1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _ASM_IO_H
3*4882a593Smuzhiyun #define _ASM_IO_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <linux/types.h>
6*4882a593Smuzhiyun #include <linux/pgtable.h>
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #define virt_to_phys(a) ((unsigned long)__pa(a))
9*4882a593Smuzhiyun #define phys_to_virt(a) __va(a)
10*4882a593Smuzhiyun #define virt_to_bus virt_to_phys
11*4882a593Smuzhiyun #define bus_to_virt phys_to_virt
12*4882a593Smuzhiyun
isa_bus_to_virt(unsigned long addr)13*4882a593Smuzhiyun static inline unsigned long isa_bus_to_virt(unsigned long addr) {
14*4882a593Smuzhiyun BUG();
15*4882a593Smuzhiyun return 0;
16*4882a593Smuzhiyun }
17*4882a593Smuzhiyun
isa_virt_to_bus(void * addr)18*4882a593Smuzhiyun static inline unsigned long isa_virt_to_bus(void *addr) {
19*4882a593Smuzhiyun BUG();
20*4882a593Smuzhiyun return 0;
21*4882a593Smuzhiyun }
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun /*
24*4882a593Smuzhiyun * Memory mapped I/O
25*4882a593Smuzhiyun *
26*4882a593Smuzhiyun * readX()/writeX() do byteswapping and take an ioremapped address
27*4882a593Smuzhiyun * __raw_readX()/__raw_writeX() don't byteswap and take an ioremapped address.
28*4882a593Smuzhiyun * gsc_*() don't byteswap and operate on physical addresses;
29*4882a593Smuzhiyun * eg dev->hpa or 0xfee00000.
30*4882a593Smuzhiyun */
31*4882a593Smuzhiyun
gsc_readb(unsigned long addr)32*4882a593Smuzhiyun static inline unsigned char gsc_readb(unsigned long addr)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun long flags;
35*4882a593Smuzhiyun unsigned char ret;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun __asm__ __volatile__(
38*4882a593Smuzhiyun " rsm %3,%0\n"
39*4882a593Smuzhiyun " ldbx 0(%2),%1\n"
40*4882a593Smuzhiyun " mtsm %0\n"
41*4882a593Smuzhiyun : "=&r" (flags), "=r" (ret) : "r" (addr), "i" (PSW_SM_D) );
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun return ret;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
gsc_readw(unsigned long addr)46*4882a593Smuzhiyun static inline unsigned short gsc_readw(unsigned long addr)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun long flags;
49*4882a593Smuzhiyun unsigned short ret;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun __asm__ __volatile__(
52*4882a593Smuzhiyun " rsm %3,%0\n"
53*4882a593Smuzhiyun " ldhx 0(%2),%1\n"
54*4882a593Smuzhiyun " mtsm %0\n"
55*4882a593Smuzhiyun : "=&r" (flags), "=r" (ret) : "r" (addr), "i" (PSW_SM_D) );
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun return ret;
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun
gsc_readl(unsigned long addr)60*4882a593Smuzhiyun static inline unsigned int gsc_readl(unsigned long addr)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun u32 ret;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun __asm__ __volatile__(
65*4882a593Smuzhiyun " ldwax 0(%1),%0\n"
66*4882a593Smuzhiyun : "=r" (ret) : "r" (addr) );
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun return ret;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun
gsc_readq(unsigned long addr)71*4882a593Smuzhiyun static inline unsigned long long gsc_readq(unsigned long addr)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun unsigned long long ret;
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun #ifdef CONFIG_64BIT
76*4882a593Smuzhiyun __asm__ __volatile__(
77*4882a593Smuzhiyun " ldda 0(%1),%0\n"
78*4882a593Smuzhiyun : "=r" (ret) : "r" (addr) );
79*4882a593Smuzhiyun #else
80*4882a593Smuzhiyun /* two reads may have side effects.. */
81*4882a593Smuzhiyun ret = ((u64) gsc_readl(addr)) << 32;
82*4882a593Smuzhiyun ret |= gsc_readl(addr+4);
83*4882a593Smuzhiyun #endif
84*4882a593Smuzhiyun return ret;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
gsc_writeb(unsigned char val,unsigned long addr)87*4882a593Smuzhiyun static inline void gsc_writeb(unsigned char val, unsigned long addr)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun long flags;
90*4882a593Smuzhiyun __asm__ __volatile__(
91*4882a593Smuzhiyun " rsm %3,%0\n"
92*4882a593Smuzhiyun " stbs %1,0(%2)\n"
93*4882a593Smuzhiyun " mtsm %0\n"
94*4882a593Smuzhiyun : "=&r" (flags) : "r" (val), "r" (addr), "i" (PSW_SM_D) );
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun
gsc_writew(unsigned short val,unsigned long addr)97*4882a593Smuzhiyun static inline void gsc_writew(unsigned short val, unsigned long addr)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun long flags;
100*4882a593Smuzhiyun __asm__ __volatile__(
101*4882a593Smuzhiyun " rsm %3,%0\n"
102*4882a593Smuzhiyun " sths %1,0(%2)\n"
103*4882a593Smuzhiyun " mtsm %0\n"
104*4882a593Smuzhiyun : "=&r" (flags) : "r" (val), "r" (addr), "i" (PSW_SM_D) );
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun
gsc_writel(unsigned int val,unsigned long addr)107*4882a593Smuzhiyun static inline void gsc_writel(unsigned int val, unsigned long addr)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun __asm__ __volatile__(
110*4882a593Smuzhiyun " stwas %0,0(%1)\n"
111*4882a593Smuzhiyun : : "r" (val), "r" (addr) );
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
gsc_writeq(unsigned long long val,unsigned long addr)114*4882a593Smuzhiyun static inline void gsc_writeq(unsigned long long val, unsigned long addr)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun #ifdef CONFIG_64BIT
117*4882a593Smuzhiyun __asm__ __volatile__(
118*4882a593Smuzhiyun " stda %0,0(%1)\n"
119*4882a593Smuzhiyun : : "r" (val), "r" (addr) );
120*4882a593Smuzhiyun #else
121*4882a593Smuzhiyun /* two writes may have side effects.. */
122*4882a593Smuzhiyun gsc_writel(val >> 32, addr);
123*4882a593Smuzhiyun gsc_writel(val, addr+4);
124*4882a593Smuzhiyun #endif
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun /*
128*4882a593Smuzhiyun * The standard PCI ioremap interfaces
129*4882a593Smuzhiyun */
130*4882a593Smuzhiyun void __iomem *ioremap(unsigned long offset, unsigned long size);
131*4882a593Smuzhiyun #define ioremap_wc ioremap
132*4882a593Smuzhiyun #define ioremap_uc ioremap
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun extern void iounmap(const volatile void __iomem *addr);
135*4882a593Smuzhiyun
__raw_readb(const volatile void __iomem * addr)136*4882a593Smuzhiyun static inline unsigned char __raw_readb(const volatile void __iomem *addr)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun return (*(volatile unsigned char __force *) (addr));
139*4882a593Smuzhiyun }
__raw_readw(const volatile void __iomem * addr)140*4882a593Smuzhiyun static inline unsigned short __raw_readw(const volatile void __iomem *addr)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun return *(volatile unsigned short __force *) addr;
143*4882a593Smuzhiyun }
__raw_readl(const volatile void __iomem * addr)144*4882a593Smuzhiyun static inline unsigned int __raw_readl(const volatile void __iomem *addr)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun return *(volatile unsigned int __force *) addr;
147*4882a593Smuzhiyun }
__raw_readq(const volatile void __iomem * addr)148*4882a593Smuzhiyun static inline unsigned long long __raw_readq(const volatile void __iomem *addr)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun return *(volatile unsigned long long __force *) addr;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
__raw_writeb(unsigned char b,volatile void __iomem * addr)153*4882a593Smuzhiyun static inline void __raw_writeb(unsigned char b, volatile void __iomem *addr)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun *(volatile unsigned char __force *) addr = b;
156*4882a593Smuzhiyun }
__raw_writew(unsigned short b,volatile void __iomem * addr)157*4882a593Smuzhiyun static inline void __raw_writew(unsigned short b, volatile void __iomem *addr)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun *(volatile unsigned short __force *) addr = b;
160*4882a593Smuzhiyun }
__raw_writel(unsigned int b,volatile void __iomem * addr)161*4882a593Smuzhiyun static inline void __raw_writel(unsigned int b, volatile void __iomem *addr)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun *(volatile unsigned int __force *) addr = b;
164*4882a593Smuzhiyun }
__raw_writeq(unsigned long long b,volatile void __iomem * addr)165*4882a593Smuzhiyun static inline void __raw_writeq(unsigned long long b, volatile void __iomem *addr)
166*4882a593Smuzhiyun {
167*4882a593Smuzhiyun *(volatile unsigned long long __force *) addr = b;
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun
readb(const volatile void __iomem * addr)170*4882a593Smuzhiyun static inline unsigned char readb(const volatile void __iomem *addr)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun return __raw_readb(addr);
173*4882a593Smuzhiyun }
readw(const volatile void __iomem * addr)174*4882a593Smuzhiyun static inline unsigned short readw(const volatile void __iomem *addr)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun return le16_to_cpu((__le16 __force) __raw_readw(addr));
177*4882a593Smuzhiyun }
readl(const volatile void __iomem * addr)178*4882a593Smuzhiyun static inline unsigned int readl(const volatile void __iomem *addr)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun return le32_to_cpu((__le32 __force) __raw_readl(addr));
181*4882a593Smuzhiyun }
readq(const volatile void __iomem * addr)182*4882a593Smuzhiyun static inline unsigned long long readq(const volatile void __iomem *addr)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun return le64_to_cpu((__le64 __force) __raw_readq(addr));
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun
writeb(unsigned char b,volatile void __iomem * addr)187*4882a593Smuzhiyun static inline void writeb(unsigned char b, volatile void __iomem *addr)
188*4882a593Smuzhiyun {
189*4882a593Smuzhiyun __raw_writeb(b, addr);
190*4882a593Smuzhiyun }
writew(unsigned short w,volatile void __iomem * addr)191*4882a593Smuzhiyun static inline void writew(unsigned short w, volatile void __iomem *addr)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun __raw_writew((__u16 __force) cpu_to_le16(w), addr);
194*4882a593Smuzhiyun }
writel(unsigned int l,volatile void __iomem * addr)195*4882a593Smuzhiyun static inline void writel(unsigned int l, volatile void __iomem *addr)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun __raw_writel((__u32 __force) cpu_to_le32(l), addr);
198*4882a593Smuzhiyun }
writeq(unsigned long long q,volatile void __iomem * addr)199*4882a593Smuzhiyun static inline void writeq(unsigned long long q, volatile void __iomem *addr)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun __raw_writeq((__u64 __force) cpu_to_le64(q), addr);
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun #define readb readb
205*4882a593Smuzhiyun #define readw readw
206*4882a593Smuzhiyun #define readl readl
207*4882a593Smuzhiyun #define readq readq
208*4882a593Smuzhiyun #define writeb writeb
209*4882a593Smuzhiyun #define writew writew
210*4882a593Smuzhiyun #define writel writel
211*4882a593Smuzhiyun #define writeq writeq
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun #define readb_relaxed(addr) readb(addr)
214*4882a593Smuzhiyun #define readw_relaxed(addr) readw(addr)
215*4882a593Smuzhiyun #define readl_relaxed(addr) readl(addr)
216*4882a593Smuzhiyun #define readq_relaxed(addr) readq(addr)
217*4882a593Smuzhiyun #define writeb_relaxed(b, addr) writeb(b, addr)
218*4882a593Smuzhiyun #define writew_relaxed(w, addr) writew(w, addr)
219*4882a593Smuzhiyun #define writel_relaxed(l, addr) writel(l, addr)
220*4882a593Smuzhiyun #define writeq_relaxed(q, addr) writeq(q, addr)
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun void memset_io(volatile void __iomem *addr, unsigned char val, int count);
223*4882a593Smuzhiyun void memcpy_fromio(void *dst, const volatile void __iomem *src, int count);
224*4882a593Smuzhiyun void memcpy_toio(volatile void __iomem *dst, const void *src, int count);
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun /* Port-space IO */
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun #define inb_p inb
229*4882a593Smuzhiyun #define inw_p inw
230*4882a593Smuzhiyun #define inl_p inl
231*4882a593Smuzhiyun #define outb_p outb
232*4882a593Smuzhiyun #define outw_p outw
233*4882a593Smuzhiyun #define outl_p outl
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun extern unsigned char eisa_in8(unsigned short port);
236*4882a593Smuzhiyun extern unsigned short eisa_in16(unsigned short port);
237*4882a593Smuzhiyun extern unsigned int eisa_in32(unsigned short port);
238*4882a593Smuzhiyun extern void eisa_out8(unsigned char data, unsigned short port);
239*4882a593Smuzhiyun extern void eisa_out16(unsigned short data, unsigned short port);
240*4882a593Smuzhiyun extern void eisa_out32(unsigned int data, unsigned short port);
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun #if defined(CONFIG_PCI)
243*4882a593Smuzhiyun extern unsigned char inb(int addr);
244*4882a593Smuzhiyun extern unsigned short inw(int addr);
245*4882a593Smuzhiyun extern unsigned int inl(int addr);
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun extern void outb(unsigned char b, int addr);
248*4882a593Smuzhiyun extern void outw(unsigned short b, int addr);
249*4882a593Smuzhiyun extern void outl(unsigned int b, int addr);
250*4882a593Smuzhiyun #elif defined(CONFIG_EISA)
251*4882a593Smuzhiyun #define inb eisa_in8
252*4882a593Smuzhiyun #define inw eisa_in16
253*4882a593Smuzhiyun #define inl eisa_in32
254*4882a593Smuzhiyun #define outb eisa_out8
255*4882a593Smuzhiyun #define outw eisa_out16
256*4882a593Smuzhiyun #define outl eisa_out32
257*4882a593Smuzhiyun #else
inb(unsigned long addr)258*4882a593Smuzhiyun static inline char inb(unsigned long addr)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun BUG();
261*4882a593Smuzhiyun return -1;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
inw(unsigned long addr)264*4882a593Smuzhiyun static inline short inw(unsigned long addr)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun BUG();
267*4882a593Smuzhiyun return -1;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun
inl(unsigned long addr)270*4882a593Smuzhiyun static inline int inl(unsigned long addr)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun BUG();
273*4882a593Smuzhiyun return -1;
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun #define outb(x, y) BUG()
277*4882a593Smuzhiyun #define outw(x, y) BUG()
278*4882a593Smuzhiyun #define outl(x, y) BUG()
279*4882a593Smuzhiyun #endif
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun /*
282*4882a593Smuzhiyun * String versions of in/out ops:
283*4882a593Smuzhiyun */
284*4882a593Smuzhiyun extern void insb (unsigned long port, void *dst, unsigned long count);
285*4882a593Smuzhiyun extern void insw (unsigned long port, void *dst, unsigned long count);
286*4882a593Smuzhiyun extern void insl (unsigned long port, void *dst, unsigned long count);
287*4882a593Smuzhiyun extern void outsb (unsigned long port, const void *src, unsigned long count);
288*4882a593Smuzhiyun extern void outsw (unsigned long port, const void *src, unsigned long count);
289*4882a593Smuzhiyun extern void outsl (unsigned long port, const void *src, unsigned long count);
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun /* IO Port space is : BBiiii where BB is HBA number. */
293*4882a593Smuzhiyun #define IO_SPACE_LIMIT 0x00ffffff
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun /* PA machines have an MM I/O space from 0xf0000000-0xffffffff in 32
296*4882a593Smuzhiyun * bit mode and from 0xfffffffff0000000-0xfffffffffffffff in 64 bit
297*4882a593Smuzhiyun * mode (essentially just sign extending. This macro takes in a 32
298*4882a593Smuzhiyun * bit I/O address (still with the leading f) and outputs the correct
299*4882a593Smuzhiyun * value for either 32 or 64 bit mode */
300*4882a593Smuzhiyun #define F_EXTEND(x) ((unsigned long)((x) | (0xffffffff00000000ULL)))
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun #define ioread64 ioread64
303*4882a593Smuzhiyun #define ioread64be ioread64be
304*4882a593Smuzhiyun #define iowrite64 iowrite64
305*4882a593Smuzhiyun #define iowrite64be iowrite64be
306*4882a593Smuzhiyun extern u64 ioread64(const void __iomem *addr);
307*4882a593Smuzhiyun extern u64 ioread64be(const void __iomem *addr);
308*4882a593Smuzhiyun extern void iowrite64(u64 val, void __iomem *addr);
309*4882a593Smuzhiyun extern void iowrite64be(u64 val, void __iomem *addr);
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun #include <asm-generic/iomap.h>
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun /*
314*4882a593Smuzhiyun * Convert a physical pointer to a virtual kernel pointer for /dev/mem
315*4882a593Smuzhiyun * access
316*4882a593Smuzhiyun */
317*4882a593Smuzhiyun #define xlate_dev_mem_ptr(p) __va(p)
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun /*
320*4882a593Smuzhiyun * Convert a virtual cached pointer to an uncached pointer
321*4882a593Smuzhiyun */
322*4882a593Smuzhiyun #define xlate_dev_kmem_ptr(p) p
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun #endif
325