diff options
Diffstat (limited to 'arch/arm/include/asm/memory.h')
-rw-r--r-- | arch/arm/include/asm/memory.h | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 4afb376d9c7c..02fa2558f662 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
@@ -166,9 +166,17 @@ | |||
166 | * Physical vs virtual RAM address space conversion. These are | 166 | * Physical vs virtual RAM address space conversion. These are |
167 | * private definitions which should NOT be used outside memory.h | 167 | * private definitions which should NOT be used outside memory.h |
168 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. | 168 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. |
169 | * | ||
170 | * PFNs are used to describe any physical page; this means | ||
171 | * PFN 0 == physical address 0. | ||
169 | */ | 172 | */ |
170 | #ifndef __virt_to_phys | 173 | #if defined(__virt_to_phys) |
171 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT | 174 | #define PHYS_OFFSET PLAT_PHYS_OFFSET |
175 | #define PHYS_PFN_OFFSET ((unsigned long)(PHYS_OFFSET >> PAGE_SHIFT)) | ||
176 | |||
177 | #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) | ||
178 | |||
179 | #elif defined(CONFIG_ARM_PATCH_PHYS_VIRT) | ||
172 | 180 | ||
173 | /* | 181 | /* |
174 | * Constants used to force the right instruction encodings and shifts | 182 | * Constants used to force the right instruction encodings and shifts |
@@ -177,12 +185,17 @@ | |||
177 | #define __PV_BITS_31_24 0x81000000 | 185 | #define __PV_BITS_31_24 0x81000000 |
178 | #define __PV_BITS_7_0 0x81 | 186 | #define __PV_BITS_7_0 0x81 |
179 | 187 | ||
180 | extern u64 __pv_phys_offset; | 188 | extern unsigned long __pv_phys_pfn_offset; |
181 | extern u64 __pv_offset; | 189 | extern u64 __pv_offset; |
182 | extern void fixup_pv_table(const void *, unsigned long); | 190 | extern void fixup_pv_table(const void *, unsigned long); |
183 | extern const void *__pv_table_begin, *__pv_table_end; | 191 | extern const void *__pv_table_begin, *__pv_table_end; |
184 | 192 | ||
185 | #define PHYS_OFFSET __pv_phys_offset | 193 | #define PHYS_OFFSET ((phys_addr_t)__pv_phys_pfn_offset << PAGE_SHIFT) |
194 | #define PHYS_PFN_OFFSET (__pv_phys_pfn_offset) | ||
195 | |||
196 | #define virt_to_pfn(kaddr) \ | ||
197 | ((((unsigned long)(kaddr) - PAGE_OFFSET) >> PAGE_SHIFT) + \ | ||
198 | PHYS_PFN_OFFSET) | ||
186 | 199 | ||
187 | #define __pv_stub(from,to,instr,type) \ | 200 | #define __pv_stub(from,to,instr,type) \ |
188 | __asm__("@ __pv_stub\n" \ | 201 | __asm__("@ __pv_stub\n" \ |
@@ -243,6 +256,7 @@ static inline unsigned long __phys_to_virt(phys_addr_t x) | |||
243 | #else | 256 | #else |
244 | 257 | ||
245 | #define PHYS_OFFSET PLAT_PHYS_OFFSET | 258 | #define PHYS_OFFSET PLAT_PHYS_OFFSET |
259 | #define PHYS_PFN_OFFSET ((unsigned long)(PHYS_OFFSET >> PAGE_SHIFT)) | ||
246 | 260 | ||
247 | static inline phys_addr_t __virt_to_phys(unsigned long x) | 261 | static inline phys_addr_t __virt_to_phys(unsigned long x) |
248 | { | 262 | { |
@@ -254,18 +268,11 @@ static inline unsigned long __phys_to_virt(phys_addr_t x) | |||
254 | return x - PHYS_OFFSET + PAGE_OFFSET; | 268 | return x - PHYS_OFFSET + PAGE_OFFSET; |
255 | } | 269 | } |
256 | 270 | ||
257 | #endif | 271 | #define virt_to_pfn(kaddr) \ |
258 | #endif | 272 | ((((unsigned long)(kaddr) - PAGE_OFFSET) >> PAGE_SHIFT) + \ |
273 | PHYS_PFN_OFFSET) | ||
259 | 274 | ||
260 | /* | 275 | #endif |
261 | * PFNs are used to describe any physical page; this means | ||
262 | * PFN 0 == physical address 0. | ||
263 | * | ||
264 | * This is the PFN of the first RAM page in the kernel | ||
265 | * direct-mapped view. We assume this is the first page | ||
266 | * of RAM in the mem_map as well. | ||
267 | */ | ||
268 | #define PHYS_PFN_OFFSET ((unsigned long)(PHYS_OFFSET >> PAGE_SHIFT)) | ||
269 | 276 | ||
270 | /* | 277 | /* |
271 | * These are *only* valid on the kernel direct mapped RAM memory. | 278 | * These are *only* valid on the kernel direct mapped RAM memory. |
@@ -343,9 +350,9 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
343 | */ | 350 | */ |
344 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET | 351 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET |
345 | 352 | ||
346 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 353 | #define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr)) |
347 | #define virt_addr_valid(kaddr) (((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) \ | 354 | #define virt_addr_valid(kaddr) (((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) \ |
348 | && pfn_valid(__pa(kaddr) >> PAGE_SHIFT) ) | 355 | && pfn_valid(virt_to_pfn(kaddr))) |
349 | 356 | ||
350 | #endif | 357 | #endif |
351 | 358 | ||