diff options
| -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 | ||
