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