Merge branch 'io' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux into...
authorArnd Bergmann <arnd@arndb.de>
Tue, 11 Nov 2014 18:55:45 +0000 (19:55 +0100)
committerArnd Bergmann <arnd@arndb.de>
Tue, 11 Nov 2014 18:55:45 +0000 (19:55 +0100)
* 'io' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux:
  documentation: memory-barriers: clarify relaxed io accessor semantics
  x86: io: implement dummy relaxed accessor macros for writes
  tile: io: implement dummy relaxed accessor macros for writes
  sparc: io: implement dummy relaxed accessor macros for writes
  powerpc: io: implement dummy relaxed accessor macros for writes
  parisc: io: implement dummy relaxed accessor macros for writes
  mn10300: io: implement dummy relaxed accessor macros for writes
  m68k: io: implement dummy relaxed accessor macros for writes
  m32r: io: implement dummy relaxed accessor macros for writes
  ia64: io: implement dummy relaxed accessor macros for writes
  cris: io: implement dummy relaxed accessor macros for writes
  frv: io: implement dummy relaxed accessor macros for writes
  xtensa: io: remove dummy relaxed accessor macros for reads
  s390: io: remove dummy relaxed accessor macros for reads
  microblaze: io: remove dummy relaxed accessor macros
  asm-generic: io: implement relaxed accessor macros as conditional wrappers

Conflicts:
include/asm-generic/io.h

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
19 files changed:
Documentation/memory-barriers.txt
arch/cris/include/asm/io.h
arch/frv/include/asm/io.h
arch/ia64/include/asm/io.h
arch/m32r/include/asm/io.h
arch/m68k/include/asm/io.h
arch/m68k/include/asm/io_no.h
arch/microblaze/include/asm/io.h
arch/mn10300/include/asm/io.h
arch/parisc/include/asm/io.h
arch/powerpc/include/asm/io.h
arch/s390/include/asm/io.h
arch/sparc/include/asm/io.h
arch/sparc/include/asm/io_32.h
arch/sparc/include/asm/io_64.h
arch/tile/include/asm/io.h
arch/x86/include/asm/io.h
arch/xtensa/include/asm/io.h
include/asm-generic/io.h

index 22a969c..4af4cea 100644 (file)
@@ -2465,10 +2465,15 @@ functions:
      Please refer to the PCI specification for more information on interactions
      between PCI transactions.
 
- (*) readX_relaxed()
-
-     These are similar to readX(), but are not guaranteed to be ordered in any
-     way. Be aware that there is no I/O read barrier available.
+ (*) readX_relaxed(), writeX_relaxed()
+
+     These are similar to readX() and writeX(), but provide weaker memory
+     ordering guarantees. Specifically, they do not guarantee ordering with
+     respect to normal memory accesses (e.g. DMA buffers) nor do they guarantee
+     ordering with respect to LOCK or UNLOCK operations. If the latter is
+     required, an mmiowb() barrier can be used. Note that relaxed accesses to
+     the same peripheral are guaranteed to be ordered with respect to each
+     other.
 
  (*) ioreadX(), iowriteX()
 
index e59dba1..752a3f4 100644 (file)
@@ -112,6 +112,9 @@ static inline void writel(unsigned int b, volatile void __iomem *addr)
        else
                *(volatile unsigned int __force *) addr = b;
 }
+#define writeb_relaxed(b, addr) writeb(b, addr)
+#define writew_relaxed(b, addr) writew(b, addr)
+#define writel_relaxed(b, addr) writel(b, addr)
 #define __raw_writeb writeb
 #define __raw_writew writew
 #define __raw_writel writel
index 8cb50a2..99bb7ef 100644 (file)
@@ -243,6 +243,9 @@ static inline void writel(uint32_t datum, volatile void __iomem *addr)
                __flush_PCI_writes();
 }
 
+#define writeb_relaxed writeb
+#define writew_relaxed writew
+#define writel_relaxed writel
 
 /* Values for nocacheflag and cmode */
 #define IOMAP_FULL_CACHING             0
index bee0acd..80a7e34 100644 (file)
@@ -393,6 +393,10 @@ __writeq (unsigned long val, volatile void __iomem *addr)
 #define writew(v,a)    __writew((v), (a))
 #define writel(v,a)    __writel((v), (a))
 #define writeq(v,a)    __writeq((v), (a))
+#define writeb_relaxed(v,a)    __writeb((v), (a))
+#define writew_relaxed(v,a)    __writew((v), (a))
+#define writel_relaxed(v,a)    __writel((v), (a))
+#define writeq_relaxed(v,a)    __writeq((v), (a))
 #define __raw_writeb   writeb
 #define __raw_writew   writew
 #define __raw_writel   writel
index 4010f1f..6e7787f 100644 (file)
@@ -161,6 +161,9 @@ static inline void _writel(unsigned long l, unsigned long addr)
 #define __raw_writeb writeb
 #define __raw_writew writew
 #define __raw_writel writel
+#define writeb_relaxed writeb
+#define writew_relaxed writew
+#define writel_relaxed writel
 
 #define ioread8 read
 #define ioread16 readw
