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