xref: /openbmc/linux/arch/x86/mm/ioremap.c (revision fd589a8f)
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 #include <linux/mmiotrace.h>
16 
17 #include <asm/cacheflush.h>
18 #include <asm/e820.h>
19 #include <asm/fixmap.h>
20 #include <asm/pgtable.h>
21 #include <asm/tlbflush.h>
22 #include <asm/pgalloc.h>
23 #include <asm/pat.h>
24 
25 #include "physaddr.h"
26 
27 int page_is_ram(unsigned long pagenr)
28 {
29 	resource_size_t addr, end;
30 	int i;
31 
32 	/*
33 	 * A special case is the first 4Kb of memory;
34 	 * This is a BIOS owned area, not kernel ram, but generally
35 	 * not listed as such in the E820 table.
36 	 */
37 	if (pagenr == 0)
38 		return 0;
39 
40 	/*
41 	 * Second special case: Some BIOSen report the PC BIOS
42 	 * area (640->1Mb) as ram even though it is not.
43 	 */
44 	if (pagenr >= (BIOS_BEGIN >> PAGE_SHIFT) &&
45 		    pagenr < (BIOS_END >> PAGE_SHIFT))
46 		return 0;
47 
48 	for (i = 0; i < e820.nr_map; i++) {
49 		/*
50 		 * Not usable memory:
51 		 */
52 		if (e820.map[i].type != E820_RAM)
53 			continue;
54 		addr = (e820.map[i].addr + PAGE_SIZE-1) >> PAGE_SHIFT;
55 		end = (e820.map[i].addr + e820.map[i].size) >> PAGE_SHIFT;
56 
57 
58 		if ((pagenr >= addr) && (pagenr < end))
59 			return 1;
60 	}
61 	return 0;
62 }
63 
64 /*
65  * Fix up the linear direct mapping of the kernel to avoid cache attribute
66  * conflicts.
67  */
68 int ioremap_change_attr(unsigned long vaddr, unsigned long size,
69 			       unsigned long prot_val)
70 {
71 	unsigned long nrpages = size >> PAGE_SHIFT;
72 	int err;
73 
74 	switch (prot_val) {
75 	case _PAGE_CACHE_UC:
76 	default:
77 		err = _set_memory_uc(vaddr, nrpages);
78 		break;
79 	case _PAGE_CACHE_WC:
80 		err = _set_memory_wc(vaddr, nrpages);
81 		break;
82 	case _PAGE_CACHE_WB:
83 		err = _set_memory_wb(vaddr, nrpages);
84 		break;
85 	}
86 
87 	return err;
88 }
89 
90 /*
91  * Remap an arbitrary physical address space into the kernel virtual
92  * address space. Needed when the kernel wants to access high addresses
93  * directly.
94  *
95  * NOTE! We need to allow non-page-aligned mappings too: we will obviously
96  * have to convert them into an offset in a page-aligned mapping, but the
97  * caller shouldn't need to know that small detail.
98  */
99 static void __iomem *__ioremap_caller(resource_size_t phys_addr,
100 		unsigned long size, unsigned long prot_val, void *caller)
101 {
102 	unsigned long pfn, offset, vaddr;
103 	resource_size_t last_addr;
104 	const resource_size_t unaligned_phys_addr = phys_addr;
105 	const unsigned long unaligned_size = size;
106 	struct vm_struct *area;
107 	unsigned long new_prot_val;
108 	pgprot_t prot;
109 	int retval;
110 	void __iomem *ret_addr;
111 
112 	/* Don't allow wraparound or zero size */
113 	last_addr = phys_addr + size - 1;
114 	if (!size || last_addr < phys_addr)
115 		return NULL;
116 
117 	if (!phys_addr_valid(phys_addr)) {
118 		printk(KERN_WARNING "ioremap: invalid physical address %llx\n",
119 		       (unsigned long long)phys_addr);
120 		WARN_ON_ONCE(1);
121 		return NULL;
122 	}
123 
124 	/*
125 	 * Don't remap the low PCI/ISA area, it's always mapped..
126 	 */
127 	if (is_ISA_range(phys_addr, last_addr))
128 		return (__force void __iomem *)phys_to_virt(phys_addr);
129 
130 	/*
131 	 * Check if the request spans more than any BAR in the iomem resource
132 	 * tree.
133 	 */
134 	WARN_ONCE(iomem_map_sanity_check(phys_addr, size),
135 		  KERN_INFO "Info: mapping multiple BARs. Your kernel is fine.");
136 
137 	/*
138 	 * Don't allow anybody to remap normal RAM that we're using..
139 	 */
140 	for (pfn = phys_addr >> PAGE_SHIFT;
141 				(pfn << PAGE_SHIFT) < (last_addr & PAGE_MASK);
142 				pfn++) {
143 
144 		int is_ram = page_is_ram(pfn);
145 
146 		if (is_ram && pfn_valid(pfn) && !PageReserved(pfn_to_page(pfn)))
147 			return NULL;
148 		WARN_ON_ONCE(is_ram);
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 	retval = reserve_memtype(phys_addr, (u64)phys_addr + size,
159 						prot_val, &new_prot_val);
160 	if (retval) {
161 		printk(KERN_ERR "ioremap reserve_memtype failed %d\n", retval);
162 		return NULL;
163 	}
164 
165 	if (prot_val != new_prot_val) {
166 		if (!is_new_memtype_allowed(phys_addr, size,
167 					    prot_val, new_prot_val)) {
168 			printk(KERN_ERR
169 		"ioremap error for 0x%llx-0x%llx, requested 0x%lx, got 0x%lx\n",
170 				(unsigned long long)phys_addr,
171 				(unsigned long long)(phys_addr + size),
172 				prot_val, new_prot_val);
173 			free_memtype(phys_addr, phys_addr + size);
174 			return NULL;
175 		}
176 		prot_val = new_prot_val;
177 	}
178 
179 	switch (prot_val) {
180 	case _PAGE_CACHE_UC:
181 	default:
182 		prot = PAGE_KERNEL_IO_NOCACHE;
183 		break;
184 	case _PAGE_CACHE_UC_MINUS:
185 		prot = PAGE_KERNEL_IO_UC_MINUS;
186 		break;
187 	case _PAGE_CACHE_WC:
188 		prot = PAGE_KERNEL_IO_WC;
189 		break;
190 	case _PAGE_CACHE_WB:
191 		prot = PAGE_KERNEL_IO;
192 		break;
193 	}
194 
195 	/*
196 	 * Ok, go for it..
197 	 */
198 	area = get_vm_area_caller(size, VM_IOREMAP, caller);
199 	if (!area)
200 		return NULL;
201 	area->phys_addr = phys_addr;
202 	vaddr = (unsigned long) area->addr;
203 
204 	if (kernel_map_sync_memtype(phys_addr, size, prot_val)) {
205 		free_memtype(phys_addr, phys_addr + size);
206 		free_vm_area(area);
207 		return NULL;
208 	}
209 
210 	if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) {
211 		free_memtype(phys_addr, phys_addr + size);
212 		free_vm_area(area);
213 		return NULL;
214 	}
215 
216 	ret_addr = (void __iomem *) (vaddr + offset);
217 	mmiotrace_ioremap(unaligned_phys_addr, unaligned_size, ret_addr);
218 
219 	return ret_addr;
220 }
221 
222 /**
223  * ioremap_nocache     -   map bus memory into CPU space
224  * @offset:    bus address of the memory
225  * @size:      size of the resource to map
226  *
227  * ioremap_nocache performs a platform specific sequence of operations to
228  * make bus memory CPU accessible via the readb/readw/readl/writeb/
229  * writew/writel functions and the other mmio helpers. The returned
230  * address is not guaranteed to be usable directly as a virtual
231  * address.
232  *
233  * This version of ioremap ensures that the memory is marked uncachable
234  * on the CPU as well as honouring existing caching rules from things like
235  * the PCI bus. Note that there are other caches and buffers on many
236  * busses. In particular driver authors should read up on PCI writes
237  *
238  * It's useful if some control registers are in such an area and
239  * write combining or read caching is not desirable:
240  *
241  * Must be freed with iounmap.
242  */
243 void __iomem *ioremap_nocache(resource_size_t phys_addr, unsigned long size)
244 {
245 	/*
246 	 * Ideally, this should be:
247 	 *	pat_enabled ? _PAGE_CACHE_UC : _PAGE_CACHE_UC_MINUS;
248 	 *
249 	 * Till we fix all X drivers to use ioremap_wc(), we will use
250 	 * UC MINUS.
251 	 */
252 	unsigned long val = _PAGE_CACHE_UC_MINUS;
253 
254 	return __ioremap_caller(phys_addr, size, val,
255 				__builtin_return_address(0));
256 }
257 EXPORT_SYMBOL(ioremap_nocache);
258 
259 /**
260  * ioremap_wc	-	map memory into CPU space write combined
261  * @offset:	bus address of the memory
262  * @size:	size of the resource to map
263  *
264  * This version of ioremap ensures that the memory is marked write combining.
265  * Write combining allows faster writes to some hardware devices.
266  *
267  * Must be freed with iounmap.
268  */
269 void __iomem *ioremap_wc(resource_size_t phys_addr, unsigned long size)
270 {
271 	if (pat_enabled)
272 		return __ioremap_caller(phys_addr, size, _PAGE_CACHE_WC,
273 					__builtin_return_address(0));
274 	else
275 		return ioremap_nocache(phys_addr, size);
276 }
277 EXPORT_SYMBOL(ioremap_wc);
278 
279 void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size)
280 {
281 	return __ioremap_caller(phys_addr, size, _PAGE_CACHE_WB,
282 				__builtin_return_address(0));
283 }
284 EXPORT_SYMBOL(ioremap_cache);
285 
286 static void __iomem *ioremap_default(resource_size_t phys_addr,
287 					unsigned long size)
288 {
289 	unsigned long flags;
290 	void __iomem *ret;
291 	int err;
292 
293 	/*
294 	 * - WB for WB-able memory and no other conflicting mappings
295 	 * - UC_MINUS for non-WB-able memory with no other conflicting mappings
296 	 * - Inherit from confliting mappings otherwise
297 	 */
298 	err = reserve_memtype(phys_addr, phys_addr + size,
299 				_PAGE_CACHE_WB, &flags);
300 	if (err < 0)
301 		return NULL;
302 
303 	ret = __ioremap_caller(phys_addr, size, flags,
304 			       __builtin_return_address(0));
305 
306 	free_memtype(phys_addr, phys_addr + size);
307 	return ret;
308 }
309 
310 void __iomem *ioremap_prot(resource_size_t phys_addr, unsigned long size,
311 				unsigned long prot_val)
312 {
313 	return __ioremap_caller(phys_addr, size, (prot_val & _PAGE_CACHE_MASK),
314 				__builtin_return_address(0));
315 }
316 EXPORT_SYMBOL(ioremap_prot);
317 
318 /**
319  * iounmap - Free a IO remapping
320  * @addr: virtual address from ioremap_*
321  *
322  * Caller must ensure there is only one unmapping for the same pointer.
323  */
324 void iounmap(volatile void __iomem *addr)
325 {
326 	struct vm_struct *p, *o;
327 
328 	if ((void __force *)addr <= high_memory)
329 		return;
330 
331 	/*
332 	 * __ioremap special-cases the PCI/ISA range by not instantiating a
333 	 * vm_area and by simply returning an address into the kernel mapping
334 	 * of ISA space.   So handle that here.
335 	 */
336 	if ((void __force *)addr >= phys_to_virt(ISA_START_ADDRESS) &&
337 	    (void __force *)addr < phys_to_virt(ISA_END_ADDRESS))
338 		return;
339 
340 	addr = (volatile void __iomem *)
341 		(PAGE_MASK & (unsigned long __force)addr);
342 
343 	mmiotrace_iounmap(addr);
344 
345 	/* Use the vm area unlocked, assuming the caller
346 	   ensures there isn't another iounmap for the same address
347 	   in parallel. Reuse of the virtual address is prevented by
348 	   leaving it in the global lists until we're done with it.
349 	   cpa takes care of the direct mappings. */
350 	read_lock(&vmlist_lock);
351 	for (p = vmlist; p; p = p->next) {
352 		if (p->addr == (void __force *)addr)
353 			break;
354 	}
355 	read_unlock(&vmlist_lock);
356 
357 	if (!p) {
358 		printk(KERN_ERR "iounmap: bad address %p\n", addr);
359 		dump_stack();
360 		return;
361 	}
362 
363 	free_memtype(p->phys_addr, p->phys_addr + get_vm_area_size(p));
364 
365 	/* Finally remove it */
366 	o = remove_vm_area((void __force *)addr);
367 	BUG_ON(p != o || o == NULL);
368 	kfree(p);
369 }
370 EXPORT_SYMBOL(iounmap);
371 
372 /*
373  * Convert a physical pointer to a virtual kernel pointer for /dev/mem
374  * access
375  */
376 void *xlate_dev_mem_ptr(unsigned long phys)
377 {
378 	void *addr;
379 	unsigned long start = phys & PAGE_MASK;
380 
381 	/* If page is RAM, we can use __va. Otherwise ioremap and unmap. */
382 	if (page_is_ram(start >> PAGE_SHIFT))
383 		return __va(phys);
384 
385 	addr = (void __force *)ioremap_default(start, PAGE_SIZE);
386 	if (addr)
387 		addr = (void *)((unsigned long)addr | (phys & ~PAGE_MASK));
388 
389 	return addr;
390 }
391 
392 void unxlate_dev_mem_ptr(unsigned long phys, void *addr)
393 {
394 	if (page_is_ram(phys >> PAGE_SHIFT))
395 		return;
396 
397 	iounmap((void __iomem *)((unsigned long)addr & PAGE_MASK));
398 	return;
399 }
400 
401 static int __initdata early_ioremap_debug;
402 
403 static int __init early_ioremap_debug_setup(char *str)
404 {
405 	early_ioremap_debug = 1;
406 
407 	return 0;
408 }
409 early_param("early_ioremap_debug", early_ioremap_debug_setup);
410 
411 static __initdata int after_paging_init;
412 static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] __page_aligned_bss;
413 
414 static inline pmd_t * __init early_ioremap_pmd(unsigned long addr)
415 {
416 	/* Don't assume we're using swapper_pg_dir at this point */
417 	pgd_t *base = __va(read_cr3());
418 	pgd_t *pgd = &base[pgd_index(addr)];
419 	pud_t *pud = pud_offset(pgd, addr);
420 	pmd_t *pmd = pmd_offset(pud, addr);
421 
422 	return pmd;
423 }
424 
425 static inline pte_t * __init early_ioremap_pte(unsigned long addr)
426 {
427 	return &bm_pte[pte_index(addr)];
428 }
429 
430 static unsigned long slot_virt[FIX_BTMAPS_SLOTS] __initdata;
431 
432 void __init early_ioremap_init(void)
433 {
434 	pmd_t *pmd;
435 	int i;
436 
437 	if (early_ioremap_debug)
438 		printk(KERN_INFO "early_ioremap_init()\n");
439 
440 	for (i = 0; i < FIX_BTMAPS_SLOTS; i++)
441 		slot_virt[i] = __fix_to_virt(FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*i);
442 
443 	pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN));
444 	memset(bm_pte, 0, sizeof(bm_pte));
445 	pmd_populate_kernel(&init_mm, pmd, bm_pte);
446 
447 	/*
448 	 * The boot-ioremap range spans multiple pmds, for which
449 	 * we are not prepared:
450 	 */
451 	if (pmd != early_ioremap_pmd(fix_to_virt(FIX_BTMAP_END))) {
452 		WARN_ON(1);
453 		printk(KERN_WARNING "pmd %p != %p\n",
454 		       pmd, early_ioremap_pmd(fix_to_virt(FIX_BTMAP_END)));
455 		printk(KERN_WARNING "fix_to_virt(FIX_BTMAP_BEGIN): %08lx\n",
456 			fix_to_virt(FIX_BTMAP_BEGIN));
457 		printk(KERN_WARNING "fix_to_virt(FIX_BTMAP_END):   %08lx\n",
458 			fix_to_virt(FIX_BTMAP_END));
459 
460 		printk(KERN_WARNING "FIX_BTMAP_END:       %d\n", FIX_BTMAP_END);
461 		printk(KERN_WARNING "FIX_BTMAP_BEGIN:     %d\n",
462 		       FIX_BTMAP_BEGIN);
463 	}
464 }
465 
466 void __init early_ioremap_reset(void)
467 {
468 	after_paging_init = 1;
469 }
470 
471 static void __init __early_set_fixmap(enum fixed_addresses idx,
472 				      phys_addr_t phys, pgprot_t flags)
473 {
474 	unsigned long addr = __fix_to_virt(idx);
475 	pte_t *pte;
476 
477 	if (idx >= __end_of_fixed_addresses) {
478 		BUG();
479 		return;
480 	}
481 	pte = early_ioremap_pte(addr);
482 
483 	if (pgprot_val(flags))
484 		set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags));
485 	else
486 		pte_clear(&init_mm, addr, pte);
487 	__flush_tlb_one(addr);
488 }
489 
490 static inline void __init early_set_fixmap(enum fixed_addresses idx,
491 					   phys_addr_t phys, pgprot_t prot)
492 {
493 	if (after_paging_init)
494 		__set_fixmap(idx, phys, prot);
495 	else
496 		__early_set_fixmap(idx, phys, prot);
497 }
498 
499 static inline void __init early_clear_fixmap(enum fixed_addresses idx)
500 {
501 	if (after_paging_init)
502 		clear_fixmap(idx);
503 	else
504 		__early_set_fixmap(idx, 0, __pgprot(0));
505 }
506 
507 static void __iomem *prev_map[FIX_BTMAPS_SLOTS] __initdata;
508 static unsigned long prev_size[FIX_BTMAPS_SLOTS] __initdata;
509 
510 static int __init check_early_ioremap_leak(void)
511 {
512 	int count = 0;
513 	int i;
514 
515 	for (i = 0; i < FIX_BTMAPS_SLOTS; i++)
516 		if (prev_map[i])
517 			count++;
518 
519 	if (!count)
520 		return 0;
521 	WARN(1, KERN_WARNING
522 	       "Debug warning: early ioremap leak of %d areas detected.\n",
523 		count);
524 	printk(KERN_WARNING
525 		"please boot with early_ioremap_debug and report the dmesg.\n");
526 
527 	return 1;
528 }
529 late_initcall(check_early_ioremap_leak);
530 
531 static void __init __iomem *
532 __early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
533 {
534 	unsigned long offset;
535 	resource_size_t last_addr;
536 	unsigned int nrpages;
537 	enum fixed_addresses idx0, idx;
538 	int i, slot;
539 
540 	WARN_ON(system_state != SYSTEM_BOOTING);
541 
542 	slot = -1;
543 	for (i = 0; i < FIX_BTMAPS_SLOTS; i++) {
544 		if (!prev_map[i]) {
545 			slot = i;
546 			break;
547 		}
548 	}
549 
550 	if (slot < 0) {
551 		printk(KERN_INFO "early_iomap(%08llx, %08lx) not found slot\n",
552 			 (u64)phys_addr, size);
553 		WARN_ON(1);
554 		return NULL;
555 	}
556 
557 	if (early_ioremap_debug) {
558 		printk(KERN_INFO "early_ioremap(%08llx, %08lx) [%d] => ",
559 		       (u64)phys_addr, size, slot);
560 		dump_stack();
561 	}
562 
563 	/* Don't allow wraparound or zero size */
564 	last_addr = phys_addr + size - 1;
565 	if (!size || last_addr < phys_addr) {
566 		WARN_ON(1);
567 		return NULL;
568 	}
569 
570 	prev_size[slot] = size;
571 	/*
572 	 * Mappings have to be page-aligned
573 	 */
574 	offset = phys_addr & ~PAGE_MASK;
575 	phys_addr &= PAGE_MASK;
576 	size = PAGE_ALIGN(last_addr + 1) - phys_addr;
577 
578 	/*
579 	 * Mappings have to fit in the FIX_BTMAP area.
580 	 */
581 	nrpages = size >> PAGE_SHIFT;
582 	if (nrpages > NR_FIX_BTMAPS) {
583 		WARN_ON(1);
584 		return NULL;
585 	}
586 
587 	/*
588 	 * Ok, go for it..
589 	 */
590 	idx0 = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*slot;
591 	idx = idx0;
592 	while (nrpages > 0) {
593 		early_set_fixmap(idx, phys_addr, prot);
594 		phys_addr += PAGE_SIZE;
595 		--idx;
596 		--nrpages;
597 	}
598 	if (early_ioremap_debug)
599 		printk(KERN_CONT "%08lx + %08lx\n", offset, slot_virt[slot]);
600 
601 	prev_map[slot] = (void __iomem *)(offset + slot_virt[slot]);
602 	return prev_map[slot];
603 }
604 
605 /* Remap an IO device */
606 void __init __iomem *
607 early_ioremap(resource_size_t phys_addr, unsigned long size)
608 {
609 	return __early_ioremap(phys_addr, size, PAGE_KERNEL_IO);
610 }
611 
612 /* Remap memory */
613 void __init __iomem *
614 early_memremap(resource_size_t phys_addr, unsigned long size)
615 {
616 	return __early_ioremap(phys_addr, size, PAGE_KERNEL);
617 }
618 
619 void __init early_iounmap(void __iomem *addr, unsigned long size)
620 {
621 	unsigned long virt_addr;
622 	unsigned long offset;
623 	unsigned int nrpages;
624 	enum fixed_addresses idx;
625 	int i, slot;
626 
627 	slot = -1;
628 	for (i = 0; i < FIX_BTMAPS_SLOTS; i++) {
629 		if (prev_map[i] == addr) {
630 			slot = i;
631 			break;
632 		}
633 	}
634 
635 	if (slot < 0) {
636 		printk(KERN_INFO "early_iounmap(%p, %08lx) not found slot\n",
637 			 addr, size);
638 		WARN_ON(1);
639 		return;
640 	}
641 
642 	if (prev_size[slot] != size) {
643 		printk(KERN_INFO "early_iounmap(%p, %08lx) [%d] size not consistent %08lx\n",
644 			 addr, size, slot, prev_size[slot]);
645 		WARN_ON(1);
646 		return;
647 	}
648 
649 	if (early_ioremap_debug) {
650 		printk(KERN_INFO "early_iounmap(%p, %08lx) [%d]\n", addr,
651 		       size, slot);
652 		dump_stack();
653 	}
654 
655 	virt_addr = (unsigned long)addr;
656 	if (virt_addr < fix_to_virt(FIX_BTMAP_BEGIN)) {
657 		WARN_ON(1);
658 		return;
659 	}
660 	offset = virt_addr & ~PAGE_MASK;
661 	nrpages = PAGE_ALIGN(offset + size - 1) >> PAGE_SHIFT;
662 
663 	idx = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*slot;
664 	while (nrpages > 0) {
665 		early_clear_fixmap(idx);
666 		--idx;
667 		--nrpages;
668 	}
669 	prev_map[slot] = NULL;
670 }
671