• Robin Murphy's avatar
    iommu/io-pgtable-arm: Improve attribute handling · 7618e479
    Robin Murphy authored
    By VMSA rules, using Normal Non-Cacheable type with a shareability
    attribute of anything other than Outer Shareable is liable to lead into
    unpredictable territory:
    
    | Overlaying the shareability attribute (B3-1377, ARM DDI 0406C.c)
    |
    | A memory region with a resultant memory type attribute of Normal, and
    | a resultant cacheability attribute of Inner Non-cacheable, Outer
    | Non-cacheable, must have a resultant shareability attribute of Outer
    | Shareable, otherwise shareability is UNPREDICTABLE
    
    Although the SMMU architectures seem to give some slightly stronger
    guarantees of Non-Cacheable output types becoming implicitly Outer
    Shareable in most cases, we may as well be explicit and not take any
    chances. It's also weird that LPAE attribute handling is currently split
    between prot_to_pte() and init_pte() given that it can all be statically
    determined up-front. Thus, collect *all* the LPAE attributes into
    prot_to_pte() in order to logically pick the shareability based on the
    incoming IOMMU API prot value, and tweak the short-descriptor code to
    stop setting TTBR0.NOS for Non-Cacheable walks.
    Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    7618e479
io-pgtable-arm-v7s.c 26.9 KB