index c70cc91..bccd5a9 100644 (file)
@@ -3,3 +3,11 @@
 #else
 #include <asm/io_mm.h>
 #endif
+
+#define readb_relaxed(addr)    readb(addr)
+#define readw_relaxed(addr)    readw(addr)
+#define readl_relaxed(addr)    readl(addr)
+
+#define writeb_relaxed(b, addr)        writeb(b, addr)
+#define writew_relaxed(b, addr)        writew(b, addr)
+#define writel_relaxed(b, addr)        writel(b, addr)
index be4b5a8..a93c8cd 100644 (file)
@@ -40,10 +40,6 @@ static inline unsigned int _swapl(volatile unsigned long v)
 #define readl(addr) \
     ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
 
-#define readb_relaxed(addr) readb(addr)
-#define readw_relaxed(addr) readw(addr)
-#define readl_relaxed(addr) readl(addr)
-
 #define writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b))
 #define writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b))
 #define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
index 433751b..940f5fc 100644 (file)
@@ -69,12 +69,4 @@ extern void __iomem *ioremap(phys_addr_t address, unsigned long size);
 
 #include <asm-generic/io.h>
 
-#define readb_relaxed  readb
-#define readw_relaxed  readw
-#define readl_relaxed  readl
-
-#define writeb_relaxed writeb
-#define writew_relaxed writew
-#define writel_relaxed writel
-
 #endif /* _ASM_MICROBLAZE_IO_H */
index e6ed0d8..897ba3c 100644 (file)
@@ -67,6 +67,10 @@ static inline void writel(u32 b, volatile void __iomem *addr)
 #define __raw_writew writew
 #define __raw_writel writel
 
+#define writeb_relaxed writeb
+#define writew_relaxed writew
+#define writel_relaxed writel
+
 /*****************************************************************************/
 /*
  * traditional input/output functions
index 1f6d2ae..8cd0abf 100644 (file)
@@ -217,10 +217,14 @@ static inline void writeq(unsigned long long q, volatile void __iomem *addr)
 #define writel writel
 #define writeq writeq
 
-#define readb_relaxed(addr) readb(addr)
-#define readw_relaxed(addr) readw(addr)
-#define readl_relaxed(addr) readl(addr)
-#define readq_relaxed(addr) readq(addr)
+#define readb_relaxed(addr)    readb(addr)
+#define readw_relaxed(addr)    readw(addr)
+#define readl_relaxed(addr)    readl(addr)
+#define readq_relaxed(addr)    readq(addr)
+#define writeb_relaxed(b, addr)        writeb(b, addr)
+#define writew_relaxed(w, addr)        writew(w, addr)
+#define writel_relaxed(l, addr)        writel(l, addr)
+#define writeq_relaxed(q, addr)        writeq(q, addr)
 
 #define mmiowb() do { } while (0)
 
index 97d3869..9eaf301 100644 (file)
@@ -617,10 +617,14 @@ static inline void name at                                        \
 /*
  * We don't do relaxed operations yet, at least not with this semantic
  */
-#define readb_relaxed(addr) readb(addr)
-#define readw_relaxed(addr) readw(addr)
-#define readl_relaxed(addr) readl(addr)
-#define readq_relaxed(addr) readq(addr)
+#define readb_relaxed(addr)    readb(addr)
+#define readw_relaxed(addr)    readw(addr)
+#define readl_relaxed(addr)    readl(addr)
+#define readq_relaxed(addr)    readq(addr)
+#define writeb_relaxed(v, addr)        writeb(v, addr)
+#define writew_relaxed(v, addr)        writew(v, addr)
+#define writel_relaxed(v, addr)        writel(v, addr)
+#define writeq_relaxed(v, addr)        writeq(v, addr)
 
 #ifdef CONFIG_PPC32
 #define mmiowb()
index d22c2ee..6ad9013 100644 (file)
@@ -61,11 +61,6 @@ static inline void iounmap(volatile void __iomem *addr)
 #define __raw_writel   zpci_write_u32
 #define __raw_writeq   zpci_write_u64
 
-#define readb_relaxed  readb
-#define readw_relaxed  readw
-#define readl_relaxed  readl
-#define readq_relaxed  readq
-
 #endif /* CONFIG_PCI */
 
 #include <asm-generic/io.h>
index f6902cf..493f22c 100644 (file)
  * Defines used for both SPARC32 and SPARC64
  */
 
+/* Relaxed accessors for MMIO */
+#define readb_relaxed(__addr)          readb(__addr)
+#define readw_relaxed(__addr)          readw(__addr)
+#define readl_relaxed(__addr)          readl(__addr)
+
+#define writeb_relaxed(__b, __addr)    writeb(__b, __addr)
+#define writew_relaxed(__w, __addr)    writew(__w, __addr)
+#define writel_relaxed(__l, __addr)    writel(__l, __addr)
+
 /* Big endian versions of memory read/write routines */
 #define readb_be(__addr)       __raw_readb(__addr)
 #define readw_be(__addr)       __raw_readw(__addr)
