Commit 6f284a2c authored by Franck Bui-Huu's avatar Franck Bui-Huu Committed by Ralf Baechle

[MIPS] FLATMEM: introduce PHYS_OFFSET.

The old code was assuming that min_low_pfn was always 0. This
means that platforms having a big hole at their memory start
paid the price of wasting some memory for the allocation of
unused entries in mem_map[].

This patch prevents this waste.

It introduces PHYS_OFFSET define which is the start of the
physical memory and uses it wherever needed. Specially when
converting physical/virtual addresses into virtual/physical
ones.

Currently all platforms defines PHYS_OFFSET to 0.
Signed-off-by: default avatarFranck Bui-Huu <fbuihuu@gmail.com>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent db84dc61
...@@ -315,13 +315,17 @@ static void __init bootmem_init(void) ...@@ -315,13 +315,17 @@ static void __init bootmem_init(void)
if (min_low_pfn >= max_low_pfn) if (min_low_pfn >= max_low_pfn)
panic("Incorrect memory mapping !!!"); panic("Incorrect memory mapping !!!");
if (min_low_pfn > 0) { if (min_low_pfn > ARCH_PFN_OFFSET) {
printk(KERN_INFO printk(KERN_INFO
"Wasting %lu bytes for tracking %lu unused pages\n", "Wasting %lu bytes for tracking %lu unused pages\n",
min_low_pfn * sizeof(struct page), (min_low_pfn - ARCH_PFN_OFFSET) * sizeof(struct page),
min_low_pfn); min_low_pfn - ARCH_PFN_OFFSET);
min_low_pfn = 0; } else if (min_low_pfn < ARCH_PFN_OFFSET) {
printk(KERN_INFO
"%lu free pages won't be used\n",
ARCH_PFN_OFFSET - min_low_pfn);
} }
min_low_pfn = ARCH_PFN_OFFSET;
/* /*
* Determine low and high memory ranges * Determine low and high memory ranges
......
...@@ -115,7 +115,7 @@ static inline void set_io_port_base(unsigned long base) ...@@ -115,7 +115,7 @@ static inline void set_io_port_base(unsigned long base)
*/ */
static inline unsigned long virt_to_phys(volatile const void *address) static inline unsigned long virt_to_phys(volatile const void *address)
{ {
return (unsigned long)address - PAGE_OFFSET; return (unsigned long)address - PAGE_OFFSET + PHYS_OFFSET;
} }
/* /*
...@@ -132,7 +132,7 @@ static inline unsigned long virt_to_phys(volatile const void *address) ...@@ -132,7 +132,7 @@ static inline unsigned long virt_to_phys(volatile const void *address)
*/ */
static inline void * phys_to_virt(unsigned long address) static inline void * phys_to_virt(unsigned long address)
{ {
return (void *)(address + PAGE_OFFSET); return (void *)(address + PAGE_OFFSET - PHYS_OFFSET);
} }
/* /*
......
...@@ -34,6 +34,20 @@ ...@@ -34,6 +34,20 @@
#ifndef __ASSEMBLY__ #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 <linux/pfn.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -132,20 +146,23 @@ typedef struct { unsigned long pgprot; } pgprot_t; ...@@ -132,20 +146,23 @@ typedef struct { unsigned long pgprot; } pgprot_t;
/* to align the pointer to the (next) page boundary */ /* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK) #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) #if defined(CONFIG_64BIT) && !defined(CONFIG_BUILD_ELF64)
#define __pa_page_offset(x) ((unsigned long)(x) < CKSEG0 ? PAGE_OFFSET : CKSEG0) #define __pa_page_offset(x) ((unsigned long)(x) < CKSEG0 ? PAGE_OFFSET : CKSEG0)
#else #else
#define __pa_page_offset(x) PAGE_OFFSET #define __pa_page_offset(x) PAGE_OFFSET
#endif #endif
#define __pa(x) ((unsigned long)(x) - __pa_page_offset(x)) #define __pa(x) ((unsigned long)(x) - __pa_page_offset(x) + PHYS_OFFSET)
#define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x),0)) #define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))
#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET)) #define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x),0))
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
#ifdef CONFIG_FLATMEM #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) #elif defined(CONFIG_SPARSEMEM)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment