diff options
Diffstat (limited to 'kernel/memremap.c')
-rw-r--r-- | kernel/memremap.c | 14 |
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 | ||
27 | static 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 | ||