From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 09DD31A1E30 for ; Tue, 11 Oct 2016 01:01:51 -0700 (PDT) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP; 11 Oct 2016 01:01:50 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,476,1473145200"; d="scan'208";a="178616575" Received: from shwde7156.ccr.corp.intel.com ([10.239.158.52]) by fmsmga004.fm.intel.com with ESMTP; 11 Oct 2016 01:01:49 -0700 From: Eric Dong To: edk2-devel@lists.01.org Cc: Feng Tian Date: Tue, 11 Oct 2016 16:01:48 +0800 Message-Id: <1476172908-70824-1-git-send-email-eric.dong@intel.com> X-Mailer: git-send-email 2.6.4.windows.1 Subject: [Patch] SecurityPkg OpalPasswordSmm: Fix S3 resume failure. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Oct 2016 08:01:51 -0000 Changes includes: 1.Check SMM device list before update it to avoid duplicate creation. 2.Clean up the configuration buffer before use it in S3 resume phase. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong Cc: Feng Tian --- .../Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c | 8 ++ .../Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c | 89 +++++++++++++++++----- 2 files changed, 76 insertions(+), 21 deletions(-) diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c index 3826698..9e90d54 100644 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c +++ b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c @@ -1691,6 +1691,14 @@ NvmeControllerInit ( Nvme->Cid[0] = 0; Nvme->Cid[1] = 0; + Nvme->Pt[0] = 0; + Nvme->Pt[1] = 0; + + ZeroMem ((VOID *)(UINTN)(&(Nvme->SqTdbl[0])), sizeof (NVME_SQTDBL) * NVME_MAX_IO_QUEUES); + ZeroMem ((VOID *)(UINTN)(&(Nvme->CqHdbl[0])), sizeof (NVME_CQHDBL) * NVME_MAX_IO_QUEUES); + + ZeroMem ((VOID *)(UINTN)Nvme->BaseMem, NVME_MEM_MAX_SIZE); + Status = NvmeDisableController (Nvme); if (EFI_ERROR(Status)) { DEBUG ((DEBUG_ERROR, "NvmeDisableController fail, Status: %r\n", Status)); diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c index 47b570f..2f2a1d9 100644 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c +++ b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c @@ -483,6 +483,53 @@ done: return Status; } +/** + The function extracts device information from OpalDeviceList and creat SmmDeviceList used for S3. + + @param[in] OpalDeviceList Opal device list created at POST which contains the information of OPAL_DISK_AND_PASSWORD_INFO + @param[in,out] SmmDeviceList Opal Smm device list to be created and used for unlocking devices at S3 resume. + + @retval EFI_SUCCESS Create SmmDeviceList successfully. + @retval Others Other execution results. +**/ +EFI_STATUS +CreateSmmDeviceList ( + IN LIST_ENTRY *OpalDeviceList, + IN OUT LIST_ENTRY *SmmDeviceList + ) +{ + LIST_ENTRY *Entry; + OPAL_DISK_AND_PASSWORD_INFO *PciDev; + OPAL_SMM_DEVICE *SmmDev; + + for (Entry = OpalDeviceList->ForwardLink; Entry != OpalDeviceList; Entry = Entry->ForwardLink) { + PciDev = BASE_CR (Entry, OPAL_DISK_AND_PASSWORD_INFO, Link); + + SmmDev = AllocateZeroPool (sizeof (OPAL_SMM_DEVICE)); + if (SmmDev == NULL) { + return EFI_OUT_OF_RESOURCES; + } + SmmDev->Signature = OPAL_SMM_DEVICE_SIGNATURE; + + ExtractDeviceInfoFromDevicePath(&PciDev->OpalDevicePath, SmmDev); + + SmmDev->PasswordLength = PciDev->PasswordLength; + CopyMem(&(SmmDev->Password), PciDev->Password, OPAL_PASSWORD_MAX_LENGTH); + + SmmDev->Sscp.ReceiveData = SecurityReceiveData; + SmmDev->Sscp.SendData = SecuritySendData; + + DEBUG ((DEBUG_INFO, "Opal SMM: Insert device node to SmmDeviceList:\n")); + DEBUG ((DEBUG_INFO, "DeviceType:%x, Bus:%d, Dev:%d, Fun:%d\n", \ + SmmDev->DeviceType, SmmDev->BusNum, SmmDev->DevNum, SmmDev->FuncNum)); + DEBUG ((DEBUG_INFO, "SataPort:%x, MultiplierPort:%x, NvmeNamespaceId:%x\n", \ + SmmDev->SataPort, SmmDev->SataPortMultiplierPort, SmmDev->NvmeNamespaceId)); + + InsertHeadList (SmmDeviceList, &SmmDev->Link); + } + + return EFI_SUCCESS; +} /** Main entry point for an SMM handler dispatch or communicate-based callback. @@ -521,7 +568,6 @@ S3SleepEntryCallBack ( UINT64 Address; S3_BOOT_SCRIPT_LIB_WIDTH Width; UINT32 Data; - OPAL_DISK_AND_PASSWORD_INFO *PciDev; OPAL_HC_PCI_REGISTER_SAVE *HcRegisterSaveListPtr; UINTN Count; OPAL_SMM_DEVICE *SmmDev; @@ -530,25 +576,28 @@ S3SleepEntryCallBack ( Status = EFI_SUCCESS; mOpalDeviceList = OpalSupportGetOpalDeviceList(); + if (IsListEmpty (mOpalDeviceList)) { + // + // No Opal enabled device. Do nothing. + // + return EFI_SUCCESS; + } - for (Entry = mOpalDeviceList->ForwardLink; Entry != mOpalDeviceList; Entry = Entry->ForwardLink) { - PciDev = BASE_CR (Entry, OPAL_DISK_AND_PASSWORD_INFO, Link); - - SmmDev = AllocateZeroPool (sizeof (OPAL_SMM_DEVICE)); - if (SmmDev == NULL) { - return EFI_OUT_OF_RESOURCES; + if (IsListEmpty (&mSmmDeviceList)) { + // + // mSmmDeviceList for S3 is empty, creat it by mOpalDeviceList. + // + Status = CreateSmmDeviceList (mOpalDeviceList, &mSmmDeviceList); + if (EFI_ERROR (Status)) { + return Status; } - SmmDev->Signature = OPAL_SMM_DEVICE_SIGNATURE; - - ExtractDeviceInfoFromDevicePath(&PciDev->OpalDevicePath, SmmDev); - - SmmDev->PasswordLength = PciDev->PasswordLength; - CopyMem(&(SmmDev->Password), PciDev->Password, OPAL_PASSWORD_MAX_LENGTH); - - SmmDev->Sscp.ReceiveData = SecurityReceiveData; - SmmDev->Sscp.SendData = SecuritySendData; + } - InsertHeadList (&mSmmDeviceList, &SmmDev->Link); + // + // Go through SmmDeviceList to save register data for S3 + // + for (Entry = mSmmDeviceList.ForwardLink; Entry != &mSmmDeviceList; Entry = Entry->ForwardLink) { + SmmDev = BASE_CR (Entry, OPAL_SMM_DEVICE, Link); if (SmmDev->DeviceType == OPAL_DEVICE_TYPE_NVME) { continue; @@ -592,10 +641,8 @@ S3SleepEntryCallBack ( } } - if (!IsListEmpty (mOpalDeviceList)) { - Status = S3BootScriptSaveIoWrite (S3BootScriptWidthUint8, 0xB2, 1, &mSwSmiValue); - ASSERT_EFI_ERROR (Status); - } + Status = S3BootScriptSaveIoWrite (S3BootScriptWidthUint8, 0xB2, 1, &mSwSmiValue); + ASSERT_EFI_ERROR (Status); return Status; } -- 2.6.4.windows.1