mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-30 09:04:07 +02:00
UefiCpuPkg: RISC-V: MMU: Support Svpbmt extension
The GCD EFI_MEMORY_UC and EFI_MEMORY_WC memory attributes will be supported when Svpbmt extension available. Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Ray Ni <ray.ni@intel.com> Signed-off-by: Tuan Phan <tphan@ventanamicro.com> Reviewed-by: Sunil V L <sunilvl@ventanamicro.com>
This commit is contained in:
parent
6ddfbeb0d6
commit
3d5352d934
@ -36,6 +36,11 @@
|
|||||||
#define PTE_PPN_SHIFT 10
|
#define PTE_PPN_SHIFT 10
|
||||||
#define RISCV_MMU_PAGE_SHIFT 12
|
#define RISCV_MMU_PAGE_SHIFT 12
|
||||||
|
|
||||||
|
#define RISCV_CPU_FEATURE_PBMT_BITMASK BIT2
|
||||||
|
#define PTE_PBMT_NC BIT61
|
||||||
|
#define PTE_PBMT_IO BIT62
|
||||||
|
#define PTE_PBMT_MASK (PTE_PBMT_NC | PTE_PBMT_IO)
|
||||||
|
|
||||||
STATIC UINTN mModeSupport[] = { SATP_MODE_SV57, SATP_MODE_SV48, SATP_MODE_SV39, SATP_MODE_OFF };
|
STATIC UINTN mModeSupport[] = { SATP_MODE_SV57, SATP_MODE_SV48, SATP_MODE_SV39, SATP_MODE_OFF };
|
||||||
STATIC UINTN mMaxRootTableLevel;
|
STATIC UINTN mMaxRootTableLevel;
|
||||||
STATIC UINTN mBitPerLevel;
|
STATIC UINTN mBitPerLevel;
|
||||||
@ -488,31 +493,81 @@ UpdateRegionMapping (
|
|||||||
Convert GCD attribute to RISC-V page attribute.
|
Convert GCD attribute to RISC-V page attribute.
|
||||||
|
|
||||||
@param GcdAttributes The GCD attribute.
|
@param GcdAttributes The GCD attribute.
|
||||||
|
@param RiscVAttributes The pointer of RISC-V page attribute.
|
||||||
|
|
||||||
@return The RISC-V page attribute.
|
@retval EFI_INVALID_PARAMETER The RiscVAttributes is NULL or cache type mask not valid.
|
||||||
|
@retval EFI_SUCCESS The operation succesfully.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
STATIC
|
STATIC
|
||||||
UINT64
|
EFI_STATUS
|
||||||
GcdAttributeToPageAttribute (
|
GcdAttributeToPageAttribute (
|
||||||
IN UINT64 GcdAttributes
|
IN UINT64 GcdAttributes,
|
||||||
|
OUT UINT64 *RiscVAttributes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT64 RiscVAttributes;
|
UINT64 CacheTypeMask;
|
||||||
|
BOOLEAN PmbtExtEnabled;
|
||||||
|
|
||||||
RiscVAttributes = RISCV_PG_R | RISCV_PG_W | RISCV_PG_X;
|
if (RiscVAttributes == NULL) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
*RiscVAttributes = RISCV_PG_R | RISCV_PG_W | RISCV_PG_X;
|
||||||
|
|
||||||
|
PmbtExtEnabled = FALSE;
|
||||||
|
if ((PcdGet64 (PcdRiscVFeatureOverride) & RISCV_CPU_FEATURE_PBMT_BITMASK) != 0) {
|
||||||
|
PmbtExtEnabled = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
// Determine protection attributes
|
// Determine protection attributes
|
||||||
if ((GcdAttributes & EFI_MEMORY_RO) != 0) {
|
if ((GcdAttributes & EFI_MEMORY_RO) != 0) {
|
||||||
RiscVAttributes &= ~(UINT64)(RISCV_PG_W);
|
*RiscVAttributes &= ~(UINT64)(RISCV_PG_W);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process eXecute Never attribute
|
// Process eXecute Never attribute
|
||||||
if ((GcdAttributes & EFI_MEMORY_XP) != 0) {
|
if ((GcdAttributes & EFI_MEMORY_XP) != 0) {
|
||||||
RiscVAttributes &= ~(UINT64)RISCV_PG_X;
|
*RiscVAttributes &= ~(UINT64)RISCV_PG_X;
|
||||||
}
|
}
|
||||||
|
|
||||||
return RiscVAttributes;
|
CacheTypeMask = GcdAttributes & EFI_CACHE_ATTRIBUTE_MASK;
|
||||||
|
if ((CacheTypeMask != 0) &&
|
||||||
|
(((CacheTypeMask - 1) & CacheTypeMask) != 0))
|
||||||
|
{
|
||||||
|
DEBUG ((
|
||||||
|
DEBUG_ERROR,
|
||||||
|
"%a: More than one bit set in cache type mask (0x%LX)\n",
|
||||||
|
__func__,
|
||||||
|
CacheTypeMask
|
||||||
|
));
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (CacheTypeMask) {
|
||||||
|
case EFI_MEMORY_UC:
|
||||||
|
if (PmbtExtEnabled) {
|
||||||
|
*RiscVAttributes |= PTE_PBMT_IO;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case EFI_MEMORY_WC:
|
||||||
|
if (PmbtExtEnabled) {
|
||||||
|
*RiscVAttributes |= PTE_PBMT_NC;
|
||||||
|
} else {
|
||||||
|
DEBUG ((
|
||||||
|
DEBUG_VERBOSE,
|
||||||
|
"%a: EFI_MEMORY_WC set but Pmbt extension not available\n",
|
||||||
|
__func__
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Default PMA mode
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -536,28 +591,37 @@ RiscVSetMemoryAttributes (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT64 PageAttributesSet;
|
UINT64 PageAttributesSet;
|
||||||
|
UINT64 PageAttributesClear;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
PageAttributesSet = GcdAttributeToPageAttribute (Attributes);
|
Status = GcdAttributeToPageAttribute (Attributes, &PageAttributesSet);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
if (!RiscVMmuEnabled ()) {
|
if (!RiscVMmuEnabled ()) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG (
|
PageAttributesClear = PTE_ATTRIBUTES_MASK;
|
||||||
(
|
if ((PcdGet64 (PcdRiscVFeatureOverride) & RISCV_CPU_FEATURE_PBMT_BITMASK) != 0) {
|
||||||
|
PageAttributesClear |= PTE_PBMT_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG ((
|
||||||
DEBUG_VERBOSE,
|
DEBUG_VERBOSE,
|
||||||
"%a: Set %llX page attribute 0x%X\n",
|
"%a: %LX: set attributes 0x%LX, clear attributes 0x%LX\n",
|
||||||
__func__,
|
__func__,
|
||||||
BaseAddress,
|
BaseAddress,
|
||||||
PageAttributesSet
|
PageAttributesSet,
|
||||||
)
|
PageAttributesClear
|
||||||
);
|
));
|
||||||
|
|
||||||
return UpdateRegionMapping (
|
return UpdateRegionMapping (
|
||||||
BaseAddress,
|
BaseAddress,
|
||||||
Length,
|
Length,
|
||||||
PageAttributesSet,
|
PageAttributesSet,
|
||||||
PTE_ATTRIBUTES_MASK,
|
PageAttributesClear,
|
||||||
(UINT64 *)RiscVGetRootTranslateTable (),
|
(UINT64 *)RiscVGetRootTranslateTable (),
|
||||||
TRUE
|
TRUE
|
||||||
);
|
);
|
||||||
|
@ -28,3 +28,4 @@
|
|||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gUefiCpuPkgTokenSpaceGuid.PcdCpuRiscVMmuMaxSatpMode ## CONSUMES
|
gUefiCpuPkgTokenSpaceGuid.PcdCpuRiscVMmuMaxSatpMode ## CONSUMES
|
||||||
|
gEfiMdePkgTokenSpaceGuid.PcdRiscVFeatureOverride ## CONSUMES
|
||||||
|
Loading…
x
Reference in New Issue
Block a user