On Mon, Nov 16, 2015 at 05:29:42PM +0100, Ard Biesheuvel wrote:
> 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.

I totally aprove of the flag, but...
 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
> ---
>  ArmPkg/ArmPkg.dec                             |  6 ++++++
>  ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf      |  3 +++
>  ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf |  3 +++
>  ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c        | 19 +++++++++++++++++++
>  4 files changed, 31 insertions(+)
> 
> diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
> index 46e9894d3f56..ff4531e44106 100644
> --- a/ArmPkg/ArmPkg.dec
> +++ b/ArmPkg/ArmPkg.dec
> @@ -73,6 +73,12 @@ [PcdsFeatureFlag.common]
>    # Define if the GICv3 controller should use the GICv2 legacy
>    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]
>    gArmTokenSpaceGuid.PcdTrustzoneSupport|FALSE|BOOLEAN|0x00000006
>  
> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf 
> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf
> index 01bdfb699656..d56851a1409b 100644
> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf
> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf
> @@ -48,3 +48,6 @@ [LibraryClasses]
>  
>  [Protocols]
>    gEfiCpuArchProtocolGuid
> +
> +[FeaturePcd.ARM]
> +  gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride
> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf 
> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf
> index ac081068db28..6eaf350c7b9d 100644
> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf
> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf
> @@ -48,3 +48,6 @@ [LibraryClasses]
>  
>  [Protocols]
>    gEfiCpuArchProtocolGuid
> +
> +[FeaturePcd.ARM]
> +  gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride
> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c 
> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c
> index e05a51e0d901..15f355012b98 100644
> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c
> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c
> @@ -62,10 +62,16 @@ PopulateLevel2PageTable (
>      case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK:
>      case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK:
>        PageAttributes = TT_DESCRIPTOR_PAGE_WRITE_BACK;
> +      if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
> +        PageAttributes = (PageAttributes & ~TT_DESCRIPTOR_PAGE_S_MASK) | 
> TT_DESCRIPTOR_PAGE_S_NOT_SHARED;
> +      }
>        break;
>      case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:
>      case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH:
>        PageAttributes = TT_DESCRIPTOR_PAGE_WRITE_THROUGH;
> +      if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
> +        PageAttributes = (PageAttributes & ~TT_DESCRIPTOR_PAGE_S_MASK) | 
> TT_DESCRIPTOR_PAGE_S_NOT_SHARED;
> +      }
>        break;
>      case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE:
>      case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE:
> @@ -178,6 +184,19 @@ FillTranslationTable (
>        break;
>    }

Could this patch not be simplified by just explicitly clearing the
bit, once here?

  if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
    PageAttributes = (PageAttributes & ~TT_DESCRIPTOR_PAGE_S_MASK) | \
                     TT_DESCRIPTOR_PAGE_S_NOT_SHARED;
  }


>  
> +  if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
> +    switch (MemoryRegion->Attributes) {
> +      case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK:
> +      case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:
> +      case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK:
> +      case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH:
> +        Attributes = (Attributes & ~TT_DESCRIPTOR_SECTION_S_MASK) | 
> TT_DESCRIPTOR_SECTION_S_NOT_SHARED;
> +        break;
> +      default:
> +        ;
> +      }
> +  }
> +

... and once here?

  if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
    Attributes = (Attributes & ~TT_DESCRIPTOR_SECTION_S_MASK) | \
                 TT_DESCRIPTOR_SECTION_S_NOT_SHARED;
  }


>    // Get the first section entry for this mapping
>    SectionEntry    = 
> TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable, 
> MemoryRegion->VirtualBase);
>  
> -- 
> 1.9.1
> 
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to