|
@@ -169,9 +169,17 @@
|
|
* Physical vs virtual RAM address space conversion. These are
|
|
* Physical vs virtual RAM address space conversion. These are
|
|
* private definitions which should NOT be used outside memory.h
|
|
* private definitions which should NOT be used outside memory.h
|
|
* files. Use virt_to_phys/phys_to_virt/__pa/__va instead.
|
|
* files. Use virt_to_phys/phys_to_virt/__pa/__va instead.
|
|
|
|
+ *
|
|
|
|
+ * PFNs are used to describe any physical page; this means
|
|
|
|
+ * PFN 0 == physical address 0.
|
|
*/
|
|
*/
|
|
-#ifndef __virt_to_phys
|
|
|
|
-#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
|
|
|
|
|
|
+#if defined(__virt_to_phys)
|
|
|
|
+#define PHYS_OFFSET PLAT_PHYS_OFFSET
|
|
|
|
+#define PHYS_PFN_OFFSET ((unsigned long)(PHYS_OFFSET >> PAGE_SHIFT))
|
|
|
|
+
|
|
|
|
+#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
|
|
|
|
+
|
|
|
|
+#elif defined(CONFIG_ARM_PATCH_PHYS_VIRT)
|
|
|
|
|
|
/*
|
|
/*
|
|
* Constants used to force the right instruction encodings and shifts
|
|
* Constants used to force the right instruction encodings and shifts
|
|
@@ -180,12 +188,17 @@
|
|
#define __PV_BITS_31_24 0x81000000
|
|
#define __PV_BITS_31_24 0x81000000
|
|
#define __PV_BITS_7_0 0x81
|
|
#define __PV_BITS_7_0 0x81
|
|
|
|
|
|
-extern u64 __pv_phys_offset;
|
|
|
|
|
|
+extern unsigned long __pv_phys_pfn_offset;
|
|
extern u64 __pv_offset;
|
|
extern u64 __pv_offset;
|
|
extern void fixup_pv_table(const void *, unsigned long);
|
|
extern void fixup_pv_table(const void *, unsigned long);
|
|
extern const void *__pv_table_begin, *__pv_table_end;
|
|
extern const void *__pv_table_begin, *__pv_table_end;
|
|
|
|
|
|
-#define PHYS_OFFSET __pv_phys_offset
|
|
|
|
|
|
+#define PHYS_OFFSET ((phys_addr_t)__pv_phys_pfn_offset << PAGE_SHIFT)
|
|
|
|
+#define PHYS_PFN_OFFSET (__pv_phys_pfn_offset)
|
|
|
|
+
|
|
|
|
+#define virt_to_pfn(kaddr) \
|
|
|
|
+ ((((unsigned long)(kaddr) - PAGE_OFFSET) >> PAGE_SHIFT) + \
|
|
|
|
+ PHYS_PFN_OFFSET)
|
|
|
|
|
|
#define __pv_stub(from,to,instr,type) \
|
|
#define __pv_stub(from,to,instr,type) \
|
|
__asm__("@ __pv_stub\n" \
|
|
__asm__("@ __pv_stub\n" \
|
|
@@ -246,6 +259,7 @@ static inline unsigned long __phys_to_virt(phys_addr_t x)
|
|
#else
|
|
#else
|
|
|
|
|
|
#define PHYS_OFFSET PLAT_PHYS_OFFSET
|
|
#define PHYS_OFFSET PLAT_PHYS_OFFSET
|
|
|
|
+#define PHYS_PFN_OFFSET ((unsigned long)(PHYS_OFFSET >> PAGE_SHIFT))
|
|
|
|
|
|
static inline phys_addr_t __virt_to_phys(unsigned long x)
|
|
static inline phys_addr_t __virt_to_phys(unsigned long x)
|
|
{
|
|
{
|
|
@@ -257,18 +271,11 @@ static inline unsigned long __phys_to_virt(phys_addr_t x)
|
|
return x - PHYS_OFFSET + PAGE_OFFSET;
|
|
return x - PHYS_OFFSET + PAGE_OFFSET;
|
|
}
|
|
}
|
|
|
|
|
|
-#endif
|
|
|
|
-#endif
|
|
|
|
|
|
+#define virt_to_pfn(kaddr) \
|
|
|
|
+ ((((unsigned long)(kaddr) - PAGE_OFFSET) >> PAGE_SHIFT) + \
|
|
|
|
+ PHYS_PFN_OFFSET)
|
|
|
|
|
|
-/*
|
|
|
|
- * PFNs are used to describe any physical page; this means
|
|
|
|
- * PFN 0 == physical address 0.
|
|
|
|
- *
|
|
|
|
- * This is the PFN of the first RAM page in the kernel
|
|
|
|
- * direct-mapped view. We assume this is the first page
|
|
|
|
- * of RAM in the mem_map as well.
|
|
|
|
- */
|
|
|
|
-#define PHYS_PFN_OFFSET ((unsigned long)(PHYS_OFFSET >> PAGE_SHIFT))
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
/*
|
|
/*
|
|
* These are *only* valid on the kernel direct mapped RAM memory.
|
|
* These are *only* valid on the kernel direct mapped RAM memory.
|
|
@@ -346,9 +353,9 @@ static inline __deprecated void *bus_to_virt(unsigned long x)
|
|
*/
|
|
*/
|
|
#define ARCH_PFN_OFFSET PHYS_PFN_OFFSET
|
|
#define ARCH_PFN_OFFSET PHYS_PFN_OFFSET
|
|
|
|
|
|
-#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
|
|
|
|
|
|
+#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
|
|
#define virt_addr_valid(kaddr) (((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) \
|
|
#define virt_addr_valid(kaddr) (((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) \
|
|
- && pfn_valid(__pa(kaddr) >> PAGE_SHIFT) )
|
|
|
|
|
|
+ && pfn_valid(virt_to_pfn(kaddr)))
|
|
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|