xref: /openbsd-src/sys/dev/pci/drm/include/linux/io.h (revision 667382c7a43214428c9590fa699030f09445b426)
17f4dd379Sjsg /* Public domain. */
27f4dd379Sjsg 
37f4dd379Sjsg #ifndef _LINUX_IO_H
47f4dd379Sjsg #define _LINUX_IO_H
57f4dd379Sjsg 
6c349dbc7Sjsg #include <sys/types.h>
77f4dd379Sjsg #include <sys/systm.h>
8c349dbc7Sjsg #include <sys/memrange.h> /* for MDF_WRITECOMBINE */
9c349dbc7Sjsg 
107f4dd379Sjsg #include <linux/types.h>
11152a693fSkettenis #include <linux/atomic.h>
127f4dd379Sjsg #include <linux/compiler.h>
1353e1df33Sjsg #include <linux/vmalloc.h> /* via asm/io.h */
147f4dd379Sjsg 
157f4dd379Sjsg #define memcpy_toio(d, s, n)	memcpy(d, s, n)
167f4dd379Sjsg #define memcpy_fromio(d, s, n)	memcpy(d, s, n)
177f4dd379Sjsg #define memset_io(d, b, n)	memset(d, b, n)
187f4dd379Sjsg 
19aa850fc3Skettenis #ifdef __powerpc__
20aa850fc3Skettenis #define iobarrier()		mb()
21aa850fc3Skettenis #else
22aa850fc3Skettenis #define iobarrier()		barrier()
23aa850fc3Skettenis #endif
24aa850fc3Skettenis 
257f4dd379Sjsg static inline u8
ioread8(const volatile void __iomem * addr)267f4dd379Sjsg ioread8(const volatile void __iomem *addr)
277f4dd379Sjsg {
28152a693fSkettenis 	uint8_t val;
297f4dd379Sjsg 
30aa850fc3Skettenis 	iobarrier();
31152a693fSkettenis 	val = *(volatile uint8_t *)addr;
32152a693fSkettenis 	rmb();
33152a693fSkettenis 	return val;
347f4dd379Sjsg }
357f4dd379Sjsg 
367f4dd379Sjsg static inline void
iowrite8(u8 val,volatile void __iomem * addr)377f4dd379Sjsg iowrite8(u8 val, volatile void __iomem *addr)
387f4dd379Sjsg {
39152a693fSkettenis 	wmb();
407f4dd379Sjsg 	*(volatile uint8_t *)addr = val;
417f4dd379Sjsg }
427f4dd379Sjsg 
43152a693fSkettenis #ifdef __sparc64__
44152a693fSkettenis 
45152a693fSkettenis /*
46152a693fSkettenis  * On sparc64, bus_space_vaddr(9) returns a virtual address that has
47152a693fSkettenis  * been mapped little-endian, so we should just use the CPU byte
48152a693fSkettenis  * order.
49152a693fSkettenis  */
50152a693fSkettenis 
51152a693fSkettenis static inline u16
ioread16(const volatile void __iomem * addr)52152a693fSkettenis ioread16(const volatile void __iomem *addr)
53152a693fSkettenis {
54152a693fSkettenis 	uint16_t val;
55152a693fSkettenis 
56aa850fc3Skettenis 	iobarrier();
57152a693fSkettenis 	val = *(volatile uint16_t *)addr;
58152a693fSkettenis 	rmb();
59152a693fSkettenis 	return val;
60152a693fSkettenis }
61152a693fSkettenis 
62152a693fSkettenis static inline u32
ioread32(const volatile void __iomem * addr)63152a693fSkettenis ioread32(const volatile void __iomem *addr)
64152a693fSkettenis {
65152a693fSkettenis 	uint32_t val;
66152a693fSkettenis 
67aa850fc3Skettenis 	iobarrier();
68152a693fSkettenis 	val = *(volatile uint32_t *)addr;
69152a693fSkettenis 	rmb();
70152a693fSkettenis 	return val;
71152a693fSkettenis }
72152a693fSkettenis 
73152a693fSkettenis static inline u64
ioread64(const volatile void __iomem * addr)74152a693fSkettenis ioread64(const volatile void __iomem *addr)
75152a693fSkettenis {
76152a693fSkettenis 	uint64_t val;
77152a693fSkettenis 
78aa850fc3Skettenis 	iobarrier();
79152a693fSkettenis 	val = *(volatile uint64_t *)addr;
80152a693fSkettenis 	rmb();
81152a693fSkettenis 	return val;
82152a693fSkettenis }
83152a693fSkettenis 
847f4dd379Sjsg static inline void
iowrite16(u16 val,volatile void __iomem * addr)857f4dd379Sjsg iowrite16(u16 val, volatile void __iomem *addr)
867f4dd379Sjsg {
87152a693fSkettenis 	wmb();
887f4dd379Sjsg 	*(volatile uint16_t *)addr = val;
897f4dd379Sjsg }
907f4dd379Sjsg 
917f4dd379Sjsg static inline void
iowrite32(u32 val,volatile void __iomem * addr)927f4dd379Sjsg iowrite32(u32 val, volatile void __iomem *addr)
937f4dd379Sjsg {
94152a693fSkettenis 	wmb();
957f4dd379Sjsg 	*(volatile uint32_t *)addr = val;
967f4dd379Sjsg }
977f4dd379Sjsg 
987f4dd379Sjsg static inline void
iowrite64(u64 val,volatile void __iomem * addr)997f4dd379Sjsg iowrite64(u64 val, volatile void __iomem *addr)
1007f4dd379Sjsg {
101152a693fSkettenis 	wmb();
1027f4dd379Sjsg 	*(volatile uint64_t *)addr = val;
1037f4dd379Sjsg }
1047f4dd379Sjsg 
105152a693fSkettenis #else
106152a693fSkettenis 
107152a693fSkettenis static inline u16
ioread16(const volatile void __iomem * addr)108152a693fSkettenis ioread16(const volatile void __iomem *addr)
109152a693fSkettenis {
110152a693fSkettenis 	uint16_t val;
111152a693fSkettenis 
112aa850fc3Skettenis 	iobarrier();
113152a693fSkettenis 	val = lemtoh16(addr);
114152a693fSkettenis 	rmb();
115152a693fSkettenis 	return val;
116152a693fSkettenis }
117152a693fSkettenis 
118152a693fSkettenis static inline u32
ioread32(const volatile void __iomem * addr)119152a693fSkettenis ioread32(const volatile void __iomem *addr)
120152a693fSkettenis {
121152a693fSkettenis 	uint32_t val;
122152a693fSkettenis 
123aa850fc3Skettenis 	iobarrier();
124152a693fSkettenis 	val = lemtoh32(addr);
125152a693fSkettenis 	rmb();
126152a693fSkettenis 	return val;
127152a693fSkettenis }
128152a693fSkettenis 
129152a693fSkettenis static inline u64
ioread64(const volatile void __iomem * addr)130152a693fSkettenis ioread64(const volatile void __iomem *addr)
131152a693fSkettenis {
132152a693fSkettenis 	uint64_t val;
133152a693fSkettenis 
134aa850fc3Skettenis 	iobarrier();
135152a693fSkettenis 	val = lemtoh64(addr);
136152a693fSkettenis 	rmb();
137152a693fSkettenis 	return val;
138152a693fSkettenis }
139152a693fSkettenis 
140152a693fSkettenis static inline void
iowrite16(u16 val,volatile void __iomem * addr)141152a693fSkettenis iowrite16(u16 val, volatile void __iomem *addr)
142152a693fSkettenis {
143152a693fSkettenis 	wmb();
144152a693fSkettenis 	htolem16(addr, val);
145152a693fSkettenis }
146152a693fSkettenis 
147152a693fSkettenis static inline void
iowrite32(u32 val,volatile void __iomem * addr)148152a693fSkettenis iowrite32(u32 val, volatile void __iomem *addr)
149152a693fSkettenis {
150152a693fSkettenis 	wmb();
151152a693fSkettenis 	htolem32(addr, val);
152152a693fSkettenis }
153152a693fSkettenis 
154152a693fSkettenis static inline void
iowrite64(u64 val,volatile void __iomem * addr)155152a693fSkettenis iowrite64(u64 val, volatile void __iomem *addr)
156152a693fSkettenis {
157152a693fSkettenis 	wmb();
158152a693fSkettenis 	htolem64(addr, val);
159152a693fSkettenis }
160152a693fSkettenis 
161152a693fSkettenis #endif
162152a693fSkettenis 
1637f4dd379Sjsg #define readb(p) ioread8(p)
1647f4dd379Sjsg #define writeb(v, p) iowrite8(v, p)
1657f4dd379Sjsg #define readw(p) ioread16(p)
1667f4dd379Sjsg #define writew(v, p) iowrite16(v, p)
1677f4dd379Sjsg #define readl(p) ioread32(p)
1687f4dd379Sjsg #define writel(v, p) iowrite32(v, p)
1697f4dd379Sjsg #define readq(p) ioread64(p)
1707f4dd379Sjsg #define writeq(v, p) iowrite64(v, p)
1717f4dd379Sjsg 
1729342ba5eSkettenis #define readl_relaxed(p) readl(p)
1739342ba5eSkettenis #define writel_relaxed(v, p) writel(v, p)
1749342ba5eSkettenis 
175c349dbc7Sjsg int	drm_mtrr_add(unsigned long, size_t, int);
176c349dbc7Sjsg int	drm_mtrr_del(int, unsigned long, size_t, int);
177c349dbc7Sjsg 
178c349dbc7Sjsg #define DRM_MTRR_WC	MDF_WRITECOMBINE
179c349dbc7Sjsg 
1801bb76ff1Sjsg static inline void *
IOMEM_ERR_PTR(long error)1811bb76ff1Sjsg IOMEM_ERR_PTR(long error)
1821bb76ff1Sjsg {
1831bb76ff1Sjsg 	return (void *) error;
1841bb76ff1Sjsg }
1851bb76ff1Sjsg 
186*667382c7Skettenis #define MEMREMAP_WB	(1 << 0)
187*667382c7Skettenis 
188*667382c7Skettenis void	*memremap(phys_addr_t, size_t, int);
189*667382c7Skettenis void	memunmap(void *);
190*667382c7Skettenis 
1917f4dd379Sjsg #endif
192