PrmPkg: Remove ALLOCATE_CONTEXT_BUFFER_IN_FW build flag

The POR is firmly to use an OS allocated context buffer now so the
build flag that allows firmware to allocate the context buffer
is removed along with supporting code.

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:
Michael Kubacki 2020-06-08 11:06:44 -07:00 committed by mergify[bot]
parent a409f4b67d
commit 0797989c5d
6 changed files with 4 additions and 107 deletions

View File

@ -26,10 +26,8 @@
#define _DBGMSGID_ "[PRMCONFIG]"
STATIC UINTN mMaxRuntimeMmioRangeCount;
STATIC UINTN mMaxStaticDataBufferCount;
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.
@ -181,32 +179,12 @@ StoreVirtualMemoryAddressChangePointers (
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;
DEBUG ((DEBUG_INFO, "%a %a - Entry.\n", _DBGMSGID_, __FUNCTION__));
RangeIndex = 0;
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
StaticDataBufferIndex = 0;
mStaticDataBuffers = AllocateRuntimeZeroPool (sizeof (*mStaticDataBuffers) * mMaxStaticDataBufferCount);
if (mStaticDataBuffers == NULL && mMaxStaticDataBufferCount > 0) {
DEBUG ((
DEBUG_ERROR,
" %a %a: Memory allocation for PRM static data buffer pointer array failed.\n",
_DBGMSGID_,
__FUNCTION__
));
ASSERT (FALSE);
return;
}
#endif
mRuntimeMmioRanges = AllocateRuntimeZeroPool (sizeof (*mRuntimeMmioRanges) * mMaxRuntimeMmioRangeCount);
if (mRuntimeMmioRanges == NULL && mMaxRuntimeMmioRangeCount > 0) {
@ -240,28 +218,6 @@ StoreVirtualMemoryAddressChangePointers (
continue;
}
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
for (BufferIndex = 0; BufferIndex < PrmConfigProtocol->ModuleContextBuffers.BufferCount; BufferIndex++) {
CurrentContextBuffer = &(PrmConfigProtocol->ModuleContextBuffers.Buffer[BufferIndex]);
if (CurrentContextBuffer->StaticDataBuffer != NULL) {
if (StaticDataBufferIndex >= mMaxStaticDataBufferCount) {
Status = EFI_BUFFER_TOO_SMALL;
DEBUG ((
DEBUG_ERROR,
" %a %a: Index out of bounds - Actual count (%d) of PRM data buffers exceeds maximum count (%d).\n",
_DBGMSGID_,
__FUNCTION__,
StaticDataBufferIndex + 1,
mMaxStaticDataBufferCount
));
ASSERT_EFI_ERROR (Status);
return;
}
mStaticDataBuffers[StaticDataBufferIndex++] = &CurrentContextBuffer->StaticDataBuffer;
}
}
#endif
if (PrmConfigProtocol->ModuleContextBuffers.RuntimeMmioRanges != NULL) {
if (RangeIndex >= mMaxRuntimeMmioRangeCount) {
Status = EFI_BUFFER_TOO_SMALL;
@ -286,15 +242,6 @@ StoreVirtualMemoryAddressChangePointers (
__FUNCTION__,
RangeIndex
));
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
DEBUG ((
DEBUG_INFO,
" %a %a: %d static buffers saved for future virtual memory conversion.\n",
_DBGMSGID_,
__FUNCTION__,
StaticDataBufferIndex
));
#endif
}
}
@ -396,15 +343,6 @@ 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
//
@ -485,9 +423,6 @@ PrmConfigEndOfDxeNotification (
CurrentContextBuffer->HandlerGuid
));
}
if (CurrentContextBuffer->StaticDataBuffer != NULL) {
mMaxStaticDataBufferCount++;
}
}
DEBUG ((DEBUG_INFO, " %a %a: Module context buffer validation complete.\n", _DBGMSGID_, __FUNCTION__));
@ -551,13 +486,6 @@ 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
//

View File

