|
|
1.1 ! root 1: #ifndef _ASM_IO_H ! 2: #define _ASM_IO_H ! 3: ! 4: #include "asm/types.h" ! 5: ! 6: #define NO_QEMU_PROTOS ! 7: #include "arch/common/fw_cfg.h" ! 8: ! 9: extern char _start, _end; ! 10: extern unsigned long virt_offset; ! 11: ! 12: #define phys_to_virt(phys) ((void *) ((unsigned long) (phys) - virt_offset)) ! 13: #define virt_to_phys(virt) ((unsigned long) (virt) + virt_offset) ! 14: ! 15: #ifndef BOOTSTRAP ! 16: ! 17: extern unsigned long isa_io_base; ! 18: ! 19: /* ! 20: * 8, 16 and 32 bit, big and little endian I/O operations, with barrier. ! 21: */ ! 22: static inline uint8_t in_8(volatile uint8_t *addr) ! 23: { ! 24: uint8_t ret; ! 25: ! 26: __asm__ __volatile__("lbz%U1%X1 %0,%1; eieio":"=r"(ret):"m"(*addr)); ! 27: return ret; ! 28: } ! 29: ! 30: static inline void out_8(volatile uint8_t *addr, uint8_t val) ! 31: { ! 32: __asm__ __volatile__("stb%U0%X0 %1,%0; eieio":"=m"(*addr):"r"(val)); ! 33: } ! 34: ! 35: static inline uint16_t in_le16(volatile uint16_t *addr) ! 36: { ! 37: uint16_t ret; ! 38: ! 39: __asm__ __volatile__("lhbrx %0,0,%1; eieio":"=r"(ret): ! 40: "r"(addr), "m"(*addr)); ! 41: return ret; ! 42: } ! 43: ! 44: static inline uint16_t in_be16(volatile uint16_t *addr) ! 45: { ! 46: uint16_t ret; ! 47: ! 48: __asm__ __volatile__("lhz%U1%X1 %0,%1; eieio":"=r"(ret):"m"(*addr)); ! 49: return ret; ! 50: } ! 51: ! 52: static inline void out_le16(volatile uint16_t *addr, uint16_t val) ! 53: { ! 54: __asm__ __volatile__("sthbrx %1,0,%2; eieio":"=m"(*addr):"r"(val), ! 55: "r"(addr)); ! 56: } ! 57: ! 58: static inline void out_be16(volatile uint16_t *addr, uint16_t val) ! 59: { ! 60: __asm__ __volatile__("sth%U0%X0 %1,%0; eieio":"=m"(*addr):"r"(val)); ! 61: } ! 62: ! 63: static inline uint32_t in_le32(volatile uint32_t *addr) ! 64: { ! 65: uint32_t ret; ! 66: ! 67: __asm__ __volatile__("lwbrx %0,0,%1; eieio":"=r"(ret): ! 68: "r"(addr), "m"(*addr)); ! 69: return ret; ! 70: } ! 71: ! 72: static inline uint32_t in_be32(volatile uint32_t *addr) ! 73: { ! 74: uint32_t ret; ! 75: ! 76: __asm__ __volatile__("lwz%U1%X1 %0,%1; eieio":"=r"(ret):"m"(*addr)); ! 77: return ret; ! 78: } ! 79: ! 80: static inline void out_le32(volatile uint32_t *addr, uint32_t val) ! 81: { ! 82: __asm__ __volatile__("stwbrx %1,0,%2; eieio":"=m"(*addr):"r"(val), ! 83: "r"(addr)); ! 84: } ! 85: ! 86: static inline void out_be32(volatile unsigned *addr, uint32_t val) ! 87: { ! 88: __asm__ __volatile__("stw%U0%X0 %1,%0; eieio":"=m"(*addr):"r"(val)); ! 89: } ! 90: ! 91: static inline void _insw_ns(volatile uint16_t * port, void *buf, int ns) ! 92: { ! 93: uint16_t *b = (uint16_t *) buf; ! 94: ! 95: while (ns > 0) { ! 96: *b++ = in_le16(port); ! 97: ns--; ! 98: } ! 99: } ! 100: ! 101: static inline void _outsw_ns(volatile uint16_t * port, const void *buf, ! 102: int ns) ! 103: { ! 104: uint16_t *b = (uint16_t *) buf; ! 105: ! 106: while (ns > 0) { ! 107: out_le16(port, *b++); ! 108: ns--; ! 109: } ! 110: } ! 111: ! 112: static inline void _insw(volatile uint16_t * port, void *buf, int ns) ! 113: { ! 114: uint16_t *b = (uint16_t *) buf; ! 115: ! 116: while (ns > 0) { ! 117: *b++ = in_be16(port); ! 118: ns--; ! 119: } ! 120: } ! 121: ! 122: static inline void _outsw(volatile uint16_t * port, const void *buf, ! 123: int ns) ! 124: { ! 125: uint16_t *b = (uint16_t *) buf; ! 126: ! 127: while (ns > 0) { ! 128: out_be16(port, *b++); ! 129: ns--; ! 130: } ! 131: } ! 132: ! 133: ! 134: /* ! 135: * The insw/outsw/insl/outsl functions don't do byte-swapping. ! 136: * They are only used in practice for transferring buffers which ! 137: * are arrays of bytes, and byte-swapping is not appropriate in ! 138: * that case. - paulus ! 139: */ ! 140: ! 141: static inline void insw(uint16_t port, void *buf, int ns) ! 142: { ! 143: _insw((uint16_t *)(port + isa_io_base), buf, ns); ! 144: } ! 145: ! 146: static inline void outsw(uint16_t port, void *buf, int ns) ! 147: { ! 148: _outsw((uint16_t *)(port + isa_io_base), buf, ns); ! 149: } ! 150: ! 151: ! 152: static inline uint8_t inb(uint16_t port) ! 153: { ! 154: return in_8((uint8_t *)(port + isa_io_base)); ! 155: } ! 156: ! 157: static inline void outb(uint8_t val, uint16_t port) ! 158: { ! 159: out_8((uint8_t *)(port + isa_io_base), val); ! 160: } ! 161: ! 162: static inline uint16_t inw(uint16_t port) ! 163: { ! 164: return in_le16((uint16_t *)(port + isa_io_base)); ! 165: } ! 166: ! 167: static inline void outw(uint16_t val, uint16_t port) ! 168: { ! 169: out_le16((uint16_t *)(port + isa_io_base), val); ! 170: } ! 171: ! 172: static inline uint32_t inl(uint16_t port) ! 173: { ! 174: return in_le32((uint32_t *)(port + isa_io_base)); ! 175: } ! 176: ! 177: static inline void outl(uint32_t val, uint16_t port) ! 178: { ! 179: out_le32((uint32_t *)(port + isa_io_base), val); ! 180: } ! 181: ! 182: #else /* BOOTSTRAP */ ! 183: #ifdef FCOMPILER ! 184: #define inb(reg) ((u8)0xff) ! 185: #define inw(reg) ((u16)0xffff) ! 186: #define inl(reg) ((u32)0xffffffff) ! 187: #define outb(reg, val) do{} while(0) ! 188: #define outw(reg, val) do{} while(0) ! 189: #define outl(reg, val) do{} while(0) ! 190: #else ! 191: extern u8 inb(u32 reg); ! 192: extern u16 inw(u32 reg); ! 193: extern u32 inl(u32 reg); ! 194: extern void insw(u32 reg, void *addr, unsigned long count); ! 195: extern void outb(u32 reg, u8 val); ! 196: extern void outw(u32 reg, u16 val); ! 197: extern void outl(u32 reg, u32 val); ! 198: extern void outsw(u32 reg, const void *addr, unsigned long count); ! 199: #endif ! 200: #endif ! 201: ! 202: #if defined(CONFIG_QEMU) ! 203: #define FW_CFG_ARCH_WIDTH (FW_CFG_ARCH_LOCAL + 0x00) ! 204: #define FW_CFG_ARCH_HEIGHT (FW_CFG_ARCH_LOCAL + 0x01) ! 205: #define FW_CFG_ARCH_DEPTH (FW_CFG_ARCH_LOCAL + 0x02) ! 206: #endif ! 207: ! 208: #endif /* _ASM_IO_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.