[edk2-devel] [PATCH] SecurityPkg: Add retry mechanism for tpm command
Yao, Jiewen
jiewen.yao at intel.com
Wed Jul 27 12:06:51 UTC 2022
Thanks. Please add Bugzilla ID and add tested-by tag by the people who performed the test.
For the code, reviewed-by: Jiewen Yao <Jiewen.yao at intel.com>
> -----Original Message-----
> From: Zhang, Qi1 <qi1.zhang at intel.com>
> Sent: Wednesday, July 27, 2022 7:36 PM
> To: devel at edk2.groups.io
> Cc: Zhang, Qi1 <qi1.zhang at intel.com>; Yao, Jiewen <jiewen.yao at intel.com>;
> Wang, Jian J <jian.j.wang at intel.com>
> Subject: [PATCH] SecurityPkg: Add retry mechanism for tpm command
>
> Signed-off-by: Qi Zhang <qi1.zhang at intel.com>
> Cc: Jiewen Yao <jiewen.yao at intel.com>
> Cc: Jian J Wang <jian.j.wang at intel.com>
> ---
> .../Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c | 107 +++++++++++-------
> 1 file changed, 68 insertions(+), 39 deletions(-)
>
> diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c
> b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c
> index 1d99beaa10..6b5994fde2 100644
> --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c
> +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c
> @@ -33,6 +33,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
> //
>
> #define TPMCMDBUFLENGTH 0x500
>
>
>
> +//
>
> +// Max retry count
>
> +//
>
> +#define RETRY_CNT_MAX 3
>
> +
>
> /**
>
> Check whether TPM PTP register exist.
>
>
>
> @@ -153,6 +158,7 @@ PtpCrbTpmCommand (
> UINT32 TpmOutSize;
>
> UINT16 Data16;
>
> UINT32 Data32;
>
> + UINT8 RetryCnt;
>
>
>
> DEBUG_CODE_BEGIN ();
>
> UINTN DebugSize;
>
> @@ -179,53 +185,76 @@ PtpCrbTpmCommand (
> DEBUG_CODE_END ();
>
> TpmOutSize = 0;
>
>
>
> - //
>
> - // STEP 0:
>
> - // if CapCRbIdelByPass == 0, enforce Idle state before sending command
>
> - //
>
> - if ((GetCachedIdleByPass () == 0) && ((MmioRead32 ((UINTN)&CrbReg-
> >CrbControlStatus) & PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE) == 0)) {
>
> + RetryCnt = 0;
>
> + while (TRUE) {
>
> + //
>
> + // STEP 0:
>
> + // if CapCRbIdelByPass == 0, enforce Idle state before sending command
>
> + //
>
> + if ((GetCachedIdleByPass () == 0) && ((MmioRead32 ((UINTN)&CrbReg-
> >CrbControlStatus) & PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE) == 0)) {
>
> + Status = PtpCrbWaitRegisterBits (
>
> + &CrbReg->CrbControlStatus,
>
> + PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE,
>
> + 0,
>
> + PTP_TIMEOUT_C
>
> + );
>
> + if (EFI_ERROR (Status)) {
>
> + RetryCnt++;
>
> + if (RetryCnt < RETRY_CNT_MAX) {
>
> + MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest,
> PTP_CRB_CONTROL_AREA_REQUEST_GO_IDLE);
>
> + continue;
>
> + } else {
>
> + //
>
> + // Try to goIdle to recover TPM
>
> + //
>
> + Status = EFI_DEVICE_ERROR;
>
> + goto GoIdle_Exit;
>
> + }
>
> + }
>
> + }
>
> +
>
> + //
>
> + // STEP 1:
>
> + // Ready is any time the TPM is ready to receive a command, following a
> write
>
> + // of 1 by software to Request.cmdReady, as indicated by the Status field
>
> + // being cleared to 0.
>
> + //
>
> + MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest,
> PTP_CRB_CONTROL_AREA_REQUEST_COMMAND_READY);
>
> Status = PtpCrbWaitRegisterBits (
>
> - &CrbReg->CrbControlStatus,
>
> - PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE,
>
> + &CrbReg->CrbControlRequest,
>
> 0,
>
> + PTP_CRB_CONTROL_AREA_REQUEST_COMMAND_READY,
>
> PTP_TIMEOUT_C
>
> );
>
> if (EFI_ERROR (Status)) {
>
> - //
>
> - // Try to goIdle to recover TPM
>
> - //
>
> - Status = EFI_DEVICE_ERROR;
>
> - goto GoIdle_Exit;
>
> + RetryCnt++;
>
> + if (RetryCnt < RETRY_CNT_MAX) {
>
> + MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest,
> PTP_CRB_CONTROL_AREA_REQUEST_GO_IDLE);
>
> + continue;
>
> + } else {
>
> + Status = EFI_DEVICE_ERROR;
>
> + goto GoIdle_Exit;
>
> + }
>
> }
>
> - }
>
>
>
> - //
>
> - // STEP 1:
>
> - // Ready is any time the TPM is ready to receive a command, following a write
>
> - // of 1 by software to Request.cmdReady, as indicated by the Status field
>
> - // being cleared to 0.
>
> - //
>
> - MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest,
> PTP_CRB_CONTROL_AREA_REQUEST_COMMAND_READY);
>
> - Status = PtpCrbWaitRegisterBits (
>
> - &CrbReg->CrbControlRequest,
>
> - 0,
>
> - PTP_CRB_CONTROL_AREA_REQUEST_COMMAND_READY,
>
> - PTP_TIMEOUT_C
>
> - );
>
> - if (EFI_ERROR (Status)) {
>
> - Status = EFI_DEVICE_ERROR;
>
> - goto GoIdle_Exit;
>
> - }
>
> + Status = PtpCrbWaitRegisterBits (
>
> + &CrbReg->CrbControlStatus,
>
> + 0,
>
> + PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE,
>
> + PTP_TIMEOUT_C
>
> + );
>
> + if (EFI_ERROR (Status)) {
>
> + RetryCnt++;
>
> + if (RetryCnt < RETRY_CNT_MAX) {
>
> + MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest,
> PTP_CRB_CONTROL_AREA_REQUEST_GO_IDLE);
>
> + continue;
>
> + } else {
>
> + Status = EFI_DEVICE_ERROR;
>
> + goto GoIdle_Exit;
>
> + }
>
> + }
>
>
>
> - Status = PtpCrbWaitRegisterBits (
>
> - &CrbReg->CrbControlStatus,
>
> - 0,
>
> - PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE,
>
> - PTP_TIMEOUT_C
>
> - );
>
> - if (EFI_ERROR (Status)) {
>
> - Status = EFI_DEVICE_ERROR;
>
> - goto GoIdle_Exit;
>
> + break;
>
> }
>
>
>
> //
>
> --
> 2.26.2.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91890): https://edk2.groups.io/g/devel/message/91890
Mute This Topic: https://groups.io/mt/92647147/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list