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