| .. | .. |
|---|
| 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 | +} |
|---|