index 9f53290..407ac14 100644 (file)
@@ -4,10 +4,6 @@
 #include <linux/kernel.h>
 #include <linux/ioport.h>  /* struct resource */
 
-#define readb_relaxed(__addr)  readb(__addr)
-#define readw_relaxed(__addr)  readw(__addr)
-#define readl_relaxed(__addr)  readl(__addr)
-
 #define IO_SPACE_LIMIT 0xffffffff
 
 #define memset_io(d,c,sz)     _memset_io(d,c,sz)
index 80b54b3..d50e612 100644 (file)
@@ -136,6 +136,7 @@ static inline u32 readl(const volatile void __iomem *addr)
 }
 
 #define readq readq
+#define readq_relaxed readq
 static inline u64 readq(const volatile void __iomem *addr)
 {      u64 ret;
 
@@ -175,6 +176,7 @@ static inline void writel(u32 l, volatile void __iomem *addr)
 }
 
 #define writeq writeq
+#define writeq_relaxed writeq
 static inline void writeq(u64 q, volatile void __iomem *addr)
 {
        __asm__ __volatile__("stxa\t%r0, [%1] %2\t/* pci_writeq */"
@@ -183,7 +185,6 @@ static inline void writeq(u64 q, volatile void __iomem *addr)
                             : "memory");
 }
 
-
 #define inb inb
 static inline u8 inb(unsigned long addr)
 {
@@ -264,11 +265,6 @@ static inline void iowrite32_rep(void __iomem *port, const void *buf, unsigned l
        outsl((unsigned long __force)port, buf, count);
 }
 
-#define readb_relaxed(__addr)  readb(__addr)
-#define readw_relaxed(__addr)  readw(__addr)
-#define readl_relaxed(__addr)  readl(__addr)
-#define readq_relaxed(__addr)  readq(__addr)
-
 /* Valid I/O Space regions are anywhere, because each PCI bus supported
  * can live in an arbitrary area of the physical address range.
  */
index 9fe4349..d372641 100644 (file)
@@ -241,6 +241,10 @@ static inline void writeq(u64 val, unsigned long addr)
 #define readw_relaxed readw
 #define readl_relaxed readl
 #define readq_relaxed readq
+#define writeb_relaxed writeb
+#define writew_relaxed writew
+#define writel_relaxed writel
+#define writeq_relaxed writeq
 
 #define ioread8 readb
 #define ioread16 readw
index ae2b593..0cdbe6e 100644 (file)
@@ -74,6 +74,9 @@ build_mmio_write(__writel, "l", unsigned int, "r", )
 #define __raw_readw __readw
 #define __raw_readl __readl
 
+#define writeb_relaxed(v, a) __writeb(v, a)
+#define writew_relaxed(v, a) __writew(v, a)
+#define writel_relaxed(v, a) __writel(v, a)
 #define __raw_writeb __writeb
 #define __raw_writew __writew
 #define __raw_writel __writel
@@ -86,6 +89,7 @@ build_mmio_read(readq, "q", unsigned long, "=r", :"memory")
 build_mmio_write(writeq, "q", unsigned long, "r", :"memory")
 
 #define readq_relaxed(a)       readq(a)
+#define writeq_relaxed(v, a)   writeq(v, a)
 
 #define __raw_readq(a)         readq(a)
 #define __raw_writeq(val, addr)        writeq(val, addr)
index 7494420..fe1600a 100644 (file)
@@ -74,13 +74,6 @@ static inline void iounmap(volatile void __iomem *addr)
 
 #endif /* CONFIG_MMU */
 
-/*
- * Generic I/O
- */
-#define readb_relaxed readb
-#define readw_relaxed readw
-#define readl_relaxed readl
-
 #endif /* __KERNEL__ */
 
 #include <asm-generic/io.h>
index 00483d7..9db0423 100644 (file)
@@ -174,6 +174,43 @@ static inline void writeq(u64 value, volatile void __iomem *addr)
 #endif
 #endif /* CONFIG_64BIT */
 
+/*
+ * {read,write}{b,w,l,q}_relaxed() are like the regular version, but
+ * are not guaranteed to provide ordering against spinlocks or memory
+ * accesses.
+ */
+#ifndef readb_relaxed
+#define readb_relaxed readb
+#endif
+
+#ifndef readw_relaxed
+#define readw_relaxed readw
+#endif
+
+#ifndef readl_relaxed
+#define readl_relaxed readl
+#endif
+
+#ifndef readq_relaxed
+#define readq_relaxed readq
+#endif
+
+#ifndef writeb_relaxed
+#define writeb_relaxed writeb
+#endif
+
+#ifndef writew_relaxed
+#define writew_relaxed writew
+#endif
+
+#ifndef writel_relaxed
+#define writel_relaxed writel
+#endif
+
+#ifndef writeq_relaxed
+#define writeq_relaxed writeq
+#endif
+
 /*
  * {read,write}s{b,w,l,q}() repeatedly access the same memory address in
  * native endianness in 8-, 16-, 32- or 64-bit chunks (@count times).