.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * linux/arch/arm/mm/ioremap.c |
---|
3 | 4 | * |
---|
.. | .. |
---|
26 | 27 | #include <linux/vmalloc.h> |
---|
27 | 28 | #include <linux/io.h> |
---|
28 | 29 | #include <linux/sizes.h> |
---|
| 30 | +#include <linux/memblock.h> |
---|
29 | 31 | |
---|
30 | 32 | #include <asm/cp15.h> |
---|
31 | 33 | #include <asm/cputype.h> |
---|
.. | .. |
---|
140 | 142 | static void unmap_area_sections(unsigned long virt, unsigned long size) |
---|
141 | 143 | { |
---|
142 | 144 | unsigned long addr = virt, end = virt + (size & ~(SZ_1M - 1)); |
---|
143 | | - pgd_t *pgd; |
---|
144 | | - pud_t *pud; |
---|
145 | | - pmd_t *pmdp; |
---|
| 145 | + pmd_t *pmdp = pmd_off_k(addr); |
---|
146 | 146 | |
---|
147 | | - flush_cache_vunmap(addr, end); |
---|
148 | | - pgd = pgd_offset_k(addr); |
---|
149 | | - pud = pud_offset(pgd, addr); |
---|
150 | | - pmdp = pmd_offset(pud, addr); |
---|
151 | 147 | do { |
---|
152 | 148 | pmd_t pmd = *pmdp; |
---|
153 | 149 | |
---|
.. | .. |
---|
188 | 184 | size_t size, const struct mem_type *type) |
---|
189 | 185 | { |
---|
190 | 186 | unsigned long addr = virt, end = virt + size; |
---|
191 | | - pgd_t *pgd; |
---|
192 | | - pud_t *pud; |
---|
193 | | - pmd_t *pmd; |
---|
| 187 | + pmd_t *pmd = pmd_off_k(addr); |
---|
194 | 188 | |
---|
195 | 189 | /* |
---|
196 | 190 | * Remove and free any PTE-based mapping, and |
---|
.. | .. |
---|
198 | 192 | */ |
---|
199 | 193 | unmap_area_sections(virt, size); |
---|
200 | 194 | |
---|
201 | | - pgd = pgd_offset_k(addr); |
---|
202 | | - pud = pud_offset(pgd, addr); |
---|
203 | | - pmd = pmd_offset(pud, addr); |
---|
204 | 195 | do { |
---|
205 | 196 | pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); |
---|
206 | 197 | pfn += SZ_1M >> PAGE_SHIFT; |
---|
.. | .. |
---|
220 | 211 | size_t size, const struct mem_type *type) |
---|
221 | 212 | { |
---|
222 | 213 | unsigned long addr = virt, end = virt + size; |
---|
223 | | - pgd_t *pgd; |
---|
224 | | - pud_t *pud; |
---|
225 | | - pmd_t *pmd; |
---|
| 214 | + pmd_t *pmd = pmd_off_k(addr); |
---|
226 | 215 | |
---|
227 | 216 | /* |
---|
228 | 217 | * Remove and free any PTE-based mapping, and |
---|
229 | 218 | * sync the current kernel mapping. |
---|
230 | 219 | */ |
---|
231 | 220 | unmap_area_sections(virt, size); |
---|
232 | | - |
---|
233 | | - pgd = pgd_offset_k(virt); |
---|
234 | | - pud = pud_offset(pgd, addr); |
---|
235 | | - pmd = pmd_offset(pud, addr); |
---|
236 | 221 | do { |
---|
237 | 222 | unsigned long super_pmd_val, i; |
---|
238 | 223 | |
---|
.. | .. |
---|
300 | 285 | * Don't allow RAM to be mapped with mismatched attributes - this |
---|
301 | 286 | * causes problems with ARMv6+ |
---|
302 | 287 | */ |
---|
303 | | - if (WARN_ON(pfn_valid(pfn) && mtype != MT_MEMORY_RW)) |
---|
| 288 | + if (WARN_ON(memblock_is_map_memory(PFN_PHYS(pfn)) && |
---|
| 289 | + mtype != MT_MEMORY_RW)) |
---|
304 | 290 | return NULL; |
---|
305 | 291 | |
---|
306 | 292 | area = get_vm_area_caller(size, VM_IOREMAP, caller); |
---|
.. | .. |
---|
381 | 367 | EXPORT_SYMBOL(ioremap); |
---|
382 | 368 | |
---|
383 | 369 | void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size) |
---|
384 | | - __alias(ioremap_cached); |
---|
385 | | - |
---|
386 | | -void __iomem *ioremap_cached(resource_size_t res_cookie, size_t size) |
---|
387 | 370 | { |
---|
388 | 371 | return arch_ioremap_caller(res_cookie, size, MT_DEVICE_CACHED, |
---|
389 | 372 | __builtin_return_address(0)); |
---|
390 | 373 | } |
---|
391 | 374 | EXPORT_SYMBOL(ioremap_cache); |
---|
392 | | -EXPORT_SYMBOL(ioremap_cached); |
---|
393 | 375 | |
---|
394 | 376 | void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size) |
---|
395 | 377 | { |
---|
.. | .. |
---|
497 | 479 | { |
---|
498 | 480 | early_ioremap_setup(); |
---|
499 | 481 | } |
---|
| 482 | + |
---|
| 483 | +bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size, |
---|
| 484 | + unsigned long flags) |
---|
| 485 | +{ |
---|
| 486 | + unsigned long pfn = PHYS_PFN(offset); |
---|
| 487 | + |
---|
| 488 | + return memblock_is_map_memory(pfn); |
---|
| 489 | +} |
---|