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