• Geert Uytterhoeven's avatar
    ARM: 8395/1: l2c: Add support for the "arm,shared-override" property · eeedcea6
    Geert Uytterhoeven authored
    "CoreLink Level 2 Cache Controller L2C-310", p. 2-15, section 2.3.2
    Shareable attribute" states:
    
        "The default behavior of the cache controller with respect to the
         shareable attribute is to transform Normal Memory Non-cacheable
         transactions into:
            - cacheable no allocate for reads
            - write through no write allocate for writes."
    
    Depending on the system architecture, this may cause memory corruption
    in the presence of bus mastering devices (e.g. OHCI). To avoid such
    corruption, the default behavior can be disabled by setting the Shared
    Override bit in the Auxiliary Control register.
    
    Currently the Shared Override bit can be set only using C code:
      - by calling l2x0_init() directly, which is deprecated,
      - by setting/clearing the bit in the machine_desc.l2c_aux_val/mask
        fields, but using values differing from 0/~0 is also deprecated.
    
    Hence add support for an "arm,shared-override" device tree property for
    the l2c device node. By specifying this property, affected systems can
    indicate that non-cacheable transactions must not be transformed.
    Then, it's up to the OS to decide. The current behavior is to set the
    "shared attribute override enable" bit, as there may exist kernel linear
    mappings and cacheable aliases for the DMA buffers, even if CMA is
    enabled.
    
    See also commit 1a8e41cd ("ARM: 6395/1: VExpress: Set bit 22 in
    the PL310 (cache controller) AuxCtlr register"):
    
        "Clearing bit 22 in the PL310 Auxiliary Control register (shared
         attribute override enable) has the side effect of transforming
         Normal Shared Non-cacheable reads into Cacheable no-allocate reads.
    
         Coherent DMA buffers in Linux always have a Cacheable alias via the
         kernel linear mapping and the processor can speculatively load
         cache lines into the PL310 controller. With bit 22 cleared,
         Non-cacheable reads would unexpectedly hit such cache lines leading
         to buffer corruption."
    Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    eeedcea6
cache-l2x0.c 47.8 KB