/** @file Definitions for the Platform Runtime Mechanism (PRM) context buffer structures. Copyright (c) Microsoft Corporation SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef PRM_CONTEXT_BUFFER_H_ #define PRM_CONTEXT_BUFFER_H_ #include #include #include #define PRM_CONTEXT_BUFFER_SIGNATURE SIGNATURE_32('P','R','M','C') #define PRM_CONTEXT_BUFFER_INTERFACE_VERSION 1 #pragma pack(push, 1) // // Associates an ACPI parameter buffer with a particular PRM handler in // a PRM module. // // If either the GUID or address are zero then neither value is used to // copy the ACPI parameter buffer address to the PRMT ACPI table. // typedef struct { EFI_GUID HandlerGuid; UINT64 AcpiParameterBufferAddress; } ACPI_PARAMETER_BUFFER_DESCRIPTOR; // // This is the context buffer structure that is passed to a PRM handler. // // At OS runtime, the OS will allocate and populate this structure and // place virtual addresses in the pointer fields. // // It is also reused internally in FW (in the PRM_MODULE_CONTEXT_BUFFERS structure) // to track context buffers within a given PRM module. In that internal usage, // the addresses will be physical addresses. // typedef struct { /// /// Signature of this interface. /// UINT32 Signature; /// /// Version of this interface. /// UINT16 Version; /// /// Reserved field. /// UINT16 Reserved; /// /// The GUID of the PRM handler represented by this context instance. /// EFI_GUID HandlerGuid; /// /// A virtual address pointer to the static data buffer allocated for /// the PRM handler represented by this context instance. /// /// The static buffer is intended to be populated in the PRM module /// configuration library and treated as read-only data at OS runtime. /// /// This pointer may be NULL if a static data buffer is not needed. /// PRM_DATA_BUFFER *StaticDataBuffer; /// /// A virtual address pointer to an array of PRM_RUNTIME_MMIO_RANGE /// structures that describe MMIO physical address ranges mapped to /// virtual memory addresses for access at OS runtime. /// /// This pointer is ignored in firmware internal usage of this structure /// as this field is present to allow a PRM handler to get the list /// of MMIO ranges described as accessible by its PRM module. /// /// The module list of MMIO ranges is specified by the PRM configuration /// code as a single array in PRM_MODULE_CONTEXT_BUFFERS. /// /// The OS is responsible for ensuring the pointer to the array in this /// structure is converted to a virtual address during construction of /// of the context buffer in the OS. /// /// This pointer may be NULL if runtime memory ranges are not needed. /// PRM_RUNTIME_MMIO_RANGES *RuntimeMmioRanges; } PRM_CONTEXT_BUFFER; // // A firmware internal data structure used to track context buffer and // runtime MMIO range usage across a PRM module. // typedef struct { /// /// The GUID of the PRM module. /// EFI_GUID ModuleGuid; /// /// The number of PRM context buffers in ContextBuffers[]. /// This count should equal the number of PRM handlers in the module being configured. /// UINTN BufferCount; /// /// A pointer to an array of PRM context buffers /// PRM_CONTEXT_BUFFER *Buffer; /// The MMIO ranges are defined in the firmware boot environment. /// The addresses within the PRM_RUNTIME_MMIO_RANGES structure will /// be converted to virtual addresses by firmware. /// /// A physical address pointer to an array of PRM_RUNTIME_MMIO_RANGE /// structures that describe memory ranges that need to be mapped to /// virtual memory addresses for access at OS runtime. /// /// This is a consolidated array of MMIO ranges accessed by any PRM /// handler in the PRM module at OS runtime. The MMIO range physical /// addresses registered here will automatically be converted to the /// corresponding virtual address in the structure by PRM infrastructure /// code. No action is required to convert MMIO range base physical /// addresses to virtual addresses by either the PRM configuration code /// or the OS. /// /// This pointer may be NULL if runtime memory ranges are not needed. /// PRM_RUNTIME_MMIO_RANGES *RuntimeMmioRanges; /// /// The number of ACPI parameter buffer descriptors in the array /// AcpiParameterBufferDescriptors /// UINTN AcpiParameterBufferDescriptorCount; /// /// A pointer to an array of ACPI parameter buffer descriptors. PRM module /// configuration code uses this structure to associate a specific PRM /// handler with an ACPI parameter buffer. /// /// An ACPI parameter buffer is a parameter buffer allocated by the PRM /// module configuration code to be used by ACPI as a parameter buffer /// to the associated PRM handler at OS runtime. /// /// This buffer is not required if: /// 1. A parameter buffer is not used by a PRM handler at all /// 2. A parameter buffer is used but the PRM handler is never invoked /// from ACPI (it is directly called by an OS device driver for example) /// /// In case #2 above, the direct PRM handler is responsible for allocating /// a parameter buffer and passing that buffer to the PRM handler. /// /// A PRM module only needs to provide an ACPI_PARAMETER_BUFFER_DESCRIPTOR /// for each PRM handler that actually uses an ACPI parameter buffer. If /// no handlers use an ACPI parameter buffer this pointer should be NULL. /// ACPI_PARAMETER_BUFFER_DESCRIPTOR *AcpiParameterBufferDescriptors; } PRM_MODULE_CONTEXT_BUFFERS; #pragma pack(pop) #endif