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