123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /** @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 <PrmDataBuffer.h>
- #include <PrmMmio.h>
- #include <Uefi.h>
- #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
|