2 #define _ASM_X86_IO_H |
2 #define _ASM_X86_IO_H |
3 |
3 |
4 #define ARCH_HAS_IOREMAP_WC |
4 #define ARCH_HAS_IOREMAP_WC |
5 |
5 |
6 #include <linux/compiler.h> |
6 #include <linux/compiler.h> |
|
7 #include <asm-generic/int-ll64.h> |
7 |
8 |
8 #define build_mmio_read(name, size, type, reg, barrier) \ |
9 #define build_mmio_read(name, size, type, reg, barrier) \ |
9 static inline type name(const volatile void __iomem *addr) \ |
10 static inline type name(const volatile void __iomem *addr) \ |
10 { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ |
11 { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ |
11 :"m" (*(volatile type __force *)addr) barrier); return ret; } |
12 :"m" (*(volatile type __force *)addr) barrier); return ret; } |
43 #define __raw_writel __writel |
44 #define __raw_writel __writel |
44 |
45 |
45 #define mmiowb() barrier() |
46 #define mmiowb() barrier() |
46 |
47 |
47 #ifdef CONFIG_X86_64 |
48 #ifdef CONFIG_X86_64 |
|
49 |
48 build_mmio_read(readq, "q", unsigned long, "=r", :"memory") |
50 build_mmio_read(readq, "q", unsigned long, "=r", :"memory") |
49 build_mmio_read(__readq, "q", unsigned long, "=r", ) |
|
50 build_mmio_write(writeq, "q", unsigned long, "r", :"memory") |
51 build_mmio_write(writeq, "q", unsigned long, "r", :"memory") |
51 build_mmio_write(__writeq, "q", unsigned long, "r", ) |
|
52 |
52 |
53 #define readq_relaxed(a) __readq(a) |
53 #else |
54 #define __raw_readq __readq |
|
55 #define __raw_writeq writeq |
|
56 |
54 |
57 /* Let people know we have them */ |
55 static inline __u64 readq(const volatile void __iomem *addr) |
58 #define readq readq |
56 { |
59 #define writeq writeq |
57 const volatile u32 __iomem *p = addr; |
|
58 u32 low, high; |
|
59 |
|
60 low = readl(p); |
|
61 high = readl(p + 1); |
|
62 |
|
63 return low + ((u64)high << 32); |
|
64 } |
|
65 |
|
66 static inline void writeq(__u64 val, volatile void __iomem *addr) |
|
67 { |
|
68 writel(val, addr); |
|
69 writel(val >> 32, addr+4); |
|
70 } |
|
71 |
60 #endif |
72 #endif |
61 |
73 |
62 extern int iommu_bio_merge; |
74 #define readq_relaxed(a) readq(a) |
|
75 |
|
76 #define __raw_readq(a) readq(a) |
|
77 #define __raw_writeq(val, addr) writeq(val, addr) |
|
78 |
|
79 /* Let people know that we have them */ |
|
80 #define readq readq |
|
81 #define writeq writeq |
63 |
82 |
64 #ifdef CONFIG_X86_32 |
83 #ifdef CONFIG_X86_32 |
65 # include "io_32.h" |
84 # include "io_32.h" |
66 #else |
85 #else |
67 # include "io_64.h" |
86 # include "io_64.h" |
78 * early_ioremap() and early_iounmap() are for temporary early boot-time |
97 * early_ioremap() and early_iounmap() are for temporary early boot-time |
79 * mappings, before the real ioremap() is functional. |
98 * mappings, before the real ioremap() is functional. |
80 * A boot-time mapping is currently limited to at most 16 pages. |
99 * A boot-time mapping is currently limited to at most 16 pages. |
81 */ |
100 */ |
82 extern void early_ioremap_init(void); |
101 extern void early_ioremap_init(void); |
83 extern void early_ioremap_clear(void); |
|
84 extern void early_ioremap_reset(void); |
102 extern void early_ioremap_reset(void); |
85 extern void __iomem *early_ioremap(unsigned long offset, unsigned long size); |
103 extern void __iomem *early_ioremap(unsigned long offset, unsigned long size); |
86 extern void __iomem *early_memremap(unsigned long offset, unsigned long size); |
104 extern void __iomem *early_memremap(unsigned long offset, unsigned long size); |
87 extern void early_iounmap(void __iomem *addr, unsigned long size); |
105 extern void early_iounmap(void __iomem *addr, unsigned long size); |
88 extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); |
106 extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); |