2020-04-07 20:00:28 +02:00
|
|
|
/** @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)
|
|
|
|
|
2020-06-09 01:32:34 +02:00
|
|
|
//
|
|
|
|
// 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;
|
|
|
|
|
2020-04-07 20:00:28 +02:00
|
|
|
//
|
|
|
|
// 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;
|
2020-06-09 01:32:34 +02:00
|
|
|
|
|
|
|
///
|
|
|
|
/// 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;
|
2020-04-07 20:00:28 +02:00
|
|
|
} PRM_MODULE_CONTEXT_BUFFERS;
|
|
|
|
|
|
|
|
#pragma pack(pop)
|
|
|
|
|
|
|
|
#endif
|