]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c
MdeModulePkg/NvmExpressPei: Avoid updating the module-level variable
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / NvmExpressPei / DmaMem.c
index 51b48d38dd6c81b87eeb079453476363d8a797be..cb629c16b076cbfb0972bf57d504d12f47b777a6 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The DMA memory help function.\r
 \r
-  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions\r
 \r
 #include "NvmExpressPei.h"\r
 \r
-EDKII_IOMMU_PPI  *mIoMmu;\r
+/**\r
+  Get IOMMU PPI.\r
+\r
+  @return Pointer to IOMMU PPI.\r
+\r
+**/\r
+EDKII_IOMMU_PPI *\r
+GetIoMmu (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS         Status;\r
+  EDKII_IOMMU_PPI    *IoMmu;\r
+\r
+  IoMmu  = NULL;\r
+  Status = PeiServicesLocatePpi (\r
+             &gEdkiiIoMmuPpiGuid,\r
+             0,\r
+             NULL,\r
+             (VOID **) &IoMmu\r
+             );\r
+  if (!EFI_ERROR (Status) && (IoMmu != NULL)) {\r
+    return IoMmu;\r
+  }\r
+\r
+  return NULL;\r
+}\r
 \r
 /**\r
   Provides the controller-specific addresses required to access system memory from a\r
@@ -46,18 +72,21 @@ IoMmuMap (
   OUT VOID                  **Mapping\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
-  UINT64      Attribute;\r
-\r
-  if (mIoMmu != NULL) {\r
-    Status = mIoMmu->Map (\r
-                       mIoMmu,\r
-                       Operation,\r
-                       HostAddress,\r
-                       NumberOfBytes,\r
-                       DeviceAddress,\r
-                       Mapping\r
-                       );\r
+  EFI_STATUS         Status;\r
+  UINT64             Attribute;\r
+  EDKII_IOMMU_PPI    *IoMmu;\r
+\r
+  IoMmu = GetIoMmu ();\r
+\r
+  if (IoMmu != NULL) {\r
+    Status = IoMmu->Map (\r
+                     IoMmu,\r
+                     Operation,\r
+                     HostAddress,\r
+                     NumberOfBytes,\r
+                     DeviceAddress,\r
+                     Mapping\r
+                     );\r
     if (EFI_ERROR (Status)) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
@@ -78,11 +107,11 @@ IoMmuMap (
       ASSERT(FALSE);\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-    Status = mIoMmu->SetAttribute (\r
-                       mIoMmu,\r
-                       *Mapping,\r
-                       Attribute\r
-                       );\r
+    Status = IoMmu->SetAttribute (\r
+                      IoMmu,\r
+                      *Mapping,\r
+                      Attribute\r
+                      );\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
@@ -108,11 +137,14 @@ IoMmuUnmap (
   IN VOID                  *Mapping\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
+  EFI_STATUS         Status;\r
+  EDKII_IOMMU_PPI    *IoMmu;\r
+\r
+  IoMmu = GetIoMmu ();\r
 \r
-  if (mIoMmu != NULL) {\r
-    Status = mIoMmu->SetAttribute (mIoMmu, Mapping, 0);\r
-    Status = mIoMmu->Unmap (mIoMmu, Mapping);\r
+  if (IoMmu != NULL) {\r
+    Status = IoMmu->SetAttribute (IoMmu, Mapping, 0);\r
+    Status = IoMmu->Unmap (IoMmu, Mapping);\r
   } else {\r
     Status = EFI_SUCCESS;\r
   }\r
@@ -148,39 +180,42 @@ IoMmuAllocateBuffer (
   EFI_STATUS            Status;\r
   UINTN                 NumberOfBytes;\r
   EFI_PHYSICAL_ADDRESS  HostPhyAddress;\r
+  EDKII_IOMMU_PPI       *IoMmu;\r
 \r
   *HostAddress = NULL;\r
   *DeviceAddress = 0;\r
 \r
-  if (mIoMmu != NULL) {\r
-    Status = mIoMmu->AllocateBuffer (\r
-                       mIoMmu,\r
-                       EfiBootServicesData,\r
-                       Pages,\r
-                       HostAddress,\r
-                       0\r
-                       );\r
+  IoMmu = GetIoMmu ();\r
+\r
+  if (IoMmu != NULL) {\r
+    Status = IoMmu->AllocateBuffer (\r
+                      IoMmu,\r
+                      EfiBootServicesData,\r
+                      Pages,\r
+                      HostAddress,\r
+                      0\r
+                      );\r
     if (EFI_ERROR (Status)) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
     NumberOfBytes = EFI_PAGES_TO_SIZE(Pages);\r
-    Status = mIoMmu->Map (\r
-                       mIoMmu,\r
-                       EdkiiIoMmuOperationBusMasterCommonBuffer,\r
-                       *HostAddress,\r
-                       &NumberOfBytes,\r
-                       DeviceAddress,\r
-                       Mapping\r
-                       );\r
+    Status = IoMmu->Map (\r
+                      IoMmu,\r
+                      EdkiiIoMmuOperationBusMasterCommonBuffer,\r
+                      *HostAddress,\r
+                      &NumberOfBytes,\r
+                      DeviceAddress,\r
+                      Mapping\r
+                      );\r
     if (EFI_ERROR (Status)) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
-    Status = mIoMmu->SetAttribute (\r
-                       mIoMmu,\r
-                       *Mapping,\r
-                       EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE\r
-                       );\r
+    Status = IoMmu->SetAttribute (\r
+                      IoMmu,\r
+                      *Mapping,\r
+                      EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE\r
+                      );\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
@@ -219,31 +254,17 @@ IoMmuFreeBuffer (
   IN VOID                   *Mapping\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
+  EFI_STATUS         Status;\r
+  EDKII_IOMMU_PPI    *IoMmu;\r
 \r
-  if (mIoMmu != NULL) {\r
-    Status = mIoMmu->SetAttribute (mIoMmu, Mapping, 0);\r
-    Status = mIoMmu->Unmap (mIoMmu, Mapping);\r
-    Status = mIoMmu->FreeBuffer (mIoMmu, Pages, HostAddress);\r
+  IoMmu = GetIoMmu ();\r
+\r
+  if (IoMmu != NULL) {\r
+    Status = IoMmu->SetAttribute (IoMmu, Mapping, 0);\r
+    Status = IoMmu->Unmap (IoMmu, Mapping);\r
+    Status = IoMmu->FreeBuffer (IoMmu, Pages, HostAddress);\r
   } else {\r
     Status = EFI_SUCCESS;\r
   }\r
   return Status;\r
 }\r
-\r
-/**\r
-  Initialize IOMMU.\r
-**/\r
-VOID\r
-IoMmuInit (\r
-  VOID\r
-  )\r
-{\r
-  PeiServicesLocatePpi (\r
-    &gEdkiiIoMmuPpiGuid,\r
-    0,\r
-    NULL,\r
-    (VOID **)&mIoMmu\r
-    );\r
-}\r
-\r