|
@@ -136,8 +136,13 @@ typedef struct { unsigned long pgprot; } pgprot_t;
|
|
|
/* to align the pointer to the (next) page boundary */
|
|
|
#define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
|
|
|
|
|
|
-#define __pa(x) ((unsigned long) (x) - PAGE_OFFSET)
|
|
|
-#define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET))
|
|
|
+#if defined(CONFIG_64BIT) && !defined(CONFIG_BUILD_ELF64)
|
|
|
+#define __pa_page_offset(x) ((unsigned long)(x) < CKSEG0 ? PAGE_OFFSET : CKSEG0)
|
|
|
+#else
|
|
|
+#define __pa_page_offset(x) PAGE_OFFSET
|
|
|
+#endif
|
|
|
+#define __pa(x) ((unsigned long)(x) - __pa_page_offset(x))
|
|
|
+#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET))
|
|
|
|
|
|
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
|
|
|