]> asedeno.scripts.mit.edu Git - linux.git/blob - arch/powerpc/mm/ioremap.c
eaf5f8a4a63f9c525f3128f50b5ad98b714801ef
[linux.git] / arch / powerpc / mm / ioremap.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2
3 #include <linux/io.h>
4 #include <asm/io-workarounds.h>
5
6 unsigned long ioremap_bot;
7 EXPORT_SYMBOL(ioremap_bot);
8
9 void __iomem *ioremap(phys_addr_t addr, unsigned long size)
10 {
11         pgprot_t prot = pgprot_noncached(PAGE_KERNEL);
12         void *caller = __builtin_return_address(0);
13
14         if (iowa_is_active())
15                 return iowa_ioremap(addr, size, prot, caller);
16         return __ioremap_caller(addr, size, prot, caller);
17 }
18 EXPORT_SYMBOL(ioremap);
19
20 void __iomem *ioremap_wc(phys_addr_t addr, unsigned long size)
21 {
22         pgprot_t prot = pgprot_noncached_wc(PAGE_KERNEL);
23         void *caller = __builtin_return_address(0);
24
25         if (iowa_is_active())
26                 return iowa_ioremap(addr, size, prot, caller);
27         return __ioremap_caller(addr, size, prot, caller);
28 }
29 EXPORT_SYMBOL(ioremap_wc);
30
31 void __iomem *ioremap_coherent(phys_addr_t addr, unsigned long size)
32 {
33         pgprot_t prot = pgprot_cached(PAGE_KERNEL);
34         void *caller = __builtin_return_address(0);
35
36         if (iowa_is_active())
37                 return iowa_ioremap(addr, size, prot, caller);
38         return __ioremap_caller(addr, size, prot, caller);
39 }
40
41 void __iomem *ioremap_prot(phys_addr_t addr, unsigned long size, unsigned long flags)
42 {
43         pte_t pte = __pte(flags);
44         void *caller = __builtin_return_address(0);
45
46         /* writeable implies dirty for kernel addresses */
47         if (pte_write(pte))
48                 pte = pte_mkdirty(pte);
49
50         /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */
51         pte = pte_exprotect(pte);
52         pte = pte_mkprivileged(pte);
53
54         if (iowa_is_active())
55                 return iowa_ioremap(addr, size, pte_pgprot(pte), caller);
56         return __ioremap_caller(addr, size, pte_pgprot(pte), caller);
57 }
58 EXPORT_SYMBOL(ioremap_prot);