From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mx.groups.io with SMTP id smtpd.web10.18704.1658921740498483045 for ; Wed, 27 Jul 2022 04:35:40 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=XH2XldKk; spf=pass (domain: intel.com, ip: 192.55.52.136, mailfrom: qi1.zhang@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1658921740; x=1690457740; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=tHCI9FFUNhxjXeNi4F2J9FOhN6vUAtrqp+HWih9AHKs=; b=XH2XldKkQvEUqPC8aV7eIwzgAMe91Mcpr+LfV+vnMxILflI+IAk+JdTj q6YlfRPz+y7ou79HlgkjwmeHOcW1fJaYITFwbkPIhdvZqE+shEHaiYNoA 6Hse4CNYdYnqjqFgJyp9sSgQusw5tmWgftXL3LVAyRZw4iwYA1TRTXZ5X 2UytIeVuhZoKKuPi2KU3VcM0S98t802V+GmcqPqtOZLw58zVh7HHfJLIw XWFw+7BXhL1dX2PnpxFP3eVxNd1U8AWSlke1yKVC3ibA8D17VqSd3Uwcp ku3oYwW9A0Kf02vidVXFfqTKjnlMsnOSPDhnI9eD8qrTeIT8QOHKuf2tp Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10420"; a="267977495" X-IronPort-AV: E=Sophos;i="5.93,195,1654585200"; d="scan'208";a="267977495" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jul 2022 04:35:40 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,195,1654585200"; d="scan'208";a="575948080" Received: from shwdesssddpdqi.ccr.corp.intel.com ([10.239.157.129]) by orsmga006.jf.intel.com with ESMTP; 27 Jul 2022 04:35:38 -0700 From: "Qi Zhang" To: devel@edk2.groups.io Cc: Qi Zhang , Jiewen Yao , Jian J Wang Subject: [PATCH] SecurityPkg: Add retry mechanism for tpm command Date: Wed, 27 Jul 2022 19:35:32 +0800 Message-Id: <20220727113532.843-1-qi1.zhang@intel.com> X-Mailer: git-send-email 2.26.2.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Signed-off-by: Qi Zhang Cc: Jiewen Yao Cc: Jian J Wang --- .../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 //=0D #define TPMCMDBUFLENGTH 0x500=0D =0D +//=0D +// Max retry count=0D +//=0D +#define RETRY_CNT_MAX 3=0D +=0D /**=0D Check whether TPM PTP register exist.=0D =0D @@ -153,6 +158,7 @@ PtpCrbTpmCommand ( UINT32 TpmOutSize;=0D UINT16 Data16;=0D UINT32 Data32;=0D + UINT8 RetryCnt;=0D =0D DEBUG_CODE_BEGIN ();=0D UINTN DebugSize;=0D @@ -179,53 +185,76 @@ PtpCrbTpmCommand ( DEBUG_CODE_END ();=0D TpmOutSize =3D 0;=0D =0D - //=0D - // STEP 0:=0D - // if CapCRbIdelByPass =3D=3D 0, enforce Idle state before sending comma= nd=0D - //=0D - if ((GetCachedIdleByPass () =3D=3D 0) && ((MmioRead32 ((UINTN)&CrbReg->C= rbControlStatus) & PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE) =3D=3D 0)) {=0D + RetryCnt =3D 0;=0D + while (TRUE) {=0D + //=0D + // STEP 0:=0D + // if CapCRbIdelByPass =3D=3D 0, enforce Idle state before sending com= mand=0D + //=0D + if ((GetCachedIdleByPass () =3D=3D 0) && ((MmioRead32 ((UINTN)&CrbReg-= >CrbControlStatus) & PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE) =3D=3D 0)) {=0D + Status =3D PtpCrbWaitRegisterBits (=0D + &CrbReg->CrbControlStatus,=0D + PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE,=0D + 0,=0D + PTP_TIMEOUT_C=0D + );=0D + if (EFI_ERROR (Status)) {=0D + RetryCnt++;=0D + if (RetryCnt < RETRY_CNT_MAX) {=0D + MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest, PTP_CRB_CONTROL_= AREA_REQUEST_GO_IDLE);=0D + continue;=0D + } else {=0D + //=0D + // Try to goIdle to recover TPM=0D + //=0D + Status =3D EFI_DEVICE_ERROR;=0D + goto GoIdle_Exit;=0D + }=0D + }=0D + }=0D +=0D + //=0D + // STEP 1:=0D + // Ready is any time the TPM is ready to receive a command, following = a write=0D + // of 1 by software to Request.cmdReady, as indicated by the Status fi= eld=0D + // being cleared to 0.=0D + //=0D + MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest, PTP_CRB_CONTROL_AREA_R= EQUEST_COMMAND_READY);=0D Status =3D PtpCrbWaitRegisterBits (=0D - &CrbReg->CrbControlStatus,=0D - PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE,=0D + &CrbReg->CrbControlRequest,=0D 0,=0D + PTP_CRB_CONTROL_AREA_REQUEST_COMMAND_READY,=0D PTP_TIMEOUT_C=0D );=0D if (EFI_ERROR (Status)) {=0D - //=0D - // Try to goIdle to recover TPM=0D - //=0D - Status =3D EFI_DEVICE_ERROR;=0D - goto GoIdle_Exit;=0D + RetryCnt++;=0D + if (RetryCnt < RETRY_CNT_MAX) {=0D + MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest, PTP_CRB_CONTROL_AR= EA_REQUEST_GO_IDLE);=0D + continue;=0D + } else {=0D + Status =3D EFI_DEVICE_ERROR;=0D + goto GoIdle_Exit;=0D + }=0D }=0D - }=0D =0D - //=0D - // STEP 1:=0D - // Ready is any time the TPM is ready to receive a command, following a = write=0D - // of 1 by software to Request.cmdReady, as indicated by the Status fiel= d=0D - // being cleared to 0.=0D - //=0D - MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest, PTP_CRB_CONTROL_AREA_REQ= UEST_COMMAND_READY);=0D - Status =3D PtpCrbWaitRegisterBits (=0D - &CrbReg->CrbControlRequest,=0D - 0,=0D - PTP_CRB_CONTROL_AREA_REQUEST_COMMAND_READY,=0D - PTP_TIMEOUT_C=0D - );=0D - if (EFI_ERROR (Status)) {=0D - Status =3D EFI_DEVICE_ERROR;=0D - goto GoIdle_Exit;=0D - }=0D + Status =3D PtpCrbWaitRegisterBits (=0D + &CrbReg->CrbControlStatus,=0D + 0,=0D + PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE,=0D + PTP_TIMEOUT_C=0D + );=0D + if (EFI_ERROR (Status)) {=0D + RetryCnt++;=0D + if (RetryCnt < RETRY_CNT_MAX) {=0D + MmioWrite32 ((UINTN)&CrbReg->CrbControlRequest, PTP_CRB_CONTROL_AR= EA_REQUEST_GO_IDLE);=0D + continue;=0D + } else {=0D + Status =3D EFI_DEVICE_ERROR;=0D + goto GoIdle_Exit;=0D + }=0D + }=0D =0D - Status =3D PtpCrbWaitRegisterBits (=0D - &CrbReg->CrbControlStatus,=0D - 0,=0D - PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE,=0D - PTP_TIMEOUT_C=0D - );=0D - if (EFI_ERROR (Status)) {=0D - Status =3D EFI_DEVICE_ERROR;=0D - goto GoIdle_Exit;=0D + break;=0D }=0D =0D //=0D --=20 2.26.2.windows.1