diff options
-rw-r--r-- | arch/arm/include/asm/memory.h | 16 | ||||
-rw-r--r-- | arch/arm/kernel/smp.c | 2 | ||||
-rw-r--r-- | arch/arm/mm/idmap.c | 5 |
3 files changed, 20 insertions, 3 deletions
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index c133bd915f48..d9b96c65e594 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
@@ -173,6 +173,7 @@ | |||
173 | */ | 173 | */ |
174 | #define __PV_BITS_31_24 0x81000000 | 174 | #define __PV_BITS_31_24 0x81000000 |
175 | 175 | ||
176 | extern phys_addr_t (*arch_virt_to_idmap) (unsigned long x); | ||
176 | extern unsigned long __pv_phys_offset; | 177 | extern unsigned long __pv_phys_offset; |
177 | #define PHYS_OFFSET __pv_phys_offset | 178 | #define PHYS_OFFSET __pv_phys_offset |
178 | 179 | ||
@@ -259,6 +260,21 @@ static inline void *phys_to_virt(phys_addr_t x) | |||
259 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | 260 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) |
260 | 261 | ||
261 | /* | 262 | /* |
263 | * These are for systems that have a hardware interconnect supported alias of | ||
264 | * physical memory for idmap purposes. Most cases should leave these | ||
265 | * untouched. | ||
266 | */ | ||
267 | static inline phys_addr_t __virt_to_idmap(unsigned long x) | ||
268 | { | ||
269 | if (arch_virt_to_idmap) | ||
270 | return arch_virt_to_idmap(x); | ||
271 | else | ||
272 | return __virt_to_phys(x); | ||
273 | } | ||
274 | |||
275 | #define virt_to_idmap(x) __virt_to_idmap((unsigned long)(x)) | ||
276 | |||
277 | /* | ||
262 | * Virtual <-> DMA view memory address translations | 278 | * Virtual <-> DMA view memory address translations |
263 | * Again, these are *only* valid on the kernel direct mapped RAM | 279 | * Again, these are *only* valid on the kernel direct mapped RAM |
264 | * memory. Use of these is *deprecated* (and that doesn't mean | 280 | * memory. Use of these is *deprecated* (and that doesn't mean |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 72024ea8a3a6..a0eb830c3daf 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -80,7 +80,7 @@ void __init smp_set_ops(struct smp_operations *ops) | |||
80 | 80 | ||
81 | static unsigned long get_arch_pgd(pgd_t *pgd) | 81 | static unsigned long get_arch_pgd(pgd_t *pgd) |
82 | { | 82 | { |
83 | phys_addr_t pgdir = virt_to_phys(pgd); | 83 | phys_addr_t pgdir = virt_to_idmap(pgd); |
84 | BUG_ON(pgdir & ARCH_PGD_MASK); | 84 | BUG_ON(pgdir & ARCH_PGD_MASK); |
85 | return pgdir >> ARCH_PGD_SHIFT; | 85 | return pgdir >> ARCH_PGD_SHIFT; |
86 | } | 86 | } |
diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c index 83cb3ac27095..c0a1e48f6733 100644 --- a/arch/arm/mm/idmap.c +++ b/arch/arm/mm/idmap.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <asm/system_info.h> | 10 | #include <asm/system_info.h> |
11 | 11 | ||
12 | pgd_t *idmap_pgd; | 12 | pgd_t *idmap_pgd; |
13 | phys_addr_t (*arch_virt_to_idmap) (unsigned long x); | ||
13 | 14 | ||
14 | #ifdef CONFIG_ARM_LPAE | 15 | #ifdef CONFIG_ARM_LPAE |
15 | static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, | 16 | static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, |
@@ -67,8 +68,8 @@ static void identity_mapping_add(pgd_t *pgd, const char *text_start, | |||
67 | unsigned long addr, end; | 68 | unsigned long addr, end; |
68 | unsigned long next; | 69 | unsigned long next; |
69 | 70 | ||
70 | addr = virt_to_phys(text_start); | 71 | addr = virt_to_idmap(text_start); |
71 | end = virt_to_phys(text_end); | 72 | end = virt_to_idmap(text_end); |
72 | 73 | ||
73 | prot |= PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AF; | 74 | prot |= PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AF; |
74 | 75 | ||