Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[POWERPC] bootwrapper: Add 16-bit I/O, sync(), eieio(), and barrier()

Also, include types.h from io.h, so callers don't have to.

Signed-off-by: Scott Wood <scottwood@freescale.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by

Scott Wood and committed by
Paul Mackerras
6e913c67 a73ac50c

+49
+49
arch/powerpc/boot/io.h
··· 1 1 #ifndef _IO_H 2 2 #define __IO_H 3 + 4 + #include "types.h" 5 + 3 6 /* 4 7 * Low-level I/O routines. 5 8 * ··· 20 17 static inline void out_8(volatile unsigned char *addr, int val) 21 18 { 22 19 __asm__ __volatile__("stb%U0%X0 %1,%0; sync" 20 + : "=m" (*addr) : "r" (val)); 21 + } 22 + 23 + static inline unsigned in_le16(const volatile u16 *addr) 24 + { 25 + unsigned ret; 26 + 27 + __asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync" 28 + : "=r" (ret) : "r" (addr), "m" (*addr)); 29 + 30 + return ret; 31 + } 32 + 33 + static inline unsigned in_be16(const volatile u16 *addr) 34 + { 35 + unsigned ret; 36 + 37 + __asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync" 38 + : "=r" (ret) : "m" (*addr)); 39 + return ret; 40 + } 41 + 42 + static inline void out_le16(volatile u16 *addr, int val) 43 + { 44 + __asm__ __volatile__("sthbrx %1,0,%2; sync" : "=m" (*addr) 45 + : "r" (val), "r" (addr)); 46 + } 47 + 48 + static inline void out_be16(volatile u16 *addr, int val) 49 + { 50 + __asm__ __volatile__("sth%U0%X0 %1,%0; sync" 23 51 : "=m" (*addr) : "r" (val)); 24 52 } 25 53 ··· 82 48 { 83 49 __asm__ __volatile__("stw%U0%X0 %1,%0; sync" 84 50 : "=m" (*addr) : "r" (val)); 51 + } 52 + 53 + static inline void sync(void) 54 + { 55 + asm volatile("sync" : : : "memory"); 56 + } 57 + 58 + static inline void eieio(void) 59 + { 60 + asm volatile("eieio" : : : "memory"); 61 + } 62 + 63 + static inline void barrier(void) 64 + { 65 + asm volatile("" : : : "memory"); 85 66 } 86 67 87 68 #endif /* _IO_H */