diff options
author | Zhang, Chao B <chao.b.zhang@intel.com> | 2018-05-08 14:51:57 +0800 |
---|---|---|
committer | Zhang, Chao B <chao.b.zhang@intel.com> | 2018-06-25 10:55:08 +0800 |
commit | f15cb995bb3880b77e15afe6facd3da05e599a17 (patch) | |
tree | 8a160b4c8324921198c45c6adac6e1f43933de61 /SecurityPkg/Library/Tpm2DeviceLibDTpm | |
parent | 796ef9da06bf1ab81b0b55f091630aa50cf9dfe0 (diff) | |
download | edk2-f15cb995bb3880b77e15afe6facd3da05e599a17.tar.gz edk2-f15cb995bb3880b77e15afe6facd3da05e599a17.tar.bz2 edk2-f15cb995bb3880b77e15afe6facd3da05e599a17.zip |
SecurityPkg: Cache TPM interface type info
Cache TPM interface type info to avoid excessive interface ID register read
Cc: Long Qin <qin.long@intel.com>
Cc: Yao Jiewen <jiewen.yao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Chao Zhang <chao.b.zhang@intel.com>
Reviewed-by: Long Qin <qin.long@intel.com>
Diffstat (limited to 'SecurityPkg/Library/Tpm2DeviceLibDTpm')
5 files changed, 90 insertions, 36 deletions
diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.c index 0b1723e4a1..3feb64df7e 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.c @@ -2,7 +2,7 @@ This library is TPM2 DTPM device lib.
Choosing this library means platform uses and only uses DTPM device as TPM2 engine.
-Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>
+Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -17,6 +17,19 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/Tpm2DeviceLib.h>
+#include <Library/PcdLib.h>
+
+/**
+ Return PTP interface type.
+
+ @param[in] Register Pointer to PTP register.
+
+ @return PTP interface type.
+**/
+TPM2_PTP_INTERFACE_TYPE
+Tpm2GetPtpInterface (
+ IN VOID *Register
+ );
/**
This service enables the sending of commands to the TPM2.
@@ -114,3 +127,26 @@ Tpm2RegisterTpm2DeviceLib ( {
return EFI_UNSUPPORTED;
}
+
+/**
+ The function caches current active TPM interface type.
+
+ @retval EFI_SUCCESS DTPM2.0 instance is registered, or system dose not surpport registr DTPM2.0 instance
+**/
+EFI_STATUS
+EFIAPI
+Tpm2DeviceLibConstructor (
+ VOID
+ )
+{
+ TPM2_PTP_INTERFACE_TYPE PtpInterface;
+
+ //
+ // Cache current active TpmInterfaceType only when needed
+ //
+ if (PcdGet8(PcdActiveTpmInterfaceType) == 0xFF) {
+ PtpInterface = Tpm2GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));
+ PcdSet8S(PcdActiveTpmInterfaceType, PtpInterface);
+ }
+ return EFI_SUCCESS;
+}
diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf index 3e619b98b7..634bbae847 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf @@ -10,7 +10,7 @@ # used for every TPM 2.0 command. Choosing this library means platform uses and
# only uses TPM 2.0 DTPM device.
#
-# Copyright (c) 2013 - 2017, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
@@ -27,8 +27,8 @@ FILE_GUID = E54A3327-A345-4068-8842-70AC0D519855
MODULE_TYPE = BASE
VERSION_STRING = 1.0
- LIBRARY_CLASS = Tpm2DeviceLib
-
+ LIBRARY_CLASS = Tpm2DeviceLib|PEIM DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER
+ Constructor = Tpm2DeviceLibConstructor
#
# The following information is for reference only and not required by the build tools.
#
@@ -50,6 +50,8 @@ IoLib
TimerLib
DebugLib
+ PcdLib
[Pcd]
gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress ## CONSUMES
+ gEfiSecurityPkgTokenSpaceGuid.PcdActiveTpmInterfaceType ## PRODUCES
diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.c index 3f28f21faa..01f78bf0be 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.c @@ -3,7 +3,7 @@ It can be registered to Tpm2 Device router, to be active TPM2 engine,
based on platform setting.
-Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>
+Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -18,10 +18,23 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/Tpm2DeviceLib.h>
+#include <Library/PcdLib.h>
#include <Guid/TpmInstance.h>
/**
+ Return PTP interface type.
+
+ @param[in] Register Pointer to PTP register.
+
+ @return PTP interface type.
+**/
+TPM2_PTP_INTERFACE_TYPE
+Tpm2GetPtpInterface (
+ IN VOID *Register
+ );
+
+/**
Dump PTP register information.
@param[in] Register Pointer to PTP register.
@@ -72,7 +85,7 @@ TPM2_DEVICE_INTERFACE mDTpm2InternalTpm2Device = { };
/**
- The function register DTPM2.0 instance.
+ The function register DTPM2.0 instance and caches current active TPM interface type.
@retval EFI_SUCCESS DTPM2.0 instance is registered, or system dose not surpport registr DTPM2.0 instance
**/
@@ -82,7 +95,8 @@ Tpm2InstanceLibDTpmConstructor ( VOID
)
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
+ TPM2_PTP_INTERFACE_TYPE PtpInterface;
Status = Tpm2RegisterTpm2DeviceLib (&mDTpm2InternalTpm2Device);
if ((Status == EFI_SUCCESS) || (Status == EFI_UNSUPPORTED)) {
@@ -90,6 +104,13 @@ Tpm2InstanceLibDTpmConstructor ( // Unsupported means platform policy does not need this instance enabled.
//
if (Status == EFI_SUCCESS) {
+ //
+ // Cache current active TpmInterfaceType only when needed
+ //
+ if (PcdGet8(PcdActiveTpmInterfaceType) == 0xFF) {
+ PtpInterface = Tpm2GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));
+ PcdSet8S(PcdActiveTpmInterfaceType, PtpInterface);
+ }
DumpPtpInfo ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));
}
return EFI_SUCCESS;
diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf index 22efb1ef4c..876a5a63c4 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf @@ -5,7 +5,7 @@ # engine, based on platform setting. It supports both TIS (TPM Interface Specification)
# and PTP (Platform TPM Profile) functions.
#
-# Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
@@ -46,6 +46,8 @@ IoLib
TimerLib
DebugLib
+ PcdLib
[Pcd]
- gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress ## CONSUMES
+ gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress ## CONSUMES
+ gEfiSecurityPkgTokenSpaceGuid.PcdActiveTpmInterfaceType ## PRODUCES
\ No newline at end of file diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c index d9df264699..1bc153a2c0 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c @@ -25,13 +25,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include <IndustryStandard/TpmPtp.h>
#include <IndustryStandard/TpmTis.h>
-typedef enum {
- PtpInterfaceTis,
- PtpInterfaceFifo,
- PtpInterfaceCrb,
- PtpInterfaceMax,
-} PTP_INTERFACE_TYPE;
-
//
// Execution of the command may take from several seconds to minutes for certain
// commands, such as key generation.
@@ -370,7 +363,7 @@ TisPcRequestUseTpm ( @return PTP interface type.
**/
-PTP_INTERFACE_TYPE
+TPM2_PTP_INTERFACE_TYPE
Tpm2GetPtpInterface (
IN VOID *Register
)
@@ -379,7 +372,7 @@ Tpm2GetPtpInterface ( PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;
if (!Tpm2IsPtpPresence (Register)) {
- return PtpInterfaceMax;
+ return Tpm2PtpInterfaceMax;
}
//
// Check interface id
@@ -390,15 +383,15 @@ Tpm2GetPtpInterface ( if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) &&
(InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) &&
(InterfaceId.Bits.CapCRB != 0)) {
- return PtpInterfaceCrb;
+ return Tpm2PtpInterfaceCrb;
}
if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO) &&
(InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_FIFO) &&
(InterfaceId.Bits.CapFIFO != 0) &&
(InterfaceCapability.Bits.InterfaceVersion == INTERFACE_CAPABILITY_INTERFACE_VERSION_PTP)) {
- return PtpInterfaceFifo;
+ return Tpm2PtpInterfaceFifo;
}
- return PtpInterfaceTis;
+ return Tpm2PtpInterfaceTis;
}
/**
@@ -417,7 +410,7 @@ DumpPtpInfo ( UINT16 Vid;
UINT16 Did;
UINT8 Rid;
- PTP_INTERFACE_TYPE PtpInterface;
+ TPM2_PTP_INTERFACE_TYPE PtpInterface;
if (!Tpm2IsPtpPresence (Register)) {
return ;
@@ -458,16 +451,16 @@ DumpPtpInfo ( Vid = 0xFFFF;
Did = 0xFFFF;
Rid = 0xFF;
- PtpInterface = Tpm2GetPtpInterface (Register);
+ PtpInterface = PcdGet8(PcdActiveTpmInterfaceType);
DEBUG ((EFI_D_INFO, "PtpInterface - %x\n", PtpInterface));
switch (PtpInterface) {
- case PtpInterfaceCrb:
+ case Tpm2PtpInterfaceCrb:
Vid = MmioRead16 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->Vid);
Did = MmioRead16 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->Did);
Rid = (UINT8)InterfaceId.Bits.Rid;
break;
- case PtpInterfaceFifo:
- case PtpInterfaceTis:
+ case Tpm2PtpInterfaceFifo:
+ case Tpm2PtpInterfaceTis:
Vid = MmioRead16 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->Vid);
Did = MmioRead16 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->Did);
Rid = MmioRead8 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->Rid);
@@ -501,11 +494,11 @@ DTpm2SubmitCommand ( IN UINT8 *OutputParameterBlock
)
{
- PTP_INTERFACE_TYPE PtpInterface;
+ TPM2_PTP_INTERFACE_TYPE PtpInterface;
- PtpInterface = Tpm2GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));
+ PtpInterface = PcdGet8(PcdActiveTpmInterfaceType);
switch (PtpInterface) {
- case PtpInterfaceCrb:
+ case Tpm2PtpInterfaceCrb:
return PtpCrbTpmCommand (
(PTP_CRB_REGISTERS_PTR) (UINTN) PcdGet64 (PcdTpmBaseAddress),
InputParameterBlock,
@@ -513,8 +506,8 @@ DTpm2SubmitCommand ( OutputParameterBlock,
OutputParameterBlockSize
);
- case PtpInterfaceFifo:
- case PtpInterfaceTis:
+ case Tpm2PtpInterfaceFifo:
+ case Tpm2PtpInterfaceTis:
return Tpm2TisTpmCommand (
(TIS_PC_REGISTERS_PTR) (UINTN) PcdGet64 (PcdTpmBaseAddress),
InputParameterBlock,
@@ -540,14 +533,14 @@ DTpm2RequestUseTpm ( VOID
)
{
- PTP_INTERFACE_TYPE PtpInterface;
+ TPM2_PTP_INTERFACE_TYPE PtpInterface;
- PtpInterface = Tpm2GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));
+ PtpInterface = PcdGet8(PcdActiveTpmInterfaceType);
switch (PtpInterface) {
- case PtpInterfaceCrb:
+ case Tpm2PtpInterfaceCrb:
return PtpCrbRequestUseTpm ((PTP_CRB_REGISTERS_PTR) (UINTN) PcdGet64 (PcdTpmBaseAddress));
- case PtpInterfaceFifo:
- case PtpInterfaceTis:
+ case Tpm2PtpInterfaceFifo:
+ case Tpm2PtpInterfaceTis:
return TisPcRequestUseTpm ((TIS_PC_REGISTERS_PTR) (UINTN) PcdGet64 (PcdTpmBaseAddress));
default:
return EFI_NOT_FOUND;
|