1
2#ifndef _ASM_POWERPC_IO_H
3#define _ASM_POWERPC_IO_H
4#ifdef __KERNEL__
5
6#define ARCH_HAS_IOREMAP_WC
7#ifdef CONFIG_PPC32
8#define ARCH_HAS_IOREMAP_WT
9#endif
10
11
12
13
14
15extern int check_legacy_ioport(unsigned long base_port);
16#define I8042_DATA_REG 0x60
17#define FDC_BASE 0x3f0
18
19#if defined(CONFIG_PPC64) && defined(CONFIG_PCI)
20extern struct pci_dev *isa_bridge_pcidev;
21
22
23
24#define arch_has_dev_port() (isa_bridge_pcidev != NULL || isa_io_special)
25#endif
26
27#include <linux/device.h>
28#include <linux/compiler.h>
29#include <linux/mm.h>
30#include <asm/page.h>
31#include <asm/byteorder.h>
32#include <asm/synch.h>
33#include <asm/delay.h>
34#include <asm/mmiowb.h>
35#include <asm/mmu.h>
36#include <asm/ppc_asm.h>
37
38#define SIO_CONFIG_RA 0x398
39#define SIO_CONFIG_RD 0x399
40
41#define SLOW_DOWN_IO
42
43
44
45
46
47#ifndef CONFIG_PCI
48#define _IO_BASE 0
49#define _ISA_MEM_BASE 0
50#define PCI_DRAM_OFFSET 0
51#elif defined(CONFIG_PPC32)
52#define _IO_BASE isa_io_base
53#define _ISA_MEM_BASE isa_mem_base
54#define PCI_DRAM_OFFSET pci_dram_offset
55#else
56#define _IO_BASE pci_io_base
57#define _ISA_MEM_BASE isa_mem_base
58#define PCI_DRAM_OFFSET 0
59#endif
60
61extern unsigned long isa_io_base;
62extern unsigned long pci_io_base;
63extern unsigned long pci_dram_offset;
64
65extern resource_size_t isa_mem_base;
66
67
68
69
70
71
72
73extern bool isa_io_special;
74
75#ifdef CONFIG_PPC32
76#if defined(CONFIG_PPC_INDIRECT_PIO) || defined(CONFIG_PPC_INDIRECT_MMIO)
77#error CONFIG_PPC_INDIRECT_{PIO,MMIO} are not yet supported on 32 bits
78#endif
79#endif
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103#define DEF_MMIO_IN_X(name, size, insn) \
104static inline u##size name(const volatile u##size __iomem *addr) \
105{ \
106 u##size ret; \
107 __asm__ __volatile__("sync;"#insn" %0,%y1;twi 0,%0,0;isync" \
108 : "=r" (ret) : "Z" (*addr) : "memory"); \
109 return ret; \
110}
111
112#define DEF_MMIO_OUT_X(name, size, insn) \
113static inline void name(volatile u##size __iomem *addr, u##size val) \
114{ \
115 __asm__ __volatile__("sync;"#insn" %1,%y0" \
116 : "=Z" (*addr) : "r" (val) : "memory"); \
117 mmiowb_set_pending(); \
118}
119
120#define DEF_MMIO_IN_D(name, size, insn) \
121static inline u##size name(const volatile u##size __iomem *addr) \
122{ \
123 u##size ret; \
124 __asm__ __volatile__("sync;"#insn"%U1%X1 %0,%1;twi 0,%0,0;isync"\
125 : "=r" (ret) : "m<>" (*addr) : "memory"); \
126 return ret; \
127}
128
129#define DEF_MMIO_OUT_D(name, size, insn) \
130static inline void name(volatile u##size __iomem *addr, u##size val) \
131{ \
132 __asm__ __volatile__("sync;"#insn"%U0%X0 %1,%0" \
133 : "=m<>" (*addr) : "r" (val) : "memory"); \
134 mmiowb_set_pending(); \
135}
136
137DEF_MMIO_IN_D(in_8, 8, lbz);
138DEF_MMIO_OUT_D(out_8, 8, stb);
139
140#ifdef __BIG_ENDIAN__
141DEF_MMIO_IN_D(in_be16, 16, lhz);
142DEF_MMIO_IN_D(in_be32, 32, lwz);
143DEF_MMIO_IN_X(in_le16, 16, lhbrx);
144DEF_MMIO_IN_X(in_le32, 32, lwbrx);
145
146DEF_MMIO_OUT_D(out_be16, 16, sth);
147DEF_MMIO_OUT_D(out_be32, 32, stw);
148DEF_MMIO_OUT_X(out_le16, 16, sthbrx);
149DEF_MMIO_OUT_X(out_le32, 32, stwbrx);
150#else
151DEF_MMIO_IN_X(in_be16, 16, lhbrx);
152DEF_MMIO_IN_X(in_be32, 32, lwbrx);
153DEF_MMIO_IN_D(in_le16, 16, lhz);
154DEF_MMIO_IN_D(in_le32, 32, lwz);
155
156DEF_MMIO_OUT_X(out_be16, 16, sthbrx);
157DEF_MMIO_OUT_X(out_be32, 32, stwbrx);
158DEF_MMIO_OUT_D(out_le16, 16, sth);
159DEF_MMIO_OUT_D(out_le32, 32, stw);
160
161#endif
162
163#ifdef __powerpc64__
164
165#ifdef __BIG_ENDIAN__
166DEF_MMIO_OUT_D(out_be64, 64, std);
167DEF_MMIO_IN_D(in_be64, 64, ld);
168
169
170static inline u64 in_le64(const volatile u64 __iomem *addr)
171{
172 return swab64(in_be64(addr));
173}
174
175static inline void out_le64(volatile u64 __iomem *addr, u64 val)
176{
177 out_be64(addr, swab64(val));
178}
179#else
180DEF_MMIO_OUT_D(out_le64, 64, std);
181DEF_MMIO_IN_D(in_le64, 64, ld);
182
183
184static inline u64 in_be64(const volatile u64 __iomem *addr)
185{
186 return swab64(in_le64(addr));
187}
188
189static inline void out_be64(volatile u64 __iomem *addr, u64 val)
190{
191 out_le64(addr, swab64(val));
192}
193
194#endif
195#endif
196
197
198
199
200extern void _insb(const volatile u8 __iomem *addr, void *buf, long count);
201extern void _outsb(volatile u8 __iomem *addr,const void *buf,long count);
202extern void _insw_ns(const volatile u16 __iomem *addr, void *buf, long count);
203extern void _outsw_ns(volatile u16 __iomem *addr, const void *buf, long count);
204extern void _insl_ns(const volatile u32 __iomem *addr, void *buf, long count);
205extern void _outsl_ns(volatile u32 __iomem *addr, const void *buf, long count);
206
207
208
209
210#define _insw _insw_ns
211#define _insl _insl_ns
212#define _outsw _outsw_ns
213#define _outsl _outsl_ns
214
215
216
217
218
219
220extern void _memset_io(volatile void __iomem *addr, int c, unsigned long n);
221extern void _memcpy_fromio(void *dest, const volatile void __iomem *src,
222 unsigned long n);
223extern void _memcpy_toio(volatile void __iomem *dest, const void *src,
224 unsigned long n);
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244#ifdef CONFIG_EEH
245#include <asm/eeh.h>
246#endif
247
248
249#define PCI_IO_ADDR volatile void __iomem *
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277#ifdef CONFIG_PPC_INDIRECT_MMIO
278#define PCI_IO_IND_TOKEN_SHIFT 52
279#define PCI_IO_IND_TOKEN_MASK (0xfful << PCI_IO_IND_TOKEN_SHIFT)
280#define PCI_FIX_ADDR(addr) \
281 ((PCI_IO_ADDR)(((unsigned long)(addr)) & ~PCI_IO_IND_TOKEN_MASK))
282#define PCI_GET_ADDR_TOKEN(addr) \
283 (((unsigned long)(addr) & PCI_IO_IND_TOKEN_MASK) >> \
284 PCI_IO_IND_TOKEN_SHIFT)
285#define PCI_SET_ADDR_TOKEN(addr, token) \
286do { \
287 unsigned long __a = (unsigned long)(addr); \
288 __a &= ~PCI_IO_IND_TOKEN_MASK; \
289 __a |= ((unsigned long)(token)) << PCI_IO_IND_TOKEN_SHIFT; \
290 (addr) = (void __iomem *)__a; \
291} while(0)
292#else
293#define PCI_FIX_ADDR(addr) (addr)
294#endif
295
296
297
298
299
300
301static inline unsigned char __raw_readb(const volatile void __iomem *addr)
302{
303 return *(volatile unsigned char __force *)PCI_FIX_ADDR(addr);
304}
305#define __raw_readb __raw_readb
306
307static inline unsigned short __raw_readw(const volatile void __iomem *addr)
308{
309 return *(volatile unsigned short __force *)PCI_FIX_ADDR(addr);
310}
311#define __raw_readw __raw_readw
312
313static inline unsigned int __raw_readl(const volatile void __iomem *addr)
314{
315 return *(volatile unsigned int __force *)PCI_FIX_ADDR(addr);
316}
317#define __raw_readl __raw_readl
318
319static inline void __raw_writeb(unsigned char v, volatile void __iomem *addr)
320{
321 *(volatile unsigned char __force *)PCI_FIX_ADDR(addr) = v;
322}
323#define __raw_writeb __raw_writeb
324
325static inline void __raw_writew(unsigned short v, volatile void __iomem *addr)
326{
327 *(volatile unsigned short __force *)PCI_FIX_ADDR(addr) = v;
328}
329#define __raw_writew __raw_writew
330
331static inline void __raw_writel(unsigned int v, volatile void __iomem *addr)
332{
333 *(volatile unsigned int __force *)PCI_FIX_ADDR(addr) = v;
334}
335#define __raw_writel __raw_writel
336
337#ifdef __powerpc64__
338static inline unsigned long __raw_readq(const volatile void __iomem *addr)
339{
340 return *(volatile unsigned long __force *)PCI_FIX_ADDR(addr);
341}
342#define __raw_readq __raw_readq
343
344static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr)
345{
346 *(volatile unsigned long __force *)PCI_FIX_ADDR(addr) = v;
347}
348#define __raw_writeq __raw_writeq
349
350static inline void __raw_writeq_be(unsigned long v, volatile void __iomem *addr)
351{
352 __raw_writeq((__force unsigned long)cpu_to_be64(v), addr);
353}
354#define __raw_writeq_be __raw_writeq_be
355
356
357
358
359
360static inline void __raw_rm_writeb(u8 val, volatile void __iomem *paddr)
361{
362 __asm__ __volatile__(".machine push; \
363 .machine power6; \
364 stbcix %0,0,%1; \
365 .machine pop;"
366 : : "r" (val), "r" (paddr) : "memory");
367}
368
369static inline void __raw_rm_writew(u16 val, volatile void __iomem *paddr)
370{
371 __asm__ __volatile__(".machine push; \
372 .machine power6; \
373 sthcix %0,0,%1; \
374 .machine pop;"
375 : : "r" (val), "r" (paddr) : "memory");
376}
377
378static inline void __raw_rm_writel(u32 val, volatile void __iomem *paddr)
379{
380 __asm__ __volatile__(".machine push; \
381 .machine power6; \
382 stwcix %0,0,%1; \
383 .machine pop;"
384 : : "r" (val), "r" (paddr) : "memory");
385}
386
387static inline void __raw_rm_writeq(u64 val, volatile void __iomem *paddr)
388{
389 __asm__ __volatile__(".machine push; \
390 .machine power6; \
391 stdcix %0,0,%1; \
392 .machine pop;"
393 : : "r" (val), "r" (paddr) : "memory");
394}
395
396static inline void __raw_rm_writeq_be(u64 val, volatile void __iomem *paddr)
397{
398 __raw_rm_writeq((__force u64)cpu_to_be64(val), paddr);
399}
400
401static inline u8 __raw_rm_readb(volatile void __iomem *paddr)
402{
403 u8 ret;
404 __asm__ __volatile__(".machine push; \
405 .machine power6; \
406 lbzcix %0,0, %1; \
407 .machine pop;"
408 : "=r" (ret) : "r" (paddr) : "memory");
409 return ret;
410}
411
412static inline u16 __raw_rm_readw(volatile void __iomem *paddr)
413{
414 u16 ret;
415 __asm__ __volatile__(".machine push; \
416 .machine power6; \
417 lhzcix %0,0, %1; \
418 .machine pop;"
419 : "=r" (ret) : "r" (paddr) : "memory");
420 return ret;
421}
422
423static inline u32 __raw_rm_readl(volatile void __iomem *paddr)
424{
425 u32 ret;
426 __asm__ __volatile__(".machine push; \
427 .machine power6; \
428 lwzcix %0,0, %1; \
429 .machine pop;"
430 : "=r" (ret) : "r" (paddr) : "memory");
431 return ret;
432}
433
434static inline u64 __raw_rm_readq(volatile void __iomem *paddr)
435{
436 u64 ret;
437 __asm__ __volatile__(".machine push; \
438 .machine power6; \
439 ldcix %0,0, %1; \
440 .machine pop;"
441 : "=r" (ret) : "r" (paddr) : "memory");
442 return ret;
443}
444#endif
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460#ifdef CONFIG_PPC32
461
462#define __do_in_asm(name, op) \
463static inline unsigned int name(unsigned int port) \
464{ \
465 unsigned int x; \
466 __asm__ __volatile__( \
467 "sync\n" \
468 "0:" op " %0,0,%1\n" \
469 "1: twi 0,%0,0\n" \
470 "2: isync\n" \
471 "3: nop\n" \
472 "4:\n" \
473 ".section .fixup,\"ax\"\n" \
474 "5: li %0,-1\n" \
475 " b 4b\n" \
476 ".previous\n" \
477 EX_TABLE(0b, 5b) \
478 EX_TABLE(1b, 5b) \
479 EX_TABLE(2b, 5b) \
480 EX_TABLE(3b, 5b) \
481 : "=&r" (x) \
482 : "r" (port + _IO_BASE) \
483 : "memory"); \
484 return x; \
485}
486
487#define __do_out_asm(name, op) \
488static inline void name(unsigned int val, unsigned int port) \
489{ \
490 __asm__ __volatile__( \
491 "sync\n" \
492 "0:" op " %0,0,%1\n" \
493 "1: sync\n" \
494 "2:\n" \
495 EX_TABLE(0b, 2b) \
496 EX_TABLE(1b, 2b) \
497 : : "r" (val), "r" (port + _IO_BASE) \
498 : "memory"); \
499}
500
501__do_in_asm(_rec_inb, "lbzx")
502__do_in_asm(_rec_inw, "lhbrx")
503__do_in_asm(_rec_inl, "lwbrx")
504__do_out_asm(_rec_outb, "stbx")
505__do_out_asm(_rec_outw, "sthbrx")
506__do_out_asm(_rec_outl, "stwbrx")
507
508#endif
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525#define __do_writeb(val, addr) out_8(PCI_FIX_ADDR(addr), val)
526#define __do_writew(val, addr) out_le16(PCI_FIX_ADDR(addr), val)
527#define __do_writel(val, addr) out_le32(PCI_FIX_ADDR(addr), val)
528#define __do_writeq(val, addr) out_le64(PCI_FIX_ADDR(addr), val)
529#define __do_writew_be(val, addr) out_be16(PCI_FIX_ADDR(addr), val)
530#define __do_writel_be(val, addr) out_be32(PCI_FIX_ADDR(addr), val)
531#define __do_writeq_be(val, addr) out_be64(PCI_FIX_ADDR(addr), val)
532
533#ifdef CONFIG_EEH
534#define __do_readb(addr) eeh_readb(PCI_FIX_ADDR(addr))
535#define __do_readw(addr) eeh_readw(PCI_FIX_ADDR(addr))
536#define __do_readl(addr) eeh_readl(PCI_FIX_ADDR(addr))
537#define __do_readq(addr) eeh_readq(PCI_FIX_ADDR(addr))
538#define __do_readw_be(addr) eeh_readw_be(PCI_FIX_ADDR(addr))
539#define __do_readl_be(addr) eeh_readl_be(PCI_FIX_ADDR(addr))
540#define __do_readq_be(addr) eeh_readq_be(PCI_FIX_ADDR(addr))
541#else
542#define __do_readb(addr) in_8(PCI_FIX_ADDR(addr))
543#define __do_readw(addr) in_le16(PCI_FIX_ADDR(addr))
544#define __do_readl(addr) in_le32(PCI_FIX_ADDR(addr))
545#define __do_readq(addr) in_le64(PCI_FIX_ADDR(addr))
546#define __do_readw_be(addr) in_be16(PCI_FIX_ADDR(addr))
547#define __do_readl_be(addr) in_be32(PCI_FIX_ADDR(addr))
548#define __do_readq_be(addr) in_be64(PCI_FIX_ADDR(addr))
549#endif
550
551#ifdef CONFIG_PPC32
552#define __do_outb(val, port) _rec_outb(val, port)
553#define __do_outw(val, port) _rec_outw(val, port)
554#define __do_outl(val, port) _rec_outl(val, port)
555#define __do_inb(port) _rec_inb(port)
556#define __do_inw(port) _rec_inw(port)
557#define __do_inl(port) _rec_inl(port)
558#else
559#define __do_outb(val, port) writeb(val,(PCI_IO_ADDR)_IO_BASE+port);
560#define __do_outw(val, port) writew(val,(PCI_IO_ADDR)_IO_BASE+port);
561#define __do_outl(val, port) writel(val,(PCI_IO_ADDR)_IO_BASE+port);
562#define __do_inb(port) readb((PCI_IO_ADDR)_IO_BASE + port);
563#define __do_inw(port) readw((PCI_IO_ADDR)_IO_BASE + port);
564#define __do_inl(port) readl((PCI_IO_ADDR)_IO_BASE + port);
565#endif
566
567#ifdef CONFIG_EEH
568#define __do_readsb(a, b, n) eeh_readsb(PCI_FIX_ADDR(a), (b), (n))
569#define __do_readsw(a, b, n) eeh_readsw(PCI_FIX_ADDR(a), (b), (n))
570#define __do_readsl(a, b, n) eeh_readsl(PCI_FIX_ADDR(a), (b), (n))
571#else
572#define __do_readsb(a, b, n) _insb(PCI_FIX_ADDR(a), (b), (n))
573#define __do_readsw(a, b, n) _insw(PCI_FIX_ADDR(a), (b), (n))
574#define __do_readsl(a, b, n) _insl(PCI_FIX_ADDR(a), (b), (n))
575#endif
576#define __do_writesb(a, b, n) _outsb(PCI_FIX_ADDR(a),(b),(n))
577#define __do_writesw(a, b, n) _outsw(PCI_FIX_ADDR(a),(b),(n))
578#define __do_writesl(a, b, n) _outsl(PCI_FIX_ADDR(a),(b),(n))
579
580#define __do_insb(p, b, n) readsb((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
581#define __do_insw(p, b, n) readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
582#define __do_insl(p, b, n) readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
583#define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
584#define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
585#define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
586
587#define __do_memset_io(addr, c, n) \
588 _memset_io(PCI_FIX_ADDR(addr), c, n)
589#define __do_memcpy_toio(dst, src, n) \
590 _memcpy_toio(PCI_FIX_ADDR(dst), src, n)
591
592#ifdef CONFIG_EEH
593#define __do_memcpy_fromio(dst, src, n) \
594 eeh_memcpy_fromio(dst, PCI_FIX_ADDR(src), n)
595#else
596#define __do_memcpy_fromio(dst, src, n) \
597 _memcpy_fromio(dst,PCI_FIX_ADDR(src),n)
598#endif
599
600#ifdef CONFIG_PPC_INDIRECT_PIO
601#define DEF_PCI_HOOK_pio(x) x
602#else
603#define DEF_PCI_HOOK_pio(x) NULL
604#endif
605
606#ifdef CONFIG_PPC_INDIRECT_MMIO
607#define DEF_PCI_HOOK_mem(x) x
608#else
609#define DEF_PCI_HOOK_mem(x) NULL
610#endif
611
612
613extern struct ppc_pci_io {
614
615#define DEF_PCI_AC_RET(name, ret, at, al, space, aa) ret (*name) at;
616#define DEF_PCI_AC_NORET(name, at, al, space, aa) void (*name) at;
617
618#include <asm/io-defs.h>
619
620#undef DEF_PCI_AC_RET
621#undef DEF_PCI_AC_NORET
622
623} ppc_pci_io;
624
625
626#define DEF_PCI_AC_RET(name, ret, at, al, space, aa) \
627static inline ret name at \
628{ \
629 if (DEF_PCI_HOOK_##space(ppc_pci_io.name) != NULL) \
630 return ppc_pci_io.name al; \
631 return __do_##name al; \
632}
633
634#define DEF_PCI_AC_NORET(name, at, al, space, aa) \
635static inline void name at \
636{ \
637 if (DEF_PCI_HOOK_##space(ppc_pci_io.name) != NULL) \
638 ppc_pci_io.name al; \
639 else \
640 __do_##name al; \
641}
642
643#include <asm/io-defs.h>
644
645#undef DEF_PCI_AC_RET
646#undef DEF_PCI_AC_NORET
647
648
649
650
651#define readb readb
652#define readw readw
653#define readl readl
654#define writeb writeb
655#define writew writew
656#define writel writel
657#define readsb readsb
658#define readsw readsw
659#define readsl readsl
660#define writesb writesb
661#define writesw writesw
662#define writesl writesl
663#define inb inb
664#define inw inw
665#define inl inl
666#define outb outb
667#define outw outw
668#define outl outl
669#define insb insb
670#define insw insw
671#define insl insl
672#define outsb outsb
673#define outsw outsw
674#define outsl outsl
675#ifdef __powerpc64__
676#define readq readq
677#define writeq writeq
678#endif
679#define memset_io memset_io
680#define memcpy_fromio memcpy_fromio
681#define memcpy_toio memcpy_toio
682
683
684
685
686
687#define xlate_dev_mem_ptr(p) __va(p)
688
689
690
691
692#define readb_relaxed(addr) readb(addr)
693#define readw_relaxed(addr) readw(addr)
694#define readl_relaxed(addr) readl(addr)
695#define readq_relaxed(addr) readq(addr)
696#define writeb_relaxed(v, addr) writeb(v, addr)
697#define writew_relaxed(v, addr) writew(v, addr)
698#define writel_relaxed(v, addr) writel(v, addr)
699#define writeq_relaxed(v, addr) writeq(v, addr)
700
701#ifdef CONFIG_GENERIC_IOMAP
702#include <asm-generic/iomap.h>
703#else
704
705
706
707static inline unsigned int ioread16be(const void __iomem *addr)
708{
709 return readw_be(addr);
710}
711#define ioread16be ioread16be
712
713static inline unsigned int ioread32be(const void __iomem *addr)
714{
715 return readl_be(addr);
716}
717#define ioread32be ioread32be
718
719#ifdef __powerpc64__
720static inline u64 ioread64_lo_hi(const void __iomem *addr)
721{
722 return readq(addr);
723}
724#define ioread64_lo_hi ioread64_lo_hi
725
726static inline u64 ioread64_hi_lo(const void __iomem *addr)
727{
728 return readq(addr);
729}
730#define ioread64_hi_lo ioread64_hi_lo
731
732static inline u64 ioread64be(const void __iomem *addr)
733{
734 return readq_be(addr);
735}
736#define ioread64be ioread64be
737
738static inline u64 ioread64be_lo_hi(const void __iomem *addr)
739{
740 return readq_be(addr);
741}
742#define ioread64be_lo_hi ioread64be_lo_hi
743
744static inline u64 ioread64be_hi_lo(const void __iomem *addr)
745{
746 return readq_be(addr);
747}
748#define ioread64be_hi_lo ioread64be_hi_lo
749#endif
750
751static inline void iowrite16be(u16 val, void __iomem *addr)
752{
753 writew_be(val, addr);
754}
755#define iowrite16be iowrite16be
756
757static inline void iowrite32be(u32 val, void __iomem *addr)
758{
759 writel_be(val, addr);
760}
761#define iowrite32be iowrite32be
762
763#ifdef __powerpc64__
764static inline void iowrite64_lo_hi(u64 val, void __iomem *addr)
765{
766 writeq(val, addr);
767}
768#define iowrite64_lo_hi iowrite64_lo_hi
769
770static inline void iowrite64_hi_lo(u64 val, void __iomem *addr)
771{
772 writeq(val, addr);
773}
774#define iowrite64_hi_lo iowrite64_hi_lo
775
776static inline void iowrite64be(u64 val, void __iomem *addr)
777{
778 writeq_be(val, addr);
779}
780#define iowrite64be iowrite64be
781
782static inline void iowrite64be_lo_hi(u64 val, void __iomem *addr)
783{
784 writeq_be(val, addr);
785}
786#define iowrite64be_lo_hi iowrite64be_lo_hi
787
788static inline void iowrite64be_hi_lo(u64 val, void __iomem *addr)
789{
790 writeq_be(val, addr);
791}
792#define iowrite64be_hi_lo iowrite64be_hi_lo
793#endif
794
795struct pci_dev;
796void pci_iounmap(struct pci_dev *dev, void __iomem *addr);
797#define pci_iounmap pci_iounmap
798void __iomem *ioport_map(unsigned long port, unsigned int len);
799#define ioport_map ioport_map
800#endif
801
802static inline void iosync(void)
803{
804 __asm__ __volatile__ ("sync" : : : "memory");
805}
806
807
808
809
810
811
812
813
814#define iobarrier_rw() eieio()
815#define iobarrier_r() eieio()
816#define iobarrier_w() eieio()
817
818
819
820
821
822
823#define inb_p(port) inb(port)
824#define outb_p(val, port) (udelay(1), outb((val), (port)))
825#define inw_p(port) inw(port)
826#define outw_p(val, port) (udelay(1), outw((val), (port)))
827#define inl_p(port) inl(port)
828#define outl_p(val, port) (udelay(1), outl((val), (port)))
829
830
831#define IO_SPACE_LIMIT ~(0UL)
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864extern void __iomem *ioremap(phys_addr_t address, unsigned long size);
865extern void __iomem *ioremap_prot(phys_addr_t address, unsigned long size,
866 unsigned long flags);
867extern void __iomem *ioremap_wc(phys_addr_t address, unsigned long size);
868#define ioremap_wc ioremap_wc
869
870#ifdef CONFIG_PPC32
871void __iomem *ioremap_wt(phys_addr_t address, unsigned long size);
872#define ioremap_wt ioremap_wt
873#endif
874
875void __iomem *ioremap_coherent(phys_addr_t address, unsigned long size);
876#define ioremap_uc(addr, size) ioremap((addr), (size))
877#define ioremap_cache(addr, size) \
878 ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL))
879
880extern void iounmap(volatile void __iomem *addr);
881
882void __iomem *ioremap_phb(phys_addr_t paddr, unsigned long size);
883
884int early_ioremap_range(unsigned long ea, phys_addr_t pa,
885 unsigned long size, pgprot_t prot);
886void __iomem *do_ioremap(phys_addr_t pa, phys_addr_t offset, unsigned long size,
887 pgprot_t prot, void *caller);
888
889extern void __iomem *__ioremap_caller(phys_addr_t, unsigned long size,
890 pgprot_t prot, void *caller);
891
892
893
894
895
896
897
898#define HAVE_ARCH_PIO_SIZE 1
899#define PIO_OFFSET 0x00000000UL
900#define PIO_MASK (FULL_IO_SIZE - 1)
901#define PIO_RESERVED (FULL_IO_SIZE)
902
903#define mmio_read16be(addr) readw_be(addr)
904#define mmio_read32be(addr) readl_be(addr)
905#define mmio_read64be(addr) readq_be(addr)
906#define mmio_write16be(val, addr) writew_be(val, addr)
907#define mmio_write32be(val, addr) writel_be(val, addr)
908#define mmio_write64be(val, addr) writeq_be(val, addr)
909#define mmio_insb(addr, dst, count) readsb(addr, dst, count)
910#define mmio_insw(addr, dst, count) readsw(addr, dst, count)
911#define mmio_insl(addr, dst, count) readsl(addr, dst, count)
912#define mmio_outsb(addr, src, count) writesb(addr, src, count)
913#define mmio_outsw(addr, src, count) writesw(addr, src, count)
914#define mmio_outsl(addr, src, count) writesl(addr, src, count)
915
916
917
918
919
920
921
922
923
924
925
926
927
928static inline unsigned long virt_to_phys(volatile void * address)
929{
930 WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && !virt_addr_valid(address));
931
932 return __pa((unsigned long)address);
933}
934#define virt_to_phys virt_to_phys
935
936
937
938
939
940
941
942
943
944
945
946
947
948static inline void * phys_to_virt(unsigned long address)
949{
950 return (void *)__va(address);
951}
952#define phys_to_virt phys_to_virt
953
954
955
956
957static inline phys_addr_t page_to_phys(struct page *page)
958{
959 unsigned long pfn = page_to_pfn(page);
960
961 WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && !pfn_valid(pfn));
962
963 return PFN_PHYS(pfn);
964}
965
966
967
968
969
970
971
972#ifdef CONFIG_PPC32
973
974static inline unsigned long virt_to_bus(volatile void * address)
975{
976 if (address == NULL)
977 return 0;
978 return __pa(address) + PCI_DRAM_OFFSET;
979}
980#define virt_to_bus virt_to_bus
981
982static inline void * bus_to_virt(unsigned long address)
983{
984 if (address == 0)
985 return NULL;
986 return __va(address - PCI_DRAM_OFFSET);
987}
988#define bus_to_virt bus_to_virt
989
990#define page_to_bus(page) (page_to_phys(page) + PCI_DRAM_OFFSET)
991
992#endif
993
994
995#define setbits32(_addr, _v) out_be32((_addr), in_be32(_addr) | (_v))
996#define clrbits32(_addr, _v) out_be32((_addr), in_be32(_addr) & ~(_v))
997
998#define setbits16(_addr, _v) out_be16((_addr), in_be16(_addr) | (_v))
999#define clrbits16(_addr, _v) out_be16((_addr), in_be16(_addr) & ~(_v))
1000
1001#define setbits8(_addr, _v) out_8((_addr), in_8(_addr) | (_v))
1002#define clrbits8(_addr, _v) out_8((_addr), in_8(_addr) & ~(_v))
1003
1004
1005
1006
1007
1008
1009
1010
1011#define clrsetbits(type, addr, clear, set) \
1012 out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
1013
1014#ifdef __powerpc64__
1015#define clrsetbits_be64(addr, clear, set) clrsetbits(be64, addr, clear, set)
1016#define clrsetbits_le64(addr, clear, set) clrsetbits(le64, addr, clear, set)
1017#endif
1018
1019#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
1020#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
1021
1022#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
1023#define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
1024
1025#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
1026
1027#include <asm-generic/io.h>
1028
1029#endif
1030
1031#endif
1032