]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/NvmExpressPei: Fix Opal S3 unlock issue
authorMaggie Chu <maggie.chu@intel.com>
Fri, 25 Oct 2019 09:19:34 +0000 (17:19 +0800)
committerHao A Wu <hao.a.wu@intel.com>
Wed, 30 Oct 2019 00:17:49 +0000 (08:17 +0800)
https://bugzilla.tianocore.org/show_bug.cgi?id=2312

This patch is for fixing unexpected system hang during S3 unlock process.
FatPei driver maintained and updated internal BlockIo devices list
when there is new BlockIo PPI has installed, and it relied on BlockIo PPI
service to get data from devices. Because BlockIo Ppi leverage
NvmExpressPei Ppi to transit Nvm command to device, we should make sure
NvmePassThruPpi installed before BlockIo PPI.

Signed-off-by: Maggie Chu <maggie.chu@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c

index 987eed420e2971bb2a74c0f622dc7b0b0b4d49e6..a8cb7f3a6758ae5b490a0b48f8811cffe8342ac4 100644 (file)
@@ -376,6 +376,29 @@ NvmExpressPeimEntry (
       continue;\r
     }\r
 \r
+    //\r
+    // Nvm Express Pass Thru PPI\r
+    //\r
+    Private->PassThruMode.Attributes            = EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |\r
+                                                  EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL |\r
+                                                  EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVM;\r
+    Private->PassThruMode.IoAlign               = sizeof (UINTN);\r
+    Private->PassThruMode.NvmeVersion           = EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI_REVISION;\r
+    Private->NvmePassThruPpi.Mode               = &Private->PassThruMode;\r
+    Private->NvmePassThruPpi.GetDevicePath      = NvmePassThruGetDevicePath;\r
+    Private->NvmePassThruPpi.GetNextNameSpace   = NvmePassThruGetNextNameSpace;\r
+    Private->NvmePassThruPpi.PassThru           = NvmePassThru;\r
+    CopyMem (\r
+      &Private->NvmePassThruPpiList,\r
+      &mNvmePassThruPpiListTemplate,\r
+      sizeof (EFI_PEI_PPI_DESCRIPTOR)\r
+      );\r
+    Private->NvmePassThruPpiList.Ppi            = &Private->NvmePassThruPpi;\r
+    PeiServicesInstallPpi (&Private->NvmePassThruPpiList);\r
+\r
+    //\r
+    // Block Io PPI\r
+    //\r
     Private->BlkIoPpi.GetNumberOfBlockDevices  = NvmeBlockIoPeimGetDeviceNo;\r
     Private->BlkIoPpi.GetBlockDeviceMediaInfo  = NvmeBlockIoPeimGetMediaInfo;\r
     Private->BlkIoPpi.ReadBlocks               = NvmeBlockIoPeimReadBlocks;\r
@@ -398,26 +421,6 @@ NvmExpressPeimEntry (
     Private->BlkIo2PpiList.Ppi                 = &Private->BlkIo2Ppi;\r
     PeiServicesInstallPpi (&Private->BlkIoPpiList);\r
 \r
-    //\r
-    // Nvm Express Pass Thru PPI\r
-    //\r
-    Private->PassThruMode.Attributes            = EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |\r
-                                                  EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL |\r
-                                                  EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVM;\r
-    Private->PassThruMode.IoAlign               = sizeof (UINTN);\r
-    Private->PassThruMode.NvmeVersion           = EDKII_PEI_NVM_EXPRESS_PASS_THRU_PPI_REVISION;\r
-    Private->NvmePassThruPpi.Mode               = &Private->PassThruMode;\r
-    Private->NvmePassThruPpi.GetDevicePath      = NvmePassThruGetDevicePath;\r
-    Private->NvmePassThruPpi.GetNextNameSpace   = NvmePassThruGetNextNameSpace;\r
-    Private->NvmePassThruPpi.PassThru           = NvmePassThru;\r
-    CopyMem (\r
-      &Private->NvmePassThruPpiList,\r
-      &mNvmePassThruPpiListTemplate,\r
-      sizeof (EFI_PEI_PPI_DESCRIPTOR)\r
-      );\r
-    Private->NvmePassThruPpiList.Ppi            = &Private->NvmePassThruPpi;\r
-    PeiServicesInstallPpi (&Private->NvmePassThruPpiList);\r
-\r
     //\r
     // Check if the NVME controller supports the Security Receive/Send commands\r
     //\r