Home | History | Annotate | Download | only in Tpm2DeviceLibRouter
      1 /** @file
      2   This library is TPM2 device router. Platform can register multi TPM2 instance to it
      3   via PcdTpmInstanceGuid. Platform need make choice that which one will be final one.
      4   At most one TPM2 instance can be finally registered, and other will return unsupported.
      5 
      6 Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>
      7 This program and the accompanying materials
      8 are licensed and made available under the terms and conditions of the BSD License
      9 which accompanies this distribution.  The full text of the license may be found at
     10 http://opensource.org/licenses/bsd-license.php
     11 
     12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 #include <Library/BaseLib.h>
     18 #include <Library/BaseMemoryLib.h>
     19 #include <Library/DebugLib.h>
     20 #include <Library/PcdLib.h>
     21 #include <Library/Tpm2DeviceLib.h>
     22 
     23 TPM2_DEVICE_INTERFACE  mInternalTpm2DeviceInterface;
     24 
     25 /**
     26   This service enables the sending of commands to the TPM2.
     27 
     28   @param[in]      InputParameterBlockSize  Size of the TPM2 input parameter block.
     29   @param[in]      InputParameterBlock      Pointer to the TPM2 input parameter block.
     30   @param[in,out]  OutputParameterBlockSize Size of the TPM2 output parameter block.
     31   @param[in]      OutputParameterBlock     Pointer to the TPM2 output parameter block.
     32 
     33   @retval EFI_SUCCESS            The command byte stream was successfully sent to the device and a response was successfully received.
     34   @retval EFI_DEVICE_ERROR       The command was not successfully sent to the device or a response was not successfully received from the device.
     35   @retval EFI_BUFFER_TOO_SMALL   The output parameter block is too small.
     36 **/
     37 EFI_STATUS
     38 EFIAPI
     39 Tpm2SubmitCommand (
     40   IN UINT32            InputParameterBlockSize,
     41   IN UINT8             *InputParameterBlock,
     42   IN OUT UINT32        *OutputParameterBlockSize,
     43   IN UINT8             *OutputParameterBlock
     44   )
     45 {
     46   if (mInternalTpm2DeviceInterface.Tpm2SubmitCommand == NULL) {
     47     return EFI_UNSUPPORTED;
     48   }
     49   return mInternalTpm2DeviceInterface.Tpm2SubmitCommand (
     50                                         InputParameterBlockSize,
     51                                         InputParameterBlock,
     52                                         OutputParameterBlockSize,
     53                                         OutputParameterBlock
     54                                         );
     55 }
     56 
     57 /**
     58   This service requests use TPM2.
     59 
     60   @retval EFI_SUCCESS      Get the control of TPM2 chip.
     61   @retval EFI_NOT_FOUND    TPM2 not found.
     62   @retval EFI_DEVICE_ERROR Unexpected device behavior.
     63 **/
     64 EFI_STATUS
     65 EFIAPI
     66 Tpm2RequestUseTpm (
     67   VOID
     68   )
     69 {
     70   if (mInternalTpm2DeviceInterface.Tpm2RequestUseTpm == NULL) {
     71     return EFI_UNSUPPORTED;
     72   }
     73   return mInternalTpm2DeviceInterface.Tpm2RequestUseTpm ();
     74 }
     75 
     76 /**
     77   This service register TPM2 device.
     78 
     79   @param Tpm2Device  TPM2 device
     80 
     81   @retval EFI_SUCCESS          This TPM2 device is registered successfully.
     82   @retval EFI_UNSUPPORTED      System does not support register this TPM2 device.
     83   @retval EFI_ALREADY_STARTED  System already register this TPM2 device.
     84 **/
     85 EFI_STATUS
     86 EFIAPI
     87 Tpm2RegisterTpm2DeviceLib (
     88   IN TPM2_DEVICE_INTERFACE   *Tpm2Device
     89   )
     90 {
     91   if (!CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &Tpm2Device->ProviderGuid)){
     92     DEBUG ((EFI_D_ERROR, "WARNING: Tpm2RegisterTpm2DeviceLib - does not support %g registration\n", &Tpm2Device->ProviderGuid));
     93     return EFI_UNSUPPORTED;
     94   }
     95 
     96   CopyMem (&mInternalTpm2DeviceInterface, Tpm2Device, sizeof(mInternalTpm2DeviceInterface));
     97   return EFI_SUCCESS;
     98 }
     99