6. PI PEI PPIs¶
6.1. MM Access PPI¶
6.1.1. EFI_PEI_MM_ACCESS_PPI¶
Summary
This PPI is used to control the visibility of the MMRAM on the platform.
GUID
#define EFI_PEI_MM_ACCESS_PROTOCOL_GUID { \\
0x268f33a9, 0xcccd, 0x48be, { 0x88, 0x17, 0x86, 0x5, 0x3a, 0xc3, 0x2e, 0xd6 } \
}
PPI Structure
typedef struct _EFI_PEI_MM_ACCESS_PPI {
EFI_PEI_MM_OPEN Open;
EFI_PEI_MM_CLOSE Close;
EFI_PEI_MM_LOCK Lock;
EFI_PEI_MM_CAPABILITIES GetCapabilities;
BOOLEAN LockState;
BOOLEAN OpenState;
} EFI_PEI_MM_ACCESS_PPI;
Parameters
- Open
Opens the MMRAM. See the Open() function description.
- Close
Closes th MMRAM. See the Close() function description.
- Lock
Locks the MMRAM. See the Lock() function description.
- GetCapabilities
Gets information about all MMRAM regions. See the GetCapabilities() function description.
- LockState
Indicates the current state of the MMRAM. Set to TRUE if MMRAM is locked.
- OpenState
Indicates the current state of the MMRAM. Set to TRUE if MMRAM is open.
Description
The EFI_PEI_MM_ACCESS_PPI abstracts the location and characteristics of MMRAM. The principal functionality found in the memory controller includes the following:
Exposing the MMRAM to all non-MM agents, or the “open” state
Shrouding the MMRAM to all but the MM agents, or the “closed” state
Preserving the system integrity, or “locking” the MMRAM, such that the settings cannot be perturbed by either boot service or runtime agents
6.1.2. EFI_PEI_MM_ACCESS_PPI.Open()¶
Summary
Opens the* MMRAM area to be accessible by a PEIM.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_OPEN) (
IN EFI_PEI_SERVICES **PeiServices,
IN PEI_MM_ACCESS_PPI *This,
IN UINTN DescriptorIndex
);
Parameters
- PeiServices
An indirect pointer to the PEI Services Table published by the PEI Foundation.
- This
The EFI_PEI_MM_ACCESS_PPI instance.
- DescriptorIndex
The region of MMRAM to Open.
Description
This function “opens” MMRAM so that it is visible while not inside of MM. The function should return EFI_UNSUPPORTED if the hardware does not support hiding of MMRAM. The function should return EFI_DEVICE_ERROR if the MMRAM configuration is locked.
Status Codes Returned
EFI_SUCCESS |
The operation was successful |
EFI_UNSUPPORTED |
The system does not support opening and closing of MMRAM |
EFI_DEVICE_ERROR |
MMRAM cannot be opened perhaps because it is locked |
6.1.3. EFI_PEI_MM_ACCESS_PPI.Close()¶
Summary
Inhibits access to the MMRAM.
Prototype
typedef
EFI_STATUS
(EFIAPI EFI_PEI_MM_CLOSE)(
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_MM_ACCESS_PPI *This
IN UINTN DescriptorIndex
);
Parameters
- PeiServices
An indirect pointer to the PEI Services Table published by the PEI Foundation.
- This
The EFI_PEI_MM_ACCESS_PPI instance.
- DescriptorIndex
The region of MMRAM to Open.
Description
This function “closes” MMRAM so that it is not visible while outside of MM. The function should return EFI_UNSUPPORTED if the hardware does not support hiding of MMRAM.
Status Codes Returned
EFI_SUCCESS |
The operation was successful |
EFI_UNSUPPORTED |
The system does not support opening and closing of MMRAM |
EFI_DEVICE_ERROR |
MMRAM cannot be closed |
6.1.4. EFI_PEI_MM_ACCESS_PPI.Lock()¶
Summary
This function prohibits access to the MMRAM region. This function is usually implemented such that it is a write-once operation.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_LOCK) (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_MM_ACCESS_PPI *This
IN UINTN DescriptorIndex
);
Parameters
- PeiServices
An indirect pointer to the PEI Services Table published by the PEI Foundation.
- This
The EFI_PEI_MM_ACCESS_PPI instance.
- DescriptorIndex
The region of MMRAM to Lock.
Description
Inhibits access to the MMRAM.
Status Codes Returned
EFI_SUCCESS |
The device was successfully locked. |
EFI_UNSUPPORTED |
The system does not support locking of MMRAM. |
6.1.5. EFI_PEI_MM_ACCESS_PPI.GetCapabilities()¶
Summary
Queries the memory controller for the regions that will support MMRAM.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_CAPABILITIES) (
IN EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_MM_ACCESS_PPI *This,
IN OUT UINTN *MmramMapSize,
IN OUT EFI_MMRAM_DESCRIPTOR *MmramMap
);
Parameters
- PeiServices
An indirect pointer to the PEI Services Table published by the PEI Foundation.
- This
The EFI_PEI_MM_ACCESS_PPI instance.
- MmramMapSize
A pointer to the size, in bytes, of the MmramMemoryMap buffer. On input, this value is the size of the buffer that is allocated by the caller. On output, it is the size of the buffer that was returned by the firmware if the buffer was large enough, or, if the buffer was too small, the size of the buffer that is needed to contain the map.
- MmramMap
A pointer to the buffer in which firmware places the current memory map. The map is an array of EFI_MMRAM_DESCRIPTORs
Description
This function describes the MMRAM regions.
This data structure forms the contract between the MM_ACCESS and MM_IPL drivers. There is an ambiguity when any MMRAM region is remapped. For example, on some chipsets, some MMRAM regions can be initialized at one physical address but is later accessed at another processor address. There is currently no way for the MM IPL driver to know that it must use two different addresses depending on what it is trying to do. As a result, initial configuration and loading can use the physical address PhysicalStart while MMRAM is open. However, once the region has been closed and needs to be accessed by agents in MM, the CpuStart address must be used.
This PPI publishes the available memory that the chipset can shroud for the use of installing code.
These regions serve the dual purpose of describing which regions have been open, closed, or locked. In addition, these regions may include overlapping memory ranges, depending on the chipset implementation. The latter might include a chipset that supports T-SEG, where memory near the top of the physical DRAM can be allocated for MMRAM too.
The key thing to note is that the regions that are described by the PPI are a subset of the capabilities of the hardware.
Status Codes Returned
EFI_SUCCESS |
The chipset supported the given resource |
EFI_BUFFER_TOO_SMALL |
The MmramMap parameter was too small The current buffer size needed to hold the memory map is returned in MmramMapSize |
6.2. MM Control PPI¶
6.2.1. EFI_PEI_MM_CONTROL_PPI¶
Summary
This PPI is used initiate synchronous MMI activations. This PPI could be published by a processor driver to abstract the MMI IPI or a driver which abstracts the ASIC that is supporting the APM port.
Because of the possibility of performing MMI IPI transactions, the ability to generate this event from a platform chipset agent is an optional capability for both IA-32 and x64-based systems.
GUID
#define EFI_PEI_MM_CONTROL_PPI_GUID { \\
0x61c68702, 0x4d7e, 0x4f43, { 0x8d, 0xef, 0xa7, 0x43, 0x5, 0xce, 0x74, 0xc5 } \
}
PPI Structure
typedef struct _EFI_PEI_MM_CONTROL_PPI {
EFI_PEI_MM_ACTIVATE Trigger;
EFI_PEI_MM_DEACTIVATE Clear;
} EFI_PEI_MM_CONTROL_PPI;
Parameters
- Trigger
Initiates the MMI activation. See the Trigger() function description.
- Clear
Quiesces the MMI activation. See the Clear() function description.
Description
The EFI_PEI_MM_CONTROL_PPI is produced by a PEIM. It provides an abstraction of the platform hardware that generates an MMI. There are often I/O ports that, when accessed, will generate the MMI. Also, the hardware optionally supports the periodic generation of these signals.
6.2.2. EFI_PEI_MM_CONTROL_PPI.Trigger()¶
Summary
Invokes PPI activation from the PI PEI environment.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_ACTIVATE) (
IN EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_MM_CONTROL_PPI *This,
IN OUT INT8 *ArgumentBuffer OPTIONAL,
IN OUT UINTN *ArgumentBufferSize OPTIONAL,
IN BOOLEAN Periodic OPTIONAL,
IN UINTN ActivationInterval OPTIONAL
);
Parameters
- PeiServices
An indirect pointer to the PEI Services Table published by the PEI Foundation.
- This
The EFI_PEI_MM_CONTROL_PPI instance.
- ArgumentBuffer
The value passed to the MMI handler. This value corresponds to the SwMmiInputValue in the RegisterContext parameter for the Register() function in the EFI_MM_SW_DISPATCH_PROTOCOL and in the Context parameter in the call to the DispatchFunction , see section 6.2.
- ArgumentBufferSize
The size of the data passed in ArgumentBuffer or NULL if ArgumentBuffer is NULL .
- Periodic
Optional mechanism to engender a periodic stream.
- ActivationInterval
Optional parameter to repeat at this period one time or, if the Periodic Boolean is set, periodically.
Description
This function generates an MMI.
Status Codes Returned
EFI_SUCCESS |
The MMI has been engendered. |
EFI_DEVICE_ERROR |
The timing is unsupported. |
EFI_INVALID_PARAMETER |
The activation period is unsupported. |
EFI_INVALID_PARAMETER |
The last periodic activation has not been cleared. |
EFI_NOT_STARTED |
The MM base service has not been initialized. |
6.2.3. EFI_PEI_MM_CONTROL_PPI.Clear()¶
Summary
Clears any system state that was created in response to the Trigger() call.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_DEACTIVATE) (
IN EFI_PEI_SERVICES **PeiServices,
IN CONST EFI_PEI_MM_CONTROL_PPI *This,
IN BOOLEAN Periodic OPTIONAL
);
Parameters
- This
The EFI_PEI_MM_CONTROL_PPI instance.
- Periodic
Optional parameter to repeat at this period one time or, if the Periodic Boolean is set, periodically.
Description
This function acknowledges and causes the deassertion of the MMI activation source. that was initiated by a preceding Trigger invocation. The results of this function update the software state of the communication infrastructure in the PEIM code, but it is ignorable from the perspective of the hardware state, though. This distinction stems from the fact that many implementations clear the hardware acknowledge in the MM-resident infrastructure itself and may also have other actions using that same activation hardware generated by MM drivers. This clear-in-MM distinction also avoids having the possible pathology of an asynchronous MMI being received in the time window between the RSM instruction (or other means of exiting MM) followed the flows engendered by the Trigger and the subsequent non-MM resident PEIM code invocation of the Clear .
Status Codes Returned
EFI_SUCCESS |
The MMI has been engendered |
EFI_DEVICE_ERROR |
The source could not be cleared |
EFI_INVALID_PARAMETER |
The service did not support the Periodic input argument |
6.3. EFI DELAYED DISPATCH PPI (Required)¶
6.3.1. EFI_DELAYED_DISPATCH_PPI (Required)¶
Summary
Provide timed event service in PEI
GUID
#define EFI_DELAYED_DISPATCH_PPI_GUID \\
{ \
0x869c711d, 0x649c, 0x44fe, { 0x8b, 0x9e, 0x2c, 0xbb, 0x29,
0x11, 0xc3, 0xe6} } \
}
PPI Interface Structure
struct _EFI_DELAYED_DISPATCH_PPI {
EFI_DELAYED_DISPATCH_REGISTER Register;
EFI_DELAYED_DISPATCH WAIT_ON_EVENT WaitOnEvent;
};
Parameters
- Register
Register a callback to be called after a minimum delay has occurred.
- WaitOnEvent
Pause current process and allow other components to continue to dispatch until all entries with specified “Unique ID” have completed.
Description
Define a time based event mechanism for PEI (Pei Delayed Dispatch):
Eliminate spin loops for timing. Instead of blocking for 50 or 100 ms, the driver would request callbacks after 50ms (or 100ms) and allow other PEIM’s to dispatch. Each loop through the PEI dispatcher will attempt to dispatch each of the queued delayed dispatch requests.
Method to schedule a callback after a minimum delay, not a real time callback. Maintains a 64 bit “State” for use by the callback.
PPI has only one function - Register, to register a function to be called after the required delay with the current value of “State”.
6.3.2. EFI_DELAYED_DISPATCH_PPI.Register()¶
Summary
Register a callback to be called after a minimum delay has occurred.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_DELAYED_DISPATCH_REGISTER)(
IN EFI_DELAYED_DISPATCH_PPI *This,
IN EFI_DELAYED_DISPATCH_FUNCTION Function,
IN UINT64 Context,
IN EFI_GUID *UniqueId OPTIONAL,
IN UINT32 Delay
);
Parameters
- This
Pointer to the EFI_DELAYED_DISPATCH_PPI instance.
- Function
Function to call back. The function prototype is defined in the “Related Definitions” below.
- Context
Context data.
- UniqueId
GUID for identifying the delayed dispatch request.
- Delay
Delay interval. This parameter describes a multiple of microseconds.
Description
This function is invoked by a PEIM to have a handler returned. The handler will be invoked after at the minimum of specified Delay. Note that if the Register
service is called with a Delay of zero, then the handler will be dispatched immediately. If the UniqueId is specified, this request will be marked with GUID for WaitOnEvent
usage.
Related Definitions
//***********************************************
// EFI_DELAYED_DISPATCH_FUNCTION
//***********************************************
typedef
VOID
(EFIAPI *EFI_DELAYED_DISPATCH_FUNCTION)(
IN OUT UINT64 *Context,
OUT UINT32 *NewDelay
);
- Context
Pointer to Context Data. Can be updated by routine.
- NewDelay
The new delay in us. Leave at 0 to unregister this callback. Upon return, if NewDelay is 0, the function is unregistered. If NewDelay is not zero, this routine will be called again after the new delay period.
Status Codes Returned (EFI_DELAYED_DISPATCH_PPI.Register)
EFI_SUCCESS |
Function successfully invoked |
EFI_INVALID_PARAMETER |
One of the arguments is not supported |
EFI_OUT_OF_RESOURCES |
No more entries |
6.3.3. EFI_DELAYED_DISPATCH_PPI.WaitOnEvent()¶
Summary
Pause current process and allow other components to continue to dispatch until all entries with specified “Unique ID” have completed.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_DELAYED_DISPATCH_WAIT ON EVENT)(
IN EFI_DELAYED_DISPATCH_PPI *This,
IN EFI_GUID UniqueId
);
Parameters
- This
Pointer to the EFI_DELAYED_DISPATCH_PPI instance.
- UniqueId
Delayed dispatch request ID the caller will wait on.
Description
This function is invoked by a PEIM to wait until all specified UniqueId events have been dispatched. The other events will continue to dispatch while this process is being paused.
Status Codes Returned
EFI_SUCCESS |
Function successfully invoked |
EFI_INVALID_PARAMETER |
One of the arguments is not supported |
6.4. MM Configuration PPI¶
6.4.1. EFI_PEI_MM_CONFIGURATION_PPI¶
Summary
Reports the portions of MMRAM regions which cannot be used for the MMRAM heap.
GUID
#define EFI_PEI_MM_CONFIGURATION_PPI_GUID { \
0xc109319, 0xc149, 0x450e, 0xa3, 0xe3, 0xb9, 0xba, 0xdd,
0x9d, 0xc3, 0xa4 \
}
PPI Structure
typedef struct _EFI_PEI_MM_CONFIGURATION_PPI {
EFI_MM_RESERVED_MMRAM_REGION *MmramReservedRegions* ;
EFI_PEI_MM_REGISTER_MM_ENTRY RegisterMmEntry;
} EFI_PEI_MM_CONFIGURATION_PPI;
Members
- MmramReservedRegions
A pointer to an array MMRAM ranges used by the initial MM entry code.
- RegisterMmEntry
A function to register the MM Foundation entry point.
Description
This PPI is a PPI published by a CPU PEIM to indicate which areas within MMRAM are reserved for use by the CPU for any purpose, such as stack, save state or MM entry point. If a platform chooses to let a CPU PEIM do MMRAM relocation, this PPI must be produced by this CPU PEIM.
The MmramReservedRegions points to an array of one or more EFI_MM_RESERVED_MMRAM_REGION structures, with the last structure having the MmramReservedSize set to 0. An empty array would contain only the last structure.
The RegisterMmEntry() function allows the MM IPL PEIM to register the MM Foundation entry point with the MM entry vector code.
6.4.2. EFI_PEI_MM_CONFIGURATION_PPI.RegisterMmEntry()¶
Summary
Register the MM Foundation entry point.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_REGISTER_MM_ENTRY) (
IN CONST EFI_PEI_MM_CONFIGURATION_PPI *This,
IN EFI_MM_ENTRY_POINT MmEntryPoint
)
Parameters
- This
The EFI_PEI_MM_CONFIGURATION_PPI instance.
- MmEntryPoint
MM Foundation entry point.
Description
This function registers the MM Foundation entry point with the processor code. This entry point will be invoked by the MM Processor entry code as defined in section 2.5.
Status Codes Returned
EFI_SUCCESS |
The entry-point was successfully registered. |
6.5. MM Communication PPI¶
6.5.1. EFI_PEI_MM_COMMUNICATION_PPI¶
Summary
This PPI provides a means of communicating between drivers outside of MM and MMI handlers inside of MM in PEI phase.
GUID
#define EFI_PEI_MM_COMMUNICATION_PPI_GUID { \
0xae933e1c, 0xcc47, 0x4e38, \
{ 0x8f, 0xe, 0xe2, 0xf6, 0x1d, 0x26, 0x5, 0xdf } \
}
PPI Structure
typedef struct _EFI_PEI_MM_COMMUNICATION_PPI {
EFI_PEI_MM_COMMUNICATE Communicate;
} EFI_PEI_MM_COMMUNICATION_PPI;
Members
- Communicate
Sends/receives a message for a registered handler. See the Communicate() function description.
Description
This PPI provides services for communicating between PEIM and a registered MMI handler.
6.5.2. EFI_PEI_MM_COMMUNICATION_PPI.Communicate()¶
Summary
Communicates with a registered handler.
Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_COMMUNICATE) (
IN CONST EFI_PEI_MM_COMMUNICATION_PPI *This,
IN OUT VOID *CommBuffer,
IN OUT UINTN *CommSize
);
Parameters
- This
The EFI_PEI_MM_COMMUNICATION_PPI instance.
- CommBuffer
Pointer to the buffer to convey into MMRAM.
- CommSize
The size of the data buffer being passed in. On exit, the size of data being returned. Zero if the handler does not wish to reply with any data.
Description
This function provides a service to send and receive messages from a registered PEI service. The EFI_PEI_MM_COMMUNICATION_PPI driver is responsible for doing any of the copies such that the data lives in PEI-service-accessible RAM.
A given implementation of the EFI_PEI_MM_COMMUNICATION_PPI may choose to use the EFI_MM_CONTROL_PPI for effecting the mode transition, or it may use some other method.
The agent invoking the communication interface must be physical/virtually 1:1 mapped.
To avoid confusion in interpreting frames, the CommBuffer parameter should always begin with EFI_MM_COMMUNICATE_HEADER . The header data is mandatory for messages sent into the MM agent.
Once inside of MM, the MM infrastructure will call all registered handlers with the same HandlerType as the GUID specified by HeaderGuid and the CommBuffer pointing to Data . This function is not reentrant.
Status Codes Returned
EFI_SUCCESS |
The message was successfully posted |
EFI_INVALID_PARAMETER |
The buffer was NULL |