20#define PREP_ISA_IO_BASE 0x80000000
21#define PREP_ISA_MEM_BASE 0xc0000000
22#define PREP_PCI_DRAM_OFFSET 0x80000000
24#define CHRP_ISA_IO_BASE 0xfe000000
25#define CHRP_ISA_MEM_BASE 0xfd000000
26#define CHRP_PCI_DRAM_OFFSET 0x00000000
41#define inb(port) in_8((uint8_t *)((port)+_IO_BASE))
42#define outb(val, port) out_8((uint8_t *)((port)+_IO_BASE), (val))
43#define inw(port) in_le16((uint16_t *)((port)+_IO_BASE))
44#define outw(val, port) out_le16((uint16_t *)((port)+_IO_BASE), (val))
45#define inl(port) in_le32((uint32_t *)((port)+_IO_BASE))
46#define outl(val, port) out_le32((uint32_t *)((port)+_IO_BASE), (val))
53static inline void io_eieio(
void)
62#define iobarrier_rw() io_eieio()
63#define iobarrier_r() io_eieio()
64#define iobarrier_w() io_eieio()
69static inline uint8_t in_8(
const volatile uint8_t *addr)
73 __asm__ __volatile__(
"lbz%U1%X1 %0,%1; eieio" :
"=r" (ret) :
"m" (*addr));
77static inline void out_8(
volatile uint8_t *addr, uint8_t val)
79 __asm__ __volatile__(
"stb%U0%X0 %1,%0; eieio" :
"=m" (*addr) :
"r" (val));
82static inline uint16_t in_le16(
const volatile uint16_t *addr)
86 __asm__ __volatile__(
"lhbrx %0,0,%1; eieio" :
"=r" (ret) :
87 "r" (addr),
"m" (*addr));
91static inline uint16_t in_be16(
const volatile uint16_t *addr)
95 __asm__ __volatile__(
"lhz%U1%X1 %0,%1; eieio" :
"=r" (ret) :
"m" (*addr));
99static inline void out_le16(
volatile uint16_t *addr, uint16_t val)
101 __asm__ __volatile__(
"sthbrx %1,0,%2; eieio" :
"=m" (*addr) :
102 "r" (val),
"r" (addr));
105static inline void out_be16(
volatile uint16_t *addr, uint16_t val)
107 __asm__ __volatile__(
"sth%U0%X0 %1,%0; eieio" :
"=m" (*addr) :
"r" (val));
111static inline uint32_t in_le32(
const volatile uint32_t *addr)
115 __asm__ __volatile__(
"lwbrx %0,0,%1; eieio" :
"=r" (ret) :
116 "r" (addr),
"m" (*addr));
122static inline uint32_t in_be32(
const volatile uint32_t *addr)
126 __asm__ __volatile__(
"lwz%U1%X1 %0,%1; eieio" :
"=r" (ret) :
"m" (*addr));
132static inline void out_le32(
volatile uint32_t *addr, uint32_t val)
134 __asm__ __volatile__(
"stwbrx %1,0,%2; eieio" :
"=m" (*addr) :
135 "r" (val),
"r" (addr));
140static inline void out_be32(
volatile uint32_t *addr, uint32_t val)
142 __asm__ __volatile__(
"stw%U0%X0 %1,%0; eieio" :
"=m" (*addr) :
"r" (val));
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.