1 /* Public domain. */ 2 3 #ifndef _LINUX_IO_H 4 #define _LINUX_IO_H 5 6 #include <sys/types.h> 7 #include <sys/systm.h> 8 #include <sys/memrange.h> /* for MDF_WRITECOMBINE */ 9 10 #include <linux/types.h> 11 #include <linux/atomic.h> 12 #include <linux/compiler.h> 13 #include <linux/vmalloc.h> 14 15 #define memcpy_toio(d, s, n) memcpy(d, s, n) 16 #define memcpy_fromio(d, s, n) memcpy(d, s, n) 17 #define memset_io(d, b, n) memset(d, b, n) 18 19 #ifdef __powerpc__ 20 #define iobarrier() mb() 21 #else 22 #define iobarrier() barrier() 23 #endif 24 25 static inline u8 26 ioread8(const volatile void __iomem *addr) 27 { 28 uint8_t val; 29 30 iobarrier(); 31 val = *(volatile uint8_t *)addr; 32 rmb(); 33 return val; 34 } 35 36 static inline void 37 iowrite8(u8 val, volatile void __iomem *addr) 38 { 39 wmb(); 40 *(volatile uint8_t *)addr = val; 41 } 42 43 #ifdef __sparc64__ 44 45 /* 46 * On sparc64, bus_space_vaddr(9) returns a virtual address that has 47 * been mapped little-endian, so we should just use the CPU byte 48 * order. 49 */ 50 51 static inline u16 52 ioread16(const volatile void __iomem *addr) 53 { 54 uint16_t val; 55 56 iobarrier(); 57 val = *(volatile uint16_t *)addr; 58 rmb(); 59 return val; 60 } 61 62 static inline u32 63 ioread32(const volatile void __iomem *addr) 64 { 65 uint32_t val; 66 67 iobarrier(); 68 val = *(volatile uint32_t *)addr; 69 rmb(); 70 return val; 71 } 72 73 static inline u64 74 ioread64(const volatile void __iomem *addr) 75 { 76 uint64_t val; 77 78 iobarrier(); 79 val = *(volatile uint64_t *)addr; 80 rmb(); 81 return val; 82 } 83 84 static inline void 85 iowrite16(u16 val, volatile void __iomem *addr) 86 { 87 wmb(); 88 *(volatile uint16_t *)addr = val; 89 } 90 91 static inline void 92 iowrite32(u32 val, volatile void __iomem *addr) 93 { 94 wmb(); 95 *(volatile uint32_t *)addr = val; 96 } 97 98 static inline void 99 iowrite64(u64 val, volatile void __iomem *addr) 100 { 101 wmb(); 102 *(volatile uint64_t *)addr = val; 103 } 104 105 #else 106 107 static inline u16 108 ioread16(const volatile void __iomem *addr) 109 { 110 uint16_t val; 111 112 iobarrier(); 113 val = lemtoh16(addr); 114 rmb(); 115 return val; 116 } 117 118 static inline u32 119 ioread32(const volatile void __iomem *addr) 120 { 121 uint32_t val; 122 123 iobarrier(); 124 val = lemtoh32(addr); 125 rmb(); 126 return val; 127 } 128 129 static inline u64 130 ioread64(const volatile void __iomem *addr) 131 { 132 uint64_t val; 133 134 iobarrier(); 135 val = lemtoh64(addr); 136 rmb(); 137 return val; 138 } 139 140 static inline void 141 iowrite16(u16 val, volatile void __iomem *addr) 142 { 143 wmb(); 144 htolem16(addr, val); 145 } 146 147 static inline void 148 iowrite32(u32 val, volatile void __iomem *addr) 149 { 150 wmb(); 151 htolem32(addr, val); 152 } 153 154 static inline void 155 iowrite64(u64 val, volatile void __iomem *addr) 156 { 157 wmb(); 158 htolem64(addr, val); 159 } 160 161 #endif 162 163 #define readb(p) ioread8(p) 164 #define writeb(v, p) iowrite8(v, p) 165 #define readw(p) ioread16(p) 166 #define writew(v, p) iowrite16(v, p) 167 #define readl(p) ioread32(p) 168 #define writel(v, p) iowrite32(v, p) 169 #define readq(p) ioread64(p) 170 #define writeq(v, p) iowrite64(v, p) 171 172 int drm_mtrr_add(unsigned long, size_t, int); 173 int drm_mtrr_del(int, unsigned long, size_t, int); 174 175 #define DRM_MTRR_WC MDF_WRITECOMBINE 176 177 #endif 178