/** @file | |
EFI MM Access PPI definition. | |
This PPI is used to control the visibility of the MMRAM on the platform. | |
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 | |
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
@par Revision Reference: | |
This PPI is introduced in PI Version 1.5. | |
**/ | |
#ifndef _MM_ACCESS_PPI_H_ | |
#define _MM_ACCESS_PPI_H_ | |
#define EFI_PEI_MM_ACCESS_PPI_GUID \ | |
{ 0x268f33a9, 0xcccd, 0x48be, { 0x88, 0x17, 0x86, 0x5, 0x3a, 0xc3, 0x2e, 0xd6 }} | |
typedef struct _EFI_PEI_MM_ACCESS_PPI EFI_PEI_MM_ACCESS_PPI; | |
/** | |
Opens the MMRAM area to be accessible by a PEIM. | |
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. | |
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. | |
@param This The EFI_PEI_MM_ACCESS_PPI instance. | |
@param DescriptorIndex The region of MMRAM to Open. | |
@retval EFI_SUCCESS The operation was successful. | |
@retval EFI_UNSUPPORTED The system does not support opening and closing of MMRAM. | |
@retval EFI_DEVICE_ERROR MMRAM cannot be opened, perhaps because it is locked. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_PEI_MM_OPEN)( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN EFI_PEI_MM_ACCESS_PPI *This, | |
IN UINTN DescriptorIndex | |
); | |
/** | |
Inhibits access to the MMRAM. | |
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. | |
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. | |
@param This The EFI_PEI_MM_ACCESS_PPI instance. | |
@param DescriptorIndex The region of MMRAM to Close. | |
@retval EFI_SUCCESS The operation was successful. | |
@retval EFI_UNSUPPORTED The system does not support opening and closing of MMRAM. | |
@retval EFI_DEVICE_ERROR MMRAM cannot be closed. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_PEI_MM_CLOSE)( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN EFI_PEI_MM_ACCESS_PPI *This, | |
IN UINTN DescriptorIndex | |
); | |
/** | |
This function prohibits access to the MMRAM region. This function is usually implemented such | |
that it is a write-once operation. | |
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. | |
@param This The EFI_PEI_MM_ACCESS_PPI instance. | |
@param DescriptorIndex The region of MMRAM to Lock. | |
@retval EFI_SUCCESS The operation was successful. | |
@retval EFI_UNSUPPORTED The system does not support opening and closing of MMRAM. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_PEI_MM_LOCK)( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN EFI_PEI_MM_ACCESS_PPI *This, | |
IN UINTN DescriptorIndex | |
); | |
/** | |
Queries the memory controller for the possible regions that will support MMRAM. | |
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. | |
@param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. | |
@param This The EFI_PEI_MM_ACCESS_PPI instance. | |
@param 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. | |
@param MmramMap A pointer to the buffer in which firmware places the current memory map. The map is | |
an array of EFI_MMRAM_DESCRIPTORs | |
@retval EFI_SUCCESS The chipset supported the given resource. | |
@retval EFI_BUFFER_TOO_SMALL The MmramMap parameter was too small. The current | |
buffer size needed to hold the memory map is returned in | |
MmramMapSize. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_PEI_MM_CAPABILITIES)( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN EFI_PEI_MM_ACCESS_PPI *This, | |
IN OUT UINTN *MmramMapSize, | |
IN OUT EFI_MMRAM_DESCRIPTOR *MmramMap | |
); | |
/// | |
/// EFI MM Access PPI is used to control the visibility of the MMRAM on the platform. | |
/// It abstracts the location and characteristics of MMRAM. The platform should report | |
/// all MMRAM via EFI_PEI_MM_ACCESS_PPI. The expectation is that the north bridge or | |
/// memory controller would publish this PPI. | |
/// | |
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; | |
}; | |
extern EFI_GUID gEfiPeiMmAccessPpiGuid; | |
#endif |