From: Michael Kubacki <michael.kuba...@microsoft.com> 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 <af...@apple.com> Cc: Kang Gao <kang....@intel.com> Cc: Michael D Kinney <michael.d.kin...@intel.com> Cc: Michael Kubacki <michael.kuba...@microsoft.com> Cc: Leif Lindholm <l...@nuviainc.com> Cc: Benjamin You <benjamin....@intel.com> Cc: Liu Yun <yun.y....@intel.com> Cc: Ankit Sinha <ankit.si...@intel.com> Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> Signed-off-by: Michael Kubacki <michael.kuba...@microsoft.com> --- PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.c | 104 ++++++++++++++++++++ PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampleHardwareAccessModule.c | 2 - PrmPkg/PrmPkg.dsc | 1 + PrmPkg/Samples/PrmSampleHardwareAccessModule/Hpet.h | 3 + PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.inf | 39 ++++++++ 5 files changed, 147 insertions(+), 2 deletions(-) diff --git a/PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.c b/PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.c new file mode 100644 index 000000000000..c00ab9ffbbe3 --- /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/PrmSampleHardwareAccessModule.c b/PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampleHardwareAccessModule.c index 32e04c5e8592..35da1fcf5f17 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 // diff --git a/PrmPkg/PrmPkg.dsc b/PrmPkg/PrmPkg.dsc index 2409378926b9..19b996eb3a02 100644 --- a/PrmPkg/PrmPkg.dsc +++ b/PrmPkg/PrmPkg.dsc @@ -79,6 +79,7 @@ [Components] <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 c7eb0cbfa747..a4f8758516c0 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.inf b/PrmPkg/Samples/PrmSampleHardwareAccessModule/Library/DxeHardwareAccessModuleConfigLib/DxeHardwareAccessModuleConfigLib.inf new file mode 100644 index 000000000000..1a50480dd2c5 --- /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 -- 2.28.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#87865): https://edk2.groups.io/g/devel/message/87865 Mute This Topic: https://groups.io/mt/89956009/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-