[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: Franck Bui-Huu <fbuihuu@gmail.com> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
committed by
Ralf Baechle
parent
db84dc6155
commit
6f284a2ce7
@@ -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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
*/
|
*/
|
||||||
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 @@
|
|||||||
|
|
||||||
#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;
|
|||||||
/* 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)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user