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