From: "Long, Qin" <qin.long@intel.com>
To: "Zhang, Chao B" <chao.b.zhang@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Yao, Jiewen" <jiewen.yao@intel.com>
Subject: Re: [Patch V2] SecurityPkg: Cache TPM interface type info
Date: Fri, 22 Jun 2018 02:14:26 +0000 [thread overview]
Message-ID: <BF2CCE9263284D428840004653A28B6E54133445@SHSMSX103.ccr.corp.intel.com> (raw)
In-Reply-To: <20180622013645.18252-1-chao.b.zhang@intel.com>
Reviewed-by: Long Qin <qin.long@intel.com>
Please correct the typos:
+ @retval EFI_SUCCESS DTPM2.0 instance is registered, or system dose not surpport registr DTPM2.0 instance
^ ^ ^
+ # Accodingt to TCG PTP spec 1.3, there are 3 types defined in TPM2_PTP_INTERFACE_TYPE.<BR>
^
Best Regards & Thanks,
LONG, Qin
> -----Original Message-----
> From: Zhang, Chao B
> Sent: Friday, June 22, 2018 9:37 AM
> To: edk2-devel@lists.01.org
> Cc: Long, Qin <qin.long@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>
> Subject: [Patch V2] 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: Zhang, Chao B <chao.b.zhang@intel.com>
> ---
> SecurityPkg/Include/Library/Tpm2DeviceLib.h | 12 +++-
> .../Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.c | 38 +++++++++++-
> .../Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf | 8 ++-
> .../Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.c | 27 ++++++++-
> .../Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf | 6 +-
> SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c | 47 +++++++--------
> SecurityPkg/SecurityPkg.dec | 12 +++-
> SecurityPkg/SecurityPkg.uni | 10 +++-
> SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxe.inf | 3 +-
> SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c | 68 ++++++----------------
> SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c | 60 ++-----------------
> SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h | 1 +
> SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf | 1 +
> 13 files changed, 148 insertions(+), 145 deletions(-)
>
> diff --git a/SecurityPkg/Include/Library/Tpm2DeviceLib.h
> b/SecurityPkg/Include/Library/Tpm2DeviceLib.h
> index 67f158ef03..f072a24925 100644
> --- a/SecurityPkg/Include/Library/Tpm2DeviceLib.h
> +++ b/SecurityPkg/Include/Library/Tpm2DeviceLib.h
> @@ -1,9 +1,9 @@
> /** @file
> This library abstract how to access TPM2 hardware device.
>
> -Copyright (c) 2013, 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
> http://opensource.org/licenses/bsd-license.php
>
> @@ -15,10 +15,20 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
> #ifndef _TPM2_DEVICE_LIB_H_
> #define _TPM2_DEVICE_LIB_H_
>
> #include <Uefi.h>
>
> +//
> +// Used in PcdActiveTpmInterfaceType to identify TPM interface type //
> +typedef enum {
> + Tpm2PtpInterfaceTis,
> + Tpm2PtpInterfaceFifo,
> + Tpm2PtpInterfaceCrb,
> + Tpm2PtpInterfaceMax,
> +} TPM2_PTP_INTERFACE_TYPE;
> +
> /**
> This service enables the sending of commands to the TPM2.
>
> @param[in] InputParameterBlockSize Size of the TPM2 input parameter
> block.
> @param[in] InputParameterBlock Pointer to the TPM2 input
> parameter block.
> 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
> @@ -1,10 +1,10 @@
> /** @file
> 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
> http://opensource.org/licenses/bsd-license.php
>
> @@ -15,10 +15,23 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
>
> #include <Library/BaseLib.h>
> #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.
>
> @param[in] InputParameterBlockSize Size of the TPM2 input parameter
> block.
> @@ -112,5 +125,28 @@ Tpm2RegisterTpm2DeviceLib (
> IN TPM2_DEVICE_INTERFACE *Tpm2Device
> )
> {
> 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
> @@ -8,11 +8,11 @@
> # This library implements TIS (TPM Interface Specification) and # PTP
> (Platform TPM Profile) functions which is # 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 #
> http://opensource.org/licenses/bsd-license.php
> # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS, @@ -25,12 +25,12 @@
> BASE_NAME = Tpm2DeviceLibDTpm
> MODULE_UNI_FILE = Tpm2DeviceLibDTpm.uni
> 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.
> #
> # VALID_ARCHITECTURES = IA32 X64 IPF
> #
> @@ -48,8 +48,10 @@
> BaseLib
> BaseMemoryLib
> 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
> @@ -1,11 +1,11 @@
> /** @file
> This library is TPM2 DTPM instance.
> 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
> http://opensource.org/licenses/bsd-license.php
>
> @@ -16,13 +16,26 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
>
> #include <Library/BaseLib.h>
> #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.
> **/
> @@ -70,28 +83,36 @@ TPM2_DEVICE_INTERFACE
> mDTpm2InternalTpm2Device = {
> DTpm2SubmitCommand,
> DTpm2RequestUseTpm,
> };
>
> /**
> - 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
> **/
> EFI_STATUS
> EFIAPI
> Tpm2InstanceLibDTpmConstructor (
> VOID
> )
> {
> - EFI_STATUS Status;
> + EFI_STATUS Status;
> + TPM2_PTP_INTERFACE_TYPE PtpInterface;
>
> Status = Tpm2RegisterTpm2DeviceLib (&mDTpm2InternalTpm2Device);
> if ((Status == EFI_SUCCESS) || (Status == EFI_UNSUPPORTED)) {
> //
> // 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;
> }
> return Status;
> 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
> @@ -3,11 +3,11 @@
> #
> # This library can be registered to Tpm 2.0 device router, to be active TPM
> 2.0 # 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 #
> http://opensource.org/licenses/bsd-license.php
> # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS, @@ -44,8 +44,10 @@
> BaseLib
> BaseMemoryLib
> 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
> @@ -23,17 +23,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
> #include <Library/PcdLib.h>
>
> #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.
> //
> #define PTP_TIMEOUT_MAX (90000 * 1000) // 90s
> @@ -368,39 +361,39 @@ TisPcRequestUseTpm (
>
> @param[in] Register Pointer to PTP register.
>
> @return PTP interface type.
> **/
> -PTP_INTERFACE_TYPE
> +TPM2_PTP_INTERFACE_TYPE
> Tpm2GetPtpInterface (
> IN VOID *Register
> )
> {
> PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;
> PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;
>
> if (!Tpm2IsPtpPresence (Register)) {
> - return PtpInterfaceMax;
> + return Tpm2PtpInterfaceMax;
> }
> //
> // Check interface id
> //
> InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS
> *)Register)->InterfaceId);
> InterfaceCapability.Uint32 = MmioRead32
> ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability);
>
> 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;
> }
>
> /**
> Dump PTP register information.
>
> @@ -415,11 +408,11 @@ DumpPtpInfo (
> PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;
> UINT8 StatusEx;
> UINT16 Vid;
> UINT16 Did;
> UINT8 Rid;
> - PTP_INTERFACE_TYPE PtpInterface;
> + TPM2_PTP_INTERFACE_TYPE PtpInterface;
>
> if (!Tpm2IsPtpPresence (Register)) {
> return ;
> }
>
> @@ -456,20 +449,20 @@ 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);
> break;
> default:
> @@ -499,24 +492,24 @@ DTpm2SubmitCommand (
> IN UINT8 *InputParameterBlock,
> IN OUT UINT32 *OutputParameterBlockSize,
> 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,
> InputParameterBlockSize,
> OutputParameterBlock,
> OutputParameterBlockSize
> );
> - case PtpInterfaceFifo:
> - case PtpInterfaceTis:
> + case Tpm2PtpInterfaceFifo:
> + case Tpm2PtpInterfaceTis:
> return Tpm2TisTpmCommand (
> (TIS_PC_REGISTERS_PTR) (UINTN) PcdGet64 (PcdTpmBaseAddress),
> InputParameterBlock,
> InputParameterBlockSize,
> OutputParameterBlock,
> @@ -538,18 +531,18 @@ EFI_STATUS
> EFIAPI
> 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;
> }
> }
> diff --git a/SecurityPkg/SecurityPkg.dec b/SecurityPkg/SecurityPkg.dec index
> 497354634b..60f1c0a0e3 100644
> --- a/SecurityPkg/SecurityPkg.dec
> +++ b/SecurityPkg/SecurityPkg.dec
> @@ -461,8 +461,18 @@
> # has no need to be configured in platform dsc and will be set to correct
> # value by the HashLib instance according to the HashInstanceLib instances
> # linked, and the value of this PCD should be got in module entrypoint.
> # @Prompt Hash Algorithm bitmap.
>
> gEfiSecurityPkgTokenSpaceGuid.PcdTcg2HashAlgorithmBitmap|0xFFFFFFFF|
> UINT32|0x00010016
> -
> +
> + ## This PCD indicates current active TPM interface type.
> + # Accodingt to TCG PTP spec 1.3, there are 3 types defined in
> + TPM2_PTP_INTERFACE_TYPE.<BR> # 0x00 - FIFO interface as defined in
> + TIS 1.3 is active.<BR> # 0x01 - FIFO interface as defined in PTP for
> + TPM 2.0 is active.<BR> # 0x02 - CRB interface is active.<BR> #
> + 0xFF - Contains no current active TPM interface type.<BR> # #
> + @Prompt current active TPM interface type.
> +
> +
> gEfiSecurityPkgTokenSpaceGuid.PcdActiveTpmInterfaceType|0xFF|UINT8|0
> x0
> + 001001E
> +
> [UserExtensions.TianoCore."ExtraFiles"]
> SecurityPkgExtra.uni
> diff --git a/SecurityPkg/SecurityPkg.uni b/SecurityPkg/SecurityPkg.uni index
> aaf77269a3..c34250e423 100644
> --- a/SecurityPkg/SecurityPkg.uni
> +++ b/SecurityPkg/SecurityPkg.uni
> @@ -244,6 +244,14 @@
> #string STR_gEfiSecurityPkgTokenSpaceGuid_PcdTpm2CurrentIrqNum_HELP
> #language en-US "This PCD defines current TPM2 device interrupt number
> reported by _CRS. If set to 0, interrupt is disabled."
>
> #string
> STR_gEfiSecurityPkgTokenSpaceGuid_PcdTpm2PossibleIrqNumBuf_PROMPT
> #language en-US "Possible TPM2 device interrupt number buffer"
>
> #string
> STR_gEfiSecurityPkgTokenSpaceGuid_PcdTpm2PossibleIrqNumBuf_HELP
> #language en-US "This PCD defines possible TPM2 interrupt number in a
> platform reported by _PRS control method.\n"
> - "If PcdTpm2CurrentIrqNum set
> to 0, _PRS will not report any possible TPM2 interrupt numbers."
> \ No newline at end of file
> + "If PcdTpm2CurrentIrqNum set
> to 0, _PRS will not report any possible TPM2 interrupt numbers."
> +
> +#string
> STR_gEfiSecurityPkgTokenSpaceGuid_PcdActiveTpmInterfaceType_PROMPT
> #language en-US "Current active TPM interface type"
> +
> +#string
> STR_gEfiSecurityPkgTokenSpaceGuid_PcdActiveTpmInterfaceType_HELP
> #language en-US "This PCD indicates current active TPM interface type.\n"
> + "0x00 - FIFO interface as
> defined in TIS 1.3 is active.<BR>\n"
> + "0x01 - FIFO interface as
> defined in PTP for TPM 2.0 is active.<BR>\n"
> + "0x02 - CRB interface is
> active.<BR>\n"
> + "0xFF - Contains no current
> active TPM interface type<BR>"
> \ No newline at end of file
> diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxe.inf
> b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxe.inf
> index 38fa331701..a52709669a 100644
> --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxe.inf
> +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxe.inf
> @@ -2,11 +2,11 @@
> # TPM device configuration for TPM 2.0 # # By this module, user may
> select TPM device, clear TPM state, etc.
> # NOTE: This module is only for reference only, each platform should have
> its own setup page.
> #
> -# Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2015 - 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 #
> http://opensource.org/licenses/bsd-license.php
> # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS, @@ -77,10 +77,11 @@
> gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid ## CONSUMES
> gEfiSecurityPkgTokenSpaceGuid.PcdTcg2HashAlgorithmBitmap ##
> CONSUMES
> gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress ## CONSUMES
> gEfiSecurityPkgTokenSpaceGuid.PcdTcgPhysicalPresenceInterfaceVer ##
> CONSUMES
> gEfiSecurityPkgTokenSpaceGuid.PcdTpm2AcpiTableRev ##
> CONSUMES
> + gEfiSecurityPkgTokenSpaceGuid.PcdActiveTpmInterfaceType ##
> CONSUMES
>
> [Depex]
> gEfiTcg2ProtocolGuid AND
> gEfiHiiConfigRoutingProtocolGuid AND
> gEfiHiiDatabaseProtocolGuid AND
> diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
> b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
> index 4195b6c68f..af97628e2c 100644
> --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
> +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
> @@ -1,10 +1,10 @@
> /** @file
> HII Config Access protocol implementation of TCG2 configuration module.
> NOTE: This module is only for reference only, each platform should have its
> own setup page.
>
> -Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
> (C) Copyright 2018 Hewlett Packard Enterprise Development LP<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
> http://opensource.org/licenses/bsd-license.php
> @@ -15,11 +15,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
> **/
>
> #include "Tcg2ConfigImpl.h"
> #include <Library/PcdLib.h>
> #include <Library/Tpm2CommandLib.h>
> +#include <Library/Tpm2DeviceLib.h>
> #include <Library/IoLib.h>
> +
> #include <Guid/TpmInstance.h>
>
> #include <IndustryStandard/TpmPtp.h>
>
> #define EFI_TCG2_EVENT_LOG_FORMAT_ALL
> (EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 |
> EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)
> @@ -58,45 +60,10 @@ HII_VENDOR_DEVICE_PATH
> mTcg2HiiVendorDevicePath = {
> }
> };
>
> UINT8 mCurrentPpRequest;
>
> -/**
> - Return PTP interface type.
> -
> - @param[in] Register Pointer to PTP register.
> -
> - @return PTP interface type.
> -**/
> -UINT8
> -GetPtpInterface (
> - IN VOID *Register
> - )
> -{
> - PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;
> - PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;
> -
> - //
> - // Check interface id
> - //
> - InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS
> *)Register)->InterfaceId);
> - InterfaceCapability.Uint32 = MmioRead32
> ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability);
> -
> - if ((InterfaceId.Bits.InterfaceType ==
> PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) &&
> - (InterfaceId.Bits.InterfaceVersion ==
> PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) &&
> - (InterfaceId.Bits.CapCRB != 0)) {
> - return TPM_DEVICE_INTERFACE_PTP_CRB;
> - }
> - 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 TPM_DEVICE_INTERFACE_PTP_FIFO;
> - }
> - return TPM_DEVICE_INTERFACE_TIS;
> -}
> -
> /**
> Return if PTP CRB is supported.
>
> @param[in] Register Pointer to PTP register.
>
> @@ -151,10 +118,11 @@ IsPtpFifoSupported (
> return FALSE;
> }
>
> /**
> Set PTP interface type.
> + Do not update PcdActiveTpmInterfaceType here because interface change
> + only happens on next _TPM_INIT
>
> @param[in] Register Pointer to PTP register.
> @param[in] PtpInterface PTP interface type.
>
> @retval EFI_SUCCESS PTP interface type is set.
> @@ -166,32 +134,32 @@ EFI_STATUS
> SetPtpInterface (
> IN VOID *Register,
> IN UINT8 PtpInterface
> )
> {
> - UINT8 PtpInterfaceCurrent;
> + TPM2_PTP_INTERFACE_TYPE PtpInterfaceCurrent;
> PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;
>
> - PtpInterfaceCurrent = GetPtpInterface (Register);
> - if ((PtpInterfaceCurrent != TPM_DEVICE_INTERFACE_PTP_FIFO) &&
> - (PtpInterfaceCurrent != TPM_DEVICE_INTERFACE_PTP_CRB)) {
> + PtpInterfaceCurrent = PcdGet8(PcdActiveTpmInterfaceType);
> + if ((PtpInterfaceCurrent != Tpm2PtpInterfaceFifo) &&
> + (PtpInterfaceCurrent != Tpm2PtpInterfaceCrb)) {
> return EFI_UNSUPPORTED;
> }
> InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS
> *)Register)->InterfaceId);
> if (InterfaceId.Bits.IntfSelLock != 0) {
> return EFI_WRITE_PROTECTED;
> }
>
> switch (PtpInterface) {
> - case TPM_DEVICE_INTERFACE_PTP_FIFO:
> + case Tpm2PtpInterfaceFifo:
> if (InterfaceId.Bits.CapFIFO == 0) {
> return EFI_UNSUPPORTED;
> }
> InterfaceId.Bits.InterfaceSelector =
> PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_FIFO;
> MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId,
> InterfaceId.Uint32);
> return EFI_SUCCESS;
> - case TPM_DEVICE_INTERFACE_PTP_CRB:
> + case Tpm2PtpInterfaceCrb:
> if (InterfaceId.Bits.CapCRB == 0) {
> return EFI_UNSUPPORTED;
> }
> InterfaceId.Bits.InterfaceSelector =
> PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_CRB;
> MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId,
> InterfaceId.Uint32); @@ -823,11 +791,11 @@ InstallTcg2ConfigForm (
> EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
> UINTN Index;
> TPML_PCR_SELECTION Pcrs;
> CHAR16 TempBuffer[1024];
> TCG2_CONFIGURATION_INFO Tcg2ConfigInfo;
> - UINT8 TpmDeviceInterfaceDetected;
> + TPM2_PTP_INTERFACE_TYPE TpmDeviceInterfaceDetected;
>
> DriverHandle = NULL;
> ConfigAccess = &PrivateData->ConfigAccess;
> Status = gBS->InstallMultipleProtocolInterfaces (
> &DriverHandle,
> @@ -928,35 +896,35 @@ InstallTcg2ConfigForm (
>
> //
> // Update TPM device interface type
> //
> if (PrivateData->TpmDeviceDetected == TPM_DEVICE_2_0_DTPM) {
> - TpmDeviceInterfaceDetected = GetPtpInterface ((VOID *) (UINTN)
> PcdGet64 (PcdTpmBaseAddress));
> + TpmDeviceInterfaceDetected = PcdGet8(PcdActiveTpmInterfaceType);
> switch (TpmDeviceInterfaceDetected) {
> - case TPM_DEVICE_INTERFACE_TIS:
> + case Tpm2PtpInterfaceTis:
> HiiSetString (PrivateData->HiiHandle, STRING_TOKEN
> (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"TIS", NULL);
> break;
> - case TPM_DEVICE_INTERFACE_PTP_FIFO:
> + case Tpm2PtpInterfaceFifo:
> HiiSetString (PrivateData->HiiHandle, STRING_TOKEN
> (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP FIFO", NULL);
> break;
> - case TPM_DEVICE_INTERFACE_PTP_CRB:
> + case Tpm2PtpInterfaceCrb:
> HiiSetString (PrivateData->HiiHandle, STRING_TOKEN
> (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP CRB", NULL);
> break;
> default:
> HiiSetString (PrivateData->HiiHandle, STRING_TOKEN
> (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"Unknown", NULL);
> break;
> }
>
> Tcg2ConfigInfo.TpmDeviceInterfaceAttempt =
> TpmDeviceInterfaceDetected;
> switch (TpmDeviceInterfaceDetected) {
> - case TPM_DEVICE_INTERFACE_TIS:
> + case Tpm2PtpInterfaceTis:
> Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = FALSE;
> Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = FALSE;
> HiiSetString (PrivateData->HiiHandle, STRING_TOKEN
> (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), L"TIS", NULL);
> break;
> - case TPM_DEVICE_INTERFACE_PTP_FIFO:
> - case TPM_DEVICE_INTERFACE_PTP_CRB:
> + case Tpm2PtpInterfaceFifo:
> + case Tpm2PtpInterfaceCrb:
> Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported =
> IsPtpFifoSupported((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));
> Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported =
> IsPtpCrbSupported((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));
> TempBuffer[0] = 0;
> if (Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported) {
> if (TempBuffer[0] != 0) {
> diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c
> b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c
> index f0c92462cf..26f1fbdf8c 100644
> --- a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c
> +++ b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c
> @@ -20,60 +20,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
>
> **/
>
> #include "Tcg2Smm.h"
>
> -typedef enum {
> - PtpInterfaceTis,
> - PtpInterfaceFifo,
> - PtpInterfaceCrb,
> - PtpInterfaceMax,
> -} PTP_INTERFACE_TYPE;
> -
> -/**
> - Return PTP interface type.
> -
> - @param[in] Register Pointer to PTP register.
> -
> - @return PTP interface type.
> -**/
> -PTP_INTERFACE_TYPE
> -GetPtpInterface (
> - IN VOID *Register
> - )
> -{
> - PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;
> - PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;
> -
> - //
> - // Check interface id
> - //
> - InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS
> *)Register)->InterfaceId);
> - InterfaceCapability.Uint32 = MmioRead32
> ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability);
> -
> - if (InterfaceId.Bits.InterfaceType ==
> PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_TIS) {
> - return PtpInterfaceTis;
> - }
> -
> - 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;
> - }
> -
> - 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;
> - }
> -
> - //
> - // No Ptp interface available
> - //
> - return PtpInterfaceMax;
> -}
>
> EFI_TPM2_ACPI_TABLE mTpm2AcpiTemplate = {
> {
> EFI_ACPI_5_0_TRUSTED_COMPUTING_PLATFORM_2_TABLE_SIGNATURE,
> sizeof (mTpm2AcpiTemplate),
> @@ -783,11 +733,11 @@ PublishTpm2 (
> EFI_STATUS Status;
> EFI_ACPI_TABLE_PROTOCOL *AcpiTable;
> UINTN TableKey;
> UINT64 OemTableId;
> EFI_TPM2_ACPI_CONTROL_AREA *ControlArea;
> - PTP_INTERFACE_TYPE InterfaceType;
> + TPM2_PTP_INTERFACE_TYPE InterfaceType;
>
> mTpm2AcpiTemplate.Header.Revision = PcdGet8(PcdTpm2AcpiTableRev);
> DEBUG((DEBUG_INFO, "Tpm2 ACPI table revision is %d\n",
> mTpm2AcpiTemplate.Header.Revision));
>
> //
> @@ -810,23 +760,23 @@ PublishTpm2 (
> ACPI_DATA_LEN,
> &mTpm2AcpiTemplate,
> sizeof(mTpm2AcpiTemplate)
> );
>
> - InterfaceType = GetPtpInterface ((VOID *) (UINTN) PcdGet64
> (PcdTpmBaseAddress));
> + InterfaceType = PcdGet8(PcdActiveTpmInterfaceType);
> switch (InterfaceType) {
> - case PtpInterfaceCrb:
> + case Tpm2PtpInterfaceCrb:
> mTpm2AcpiTemplate.StartMethod =
> EFI_TPM2_ACPI_TABLE_START_METHOD_COMMAND_RESPONSE_BUFFER_
> INTERFACE;
> mTpm2AcpiTemplate.AddressOfControlArea = PcdGet64
> (PcdTpmBaseAddress) + 0x40;
> ControlArea = (EFI_TPM2_ACPI_CONTROL_AREA
> *)(UINTN)mTpm2AcpiTemplate.AddressOfControlArea;
> ControlArea->CommandSize = 0xF80;
> ControlArea->ResponseSize = 0xF80;
> ControlArea->Command = PcdGet64 (PcdTpmBaseAddress) + 0x80;
> ControlArea->Response = PcdGet64 (PcdTpmBaseAddress) + 0x80;
> break;
> - case PtpInterfaceFifo:
> - case PtpInterfaceTis:
> + case Tpm2PtpInterfaceFifo:
> + case Tpm2PtpInterfaceTis:
> break;
> default:
> DEBUG((EFI_D_ERROR, "TPM2 InterfaceType get error! %d\n",
> InterfaceType));
> break;
> }
> diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h
> b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h
> index 732452cb35..e3a14e8339 100644
> --- a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h
> +++ b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h
> @@ -38,10 +38,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
> #include <Library/Tpm2CommandLib.h>
> #include <Library/Tcg2PhysicalPresenceLib.h>
> #include <Library/IoLib.h>
> #include <Library/PrintLib.h>
> #include <Library/PcdLib.h>
> +#include <Library/Tpm2DeviceLib.h>
>
> #include <IndustryStandard/TpmPtp.h>
>
> #pragma pack(1)
> typedef struct {
> diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf
> b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf
> index 81f74959a4..168f9779e6 100644
> --- a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf
> +++ b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf
> @@ -83,10 +83,11 @@
> gEfiSecurityPkgTokenSpaceGuid.PcdTcgPhysicalPresenceInterfaceVer ##
> CONSUMES
> gEfiSecurityPkgTokenSpaceGuid.PcdTpm2AcpiTableRev ##
> CONSUMES
> gEfiSecurityPkgTokenSpaceGuid.PcdTpmPlatformClass ##
> SOMETIMES_CONSUMES
> gEfiSecurityPkgTokenSpaceGuid.PcdTpm2CurrentIrqNum ##
> CONSUMES
> gEfiSecurityPkgTokenSpaceGuid.PcdTpm2PossibleIrqNumBuf ##
> CONSUMES
> + gEfiSecurityPkgTokenSpaceGuid.PcdActiveTpmInterfaceType ##
> CONSUMES
>
> [Depex]
> gEfiAcpiTableProtocolGuid AND
> gEfiSmmSwDispatch2ProtocolGuid AND
> gEfiSmmVariableProtocolGuid AND
> --
> 2.16.2.windows.1
prev parent reply other threads:[~2018-06-22 2:14 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-22 1:36 [Patch V2] SecurityPkg: Cache TPM interface type info Zhang, Chao B
2018-06-22 2:14 ` Long, Qin [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BF2CCE9263284D428840004653A28B6E54133445@SHSMSX103.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox