1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | |
3 | #include <linux/io.h> |
4 | #include <linux/slab.h> |
5 | #include <linux/mmzone.h> |
6 | #include <linux/vmalloc.h> |
7 | #include <asm/io-workarounds.h> |
8 | |
9 | unsigned long ioremap_bot; |
10 | EXPORT_SYMBOL(ioremap_bot); |
11 | |
12 | void __iomem *ioremap(phys_addr_t addr, unsigned long size) |
13 | { |
14 | pgprot_t prot = pgprot_noncached(PAGE_KERNEL); |
15 | void *caller = __builtin_return_address(0); |
16 | |
17 | if (iowa_is_active()) |
18 | return iowa_ioremap(addr, size, prot, caller); |
19 | return __ioremap_caller(addr, size, prot, caller); |
20 | } |
21 | EXPORT_SYMBOL(ioremap); |
22 | |
23 | void __iomem *ioremap_wc(phys_addr_t addr, unsigned long size) |
24 | { |
25 | pgprot_t prot = pgprot_noncached_wc(PAGE_KERNEL); |
26 | void *caller = __builtin_return_address(0); |
27 | |
28 | if (iowa_is_active()) |
29 | return iowa_ioremap(addr, size, prot, caller); |
30 | return __ioremap_caller(addr, size, prot, caller); |
31 | } |
32 | EXPORT_SYMBOL(ioremap_wc); |
33 | |
34 | void __iomem *ioremap_coherent(phys_addr_t addr, unsigned long size) |
35 | { |
36 | pgprot_t prot = pgprot_cached(PAGE_KERNEL); |
37 | void *caller = __builtin_return_address(0); |
38 | |
39 | if (iowa_is_active()) |
40 | return iowa_ioremap(addr, size, prot, caller); |
41 | return __ioremap_caller(addr, size, prot, caller); |
42 | } |
43 | |
44 | void __iomem *ioremap_prot(phys_addr_t addr, size_t size, unsigned long flags) |
45 | { |
46 | pte_t pte = __pte(val: flags); |
47 | void *caller = __builtin_return_address(0); |
48 | |
49 | /* writeable implies dirty for kernel addresses */ |
50 | if (pte_write(pte)) |
51 | pte = pte_mkdirty(pte); |
52 | |
53 | if (iowa_is_active()) |
54 | return iowa_ioremap(addr, size, pte_pgprot(pte), caller); |
55 | return __ioremap_caller(addr, size, pte_pgprot(pte), caller); |
56 | } |
57 | EXPORT_SYMBOL(ioremap_prot); |
58 | |
59 | int early_ioremap_range(unsigned long ea, phys_addr_t pa, |
60 | unsigned long size, pgprot_t prot) |
61 | { |
62 | unsigned long i; |
63 | |
64 | for (i = 0; i < size; i += PAGE_SIZE) { |
65 | int err = map_kernel_page(ea + i, pa + i, pgprot_nx(prot)); |
66 | |
67 | if (WARN_ON_ONCE(err)) /* Should clean up */ |
68 | return err; |
69 | } |
70 | |
71 | return 0; |
72 | } |
73 | |