[POWERPC] Add "memory" clobber to MMIO accessors

Gcc might re-order MMIO accessors vs. surrounding consistent
memory accesses, which is a "bad thing", and could break drivers.
This fixes it by adding a "memory" clobber to the MMIO accessors,
which should prevent gcc from doing that reordering.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by Benjamin Herrenschmidt and committed by Paul Mackerras cfab3bdf 732bee4c

+7 -5
+7 -5
include/asm-powerpc/io.h
··· 100 { \ 101 type ret; \ 102 __asm__ __volatile__("sync;" insn ";twi 0,%0,0;isync" \ 103 - : "=r" (ret) : "r" (addr), "m" (*addr)); \ 104 return ret; \ 105 } 106 ··· 108 static inline void name(volatile type __iomem *addr, type val) \ 109 { \ 110 __asm__ __volatile__("sync;" insn \ 111 - : "=m" (*addr) : "r" (val), "r" (addr)); \ 112 - IO_SET_SYNC_FLAG(); \ 113 } 114 115 ··· 333 " .long 3b,5b\n" \ 334 ".previous" \ 335 : "=&r" (x) \ 336 - : "r" (port + _IO_BASE)); \ 337 return x; \ 338 } 339 ··· 351 " .long 0b,2b\n" \ 352 " .long 1b,2b\n" \ 353 ".previous" \ 354 - : : "r" (val), "r" (port + _IO_BASE)); \ 355 } 356 357 __do_in_asm(_rec_inb, "lbzx")
··· 100 { \ 101 type ret; \ 102 __asm__ __volatile__("sync;" insn ";twi 0,%0,0;isync" \ 103 + : "=r" (ret) : "r" (addr), "m" (*addr) : "memory"); \ 104 return ret; \ 105 } 106 ··· 108 static inline void name(volatile type __iomem *addr, type val) \ 109 { \ 110 __asm__ __volatile__("sync;" insn \ 111 + : "=m" (*addr) : "r" (val), "r" (addr) : "memory"); \ 112 + IO_SET_SYNC_FLAG(); \ 113 } 114 115 ··· 333 " .long 3b,5b\n" \ 334 ".previous" \ 335 : "=&r" (x) \ 336 + : "r" (port + _IO_BASE) \ 337 + : "memory"); \ 338 return x; \ 339 } 340 ··· 350 " .long 0b,2b\n" \ 351 " .long 1b,2b\n" \ 352 ".previous" \ 353 + : : "r" (val), "r" (port + _IO_BASE) \ 354 + : "memory"); \ 355 } 356 357 __do_in_asm(_rec_inb, "lbzx")