• Lennert Buytenhek's avatar
    [ARM] 5241/1: provide ioremap_wc() · 1ad77a87
    Lennert Buytenhek authored
    This patch provides an ARM implementation of ioremap_wc().
    
    We use different page table attributes depending on which CPU we
    are running on:
    
    - Non-XScale ARMv5 and earlier systems: The ARMv5 ARM documents four
      possible mapping types (CB=00/01/10/11).  We can't use any of the
      cached memory types (CB=10/11), since that breaks coherency with
      peripheral devices.  Both CB=00 and CB=01 are suitable for _wc, and
      CB=01 (Uncached/Buffered) allows the hardware more freedom than
      CB=00, so we'll use that.
    
      (The ARMv5 ARM seems to suggest that CB=01 is allowed to delay stores
      but isn't allowed to merge them, but there is no other mapping type
      we can use that allows the hardware to delay and merge stores, so
      we'll go with CB=01.)
    
    - XScale v1/v2 (ARMv5): same as the ARMv5 case above, with the slight
      difference that on these platforms, CB=01 actually _does_ allow
      merging stores.  (If you want noncoalescing bufferable behavior
      on Xscale v1/v2, you need to use XCB=101.)
    
    - Xscale v3 (ARMv5) and ARMv6+: on these systems, we use TEXCB=00100
      mappings (Inner/Outer Uncacheable in xsc3 parlance, Uncached Normal
      in ARMv6 parlance).
    
      The ARMv6 ARM explicitly says that any accesses to Normal memory can
      be merged, which makes Normal memory more suitable for _wc mappings
      than Device or Strongly Ordered memory, as the latter two mapping
      types are guaranteed to maintain transaction number, size and order.
      We use the Uncached variety of Normal mappings for the same reason
      that we can't use C=1 mappings on ARMv5.
    
      The xsc3 Architecture Specification documents TEXCB=00100 as being
      Uncacheable and allowing coalescing of writes, which is also just
      what we need.
    Signed-off-by: default avatarLennert Buytenhek <buytenh@marvell.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    1ad77a87
io.h 9.94 KB