1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | /* |
3 | * arch/parisc/mm/ioremap.c |
4 | * |
5 | * (C) Copyright 1995 1996 Linus Torvalds |
6 | * (C) Copyright 2001-2019 Helge Deller <deller@gmx.de> |
7 | * (C) Copyright 2005 Kyle McMartin <kyle@parisc-linux.org> |
8 | */ |
9 | |
10 | #include <linux/vmalloc.h> |
11 | #include <linux/errno.h> |
12 | #include <linux/module.h> |
13 | #include <linux/io.h> |
14 | #include <linux/mm.h> |
15 | |
16 | void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size, |
17 | unsigned long prot) |
18 | { |
19 | #ifdef CONFIG_EISA |
20 | unsigned long end = phys_addr + size - 1; |
21 | /* Support EISA addresses */ |
22 | if ((phys_addr >= 0x00080000 && end < 0x000fffff) || |
23 | (phys_addr >= 0x00500000 && end < 0x03bfffff)) |
24 | phys_addr |= F_EXTEND(0xfc000000); |
25 | #endif |
26 | |
27 | /* |
28 | * Don't allow anybody to remap normal RAM that we're using.. |
29 | */ |
30 | if (phys_addr < virt_to_phys(address: high_memory)) { |
31 | char *t_addr, *t_end; |
32 | struct page *page; |
33 | |
34 | t_addr = __va(phys_addr); |
35 | t_end = t_addr + (size - 1); |
36 | |
37 | for (page = virt_to_page(t_addr); |
38 | page <= virt_to_page(t_end); page++) { |
39 | if(!PageReserved(page)) |
40 | return NULL; |
41 | } |
42 | } |
43 | |
44 | return generic_ioremap_prot(phys_addr, size, __pgprot(prot)); |
45 | } |
46 | EXPORT_SYMBOL(ioremap_prot); |
47 |