x86: fix early_ioremap pagetable ops
[linux-3.10.git] / arch / x86 / mm / ioremap.c
1 /*
2  * Re-map IO memory to kernel address space so that we can access it.
3  * This is needed for high PCI addresses that aren't mapped in the
4  * 640k-1MB IO memory area on PC's
5  *
6  * (C) Copyright 1995 1996 Linus Torvalds
7  */
8
9 #include <linux/bootmem.h>
10 #include <linux/init.h>
11 #include <linux/io.h>
12 #include <linux/module.h>
13 #include <linux/slab.h>
14 #include <linux/vmalloc.h>
15
16 #include <asm/cacheflush.h>
17 #include <asm/e820.h>
18 #include <asm/fixmap.h>
19 #include <asm/pgtable.h>
20 #include <asm/tlbflush.h>
21 #include <asm/pgalloc.h>
22
23 enum ioremap_mode {
24         IOR_MODE_UNCACHED,
25         IOR_MODE_CACHED,
26 };
27
28 #ifdef CONFIG_X86_64
29
30 unsigned long __phys_addr(unsigned long x)
31 {
32         if (x >= __START_KERNEL_map)
33                 return x - __START_KERNEL_map + phys_base;
34         return x - PAGE_OFFSET;
35 }
36 EXPORT_SYMBOL(__phys_addr);
37
38 #endif
39
40 int page_is_ram(unsigned long pagenr)
41 {
42         unsigned long addr, end;
43         int i;
44
45         for (i = 0; i < e820.nr_map; i++) {
46                 /*
47                  * Not usable memory:
48                  */
49                 if (e820.map[i].type != E820_RAM)
50                         continue;
51                 addr = (e820.map[i].addr + PAGE_SIZE-1) >> PAGE_SHIFT;
52                 end = (e820.map[i].addr + e820.map[i].size) >> PAGE_SHIFT;
53
54                 /*
55                  * Sanity check: Some BIOSen report areas as RAM that
56                  * are not. Notably the 640->1Mb area, which is the
57                  * PCI BIOS area.
58                  */
59                 if (addr >= (BIOS_BEGIN >> PAGE_SHIFT) &&
60                     end < (BIOS_END >> PAGE_SHIFT))
61                         continue;
62
63                 if ((pagenr >= addr) && (pagenr < end))
64                         return 1;
65         }
66         return 0;
67 }
68
69 /*
70  * Fix up the linear direct mapping of the kernel to avoid cache attribute
71  * conflicts.
72  */
73 static int ioremap_change_attr(unsigned long paddr, unsigned long size,
74                                enum ioremap_mode mode)
75 {
76         unsigned long vaddr = (unsigned long)__va(paddr);
77         unsigned long nrpages = size >> PAGE_SHIFT;
78         int err, level;
79
80         /* No change for pages after the last mapping */
81         if ((paddr + size - 1) >= (max_pfn_mapped << PAGE_SHIFT))
82                 return 0;
83
84         /*
85          * If there is no identity map for this address,
86          * change_page_attr_addr is unnecessary
87          */
88         if (!lookup_address(vaddr, &level))
89                 return 0;
90
91         switch (mode) {
92         case IOR_MODE_UNCACHED:
93         default:
94                 err = set_memory_uc(vaddr, nrpages);
95                 break;
96         case IOR_MODE_CACHED:
97                 err = set_memory_wb(vaddr, nrpages);
98                 break;
99         }
100
101         return err;
102 }
103
104 /*
105  * Remap an arbitrary physical address space into the kernel virtual
106  * address space. Needed when the kernel wants to access high addresses
107  * directly.
108  *
109  * NOTE! We need to allow non-page-aligned mappings too: we will obviously
110  * have to convert them into an offset in a page-aligned mapping, but the
111  * caller shouldn't need to know that small detail.
112  */
113 static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size,
114                                enum ioremap_mode mode)
115 {
116         void __iomem *addr;
117         struct vm_struct *area;
118         unsigned long offset, last_addr;
119         pgprot_t prot;
120
121         /* Don't allow wraparound or zero size */
122         last_addr = phys_addr + size - 1;
123         if (!size || last_addr < phys_addr)
124                 return NULL;
125
126         /*
127          * Don't remap the low PCI/ISA area, it's always mapped..
128          */
129         if (phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
130                 return (__force void __iomem *)phys_to_virt(phys_addr);
131
132         /*
133          * Don't allow anybody to remap normal RAM that we're using..
134          */
135         for (offset = phys_addr >> PAGE_SHIFT; offset < max_pfn_mapped &&
136              (offset << PAGE_SHIFT) < last_addr; offset++) {
137                 if (page_is_ram(offset))
138                         return NULL;
139         }
140
141         switch (mode) {
142         case IOR_MODE_UNCACHED:
143         default:
144                 prot = PAGE_KERNEL_NOCACHE;
145                 break;
146         case IOR_MODE_CACHED:
147                 prot = PAGE_KERNEL;
148                 break;
149         }
150
151         /*
152          * Mappings have to be page-aligned
153          */
154         offset = phys_addr & ~PAGE_MASK;
155         phys_addr &= PAGE_MASK;
156         size = PAGE_ALIGN(last_addr+1) - phys_addr;
157
158         /*
159          * Ok, go for it..
160          */
161         area = get_vm_area(size, VM_IOREMAP);
162         if (!area)
163                 return NULL;
164         area->phys_addr = phys_addr;
165         addr = (void __iomem *) area->addr;
166         if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
167                                phys_addr, prot)) {
168                 remove_vm_area((void *)(PAGE_MASK & (unsigned long) addr));
169                 return NULL;
170         }
171
172         if (ioremap_change_attr(phys_addr, size, mode) < 0) {
173                 vunmap(addr);
174                 return NULL;
175         }
176
177         return (void __iomem *) (offset + (char __iomem *)addr);
178 }
179
180 /**
181  * ioremap_nocache     -   map bus memory into CPU space
182  * @offset:    bus address of the memory
183  * @size:      size of the resource to map
184  *
185  * ioremap_nocache performs a platform specific sequence of operations to
186  * make bus memory CPU accessible via the readb/readw/readl/writeb/
187  * writew/writel functions and the other mmio helpers. The returned
188  * address is not guaranteed to be usable directly as a virtual
189  * address.
190  *
191  * This version of ioremap ensures that the memory is marked uncachable
192  * on the CPU as well as honouring existing caching rules from things like
193  * the PCI bus. Note that there are other caches and buffers on many
194  * busses. In particular driver authors should read up on PCI writes
195  *
196  * It's useful if some control registers are in such an area and
197  * write combining or read caching is not desirable:
198  *
199  * Must be freed with iounmap.
200  */
201 void __iomem *ioremap_nocache(unsigned long phys_addr, unsigned long size)
202 {
203         return __ioremap(phys_addr, size, IOR_MODE_UNCACHED);
204 }
205 EXPORT_SYMBOL(ioremap_nocache);
206
207 void __iomem *ioremap_cache(unsigned long phys_addr, unsigned long size)
208 {
209         return __ioremap(phys_addr, size, IOR_MODE_CACHED);
210 }
211 EXPORT_SYMBOL(ioremap_cache);
212
213 /**
214  * iounmap - Free a IO remapping
215  * @addr: virtual address from ioremap_*
216  *
217  * Caller must ensure there is only one unmapping for the same pointer.
218  */
219 void iounmap(volatile void __iomem *addr)
220 {
221         struct vm_struct *p, *o;
222
223         if ((void __force *)addr <= high_memory)
224                 return;
225
226         /*
227          * __ioremap special-cases the PCI/ISA range by not instantiating a
228          * vm_area and by simply returning an address into the kernel mapping
229          * of ISA space.   So handle that here.
230          */
231         if (addr >= phys_to_virt(ISA_START_ADDRESS) &&
232             addr < phys_to_virt(ISA_END_ADDRESS))
233                 return;
234
235         addr = (volatile void __iomem *)
236                 (PAGE_MASK & (unsigned long __force)addr);
237
238         /* Use the vm area unlocked, assuming the caller
239            ensures there isn't another iounmap for the same address
240            in parallel. Reuse of the virtual address is prevented by
241            leaving it in the global lists until we're done with it.
242            cpa takes care of the direct mappings. */
243         read_lock(&vmlist_lock);
244         for (p = vmlist; p; p = p->next) {
245                 if (p->addr == addr)
246                         break;
247         }
248         read_unlock(&vmlist_lock);
249
250         if (!p) {
251                 printk(KERN_ERR "iounmap: bad address %p\n", addr);
252                 dump_stack();
253                 return;
254         }
255
256         /* Reset the direct mapping. Can block */
257         ioremap_change_attr(p->phys_addr, p->size, IOR_MODE_CACHED);
258
259         /* Finally remove it */
260         o = remove_vm_area((void *)addr);
261         BUG_ON(p != o || o == NULL);
262         kfree(p);
263 }
264 EXPORT_SYMBOL(iounmap);
265
266 #ifdef CONFIG_X86_32
267
268 int __initdata early_ioremap_debug;
269
270 static int __init early_ioremap_debug_setup(char *str)
271 {
272         early_ioremap_debug = 1;
273
274         return 0;
275 }
276 early_param("early_ioremap_debug", early_ioremap_debug_setup);
277
278 static __initdata int after_paging_init;
279 static __initdata unsigned long bm_pte[1024]
280                                 __attribute__((aligned(PAGE_SIZE)));
281
282 static inline unsigned long * __init early_ioremap_pgd(unsigned long addr)
283 {
284         return (unsigned long *)swapper_pg_dir + ((addr >> 22) & 1023);
285 }
286
287 static inline unsigned long * __init early_ioremap_pte(unsigned long addr)
288 {
289         return bm_pte + ((addr >> PAGE_SHIFT) & 1023);
290 }
291
292 void __init early_ioremap_init(void)
293 {
294         unsigned long *pgd;
295
296         if (early_ioremap_debug)
297                 printk(KERN_INFO "early_ioremap_init()\n");
298
299         pgd = early_ioremap_pgd(fix_to_virt(FIX_BTMAP_BEGIN));
300         *pgd = __pa(bm_pte) | _PAGE_TABLE;
301         memset(bm_pte, 0, sizeof(bm_pte));
302         /*
303          * The boot-ioremap range spans multiple pgds, for which
304          * we are not prepared:
305          */
306         if (pgd != early_ioremap_pgd(fix_to_virt(FIX_BTMAP_END))) {
307                 WARN_ON(1);
308                 printk(KERN_WARNING "pgd %p != %p\n",
309                        pgd, early_ioremap_pgd(fix_to_virt(FIX_BTMAP_END)));
310                 printk(KERN_WARNING "fix_to_virt(FIX_BTMAP_BEGIN): %08lx\n",
311                        fix_to_virt(FIX_BTMAP_BEGIN));
312                 printk(KERN_WARNING "fix_to_virt(FIX_BTMAP_END):   %08lx\n",
313                        fix_to_virt(FIX_BTMAP_END));
314
315                 printk(KERN_WARNING "FIX_BTMAP_END:       %d\n", FIX_BTMAP_END);
316                 printk(KERN_WARNING "FIX_BTMAP_BEGIN:     %d\n",
317                        FIX_BTMAP_BEGIN);
318         }
319 }
320
321 void __init early_ioremap_clear(void)
322 {
323         unsigned long *pgd;
324
325         if (early_ioremap_debug)
326                 printk(KERN_INFO "early_ioremap_clear()\n");
327
328         pgd = early_ioremap_pgd(fix_to_virt(FIX_BTMAP_BEGIN));
329         *pgd = 0;
330         paravirt_release_pt(__pa(pgd) >> PAGE_SHIFT);
331         __flush_tlb_all();
332 }
333
334 void __init early_ioremap_reset(void)
335 {
336         enum fixed_addresses idx;
337         unsigned long *pte, phys, addr;
338
339         after_paging_init = 1;
340         for (idx = FIX_BTMAP_BEGIN; idx >= FIX_BTMAP_END; idx--) {
341                 addr = fix_to_virt(idx);
342                 pte = early_ioremap_pte(addr);
343                 if (!*pte & _PAGE_PRESENT) {
344                         phys = *pte & PAGE_MASK;
345                         set_fixmap(idx, phys);
346                 }
347         }
348 }
349
350 static void __init __early_set_fixmap(enum fixed_addresses idx,
351                                    unsigned long phys, pgprot_t flags)
352 {
353         unsigned long *pte, addr = __fix_to_virt(idx);
354
355         if (idx >= __end_of_fixed_addresses) {
356                 BUG();
357                 return;
358         }
359         pte = early_ioremap_pte(addr);
360         if (pgprot_val(flags))
361                 *pte = (phys & PAGE_MASK) | pgprot_val(flags);
362         else
363                 *pte = 0;
364         __flush_tlb_one(addr);
365 }
366
367 static inline void __init early_set_fixmap(enum fixed_addresses idx,
368                                         unsigned long phys)
369 {
370         if (after_paging_init)
371                 set_fixmap(idx, phys);
372         else
373                 __early_set_fixmap(idx, phys, PAGE_KERNEL);
374 }
375
376 static inline void __init early_clear_fixmap(enum fixed_addresses idx)
377 {
378         if (after_paging_init)
379                 clear_fixmap(idx);
380         else
381                 __early_set_fixmap(idx, 0, __pgprot(0));
382 }
383
384
385 int __initdata early_ioremap_nested;
386
387 static int __init check_early_ioremap_leak(void)
388 {
389         if (!early_ioremap_nested)
390                 return 0;
391
392         printk(KERN_WARNING
393                "Debug warning: early ioremap leak of %d areas detected.\n",
394                early_ioremap_nested);
395         printk(KERN_WARNING
396                "please boot with early_ioremap_debug and report the dmesg.\n");
397         WARN_ON(1);
398
399         return 1;
400 }
401 late_initcall(check_early_ioremap_leak);
402
403 void __init *early_ioremap(unsigned long phys_addr, unsigned long size)
404 {
405         unsigned long offset, last_addr;
406         unsigned int nrpages, nesting;
407         enum fixed_addresses idx0, idx;
408
409         WARN_ON(system_state != SYSTEM_BOOTING);
410
411         nesting = early_ioremap_nested;
412         if (early_ioremap_debug) {
413                 printk(KERN_INFO "early_ioremap(%08lx, %08lx) [%d] => ",
414                        phys_addr, size, nesting);
415                 dump_stack();
416         }
417
418         /* Don't allow wraparound or zero size */
419         last_addr = phys_addr + size - 1;
420         if (!size || last_addr < phys_addr) {
421                 WARN_ON(1);
422                 return NULL;
423         }
424
425         if (nesting >= FIX_BTMAPS_NESTING) {
426                 WARN_ON(1);
427                 return NULL;
428         }
429         early_ioremap_nested++;
430         /*
431          * Mappings have to be page-aligned
432          */
433         offset = phys_addr & ~PAGE_MASK;
434         phys_addr &= PAGE_MASK;
435         size = PAGE_ALIGN(last_addr) - phys_addr;
436
437         /*
438          * Mappings have to fit in the FIX_BTMAP area.
439          */
440         nrpages = size >> PAGE_SHIFT;
441         if (nrpages > NR_FIX_BTMAPS) {
442                 WARN_ON(1);
443                 return NULL;
444         }
445
446         /*
447          * Ok, go for it..
448          */
449         idx0 = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*nesting;
450         idx = idx0;
451         while (nrpages > 0) {
452                 early_set_fixmap(idx, phys_addr);
453                 phys_addr += PAGE_SIZE;
454                 --idx;
455                 --nrpages;
456         }
457         if (early_ioremap_debug)
458                 printk(KERN_CONT "%08lx + %08lx\n", offset, fix_to_virt(idx0));
459
460         return (void *) (offset + fix_to_virt(idx0));
461 }
462
463 void __init early_iounmap(void *addr, unsigned long size)
464 {
465         unsigned long virt_addr;
466         unsigned long offset;
467         unsigned int nrpages;
468         enum fixed_addresses idx;
469         unsigned int nesting;
470
471         nesting = --early_ioremap_nested;
472         WARN_ON(nesting < 0);
473
474         if (early_ioremap_debug) {
475                 printk(KERN_INFO "early_iounmap(%p, %08lx) [%d]\n", addr,
476                        size, nesting);
477                 dump_stack();
478         }
479
480         virt_addr = (unsigned long)addr;
481         if (virt_addr < fix_to_virt(FIX_BTMAP_BEGIN)) {
482                 WARN_ON(1);
483                 return;
484         }
485         offset = virt_addr & ~PAGE_MASK;
486         nrpages = PAGE_ALIGN(offset + size - 1) >> PAGE_SHIFT;
487
488         idx = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*nesting;
489         while (nrpages > 0) {
490                 early_clear_fixmap(idx);
491                 --idx;
492                 --nrpages;
493         }
494 }
495
496 void __this_fixmap_does_not_exist(void)
497 {
498         WARN_ON(1);
499 }
500
501 #endif /* CONFIG_X86_32 */