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> /* via asm/io.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 25static inline u8 26ioread8(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 36static inline void 37iowrite8(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 51static inline u16 52ioread16(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 62static inline u32 63ioread32(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 73static inline u64 74ioread64(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 84static inline void 85iowrite16(u16 val, volatile void __iomem *addr) 86{ 87 wmb(); 88 *(volatile uint16_t *)addr = val; 89} 90 91static inline void 92iowrite32(u32 val, volatile void __iomem *addr) 93{ 94 wmb(); 95 *(volatile uint32_t *)addr = val; 96} 97 98static inline void 99iowrite64(u64 val, volatile void __iomem *addr) 100{ 101 wmb(); 102 *(volatile uint64_t *)addr = val; 103} 104 105#else 106 107static inline u16 108ioread16(const volatile void __iomem *addr) 109{ 110 uint16_t val; 111 112 iobarrier(); 113 val = lemtoh16(addr); 114 rmb(); 115 return val; 116} 117 118static inline u32 119ioread32(const volatile void __iomem *addr) 120{ 121 uint32_t val; 122 123 iobarrier(); 124 val = lemtoh32(addr); 125 rmb(); 126 return val; 127} 128 129static inline u64 130ioread64(const volatile void __iomem *addr) 131{ 132 uint64_t val; 133 134 iobarrier(); 135 val = lemtoh64(addr); 136 rmb(); 137 return val; 138} 139 140static inline void 141iowrite16(u16 val, volatile void __iomem *addr) 142{ 143 wmb(); 144 htolem16(addr, val); 145} 146 147static inline void 148iowrite32(u32 val, volatile void __iomem *addr) 149{ 150 wmb(); 151 htolem32(addr, val); 152} 153 154static inline void 155iowrite64(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#define readl_relaxed(p) readl(p) 173#define writel_relaxed(v, p) writel(v, p) 174 175int drm_mtrr_add(unsigned long, size_t, int); 176int drm_mtrr_del(int, unsigned long, size_t, int); 177 178#define DRM_MTRR_WC MDF_WRITECOMBINE 179 180static inline void * 181IOMEM_ERR_PTR(long error) 182{ 183 return (void *) error; 184} 185 186#define MEMREMAP_WB (1 << 0) 187 188void *memremap(phys_addr_t, size_t, int); 189void memunmap(void *); 190 191#endif 192