blob: d50e6127325d099fab38a583a09c9d666a6350f4 [file] [log] [blame]
Sam Ravnborgf5e706a2008-07-17 21:55:51 -07001#ifndef __SPARC64_IO_H
2#define __SPARC64_IO_H
3
4#include <linux/kernel.h>
5#include <linux/compiler.h>
6#include <linux/types.h>
7
8#include <asm/page.h> /* IO address mapping routines need this */
Sam Ravnborgf5e706a2008-07-17 21:55:51 -07009#include <asm/asi.h>
Michael S. Tsirkina21a2fd2011-11-24 21:10:12 +020010#include <asm-generic/pci_iomap.h>
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070011
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070012/* BIO layer definitions. */
13extern unsigned long kern_base, kern_size;
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070014
Sam Ravnborgadd79d62014-07-20 13:39:02 +020015/* __raw_{read,write}{b,w,l,q} uses direct access.
16 * Access the memory as big endian bypassing the cache
17 * by using ASI_PHYS_BYPASS_EC_E
18 */
19#define __raw_readb __raw_readb
20static inline u8 __raw_readb(const volatile void __iomem *addr)
21{
22 u8 ret;
23
24 __asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_raw_readb */"
25 : "=r" (ret)
26 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
27
28 return ret;
29}
30
31#define __raw_readw __raw_readw
32static inline u16 __raw_readw(const volatile void __iomem *addr)
33{
34 u16 ret;
35
36 __asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_raw_readw */"
37 : "=r" (ret)
38 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
39
40 return ret;
41}
42
43#define __raw_readl __raw_readl
44static inline u32 __raw_readl(const volatile void __iomem *addr)
45{
46 u32 ret;
47
48 __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_raw_readl */"
49 : "=r" (ret)
50 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
51
52 return ret;
53}
54
55#define __raw_readq __raw_readq
56static inline u64 __raw_readq(const volatile void __iomem *addr)
57{
58 u64 ret;
59
60 __asm__ __volatile__("ldxa\t[%1] %2, %0\t/* pci_raw_readq */"
61 : "=r" (ret)
62 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
63
64 return ret;
65}
66
67#define __raw_writeb __raw_writeb
68static inline void __raw_writeb(u8 b, const volatile void __iomem *addr)
69{
70 __asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_raw_writeb */"
71 : /* no outputs */
72 : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
73}
74
75#define __raw_writew __raw_writew
76static inline void __raw_writew(u16 w, const volatile void __iomem *addr)
77{
78 __asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_raw_writew */"
79 : /* no outputs */
80 : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
81}
82
83#define __raw_writel __raw_writel
84static inline void __raw_writel(u32 l, const volatile void __iomem *addr)
85{
86 __asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_raw_writel */"
87 : /* no outputs */
88 : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
89}
90
91#define __raw_writeq __raw_writeq
92static inline void __raw_writeq(u64 q, const volatile void __iomem *addr)
93{
94 __asm__ __volatile__("stxa\t%r0, [%1] %2\t/* pci_raw_writeq */"
95 : /* no outputs */
96 : "Jr" (q), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
97}
98
99/* Memory functions, same as I/O accesses on Ultra.
100 * Access memory as little endian bypassing
101 * the cache by using ASI_PHYS_BYPASS_EC_E_L
102 */
103#define readb readb
104static inline u8 readb(const volatile void __iomem *addr)
105{ u8 ret;
106
107 __asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_readb */"
108 : "=r" (ret)
109 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
110 : "memory");
111 return ret;
112}
113
114#define readw readw
115static inline u16 readw(const volatile void __iomem *addr)
116{ u16 ret;
117
118 __asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_readw */"
119 : "=r" (ret)
120 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
121 : "memory");
122
123 return ret;
124}
125
126#define readl readl
127static inline u32 readl(const volatile void __iomem *addr)
128{ u32 ret;
129
130 __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_readl */"
131 : "=r" (ret)
132 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
133 : "memory");
134
135 return ret;
136}
137
138#define readq readq
Will Deacon1191ccb2013-09-04 11:34:08 +0100139#define readq_relaxed readq
Sam Ravnborgadd79d62014-07-20 13:39:02 +0200140static inline u64 readq(const volatile void __iomem *addr)
141{ u64 ret;
142
143 __asm__ __volatile__("ldxa\t[%1] %2, %0\t/* pci_readq */"
144 : "=r" (ret)
145 : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
146 : "memory");
147
148 return ret;
149}
150
151#define writeb writeb
152static inline void writeb(u8 b, volatile void __iomem *addr)
153{
154 __asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_writeb */"
155 : /* no outputs */
156 : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
157 : "memory");
158}
159
160#define writew writew
161static inline void writew(u16 w, volatile void __iomem *addr)
162{
163 __asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_writew */"
164 : /* no outputs */
165 : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
166 : "memory");
167}
168
169#define writel writel
170static inline void writel(u32 l, volatile void __iomem *addr)
171{
172 __asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_writel */"
173 : /* no outputs */
174 : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
175 : "memory");
176}
177
178#define writeq writeq
Will Deacon1191ccb2013-09-04 11:34:08 +0100179#define writeq_relaxed writeq
Sam Ravnborgadd79d62014-07-20 13:39:02 +0200180static inline void writeq(u64 q, volatile void __iomem *addr)
181{
182 __asm__ __volatile__("stxa\t%r0, [%1] %2\t/* pci_writeq */"
183 : /* no outputs */
184 : "Jr" (q), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
185 : "memory");
186}
187
Sam Ravnborg79294d72014-07-20 13:39:00 +0200188#define inb inb
189static inline u8 inb(unsigned long addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700190{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200191 return readb((volatile void __iomem *)addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700192}
193
Sam Ravnborg79294d72014-07-20 13:39:00 +0200194#define inw inw
195static inline u16 inw(unsigned long addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700196{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200197 return readw((volatile void __iomem *)addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700198}
199
Sam Ravnborg79294d72014-07-20 13:39:00 +0200200#define inl inl
201static inline u32 inl(unsigned long addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700202{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200203 return readl((volatile void __iomem *)addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700204}
205
Sam Ravnborg79294d72014-07-20 13:39:00 +0200206#define outb outb
207static inline void outb(u8 b, unsigned long addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700208{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200209 writeb(b, (volatile void __iomem *)addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700210}
211
Sam Ravnborg79294d72014-07-20 13:39:00 +0200212#define outw outw
213static inline void outw(u16 w, unsigned long addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700214{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200215 writew(w, (volatile void __iomem *)addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700216}
217
Sam Ravnborg79294d72014-07-20 13:39:00 +0200218#define outl outl
219static inline void outl(u32 l, unsigned long addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700220{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200221 writel(l, (volatile void __iomem *)addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700222}
223
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700224
225#define inb_p(__addr) inb(__addr)
226#define outb_p(__b, __addr) outb(__b, __addr)
227#define inw_p(__addr) inw(__addr)
228#define outw_p(__w, __addr) outw(__w, __addr)
229#define inl_p(__addr) inl(__addr)
230#define outl_p(__l, __addr) outl(__l, __addr)
231
Sam Ravnborgf05a6862014-05-16 23:25:50 +0200232void outsb(unsigned long, const void *, unsigned long);
233void outsw(unsigned long, const void *, unsigned long);
234void outsl(unsigned long, const void *, unsigned long);
235void insb(unsigned long, void *, unsigned long);
236void insw(unsigned long, void *, unsigned long);
237void insl(unsigned long, void *, unsigned long);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700238
239static inline void ioread8_rep(void __iomem *port, void *buf, unsigned long count)
240{
241 insb((unsigned long __force)port, buf, count);
242}
243static inline void ioread16_rep(void __iomem *port, void *buf, unsigned long count)
244{
245 insw((unsigned long __force)port, buf, count);
246}
247
248static inline void ioread32_rep(void __iomem *port, void *buf, unsigned long count)
249{
250 insl((unsigned long __force)port, buf, count);
251}
252
253static inline void iowrite8_rep(void __iomem *port, const void *buf, unsigned long count)
254{
255 outsb((unsigned long __force)port, buf, count);
256}
257
258static inline void iowrite16_rep(void __iomem *port, const void *buf, unsigned long count)
259{
260 outsw((unsigned long __force)port, buf, count);
261}
262
263static inline void iowrite32_rep(void __iomem *port, const void *buf, unsigned long count)
264{
265 outsl((unsigned long __force)port, buf, count);
266}
267
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700268/* Valid I/O Space regions are anywhere, because each PCI bus supported
269 * can live in an arbitrary area of the physical address range.
270 */
271#define IO_SPACE_LIMIT 0xffffffffffffffffUL
272
273/* Now, SBUS variants, only difference from PCI is that we do
274 * not use little-endian ASIs.
275 */
Sam Ravnborg79294d72014-07-20 13:39:00 +0200276static inline u8 sbus_readb(const volatile void __iomem *addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700277{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200278 return __raw_readb(addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700279}
280
Sam Ravnborg79294d72014-07-20 13:39:00 +0200281static inline u16 sbus_readw(const volatile void __iomem *addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700282{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200283 return __raw_readw(addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700284}
285
Sam Ravnborg79294d72014-07-20 13:39:00 +0200286static inline u32 sbus_readl(const volatile void __iomem *addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700287{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200288 return __raw_readl(addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700289}
290
Sam Ravnborg79294d72014-07-20 13:39:00 +0200291static inline u64 sbus_readq(const volatile void __iomem *addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700292{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200293 return __raw_readq(addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700294}
295
Sam Ravnborg79294d72014-07-20 13:39:00 +0200296static inline void sbus_writeb(u8 b, volatile void __iomem *addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700297{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200298 __raw_writeb(b, addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700299}
300
Sam Ravnborg79294d72014-07-20 13:39:00 +0200301static inline void sbus_writew(u16 w, volatile void __iomem *addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700302{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200303 __raw_writew(w, addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700304}
305
Sam Ravnborg79294d72014-07-20 13:39:00 +0200306static inline void sbus_writel(u32 l, volatile void __iomem *addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700307{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200308 __raw_writel(l, addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700309}
310
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200311static inline void sbus_writeq(u64 q, volatile void __iomem *addr)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700312{
Sam Ravnborg453c9ab2014-07-20 13:39:03 +0200313 __raw_writeq(q, addr);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700314}
315
Sam Ravnborg79294d72014-07-20 13:39:00 +0200316static inline void sbus_memset_io(volatile void __iomem *dst, int c, __kernel_size_t n)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700317{
318 while(n--) {
319 sbus_writeb(c, dst);
320 dst++;
321 }
322}
323
Sam Ravnborg79294d72014-07-20 13:39:00 +0200324static inline void memset_io(volatile void __iomem *dst, int c, __kernel_size_t n)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700325{
326 volatile void __iomem *d = dst;
327
328 while (n--) {
329 writeb(c, d);
330 d++;
331 }
332}
333
Sam Ravnborg79294d72014-07-20 13:39:00 +0200334static inline void sbus_memcpy_fromio(void *dst, const volatile void __iomem *src,
335 __kernel_size_t n)
James Hoganf11b4782010-10-27 15:33:28 -0700336{
337 char *d = dst;
338
339 while (n--) {
340 char tmp = sbus_readb(src);
341 *d++ = tmp;
342 src++;
343 }
344}
345
James Hoganf11b4782010-10-27 15:33:28 -0700346
Sam Ravnborg79294d72014-07-20 13:39:00 +0200347static inline void memcpy_fromio(void *dst, const volatile void __iomem *src,
348 __kernel_size_t n)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700349{
350 char *d = dst;
351
352 while (n--) {
353 char tmp = readb(src);
354 *d++ = tmp;
355 src++;
356 }
357}
358
Sam Ravnborg79294d72014-07-20 13:39:00 +0200359static inline void sbus_memcpy_toio(volatile void __iomem *dst, const void *src,
360 __kernel_size_t n)
James Hoganf11b4782010-10-27 15:33:28 -0700361{
362 const char *s = src;
363 volatile void __iomem *d = dst;
364
365 while (n--) {
366 char tmp = *s++;
367 sbus_writeb(tmp, d);
368 d++;
369 }
370}
371
Sam Ravnborg79294d72014-07-20 13:39:00 +0200372static inline void memcpy_toio(volatile void __iomem *dst, const void *src,
373 __kernel_size_t n)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700374{
375 const char *s = src;
376 volatile void __iomem *d = dst;
377
378 while (n--) {
379 char tmp = *s++;
380 writeb(tmp, d);
381 d++;
382 }
383}
384
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700385#define mmiowb()
386
387#ifdef __KERNEL__
388
389/* On sparc64 we have the whole physical IO address space accessible
390 * using physically addressed loads and stores, so this does nothing.
391 */
392static inline void __iomem *ioremap(unsigned long offset, unsigned long size)
393{
394 return (void __iomem *)offset;
395}
396
397#define ioremap_nocache(X,Y) ioremap((X),(Y))
David S. Miller428695b2008-07-22 14:30:55 -0700398#define ioremap_wc(X,Y) ioremap((X),(Y))
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700399
400static inline void iounmap(volatile void __iomem *addr)
401{
402}
403
404#define ioread8(X) readb(X)
405#define ioread16(X) readw(X)
David S. Miller1bff4db2010-03-03 02:30:37 -0800406#define ioread16be(X) __raw_readw(X)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700407#define ioread32(X) readl(X)
David S. Miller1bff4db2010-03-03 02:30:37 -0800408#define ioread32be(X) __raw_readl(X)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700409#define iowrite8(val,X) writeb(val,X)
410#define iowrite16(val,X) writew(val,X)
David S. Miller1bff4db2010-03-03 02:30:37 -0800411#define iowrite16be(val,X) __raw_writew(val,X)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700412#define iowrite32(val,X) writel(val,X)
David S. Miller1bff4db2010-03-03 02:30:37 -0800413#define iowrite32be(val,X) __raw_writel(val,X)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700414
415/* Create a virtual mapping cookie for an IO port range */
Sam Ravnborgf05a6862014-05-16 23:25:50 +0200416void __iomem *ioport_map(unsigned long port, unsigned int nr);
417void ioport_unmap(void __iomem *);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700418
419/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
420struct pci_dev;
Sam Ravnborgf05a6862014-05-16 23:25:50 +0200421void pci_iounmap(struct pci_dev *dev, void __iomem *);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700422
David S. Miller63237ee2008-08-26 23:33:42 -0700423static inline int sbus_can_dma_64bit(void)
424{
425 return 1;
426}
427static inline int sbus_can_burst64(void)
428{
429 return 1;
430}
431struct device;
Sam Ravnborgf05a6862014-05-16 23:25:50 +0200432void sbus_set_sbus64(struct device *, int);
David S. Miller63237ee2008-08-26 23:33:42 -0700433
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700434/*
435 * Convert a physical pointer to a virtual kernel pointer for /dev/mem
436 * access
437 */
438#define xlate_dev_mem_ptr(p) __va(p)
439
440/*
441 * Convert a virtual cached pointer to an uncached pointer
442 */
443#define xlate_dev_kmem_ptr(p) p
444
445#endif
446
447#endif /* !(__SPARC64_IO_H) */