mirror of https://github.com/acidanthera/audk.git
ArmPkg/ArmV7Mmu: introduce feature PCD to map normal memory non-shareable
Even though mapping normal memory (inner) shareable is usually the correct choice on coherent systems, it may be desirable in some cases to use non-shareable mappings for normal memory, e.g., when hardware managed coherency is not required and the memory system is not fully configured yet. So introduce a PCD PcdNormalMemoryNonshareableOverride that makes cacheable mappings of normal memory non-shareable. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18897 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
07070ecc76
commit
65ceda9173
|
@ -73,6 +73,12 @@
|
||||||
# Define if the GICv3 controller should use the GICv2 legacy
|
# Define if the GICv3 controller should use the GICv2 legacy
|
||||||
gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE|BOOLEAN|0x00000042
|
gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE|BOOLEAN|0x00000042
|
||||||
|
|
||||||
|
[PcdsFeatureFlag.ARM]
|
||||||
|
# Whether to map normal memory as non-shareable. FALSE is the safe choice, but
|
||||||
|
# TRUE may be appropriate to fix performance problems if you don't care about
|
||||||
|
# hardware coherency (i.e., no virtualization or cache coherent DMA)
|
||||||
|
gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride|FALSE|BOOLEAN|0x00000043
|
||||||
|
|
||||||
[PcdsFixedAtBuild.common]
|
[PcdsFixedAtBuild.common]
|
||||||
gArmTokenSpaceGuid.PcdTrustzoneSupport|FALSE|BOOLEAN|0x00000006
|
gArmTokenSpaceGuid.PcdTrustzoneSupport|FALSE|BOOLEAN|0x00000006
|
||||||
|
|
||||||
|
|
|
@ -48,3 +48,6 @@
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiCpuArchProtocolGuid
|
gEfiCpuArchProtocolGuid
|
||||||
|
|
||||||
|
[FeaturePcd.ARM]
|
||||||
|
gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride
|
||||||
|
|
|
@ -48,3 +48,6 @@
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiCpuArchProtocolGuid
|
gEfiCpuArchProtocolGuid
|
||||||
|
|
||||||
|
[FeaturePcd.ARM]
|
||||||
|
gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride
|
||||||
|
|
|
@ -80,6 +80,10 @@ PopulateLevel2PageTable (
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
|
||||||
|
PageAttributes &= ~TT_DESCRIPTOR_PAGE_S_SHARED;
|
||||||
|
}
|
||||||
|
|
||||||
// Check if the Section Entry has already been populated. Otherwise attach a
|
// Check if the Section Entry has already been populated. Otherwise attach a
|
||||||
// Level 2 Translation Table to it
|
// Level 2 Translation Table to it
|
||||||
if (*SectionEntry != 0) {
|
if (*SectionEntry != 0) {
|
||||||
|
@ -178,6 +182,10 @@ FillTranslationTable (
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
|
||||||
|
Attributes &= ~TT_DESCRIPTOR_SECTION_S_SHARED;
|
||||||
|
}
|
||||||
|
|
||||||
// Get the first section entry for this mapping
|
// Get the first section entry for this mapping
|
||||||
SectionEntry = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable, MemoryRegion->VirtualBase);
|
SectionEntry = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable, MemoryRegion->VirtualBase);
|
||||||
|
|
||||||
|
@ -266,15 +274,19 @@ ArmConfigureMmu (
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TTBRAttributes & TTBR_SHAREABLE) {
|
if (TTBRAttributes & TTBR_SHAREABLE) {
|
||||||
//
|
if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
|
||||||
// Unlike the S bit in the short descriptors, which implies inner shareable
|
TTBRAttributes ^= TTBR_SHAREABLE;
|
||||||
// on an implementation that supports two levels, the meaning of the S bit
|
} else {
|
||||||
// in the TTBR depends on the NOS bit, which defaults to Outer Shareable.
|
//
|
||||||
// However, we should only set this bit after we have confirmed that the
|
// Unlike the S bit in the short descriptors, which implies inner shareable
|
||||||
// implementation supports multiple levels, or else the NOS bit is UNK/SBZP
|
// on an implementation that supports two levels, the meaning of the S bit
|
||||||
//
|
// in the TTBR depends on the NOS bit, which defaults to Outer Shareable.
|
||||||
if (((ArmReadIdMmfr0 () >> 12) & 0xf) != 0) {
|
// However, we should only set this bit after we have confirmed that the
|
||||||
TTBRAttributes |= TTBR_NOT_OUTER_SHAREABLE;
|
// implementation supports multiple levels, or else the NOS bit is UNK/SBZP
|
||||||
|
//
|
||||||
|
if (((ArmReadIdMmfr0 () >> 12) & 0xf) != 0) {
|
||||||
|
TTBRAttributes |= TTBR_NOT_OUTER_SHAREABLE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue