diff options
Diffstat (limited to 'arch/x86/include/asm/io.h')
-rw-r--r-- | arch/x86/include/asm/io.h | 97 |
1 files changed, 95 insertions, 2 deletions
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index 1dbbdf4be9b4..e5383e3d2f8c 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h | |||
@@ -5,6 +5,7 @@ | |||
5 | 5 | ||
6 | #include <linux/compiler.h> | 6 | #include <linux/compiler.h> |
7 | #include <asm-generic/int-ll64.h> | 7 | #include <asm-generic/int-ll64.h> |
8 | #include <asm/page.h> | ||
8 | 9 | ||
9 | #define build_mmio_read(name, size, type, reg, barrier) \ | 10 | #define build_mmio_read(name, size, type, reg, barrier) \ |
10 | static inline type name(const volatile void __iomem *addr) \ | 11 | static inline type name(const volatile void __iomem *addr) \ |
@@ -80,6 +81,98 @@ static inline void writeq(__u64 val, volatile void __iomem *addr) | |||
80 | #define readq readq | 81 | #define readq readq |
81 | #define writeq writeq | 82 | #define writeq writeq |
82 | 83 | ||
84 | /** | ||
85 | * virt_to_phys - map virtual addresses to physical | ||
86 | * @address: address to remap | ||
87 | * | ||
88 | * The returned physical address is the physical (CPU) mapping for | ||
89 | * the memory address given. It is only valid to use this function on | ||
90 | * addresses directly mapped or allocated via kmalloc. | ||
91 | * | ||
92 | * This function does not give bus mappings for DMA transfers. In | ||
93 | * almost all conceivable cases a device driver should not be using | ||
94 | * this function | ||
95 | */ | ||
96 | |||
97 | static inline phys_addr_t virt_to_phys(volatile void *address) | ||
98 | { | ||
99 | return __pa(address); | ||
100 | } | ||
101 | |||
102 | /** | ||
103 | * phys_to_virt - map physical address to virtual | ||
104 | * @address: address to remap | ||
105 | * | ||
106 | * The returned virtual address is a current CPU mapping for | ||
107 | * the memory address given. It is only valid to use this function on | ||
108 | * addresses that have a kernel mapping | ||
109 | * | ||
110 | * This function does not handle bus mappings for DMA transfers. In | ||
111 | * almost all conceivable cases a device driver should not be using | ||
112 | * this function | ||
113 | */ | ||
114 | |||
115 | static inline void *phys_to_virt(phys_addr_t address) | ||
116 | { | ||
117 | return __va(address); | ||
118 | } | ||
119 | |||
120 | /* | ||
121 | * Change "struct page" to physical address. | ||
122 | */ | ||
123 | #define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) | ||
124 | |||
125 | /* | ||
126 | * ISA I/O bus memory addresses are 1:1 with the physical address. | ||
127 | * However, we truncate the address to unsigned int to avoid undesirable | ||
128 | * promitions in legacy drivers. | ||
129 | */ | ||
130 | static inline unsigned int isa_virt_to_bus(volatile void *address) | ||
131 | { | ||
132 | return (unsigned int)virt_to_phys(address); | ||
133 | } | ||
134 | #define isa_page_to_bus(page) ((unsigned int)page_to_phys(page)) | ||
135 | #define isa_bus_to_virt phys_to_virt | ||
136 | |||
137 | /* | ||
138 | * However PCI ones are not necessarily 1:1 and therefore these interfaces | ||
139 | * are forbidden in portable PCI drivers. | ||
140 | * | ||
141 | * Allow them on x86 for legacy drivers, though. | ||
142 | */ | ||
143 | #define virt_to_bus virt_to_phys | ||
144 | #define bus_to_virt phys_to_virt | ||
145 | |||
146 | /** | ||
147 | * ioremap - map bus memory into CPU space | ||
148 | * @offset: bus address of the memory | ||
149 | * @size: size of the resource to map | ||
150 | * | ||
151 | * ioremap performs a platform specific sequence of operations to | ||
152 | * make bus memory CPU accessible via the readb/readw/readl/writeb/ | ||
153 | * writew/writel functions and the other mmio helpers. The returned | ||
154 | * address is not guaranteed to be usable directly as a virtual | ||
155 | * address. | ||
156 | * | ||
157 | * If the area you are trying to map is a PCI BAR you should have a | ||
158 | * look at pci_iomap(). | ||
159 | */ | ||
160 | extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size); | ||
161 | extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size); | ||
162 | extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size, | ||
163 | unsigned long prot_val); | ||
164 | |||
165 | /* | ||
166 | * The default ioremap() behavior is non-cached: | ||
167 | */ | ||
168 | static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) | ||
169 | { | ||
170 | return ioremap_nocache(offset, size); | ||
171 | } | ||
172 | |||
173 | extern void iounmap(volatile void __iomem *addr); | ||
174 | |||
175 | |||
83 | #ifdef CONFIG_X86_32 | 176 | #ifdef CONFIG_X86_32 |
84 | # include "io_32.h" | 177 | # include "io_32.h" |
85 | #else | 178 | #else |
@@ -91,7 +184,7 @@ extern void unxlate_dev_mem_ptr(unsigned long phys, void *addr); | |||
91 | 184 | ||
92 | extern int ioremap_change_attr(unsigned long vaddr, unsigned long size, | 185 | extern int ioremap_change_attr(unsigned long vaddr, unsigned long size, |
93 | unsigned long prot_val); | 186 | unsigned long prot_val); |
94 | extern void __iomem *ioremap_wc(unsigned long offset, unsigned long size); | 187 | extern void __iomem *ioremap_wc(resource_size_t offset, unsigned long size); |
95 | 188 | ||
96 | /* | 189 | /* |
97 | * early_ioremap() and early_iounmap() are for temporary early boot-time | 190 | * early_ioremap() and early_iounmap() are for temporary early boot-time |
@@ -103,7 +196,7 @@ extern void early_ioremap_reset(void); | |||
103 | extern void __iomem *early_ioremap(unsigned long offset, unsigned long size); | 196 | extern void __iomem *early_ioremap(unsigned long offset, unsigned long size); |
104 | extern void __iomem *early_memremap(unsigned long offset, unsigned long size); | 197 | extern void __iomem *early_memremap(unsigned long offset, unsigned long size); |
105 | extern void early_iounmap(void __iomem *addr, unsigned long size); | 198 | extern void early_iounmap(void __iomem *addr, unsigned long size); |
106 | extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | ||
107 | 199 | ||
200 | #define IO_SPACE_LIMIT 0xffff | ||
108 | 201 | ||
109 | #endif /* _ASM_X86_IO_H */ | 202 | #endif /* _ASM_X86_IO_H */ |