/** @file | |
The Legacy Region Protocol controls the read, write and boot-lock attributes for | |
the region 0xC0000 to 0xFFFFF. | |
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
@par Revision Reference: | |
This Protocol is defined in UEFI Platform Initialization Specification 1.2 | |
Volume 5: Standards | |
**/ | |
#ifndef __LEGACY_REGION2_H__ | |
#define __LEGACY_REGION2_H__ | |
#define EFI_LEGACY_REGION2_PROTOCOL_GUID \ | |
{ \ | |
0x70101eaf, 0x85, 0x440c, {0xb3, 0x56, 0x8e, 0xe3, 0x6f, 0xef, 0x24, 0xf0 } \ | |
} | |
typedef struct _EFI_LEGACY_REGION2_PROTOCOL EFI_LEGACY_REGION2_PROTOCOL; | |
/** | |
Modify the hardware to allow (decode) or disallow (not decode) memory reads in a region. | |
If the On parameter evaluates to TRUE, this function enables memory reads in the address range | |
Start to (Start + Length - 1). | |
If the On parameter evaluates to FALSE, this function disables memory reads in the address range | |
Start to (Start + Length - 1). | |
@param This[in] Indicates the EFI_LEGACY_REGION2_PROTOCOL instance. | |
@param Start[in] The beginning of the physical address of the region whose attributes | |
should be modified. | |
@param Length[in] The number of bytes of memory whose attributes should be modified. | |
The actual number of bytes modified may be greater than the number | |
specified. | |
@param Granularity[out] The number of bytes in the last region affected. This may be less | |
than the total number of bytes affected if the starting address | |
was not aligned to a region's starting address or if the length | |
was greater than the number of bytes in the first region. | |
@param On[in] Decode / Non-Decode flag. | |
@retval EFI_SUCCESS The region's attributes were successfully modified. | |
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_LEGACY_REGION2_DECODE)( | |
IN EFI_LEGACY_REGION2_PROTOCOL *This, | |
IN UINT32 Start, | |
IN UINT32 Length, | |
OUT UINT32 *Granularity, | |
IN BOOLEAN *On | |
); | |
/** | |
Modify the hardware to disallow memory writes in a region. | |
This function changes the attributes of a memory range to not allow writes. | |
@param This[in] Indicates the EFI_LEGACY_REGION2_PROTOCOL instance. | |
@param Start[in] The beginning of the physical address of the region whose | |
attributes should be modified. | |
@param Length[in] The number of bytes of memory whose attributes should be modified. | |
The actual number of bytes modified may be greater than the number | |
specified. | |
@param Granularity[out] The number of bytes in the last region affected. This may be less | |
than the total number of bytes affected if the starting address was | |
not aligned to a region's starting address or if the length was | |
greater than the number of bytes in the first region. | |
@retval EFI_SUCCESS The region's attributes were successfully modified. | |
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_LEGACY_REGION2_LOCK)( | |
IN EFI_LEGACY_REGION2_PROTOCOL *This, | |
IN UINT32 Start, | |
IN UINT32 Length, | |
OUT UINT32 *Granularity | |
); | |
/** | |
Modify the hardware to disallow memory attribute changes in a region. | |
This function makes the attributes of a region read only. Once a region is boot-locked with this | |
function, the read and write attributes of that region cannot be changed until a power cycle has | |
reset the boot-lock attribute. Calls to Decode(), Lock() and Unlock() will have no effect. | |
@param This[in] Indicates the EFI_LEGACY_REGION2_PROTOCOL instance. | |
@param Start[in] The beginning of the physical address of the region whose | |
attributes should be modified. | |
@param Length[in] The number of bytes of memory whose attributes should be modified. | |
The actual number of bytes modified may be greater than the number | |
specified. | |
@param Granularity[out] The number of bytes in the last region affected. This may be less | |
than the total number of bytes affected if the starting address was | |
not aligned to a region's starting address or if the length was | |
greater than the number of bytes in the first region. | |
@retval EFI_SUCCESS The region's attributes were successfully modified. | |
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region. | |
@retval EFI_UNSUPPORTED The chipset does not support locking the configuration registers in | |
a way that will not affect memory regions outside the legacy memory | |
region. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_LEGACY_REGION2_BOOT_LOCK)( | |
IN EFI_LEGACY_REGION2_PROTOCOL *This, | |
IN UINT32 Start, | |
IN UINT32 Length, | |
OUT UINT32 *Granularity OPTIONAL | |
); | |
/** | |
Modify the hardware to allow memory writes in a region. | |
This function changes the attributes of a memory range to allow writes. | |
@param This[in] Indicates the EFI_LEGACY_REGION2_PROTOCOL instance. | |
@param Start[in] The beginning of the physical address of the region whose | |
attributes should be modified. | |
@param Length[in] The number of bytes of memory whose attributes should be modified. | |
The actual number of bytes modified may be greater than the number | |
specified. | |
@param Granularity[out] The number of bytes in the last region affected. This may be less | |
than the total number of bytes affected if the starting address was | |
not aligned to a region's starting address or if the length was | |
greater than the number of bytes in the first region. | |
@retval EFI_SUCCESS The region's attributes were successfully modified. | |
@retval EFI_INVALID_PARAMETER If Start or Length describe an address not in the Legacy Region. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_LEGACY_REGION2_UNLOCK)( | |
IN EFI_LEGACY_REGION2_PROTOCOL *This, | |
IN UINT32 Start, | |
IN UINT32 Length, | |
OUT UINT32 *Granularity | |
); | |
typedef enum { | |
LegacyRegionDecoded, ///< This region is currently set to allow reads. | |
LegacyRegionNotDecoded, ///< This region is currently set to not allow reads. | |
LegacyRegionWriteEnabled, ///< This region is currently set to allow writes. | |
LegacyRegionWriteDisabled, ///< This region is currently set to write protected. | |
LegacyRegionBootLocked, ///< This region's attributes are locked, cannot be modified until | |
///< after a power cycle. | |
LegacyRegionNotLocked ///< This region's attributes are not locked. | |
} EFI_LEGACY_REGION_ATTRIBUTE; | |
typedef struct { | |
/// | |
/// The beginning of the physical address of this | |
/// region. | |
/// | |
UINT32 Start; | |
/// | |
/// The number of bytes in this region. | |
/// | |
UINT32 Length; | |
/// | |
/// Attribute of the Legacy Region Descriptor that | |
/// describes the capabilities for that memory region. | |
/// | |
EFI_LEGACY_REGION_ATTRIBUTE Attribute; | |
/// | |
/// Describes the byte length programmability | |
/// associated with the Start address and the specified | |
/// Attribute setting. | |
UINT32 Granularity; | |
} EFI_LEGACY_REGION_DESCRIPTOR; | |
/** | |
Get region information for the attributes of the Legacy Region. | |
This function is used to discover the granularity of the attributes for the memory in the legacy | |
region. Each attribute may have a different granularity and the granularity may not be the same | |
for all memory ranges in the legacy region. | |
@param This[in] Indicates the EFI_LEGACY_REGION2_PROTOCOL instance. | |
@param DescriptorCount[out] The number of region descriptor entries returned in the Descriptor | |
buffer. | |
@param Descriptor[out] A pointer to a pointer used to return a buffer where the legacy | |
region information is deposited. This buffer will contain a list of | |
DescriptorCount number of region descriptors. This function will | |
provide the memory for the buffer. | |
@retval EFI_SUCCESS The information structure was returned. | |
@retval EFI_UNSUPPORTED This function is not supported. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_LEGACY_REGION_GET_INFO)( | |
IN EFI_LEGACY_REGION2_PROTOCOL *This, | |
OUT UINT32 *DescriptorCount, | |
OUT EFI_LEGACY_REGION_DESCRIPTOR **Descriptor | |
); | |
/// | |
/// The EFI_LEGACY_REGION2_PROTOCOL is used to abstract the hardware control of the memory | |
/// attributes of the Option ROM shadowing region, 0xC0000 to 0xFFFFF. | |
/// There are three memory attributes that can be modified through this protocol: read, write and | |
/// boot-lock. These protocols may be set in any combination. | |
/// | |
struct _EFI_LEGACY_REGION2_PROTOCOL { | |
EFI_LEGACY_REGION2_DECODE Decode; | |
EFI_LEGACY_REGION2_LOCK Lock; | |
EFI_LEGACY_REGION2_BOOT_LOCK BootLock; | |
EFI_LEGACY_REGION2_UNLOCK UnLock; | |
EFI_LEGACY_REGION_GET_INFO GetInfo; | |
}; | |
extern EFI_GUID gEfiLegacyRegion2ProtocolGuid; | |
#endif |