]> git.proxmox.com Git - mirror_edk2.git/commitdiff
PrmPkg/HardwareAccessModuleConfigLib: Add initial library
authorMichael Kubacki <michael.kubacki@microsoft.com>
Thu, 11 Jun 2020 00:28:55 +0000 (17:28 -0700)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 5 Apr 2022 00:42:38 +0000 (00:42 +0000)
Adds a PRM module configuration library for PrmSampleHardwareAccessModule
that demonstrates marking a runtime MMIO range. In the case of this
sample module, the range used is for HPET.

Cc: Andrew Fish <afish@apple.com>
Cc: Kang Gao <kang.gao@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Michael Kubacki <michael.kubacki@microsoft.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Benjamin You <benjamin.you@intel.com>
Cc: Liu Yun <yun.y.liu@intel.com>
Cc: Ankit Sinha <ankit.sinha@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Acked-by: Michael D Kinney <michael.d.kinney@intel.com>
Acked-by: Liming Gao <gaoliming@byosoft.com.cn>
Acked-by: Leif Lindholm <quic_llindhol@quicinc.com>
Reviewed-by: Ankit Sinha <ankit.sinha@intel.com>
PrmPkg/PrmPkg.dsc
PrmPkg/Samples/PrmSampleHardwareAccessModule/Hpet.h
PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.c [new file with mode: 0644]
PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.inf [new file with mode: 0644]
PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampleHardwareAccessModule.c

index 2409378926b9dd96a7f4d4bc21a2ed7add1c2008..19b996eb3a025b918c3cf01918e9fcd79a212ab9 100644 (file)
@@ -79,6 +79,7 @@
     <LibraryClasses>\r
       NULL|$(PLATFORM_PACKAGE)/Samples/PrmSampleAcpiParameterBufferModule/Library/DxeAcpiParameterBufferModuleConfigLib/DxeAcpiParameterBufferModuleConfigLib.inf\r
       NULL|$(PLATFORM_PACKAGE)/Samples/PrmSampleContextBufferModule/Library/DxeContextBufferModuleConfigLib/DxeContextBufferModuleConfigLib.inf\r
+      NULL|$(PLATFORM_PACKAGE)/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.inf\r
   }\r
 \r
   #\r
index c7eb0cbfa747dae06af9fcbe845f0c617a0f7d36..a4f8758516c0edd5929c03be478ce168aa478f8d 100644 (file)
@@ -15,6 +15,9 @@
 #ifndef HPET_REGISTER_H_\r
 #define HPET_REGISTER_H_\r
 \r
+#define HPET_BASE_ADDRESS 0xFED00000\r
+#define HPET_RANGE_LENGTH 0x1000\r
+\r
 ///\r
 /// HPET General Register Offsets\r
 ///\r
