]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/x86/mm/ioremap.c
fix historic ioremap() abuse in AGP
[linux-2.6-omap-h63xx.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 vaddr, unsigned long size,
74                                enum ioremap_mode mode)
75 {
76         unsigned long nrpages = size >> PAGE_SHIFT;
77         int err;
78
79         switch (mode) {
80         case IOR_MODE_UNCACHED:
81         default:
82                 err = set_memory_uc(vaddr, nrpages);
83                 break;
84         case IOR_MODE_CACHED:
85                 err = set_memory_wb(vaddr, nrpages);
86                 break;
87         }
88
89         return err;
90 }
91
92 /*
93  * Remap an arbitrary physical address space into the kernel virtual
94  * address space. Needed when the kernel wants to access high addresses
95  * directly.
96  *
97  * NOTE! We need to allow non-page-aligned mappings too: we will obviously
98  * have to convert them into an offset in a page-aligned mapping, but the
99  * caller shouldn't need to know that small detail.
100  */
101 static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size,
102                                enum ioremap_mode mode)
103 {
104         unsigned long pfn, offset, last_addr, vaddr;
105         struct vm_struct *area;
106         pgprot_t prot;
107
108         /* Don't allow wraparound or zero size */
109         last_addr = phys_addr + size - 1;
110         if (!size || last_addr < phys_addr)
111                 return NULL;
112
113         /*
114          * Don't remap the low PCI/ISA area, it's always mapped..
115          */
116         if (phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
117                 return (__force void __iomem *)phys_to_virt(phys_addr);
118
119         /*
120          * Don't allow anybody to remap normal RAM that we're using..
121          */
122         for (pfn = phys_addr >> PAGE_SHIFT; pfn < max_pfn_mapped &&
123              (pfn << PAGE_SHIFT) < last_addr; pfn++) {
124                 if (page_is_ram(pfn) && pfn_valid(pfn) &&
125                     !PageReserved(pfn_to_page(pfn)))
126                         return NULL;
127         }
128
129         WARN_ON_ONCE(page_is_ram(pfn));
130
131         switch (mode) {
132         case IOR_MODE_UNCACHED:
133         default:
134                 prot = PAGE_KERNEL_NOCACHE;
135                 break;
136         case IOR_MODE_CACHED:
137                 prot = PAGE_KERNEL;
138                 break;
139         }
140
141         /*
142          * Mappings have to be page-aligned
143          */
144         offset = phys_addr & ~PAGE_MASK;
145         phys_addr &= PAGE_MASK;
146         size = PAGE_ALIGN(last_addr+1) - phys_addr;
147
148         /*
149          * Ok, go for it..
150          */
151         area = get_vm_area(size, VM_IOREMAP);
152         if (!area)
153                 return NULL;
154         area->phys_addr = phys_addr;
155         vaddr = (unsigned long) area->addr;
156         if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) {
157                 remove_vm_area((void *)(vaddr & PAGE_MASK));
158                 return NULL;
159         }
160
161         if (ioremap_change_attr(vaddr, size, mode) < 0) {
162                 vunmap(area->addr);
163                 return NULL;
164         }
165
166         return (void __iomem *) (vaddr + offset);
167 }
168
169 /**
170  * ioremap_nocache     -   map bus memory into CPU space
171  * @offset:    bus address of the memory
172  * @size:      size of the resource to map
173  *
174  * ioremap_nocache performs a platform specific sequence of operations to
175  * make bus memory CPU accessible via the readb/readw/readl/writeb/
176  * writew/writel functions and the other mmio helpers. The returned
177  * address is not guaranteed to be usable directly as a virtual
178  * address.
179  *
180  * This version of ioremap ensures that the memory is marked uncachable
181  * on the CPU as well as honouring existing caching rules from things like
182  * the PCI bus. Note that there are other caches and buffers on many
183  * busses. In particular driver authors should read up on PCI writes
184  *
185  * It's useful if some control registers are in such an area and
186  * write combining or read caching is not desirable:
187  *
188  * Must be freed with iounmap.
189  */
190 void __iomem *ioremap_nocache(unsigned long phys_addr, unsigned long size)
191 {
192         return __ioremap(phys_addr, size, IOR_MODE_UNCACHED);
193 }
194 EXPORT_SYMBOL(ioremap_nocache);
195
196 void __iomem *ioremap_cache(unsigned long phys_addr, unsigned long size)
197 {
198         return __ioremap(phys_addr, size, IOR_MODE_CACHED);
199 }
200 EXPORT_SYMBOL(ioremap_cache);
201
202 /**
203  * iounmap - Free a IO remapping
204  * @addr: virtual address from ioremap_*
205  *
206  * Caller must ensure there is only one unmapping for the same pointer.
207  */
208 void iounmap(volatile void __iomem *addr)
209 {
210         struct vm_struct *p, *o;
211
212         if ((void __force *)addr <= high_memory)
213                 return;
214
215         /*
216          * __ioremap special-cases the PCI/ISA range by not instantiating a
217          * vm_area and by simply returning an address into the kernel mapping
218          * of ISA space.   So handle that here.
219          */
220         if (addr >= phys_to_virt(ISA_START_ADDRESS) &&
221             addr < phys_to_virt(ISA_END_ADDRESS))
222                 return;
223
224         addr = (volatile void __iomem *)
225                 (PAGE_MASK & (unsigned long __force)addr);
226
227         /* Use the vm area unlocked, assuming the caller
228            ensures there isn't another iounmap for the same address
229            in parallel. Reuse of the virtual address is prevented by
230            leaving it in the global lists until we're done with it.
231            cpa takes care of the direct mappings. */
232         read_lock(&vmlist_lock);
233         for (p = vmlist; p; p = p->next) {
234                 if (p->addr == addr)
235                         break;
236         }
237         read_unlock(&vmlist_lock);
238
239         if (!p) {
240                 printk(KERN_ERR "iounmap: bad address %p\n", addr);
241                 dump_stack();
242                 return;
243         }
244
245         /* Finally remove it */
246         o = remove_vm_area((void *)addr);
247         BUG_ON(p != o || o == NULL);
248         kfree(p);
249 }
250 EXPORT_SYMBOL(iounmap);
251
252 #ifdef CONFIG_X86_32
253
254 int __initdata early_ioremap_debug;
255
256 static int __init early_ioremap_debug_setup(char *str)
257 {
258         early_ioremap_debug = 1;
259
260         return 0;
261 }
262 early_param("early_ioremap_debug", early_ioremap_debug_setup);
263
264 static __initdata int after_paging_init;
265 static __initdata pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)]
266                                 __attribute__((aligned(PAGE_SIZE)));
267
268 static inline pmd_t * __init early_ioremap_pmd(unsigned long addr)
269 {
270         /* Don't assume we're using swapper_pg_dir at this point */
271         pgd_t *base = __va(read_cr3());
272         pgd_t *pgd = &base[pgd_index(addr)];
273         pud_t *pud = pud_offset(pgd, addr);
274         pmd_t *pmd = pmd_offset(pud, addr);
275
276         return pmd;
277 }
278
279 static inline pte_t * __init early_ioremap_pte(unsigned long addr)
280 {
281         return &bm_pte[pte_index(addr)];
282 }
283
284 void __init early_ioremap_init(void)
285 {
286         pmd_t *pmd;
287
288         if (early_ioremap_debug)
289                 printk(KERN_INFO "early_ioremap_init()\n");
290
291         pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN));
292         memset(bm_pte, 0, sizeof(bm_pte));
293         pmd_populate_kernel(&init_mm, pmd, bm_pte);
294
295         /*
296          * The boot-ioremap range spans multiple pmds, for which
297          * we are not prepared:
298          */
299         if (pmd != early_ioremap_pmd(fix_to_virt(FIX_BTMAP_END))) {
300                 WARN_ON(1);
301                 printk(KERN_WARNING "pmd %p != %p\n",
302                        pmd, early_ioremap_pmd(fix_to_virt(FIX_BTMAP_END)));
303                 printk(KERN_WARNING "fix_to_virt(FIX_BTMAP_BEGIN): %08lx\n",
304                         fix_to_virt(FIX_BTMAP_BEGIN));
305                 printk(KERN_WARNING "fix_to_virt(FIX_BTMAP_END):   %08lx\n",
306                         fix_to_virt(FIX_BTMAP_END));
307
308                 printk(KERN_WARNING "FIX_BTMAP_END:       %d\n", FIX_BTMAP_END);
309                 printk(KERN_WARNING "FIX_BTMAP_BEGIN:     %d\n",
310                        FIX_BTMAP_BEGIN);
311         }
312 }
313
314 void __init early_ioremap_clear(void)
315 {
316         pmd_t *pmd;
317
318         if (early_ioremap_debug)
319                 printk(KERN_INFO "early_ioremap_clear()\n");
320
321         pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN));
322         pmd_clear(pmd);
323         paravirt_release_pt(__pa(bm_pte) >> PAGE_SHIFT);
324         __flush_tlb_all();
325 }
326
327 void __init early_ioremap_reset(void)
328 {
329         enum fixed_addresses idx;
330         unsigned long addr, phys;
331         pte_t *pte;
332
333         after_paging_init = 1;
334         for (idx = FIX_BTMAP_BEGIN; idx >= FIX_BTMAP_END; idx--) {
335                 addr = fix_to_virt(idx);
336                 pte = early_ioremap_pte(addr);
337                 if (pte_present(*pte)) {
338                         phys = pte_val(*pte) & PAGE_MASK;
339                         set_fixmap(idx, phys);
340                 }
341         }
342 }
343
344 static void __init __early_set_fixmap(enum fixed_addresses idx,
345                                    unsigned long phys, pgprot_t flags)
346 {
347         unsigned long addr = __fix_to_virt(idx);
348         pte_t *pte;
349
350         if (idx >= __end_of_fixed_addresses) {
351                 BUG();
352                 return;
353         }
354         pte = early_ioremap_pte(addr);
355         if (pgprot_val(flags))
356                 set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags));
357         else
358                 pte_clear(NULL, addr, pte);
359         __flush_tlb_one(addr);
360 }
361
362 static inline void __init early_set_fixmap(enum fixed_addresses idx,
363                                         unsigned long phys)
364 {
365         if (after_paging_init)
366                 set_fixmap(idx, phys);
367         else
368                 __early_set_fixmap(idx, phys, PAGE_KERNEL);
369 }
370
371 static inline void __init early_clear_fixmap(enum fixed_addresses idx)
372 {
373         if (after_paging_init)
374                 clear_fixmap(idx);
375         else
376                 __early_set_fixmap(idx, 0, __pgprot(0));
377 }
378
379
380 int __initdata early_ioremap_nested;
381
382 static int __init check_early_ioremap_leak(void)
383 {
384         if (!early_ioremap_nested)
385                 return 0;
386
387         printk(KERN_WARNING
388                "Debug warning: early ioremap leak of %d areas detected.\n",
389                early_ioremap_nested);
390         printk(KERN_WARNING
391                "please boot with early_ioremap_debug and report the dmesg.\n");
392         WARN_ON(1);
393
394         return 1;
395 }
396 late_initcall(check_early_ioremap_leak);
397
398 void __init *early_ioremap(unsigned long phys_addr, unsigned long size)
399 {
400         unsigned long offset, last_addr;
401         unsigned int nrpages, nesting;
402         enum fixed_addresses idx0, idx;
403
404         WARN_ON(system_state != SYSTEM_BOOTING);
405
406         nesting = early_ioremap_nested;
407         if (early_ioremap_debug) {
408                 printk(KERN_INFO "early_ioremap(%08lx, %08lx) [%d] => ",
409                        phys_addr, size, nesting);
410                 dump_stack();
411         }
412
413         /* Don't allow wraparound or zero size */
414         last_addr = phys_addr + size - 1;
415         if (!size || last_addr < phys_addr) {
416                 WARN_ON(1);
417                 return NULL;
418         }
419
420         if (nesting >= FIX_BTMAPS_NESTING) {
421                 WARN_ON(1);
422                 return NULL;
423         }
424         early_ioremap_nested++;
425         /*
426          * Mappings have to be page-aligned
427          */
428         offset = phys_addr & ~PAGE_MASK;
429         phys_addr &= PAGE_MASK;
430         size = PAGE_ALIGN(last_addr) - phys_addr;
431
432         /*
433          * Mappings have to fit in the FIX_BTMAP area.
434          */
435         nrpages = size >> PAGE_SHIFT;
436         if (nrpages > NR_FIX_BTMAPS) {
437                 WARN_ON(1);
438                 return NULL;
439         }
440
441         /*
442          * Ok, go for it..
443          */
444         idx0 = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*nesting;
445         idx = idx0;
446         while (nrpages > 0) {
447                 early_set_fixmap(idx, phys_addr);
448                 phys_addr += PAGE_SIZE;
449                 --idx;
450                 --nrpages;
451         }
452         if (early_ioremap_debug)
453                 printk(KERN_CONT "%08lx + %08lx\n", offset, fix_to_virt(idx0));
454
455         return (void *) (offset + fix_to_virt(idx0));
456 }
457
458 void __init early_iounmap(void *addr, unsigned long size)
459 {
460         unsigned long virt_addr;
461         unsigned long offset;
462         unsigned int nrpages;
463         enum fixed_addresses idx;
464         unsigned int nesting;
465
466         nesting = --early_ioremap_nested;
467         WARN_ON(nesting < 0);
468
469         if (early_ioremap_debug) {
470                 printk(KERN_INFO "early_iounmap(%p, %08lx) [%d]\n", addr,
471                        size, nesting);
472                 dump_stack();
473         }
474
475         virt_addr = (unsigned long)addr;
476         if (virt_addr < fix_to_virt(FIX_BTMAP_BEGIN)) {
477                 WARN_ON(1);
478                 return;
479         }
480         offset = virt_addr & ~PAGE_MASK;
481         nrpages = PAGE_ALIGN(offset + size - 1) >> PAGE_SHIFT;
482
483         idx = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*nesting;
484         while (nrpages > 0) {
485                 early_clear_fixmap(idx);
486                 --idx;
487                 --nrpages;
488         }
489 }
490
491 void __this_fixmap_does_not_exist(void)
492 {
493         WARN_ON(1);
494 }
495
496 #endif /* CONFIG_X86_32 */