@ -30,10 +30,6 @@ typedef struct {
UINT16 StructureLength; ///< Length in bytes of this structure
GUID Identifier; ///< GUID of the PRM handler for this structure
UINT64 PhysicalAddress; ///< Physical address of this PRM handler
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
UINT64 PrmContextBuffer; ///< Physical address of the context buffer for this
///< PRM handler (PRM_CONTEXT_BUFFER *)
#else
UINT64 StaticDataBuffer; ///< Physical address of the static data buffer for
///< this PRM handler (PRM_DATA_BUFFER *)
UINT64 AcpiParameterBuffer; ///< Physical address of the parameter buffer
@ -41,8 +37,6 @@ typedef struct {
///< that is only used in the case of _DSM invocation.
///< If _DSM invocation is not used, this value is
///< ignored.
#endif
} PRM_HANDLER_INFORMATION_STRUCT;
typedef struct {

View File

@ -738,11 +738,7 @@ ProcessPrmModules (
&CurrentContextBuffer
);
if (!EFI_ERROR (Status)) {
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
CurrentHandlerInfoStruct->PrmContextBuffer = (UINT64) (UINTN) CurrentContextBuffer;
#else
CurrentHandlerInfoStruct->StaticDataBuffer = (UINT64) (UINTN) CurrentContextBuffer->StaticDataBuffer;
#endif
}
Status = GetExportEntryAddress (

View File

@ -110,8 +110,3 @@
[BuildOptions]
# Force deprecated interfaces off
*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES
# Append package-specific build settings
!ifdef $(ALLOCATE_CONTEXT_BUFFER_IN_FW)
*_*_*_CC_FLAGS = -D ALLOCATE_CONTEXT_BUFFER_IN_FW
!endif

View File

@ -68,17 +68,11 @@ record (POR) configuration.
The following list are the currently defined build flags (if any) that may be passed to the `build` command
(e.g. -D FLAG=VALUE).
* `ALLOCATE_CONTEXT_BUFFER_IN_FW` - Allocates the context buffer for each PRM handler in the firmware instead of
the operating system (OS).
* NONE - No build flags are currently used.
Additional detail: The context buffer structure is defined in [PrmContextBuffer.h](PrmPkg/Include/PrmContextBuffer.h).
This structure can be instantiated by either firmware with a physical pointer to the buffer placed in the
`PRM_HANDLER_INFORMATION_STRUCT` for each handler wherein the OS would convert that physical pointer and pass it
as a virtual address pointer to each PRM handler. Alternatively, the context buffer can be allocated and populated
by the OS where it would get all the information to populate the context buffer from other structures.
The default is for the OS to allocate and populate the buffer. The alternative option of the firmware doing this
work is kept in the source code until broader OS testing is completed.
This structure is passed as the context buffer to PRM handlers. The structure actually passed to PRM handlers is
allocated and populated by the OS where it gets all the information to populate the context buffer from other structures.
## Overview
At a high-level, PRM can be viewed from three levels of granularity:

View File

@ -151,16 +151,7 @@ ContextBufferModuleConfigLibConstructor (
//
// Allocate and populate the context buffer
//
#ifdef ALLOCATE_CONTEXT_BUFFER_IN_FW
//
// The context buffer allocated in FW will continue being used at OS runtime so it must
// be a runtime services data buffer.
//
// This sample module uses a single context buffer for all the handlers
// Todo: This can be done more elegantly in the future. Likely though a library service.
//
PrmContextBuffer = AllocateRuntimeZeroPool (sizeof (*PrmContextBuffer));
#else
//
// This context buffer is not actually used by PRM handler at OS runtime. The OS will allocate
// the actual context buffer passed to the PRM handler.
@ -170,7 +161,6 @@ ContextBufferModuleConfigLibConstructor (
// PRM_HANDLER_INFORMATION_STRUCT and PRM_MODULE_INFORMATION_STRUCT respectively for the PRM handler.
//
PrmContextBuffer = AllocateZeroPool (sizeof (*PrmContextBuffer));
#endif
ASSERT (PrmContextBuffer != NULL);
if (PrmContextBuffer == NULL) {
Status = EFI_OUT_OF_RESOURCES;