diff --git a/PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.c b/PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.c
new file mode 100644 (file)
index 0000000..c00ab9f
--- /dev/null
@@ -0,0 +1,104 @@
+/** @file\r
+\r
+  The boot services environment configuration library for the Hardware Access Sample PRM module.\r
+\r
+  Copyright (c) Microsoft Corporation\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Protocol/PrmConfig.h>\r
+#include <Samples/PrmSampleHardwareAccessModule/Hpet.h>\r
+\r
+STATIC EFI_HANDLE  mPrmConfigProtocolHandle;\r
+\r
+// {0ef93ed7-14ae-425b-928f-b85a6213b57e}\r
+STATIC CONST EFI_GUID mPrmModuleGuid = {0x0ef93ed7, 0x14ae, 0x425b, {0x92, 0x8f, 0xb8, 0x5a, 0x62, 0x13, 0xb5, 0x7e}};\r
+\r
+/**\r
+  Constructor of the PRM configuration library.\r
+\r
+  @param[in] ImageHandle        The image handle of the driver.\r
+  @param[in] SystemTable        The EFI System Table pointer.\r
+\r
+  @retval EFI_SUCCESS           The shell command handlers were installed successfully.\r
+  @retval EFI_UNSUPPORTED       The shell level required was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HardwareAccessModuleConfigLibConstructor (\r
+  IN  EFI_HANDLE                    ImageHandle,\r
+  IN  EFI_SYSTEM_TABLE              *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  PRM_RUNTIME_MMIO_RANGES           *RuntimeMmioRanges;\r
+  PRM_CONFIG_PROTOCOL               *PrmConfigProtocol;\r
+\r
+  RuntimeMmioRanges = NULL;\r
+  PrmConfigProtocol = NULL;\r
+\r
+  /*\r
+    In this sample PRM module, the protocol describing this sample module's resources is simply\r
+    installed in the constructor.\r
+\r
+    However, if some data is not available until later, this constructor could register a callback\r
+    on the dependency for the data to be available (e.g. ability to communicate with some device)\r
+    and then install the protocol. The requirement is that the protocol is installed before end of DXE.\r
+  */\r
+\r
+  // Runtime MMIO Ranges structure\r
+\r
+  // Since this sample module only uses 1 runtime MMIO range, it can use the PRM_RUNTIME_MMIO_RANGES\r
+  // type directly without extending the size of the data buffer for additional MMIO ranges.\r
+  RuntimeMmioRanges = AllocateRuntimeZeroPool (sizeof (*RuntimeMmioRanges));\r
+  ASSERT (RuntimeMmioRanges != NULL);\r
+  if (RuntimeMmioRanges == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
+  }\r
+\r
+  // Allocate the PRM Configuration protocol structure for this PRM module\r
+  PrmConfigProtocol = AllocateZeroPool (sizeof (*PrmConfigProtocol));\r
+  ASSERT (PrmConfigProtocol != NULL);\r
+  if (PrmConfigProtocol == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
+  }\r
+  CopyGuid (&PrmConfigProtocol->ModuleContextBuffers.ModuleGuid, &mPrmModuleGuid);\r
+\r
+  // Populate the Runtime MMIO Ranges structure\r
+  RuntimeMmioRanges->Count = 1;\r
+  RuntimeMmioRanges->Range[0].PhysicalBaseAddress = HPET_BASE_ADDRESS;\r
+  RuntimeMmioRanges->Range[0].Length = HPET_RANGE_LENGTH;\r
+\r
+  PrmConfigProtocol->ModuleContextBuffers.RuntimeMmioRanges = RuntimeMmioRanges;\r
+\r
+  //\r
+  // Install the PRM Configuration Protocol for this module. This indicates the configuration\r
+  // library has completed resource initialization for the PRM module.\r
+  //\r
+  Status = gBS->InstallProtocolInterface (\r
+                  &mPrmConfigProtocolHandle,\r
+                  &gPrmConfigProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  (VOID *) PrmConfigProtocol\r
+                  );\r
+\r
+Done:\r
+  if (EFI_ERROR (Status)) {\r
+    if (RuntimeMmioRanges != NULL) {\r
+      FreePool (RuntimeMmioRanges);\r
+    }\r
+    if (PrmConfigProtocol != NULL) {\r
+      FreePool (PrmConfigProtocol);\r
+    }\r
+  }\r
+\r
+  return Status;\r
+}\r
diff --git a/PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.inf b/PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.inf
new file mode 100644 (file)
index 0000000..1a50480
--- /dev/null
@@ -0,0 +1,39 @@
+## @file\r
+#  Sample PRM Configuration Library Instance\r
+#\r
+#  The PRM configuration library instance is responsible for initializing and setting the corresponding\r
+#  PRM module's configuration in the boot environment.\r
+#\r
+#  Copyright (c) Microsoft Corporation\r
+#\r
+#  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION         = 0x00010005\r
+  BASE_NAME           = DxeHardwareAccessModuleConfigLib\r
+  FILE_GUID           = 88AA72FE-AE5A-435F-A267-E24D526C666C\r
+  MODULE_TYPE         = DXE_DRIVER\r
+  VERSION_STRING      = 1.0\r
+  LIBRARY_CLASS       = NULL |DXE_DRIVER\r
+  CONSTRUCTOR         = HardwareAccessModuleConfigLibConstructor\r
+\r
+[Sources]\r
+  DxeHardwareAccessModuleConfigLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
+  PrmPkg/PrmPkg.dec\r
+\r
+[Protocols]\r
+  gPrmConfigProtocolGuid\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  BaseMemoryLib\r
+  DebugLib\r
+  MemoryAllocationLib\r
+  UefiBootServicesTableLib\r
+  UefiDriverEntryPoint\r
index 32e04c5e85923a7df4583532699a20c596bf5d0c..35da1fcf5f17d7a11c1d50cf24d19b57aa7c5768 100644 (file)
@@ -42,8 +42,6 @@
 // {8a0efdde-78d0-45f0-aea0-c28245c7e1db}\r
 #define MMIO_PRINT_HPET_PRM_HANDLER_GUID {0x8a0efdde, 0x78d0, 0x45f0, {0xae, 0xa0, 0xc2, 0x82, 0x45, 0xc7, 0xe1, 0xdb}}\r
 \r
-#define HPET_BASE_ADDRESS 0xFED00000\r
-\r
 //\r
 // BEGIN: MtrrLib internal library globals and function prototypes here for testing\r
 //\r