PrmPkg: Add ALLOCATE_CONTEXT_BUFFER_IN_FW build option
There's currently two approaches being considered for how to allocate the context buffer passed to PRM handlers: 1. The context buffer is allocated and populated in firmware. As such, the FW converts all pointers internal to the buffer to virtual memory addresses at the virtual address change event. A single context buffer pointer is given to the OS via the PRM ACPI table and the OS converts this single physical address to a virtual address when it passes the context buffer as a pointer to PRM handlers. 2. The context buffer is allocated and populated in the OS. The OS gets all the information needed to populate the context buffer from other pre-existing resources (mainly physical addresses in the PRM ACPI table). The OS converts all the physical addresses to virtual addresses, allocates the context buffer instances, and fills in the information. The OS passes the context buffer virtual address to PRM handlers. The prior behavior was (1). The current POR behavior has moved to (2). Until (2) is used more widely, it can be kept around with fairly minimal overhead via a build flag in a few places. So the default behavior is now (2) (the expected permanent behavior) with (1) easily enabled by defining "ALLOCATE_CONTEXT_BUFFER_IN_FW" in the compiler defined macros. A DSC define was added in PrmPkg.dsc to set this compiler macro in the package build. At some point in the future, all code (and some peripheral code) surrounded with this build flag can be removed if (2) is fully decided upon. 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>
This commit is contained in:
committed by
mergify[bot]
parent
d2cb6e67a4
commit
e846797662
@@ -28,8 +28,8 @@
|
||||
STATIC UINTN mMaxRuntimeMmioRangeCount;
|
||||
STATIC UINTN mMaxStaticDataBufferCount;
|
||||
|
||||
STATIC PRM_RUNTIME_MMIO_RANGES **mRuntimeMmioRanges;
|
||||
STATIC PRM_DATA_BUFFER ***mStaticDataBuffers;
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED STATIC PRM_RUNTIME_MMIO_RANGES **mRuntimeMmioRanges;
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED STATIC PRM_DATA_BUFFER ***mStaticDataBuffers;
|
||||
|
||||
/**
|
||||
Converts the runtime memory range physical addresses to virtual addresses.
|
||||
@@ -178,32 +178,23 @@ StoreVirtualMemoryAddressChangePointers (
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN BufferIndex;
|
||||
UINTN HandleCount;
|
||||
UINTN HandleIndex;
|
||||
UINTN RangeIndex;
|
||||
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
|
||||
UINTN BufferIndex;
|
||||
UINTN StaticDataBufferIndex;
|
||||
PRM_CONTEXT_BUFFER *CurrentContextBuffer;
|
||||
#endif
|
||||
EFI_HANDLE *HandleBuffer;
|
||||
PRM_CONFIG_PROTOCOL *PrmConfigProtocol;
|
||||
PRM_CONTEXT_BUFFER *CurrentContextBuffer;
|
||||
|
||||
DEBUG ((DEBUG_INFO, "%a %a - Entry.\n", _DBGMSGID_, __FUNCTION__));
|
||||
|
||||
RangeIndex = 0;
|
||||
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
|
||||
StaticDataBufferIndex = 0;
|
||||
|
||||
mRuntimeMmioRanges = AllocateRuntimeZeroPool (sizeof (*mRuntimeMmioRanges) * mMaxRuntimeMmioRangeCount);
|
||||
if (mRuntimeMmioRanges == NULL && mMaxRuntimeMmioRangeCount > 0) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
" %a %a: Memory allocation for runtime MMIO pointer array failed.\n",
|
||||
_DBGMSGID_,
|
||||
__FUNCTION__
|
||||
));
|
||||
ASSERT (FALSE);
|
||||
return;
|
||||
}
|
||||
|
||||
mStaticDataBuffers = AllocateRuntimeZeroPool (sizeof (*mStaticDataBuffers) * mMaxStaticDataBufferCount);
|
||||
if (mStaticDataBuffers == NULL && mMaxStaticDataBufferCount > 0) {
|
||||
DEBUG ((
|
||||
@@ -215,6 +206,19 @@ StoreVirtualMemoryAddressChangePointers (
|
||||
ASSERT (FALSE);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
mRuntimeMmioRanges = AllocateRuntimeZeroPool (sizeof (*mRuntimeMmioRanges) * mMaxRuntimeMmioRangeCount);
|
||||
if (mRuntimeMmioRanges == NULL && mMaxRuntimeMmioRangeCount > 0) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
" %a %a: Memory allocation for runtime MMIO pointer array failed.\n",
|
||||
_DBGMSGID_,
|
||||
__FUNCTION__
|
||||
));
|
||||
ASSERT (FALSE);
|
||||
return;
|
||||
}
|
||||
|
||||
HandleBuffer = NULL;
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
@@ -236,6 +240,7 @@ StoreVirtualMemoryAddressChangePointers (
|
||||
continue;
|
||||
}
|
||||
|
||||
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
|
||||
for (BufferIndex = 0; BufferIndex < PrmConfigProtocol->ModuleContextBuffers.BufferCount; BufferIndex++) {
|
||||
CurrentContextBuffer = &(PrmConfigProtocol->ModuleContextBuffers.Buffer[BufferIndex]);
|
||||
|
||||
@@ -256,6 +261,7 @@ StoreVirtualMemoryAddressChangePointers (
|
||||
mStaticDataBuffers[StaticDataBufferIndex++] = &CurrentContextBuffer->StaticDataBuffer;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (PrmConfigProtocol->ModuleContextBuffers.RuntimeMmioRanges != NULL) {
|
||||
if (RangeIndex >= mMaxRuntimeMmioRangeCount) {
|
||||
Status = EFI_BUFFER_TOO_SMALL;
|
||||
@@ -280,6 +286,7 @@ StoreVirtualMemoryAddressChangePointers (
|
||||
__FUNCTION__,
|
||||
RangeIndex
|
||||
));
|
||||
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
" %a %a: %d static buffers saved for future virtual memory conversion.\n",
|
||||
@@ -287,6 +294,7 @@ StoreVirtualMemoryAddressChangePointers (
|
||||
__FUNCTION__,
|
||||
StaticDataBufferIndex
|
||||
));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -388,12 +396,14 @@ PrmConfigVirtualAddressChangeEvent (
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
|
||||
//
|
||||
// Convert static data buffer pointers
|
||||
//
|
||||
for (Index = 0; Index < mMaxStaticDataBufferCount; Index++) {
|
||||
gRT->ConvertPointer (0x0, (VOID **) mStaticDataBuffers[Index]);
|
||||
}
|
||||
#endif
|
||||
|
||||
//
|
||||
// Convert runtime MMIO ranges
|
||||
@@ -484,7 +494,7 @@ PrmConfigEndOfDxeNotification (
|
||||
if (PrmConfigProtocol->ModuleContextBuffers.RuntimeMmioRanges != NULL) {
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
" %a %a: Found %d PRM runtime MMIO ranges to convert.\n",
|
||||
" %a %a: Found %d PRM runtime MMIO ranges.\n",
|
||||
_DBGMSGID_,
|
||||
__FUNCTION__,
|
||||
PrmConfigProtocol->ModuleContextBuffers.RuntimeMmioRanges->Count
|
||||
@@ -541,6 +551,13 @@ PrmConfigEntryPoint (
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
DEBUG ((DEBUG_INFO, " %a %a: Context buffers will be allocated in ", _DBGMSGID_, __FUNCTION__));
|
||||
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
|
||||
DEBUG ((DEBUG_INFO, "firmware.\n"));
|
||||
#else
|
||||
DEBUG ((DEBUG_INFO, "the operating system.\n"));
|
||||
#endif
|
||||
|
||||
//
|
||||
// Register a notification function for virtual address change
|
||||
//
|
||||
|
Reference in New Issue
Block a user