|
@@ -34,6 +34,20 @@
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
|
+/*
|
|
|
+ * This gives the physical RAM offset.
|
|
|
+ */
|
|
|
+#ifndef PHYS_OFFSET
|
|
|
+#define PHYS_OFFSET 0UL
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * It's normally defined only for FLATMEM config but it's
|
|
|
+ * used in our early mem init code for all memory models.
|
|
|
+ * So always define it.
|
|
|
+ */
|
|
|
+#define ARCH_PFN_OFFSET PFN_UP(PHYS_OFFSET)
|
|
|
+
|
|
|
#include <linux/pfn.h>
|
|
|
#include <asm/io.h>
|
|
|
|
|
@@ -132,20 +146,23 @@ 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)
|
|
|
|
|
|
+/*
|
|
|
+ * __pa()/__va() should be used only during mem init.
|
|
|
+ */
|
|
|
#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 __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x),0))
|
|
|
-#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET))
|
|
|
+#define __pa(x) ((unsigned long)(x) - __pa_page_offset(x) + PHYS_OFFSET)
|
|
|
+#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))
|
|
|
+#define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x),0))
|
|
|
|
|
|
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
|
|
|
|
|
#ifdef CONFIG_FLATMEM
|
|
|
|
|
|
-#define pfn_valid(pfn) ((pfn) < max_mapnr)
|
|
|
+#define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr)
|
|
|
|
|
|
#elif defined(CONFIG_SPARSEMEM)
|
|
|
|