aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/memremap.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/memremap.c')
-rw-r--r--kernel/memremap.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/kernel/memremap.c b/kernel/memremap.c
index 72b0c66628b6..9d6b55587eaa 100644
--- a/kernel/memremap.c
+++ b/kernel/memremap.c
@@ -24,6 +24,16 @@ __weak void __iomem *ioremap_cache(resource_size_t offset, unsigned long size)
24} 24}
25#endif 25#endif
26 26
27static void *try_ram_remap(resource_size_t offset, size_t size)
28{
29 struct page *page = pfn_to_page(offset >> PAGE_SHIFT);
30
31 /* In the simple case just return the existing linear address */
32 if (!PageHighMem(page))
33 return __va(offset);
34 return NULL; /* fallback to ioremap_cache */
35}
36
27/** 37/**
28 * memremap() - remap an iomem_resource as cacheable memory 38 * memremap() - remap an iomem_resource as cacheable memory
29 * @offset: iomem resource start address 39 * @offset: iomem resource start address
@@ -66,8 +76,8 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags)
66 * the requested range is potentially in "System RAM" 76 * the requested range is potentially in "System RAM"
67 */ 77 */
68 if (is_ram == REGION_INTERSECTS) 78 if (is_ram == REGION_INTERSECTS)
69 addr = __va(offset); 79 addr = try_ram_remap(offset, size);
70 else 80 if (!addr)
71 addr = ioremap_cache(offset, size); 81 addr = ioremap_cache(offset, size);
72 } 82 }
73 83