2 * arch/i386/mm/ioremap.c
4 * Re-map IO memory to kernel address space so that we can access it.
5 * This is needed for high PCI addresses that aren't mapped in the
6 * 640k-1MB IO memory area on PC's
8 * (C) Copyright 1995 1996 Linus Torvalds
11 #include <linux/vmalloc.h>
12 #include <linux/init.h>
13 #include <linux/slab.h>
14 #include <linux/module.h>
16 #include <asm/fixmap.h>
17 #include <asm/cacheflush.h>
18 #include <asm/tlbflush.h>
19 #include <asm/pgtable.h>
21 #define ISA_START_ADDRESS 0xa0000
22 #define ISA_END_ADDRESS 0x100000
25 * Generic mapping function (not visible outside):
29 * Remap an arbitrary physical address space into the kernel virtual
30 * address space. Needed when the kernel wants to access high addresses
33 * NOTE! We need to allow non-page-aligned mappings too: we will obviously
34 * have to convert them into an offset in a page-aligned mapping, but the
35 * caller shouldn't need to know that small detail.
37 void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
40 struct vm_struct * area;
41 unsigned long offset, last_addr;
44 /* Don't allow wraparound or zero size */
45 last_addr = phys_addr + size - 1;
46 if (!size || last_addr < phys_addr)
50 * Don't remap the low PCI/ISA area, it's always mapped..
52 if (phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
53 return (void __iomem *) phys_to_virt(phys_addr);
56 * Don't allow anybody to remap normal RAM that we're using..
58 if (phys_addr <= virt_to_phys(high_memory - 1)) {
62 t_addr = __va(phys_addr);
63 t_end = t_addr + (size - 1);
65 for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++)
66 if(!PageReserved(page))
70 prot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY
71 | _PAGE_ACCESSED | flags);
74 * Mappings have to be page-aligned
76 offset = phys_addr & ~PAGE_MASK;
77 phys_addr &= PAGE_MASK;
78 size = PAGE_ALIGN(last_addr+1) - phys_addr;
83 area = get_vm_area(size, VM_IOREMAP | (flags << 20));
86 area->phys_addr = phys_addr;
87 addr = (void __iomem *) area->addr;
88 if (ioremap_page_range((unsigned long) addr,
89 (unsigned long) addr + size, phys_addr, prot)) {
90 vunmap((void __force *) addr);
93 return (void __iomem *) (offset + (char __iomem *)addr);
95 EXPORT_SYMBOL(__ioremap);
98 * ioremap_nocache - map bus memory into CPU space
99 * @offset: bus address of the memory
100 * @size: size of the resource to map
102 * ioremap_nocache performs a platform specific sequence of operations to
103 * make bus memory CPU accessible via the readb/readw/readl/writeb/
104 * writew/writel functions and the other mmio helpers. The returned
105 * address is not guaranteed to be usable directly as a virtual
108 * This version of ioremap ensures that the memory is marked uncachable
109 * on the CPU as well as honouring existing caching rules from things like
110 * the PCI bus. Note that there are other caches and buffers on many
111 * busses. In particular driver authors should read up on PCI writes
113 * It's useful if some control registers are in such an area and
114 * write combining or read caching is not desirable:
116 * Must be freed with iounmap.
119 void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size)
121 unsigned long last_addr;
122 void __iomem *p = __ioremap(phys_addr, size, _PAGE_PCD | _PAGE_PWT);
126 /* Guaranteed to be > phys_addr, as per __ioremap() */
127 last_addr = phys_addr + size - 1;
129 if (last_addr < virt_to_phys(high_memory) - 1) {
130 struct page *ppage = virt_to_page(__va(phys_addr));
131 unsigned long npages;
133 phys_addr &= PAGE_MASK;
135 /* This might overflow and become zero.. */
136 last_addr = PAGE_ALIGN(last_addr);
138 /* .. but that's ok, because modulo-2**n arithmetic will make
139 * the page-aligned "last - first" come out right.
141 npages = (last_addr - phys_addr) >> PAGE_SHIFT;
143 if (change_page_attr(ppage, npages, PAGE_KERNEL_NOCACHE) < 0) {
152 EXPORT_SYMBOL(ioremap_nocache);
155 * iounmap - Free a IO remapping
156 * @addr: virtual address from ioremap_*
158 * Caller must ensure there is only one unmapping for the same pointer.
160 void iounmap(volatile void __iomem *addr)
162 struct vm_struct *p, *o;
164 if ((void __force *)addr <= high_memory)
168 * __ioremap special-cases the PCI/ISA range by not instantiating a
169 * vm_area and by simply returning an address into the kernel mapping
170 * of ISA space. So handle that here.
172 if (addr >= phys_to_virt(ISA_START_ADDRESS) &&
173 addr < phys_to_virt(ISA_END_ADDRESS))
176 addr = (volatile void __iomem *)(PAGE_MASK & (unsigned long __force)addr);
178 /* Use the vm area unlocked, assuming the caller
179 ensures there isn't another iounmap for the same address
180 in parallel. Reuse of the virtual address is prevented by
181 leaving it in the global lists until we're done with it.
182 cpa takes care of the direct mappings. */
183 read_lock(&vmlist_lock);
184 for (p = vmlist; p; p = p->next) {
188 read_unlock(&vmlist_lock);
191 printk("iounmap: bad address %p\n", addr);
196 /* Reset the direct mapping. Can block */
197 if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) {
198 change_page_attr(virt_to_page(__va(p->phys_addr)),
199 get_vm_area_size(p) >> PAGE_SHIFT,
204 /* Finally remove it */
205 o = remove_vm_area((void *)addr);
206 BUG_ON(p != o || o == NULL);
209 EXPORT_SYMBOL(iounmap);
211 static __initdata int after_paging_init;
212 static __initdata unsigned long bm_pte[1024]
213 __attribute__((aligned(PAGE_SIZE)));
215 static inline unsigned long * __init early_ioremap_pgd(unsigned long addr)
217 return (unsigned long *)swapper_pg_dir + ((addr >> 22) & 1023);
220 static inline unsigned long * __init early_ioremap_pte(unsigned long addr)
222 return bm_pte + ((addr >> PAGE_SHIFT) & 1023);
225 void __init early_ioremap_init(void)
229 pgd = early_ioremap_pgd(fix_to_virt(FIX_BTMAP_BEGIN));
230 *pgd = __pa(bm_pte) | _PAGE_TABLE;
231 memset(bm_pte, 0, sizeof(bm_pte));
232 BUG_ON(pgd != early_ioremap_pgd(fix_to_virt(FIX_BTMAP_END)));
235 void __init early_ioremap_clear(void)
239 pgd = early_ioremap_pgd(fix_to_virt(FIX_BTMAP_BEGIN));
244 void __init early_ioremap_reset(void)
246 enum fixed_addresses idx;
247 unsigned long *pte, phys, addr;
249 after_paging_init = 1;
250 for (idx = FIX_BTMAP_BEGIN; idx >= FIX_BTMAP_END; idx--) {
251 addr = fix_to_virt(idx);
252 pte = early_ioremap_pte(addr);
253 if (!*pte & _PAGE_PRESENT) {
254 phys = *pte & PAGE_MASK;
255 set_fixmap(idx, phys);
260 static void __init __early_set_fixmap(enum fixed_addresses idx,
261 unsigned long phys, pgprot_t flags)
263 unsigned long *pte, addr = __fix_to_virt(idx);
265 if (idx >= __end_of_fixed_addresses) {
269 pte = early_ioremap_pte(addr);
270 if (pgprot_val(flags))
271 *pte = (phys & PAGE_MASK) | pgprot_val(flags);
274 __flush_tlb_one(addr);
277 static inline void __init early_set_fixmap(enum fixed_addresses idx,
280 if (after_paging_init)
281 set_fixmap(idx, phys);
283 __early_set_fixmap(idx, phys, PAGE_KERNEL);
286 static inline void __init early_clear_fixmap(enum fixed_addresses idx)
288 if (after_paging_init)
291 __early_set_fixmap(idx, 0, __pgprot(0));
295 int __initdata early_ioremap_nested;
297 void __init *early_ioremap(unsigned long phys_addr, unsigned long size)
299 unsigned long offset, last_addr;
300 unsigned int nrpages, nesting;
301 enum fixed_addresses idx0, idx;
303 WARN_ON(system_state != SYSTEM_BOOTING);
305 nesting = early_ioremap_nested;
307 /* Don't allow wraparound or zero size */
308 last_addr = phys_addr + size - 1;
309 if (!size || last_addr < phys_addr)
312 if (nesting >= FIX_BTMAPS_NESTING)
315 early_ioremap_nested++;
317 * Mappings have to be page-aligned
319 offset = phys_addr & ~PAGE_MASK;
320 phys_addr &= PAGE_MASK;
321 size = PAGE_ALIGN(last_addr) - phys_addr;
324 * Mappings have to fit in the FIX_BTMAP area.
326 nrpages = size >> PAGE_SHIFT;
327 if (nrpages > NR_FIX_BTMAPS)
333 idx0 = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*nesting;
335 while (nrpages > 0) {
336 early_set_fixmap(idx, phys_addr);
337 phys_addr += PAGE_SIZE;
342 return (void*) (offset + fix_to_virt(idx0));
345 void __init early_iounmap(void *addr, unsigned long size)
347 unsigned long virt_addr;
348 unsigned long offset;
349 unsigned int nrpages;
350 enum fixed_addresses idx;
351 unsigned int nesting;
353 nesting = --early_ioremap_nested;
355 virt_addr = (unsigned long)addr;
356 if (virt_addr < fix_to_virt(FIX_BTMAP_BEGIN))
359 offset = virt_addr & ~PAGE_MASK;
360 nrpages = PAGE_ALIGN(offset + size - 1) >> PAGE_SHIFT;
362 idx = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*nesting;
363 while (nrpages > 0) {
364 early_clear_fixmap(idx);
370 void __this_fixmap_does_not_exist(void)