2005-04-16 16:20:36 -06:00
|
|
|
/*
|
|
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
|
|
* for more details.
|
|
|
|
*
|
|
|
|
* Copyright (C) 1994 - 2000 Ralf Baechle
|
|
|
|
* Copyright (C) 1999, 2000 Silicon Graphics, Inc.
|
|
|
|
* Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
|
|
|
|
* Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
|
|
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/signal.h>
|
|
|
|
#include <linux/sched.h>
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/errno.h>
|
|
|
|
#include <linux/string.h>
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/pagemap.h>
|
|
|
|
#include <linux/ptrace.h>
|
|
|
|
#include <linux/mman.h>
|
|
|
|
#include <linux/mm.h>
|
|
|
|
#include <linux/bootmem.h>
|
|
|
|
#include <linux/highmem.h>
|
|
|
|
#include <linux/swap.h>
|
2005-01-20 17:59:54 -07:00
|
|
|
#include <linux/proc_fs.h>
|
2006-03-27 02:16:04 -07:00
|
|
|
#include <linux/pfn.h>
|
2005-04-16 16:20:36 -06:00
|
|
|
|
|
|
|
#include <asm/bootinfo.h>
|
|
|
|
#include <asm/cachectl.h>
|
|
|
|
#include <asm/cpu.h>
|
|
|
|
#include <asm/dma.h>
|
|
|
|
#include <asm/mmu_context.h>
|
|
|
|
#include <asm/sections.h>
|
|
|
|
#include <asm/pgtable.h>
|
|
|
|
#include <asm/pgalloc.h>
|
|
|
|
#include <asm/tlb.h>
|
|
|
|
|
|
|
|
DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
|
|
|
|
|
|
|
|
unsigned long highstart_pfn, highend_pfn;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We have up to 8 empty zeroed pages so we can map one of the right colour
|
|
|
|
* when needed. This is necessary only on R4000 / R4400 SC and MC versions
|
|
|
|
* where we have to avoid VCED / VECI exceptions for good performance at
|
|
|
|
* any price. Since page is never written to after the initialization we
|
|
|
|
* don't have to care about aliases on other CPUs.
|
|
|
|
*/
|
|
|
|
unsigned long empty_zero_page, zero_page_mask;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Not static inline because used by IP27 special magic initialization code
|
|
|
|
*/
|
|
|
|
unsigned long setup_zero_pages(void)
|
|
|
|
{
|
2006-03-22 01:08:05 -07:00
|
|
|
unsigned int order;
|
|
|
|
unsigned long size;
|
2005-04-16 16:20:36 -06:00
|
|
|
struct page *page;
|
|
|
|
|
|
|
|
if (cpu_has_vce)
|
|
|
|
order = 3;
|
|
|
|
else
|
|
|
|
order = 0;
|
|
|
|
|
|
|
|
empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, order);
|
|
|
|
if (!empty_zero_page)
|
|
|
|
panic("Oh boy, that early out of memory?");
|
|
|
|
|
|
|
|
page = virt_to_page(empty_zero_page);
|
2006-03-22 01:08:05 -07:00
|
|
|
split_page(page, order);
|
2005-04-16 16:20:36 -06:00
|
|
|
while (page < virt_to_page(empty_zero_page + (PAGE_SIZE << order))) {
|
2005-12-12 01:37:23 -07:00
|
|
|
SetPageReserved(page);
|
2005-04-16 16:20:36 -06:00
|
|
|
page++;
|
|
|
|
}
|
|
|
|
|
|
|
|
size = PAGE_SIZE << order;
|
|
|
|
zero_page_mask = (size - 1) & PAGE_MASK;
|
|
|
|
|
|
|
|
return 1UL << order;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
|
pte_t *kmap_pte;
|
|
|
|
pgprot_t kmap_prot;
|
|
|
|
|
|
|
|
#define kmap_get_fixmap_pte(vaddr) \
|
2005-02-10 05:19:59 -07:00
|
|
|
pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)), (vaddr))
|
2005-04-16 16:20:36 -06:00
|
|
|
|
|
|
|
static void __init kmap_init(void)
|
|
|
|
{
|
|
|
|
unsigned long kmap_vstart;
|
|
|
|
|
|
|
|
/* cache the first kmap pte */
|
|
|
|
kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
|
|
|
|
kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
|
|
|
|
|
|
|
|
kmap_prot = PAGE_KERNEL;
|
|
|
|
}
|
|
|
|
|
2005-02-07 09:13:07 -07:00
|
|
|
#ifdef CONFIG_32BIT
|
|
|
|
void __init fixrange_init(unsigned long start, unsigned long end,
|
2005-04-16 16:20:36 -06:00
|
|
|
pgd_t *pgd_base)
|
|
|
|
{
|
|
|
|
pgd_t *pgd;
|
2005-02-10 05:19:59 -07:00
|
|
|
pud_t *pud;
|
2005-04-16 16:20:36 -06:00
|
|
|
pmd_t *pmd;
|
|
|
|
pte_t *pte;
|
2005-02-10 05:19:59 -07:00
|
|
|
int i, j, k;
|
2005-04-16 16:20:36 -06:00
|
|
|
unsigned long vaddr;
|
|
|
|
|
|
|
|
vaddr = start;
|
|
|
|
i = __pgd_offset(vaddr);
|
2005-02-10 05:19:59 -07:00
|
|
|
j = __pud_offset(vaddr);
|
|
|
|
k = __pmd_offset(vaddr);
|
2005-04-16 16:20:36 -06:00
|
|
|
pgd = pgd_base + i;
|
|
|
|
|
|
|
|
for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) {
|
2005-02-10 05:19:59 -07:00
|
|
|
pud = (pud_t *)pgd;
|
|
|
|
for ( ; (j < PTRS_PER_PUD) && (vaddr != end); pud++, j++) {
|
|
|
|
pmd = (pmd_t *)pud;
|
|
|
|
for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) {
|
|
|
|
if (pmd_none(*pmd)) {
|
|
|
|
pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
|
|
|
|
set_pmd(pmd, __pmd(pte));
|
|
|
|
if (pte != pte_offset_kernel(pmd, 0))
|
|
|
|
BUG();
|
|
|
|
}
|
|
|
|
vaddr += PMD_SIZE;
|
2005-04-16 16:20:36 -06:00
|
|
|
}
|
2005-02-10 05:19:59 -07:00
|
|
|
k = 0;
|
2005-04-16 16:20:36 -06:00
|
|
|
}
|
|
|
|
j = 0;
|
|
|
|
}
|
|
|
|
}
|
2005-10-29 12:32:38 -06:00
|
|
|
#endif /* CONFIG_32BIT */
|
2005-04-16 16:20:36 -06:00
|
|
|
#endif /* CONFIG_HIGHMEM */
|
|
|
|
|
2005-06-25 15:54:31 -06:00
|
|
|
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
2005-04-16 16:20:36 -06:00
|
|
|
extern void pagetable_init(void);
|
|
|
|
|
[MIPS] Do not count pages in holes with sparsemem
With some memory model other than FLATMEM, the single node can
contains some holes so there might be many invalid pages. For
example, with two 256M memory and one 256M hole, some variables
(num_physpage, totalpages, nr_kernel_pages, nr_all_pages, etc.) will
indicate that there are 768MB on this system. This is not desired
because, for example, alloc_large_system_hash() allocates too many
entries.
Use free_area_init_node() with counted zholes_size[] instead of
free_area_init().
For num_physpages, use number of ram pages instead of max_low_pfn.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-07-06 09:26:02 -06:00
|
|
|
static int __init page_is_ram(unsigned long pagenr)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
|
|
|
unsigned long addr, end;
|
|
|
|
|
|
|
|
if (boot_mem_map.map[i].type != BOOT_MEM_RAM)
|
|
|
|
/* not usable memory */
|
|
|
|
continue;
|
|
|
|
|
|
|
|
addr = PFN_UP(boot_mem_map.map[i].addr);
|
|
|
|
end = PFN_DOWN(boot_mem_map.map[i].addr +
|
|
|
|
boot_mem_map.map[i].size);
|
|
|
|
|
|
|
|
if (pagenr >= addr && pagenr < end)
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-04-16 16:20:36 -06:00
|
|
|
void __init paging_init(void)
|
|
|
|
{
|
[MIPS] Do not count pages in holes with sparsemem
With some memory model other than FLATMEM, the single node can
contains some holes so there might be many invalid pages. For
example, with two 256M memory and one 256M hole, some variables
(num_physpage, totalpages, nr_kernel_pages, nr_all_pages, etc.) will
indicate that there are 768MB on this system. This is not desired
because, for example, alloc_large_system_hash() allocates too many
entries.
Use free_area_init_node() with counted zholes_size[] instead of
free_area_init().
For num_physpages, use number of ram pages instead of max_low_pfn.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-07-06 09:26:02 -06:00
|
|
|
unsigned long zones_size[] = { [0 ... MAX_NR_ZONES - 1] = 0 };
|
2005-04-16 16:20:36 -06:00
|
|
|
unsigned long max_dma, high, low;
|
[MIPS] Do not count pages in holes with sparsemem
With some memory model other than FLATMEM, the single node can
contains some holes so there might be many invalid pages. For
example, with two 256M memory and one 256M hole, some variables
(num_physpage, totalpages, nr_kernel_pages, nr_all_pages, etc.) will
indicate that there are 768MB on this system. This is not desired
because, for example, alloc_large_system_hash() allocates too many
entries.
Use free_area_init_node() with counted zholes_size[] instead of
free_area_init().
For num_physpages, use number of ram pages instead of max_low_pfn.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-07-06 09:26:02 -06:00
|
|
|
#ifndef CONFIG_FLATMEM
|
|
|
|
unsigned long zholes_size[] = { [0 ... MAX_NR_ZONES - 1] = 0 };
|
|
|
|
unsigned long i, j, pfn;
|
|
|
|
#endif
|
2005-04-16 16:20:36 -06:00
|
|
|
|
|
|
|
pagetable_init();
|
|
|
|
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
|
kmap_init();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
|
|
|
|
low = max_low_pfn;
|
|
|
|
high = highend_pfn;
|
|
|
|
|
|
|
|
#ifdef CONFIG_ISA
|
|
|
|
if (low < max_dma)
|
|
|
|
zones_size[ZONE_DMA] = low;
|
|
|
|
else {
|
|
|
|
zones_size[ZONE_DMA] = max_dma;
|
|
|
|
zones_size[ZONE_NORMAL] = low - max_dma;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
zones_size[ZONE_DMA] = low;
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
|
if (cpu_has_dc_aliases) {
|
|
|
|
printk(KERN_WARNING "This processor doesn't support highmem.");
|
|
|
|
if (high - low)
|
|
|
|
printk(" %ldk highmem ignored", high - low);
|
|
|
|
printk("\n");
|
|
|
|
} else
|
|
|
|
zones_size[ZONE_HIGHMEM] = high - low;
|
|
|
|
#endif
|
|
|
|
|
[MIPS] Do not count pages in holes with sparsemem
With some memory model other than FLATMEM, the single node can
contains some holes so there might be many invalid pages. For
example, with two 256M memory and one 256M hole, some variables
(num_physpage, totalpages, nr_kernel_pages, nr_all_pages, etc.) will
indicate that there are 768MB on this system. This is not desired
because, for example, alloc_large_system_hash() allocates too many
entries.
Use free_area_init_node() with counted zholes_size[] instead of
free_area_init().
For num_physpages, use number of ram pages instead of max_low_pfn.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-07-06 09:26:02 -06:00
|
|
|
#ifdef CONFIG_FLATMEM
|
2005-04-16 16:20:36 -06:00
|
|
|
free_area_init(zones_size);
|
[MIPS] Do not count pages in holes with sparsemem
With some memory model other than FLATMEM, the single node can
contains some holes so there might be many invalid pages. For
example, with two 256M memory and one 256M hole, some variables
(num_physpage, totalpages, nr_kernel_pages, nr_all_pages, etc.) will
indicate that there are 768MB on this system. This is not desired
because, for example, alloc_large_system_hash() allocates too many
entries.
Use free_area_init_node() with counted zholes_size[] instead of
free_area_init().
For num_physpages, use number of ram pages instead of max_low_pfn.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-07-06 09:26:02 -06:00
|
|
|
#else
|
|
|
|
pfn = 0;
|
|
|
|
for (i = 0; i < MAX_NR_ZONES; i++)
|
|
|
|
for (j = 0; j < zones_size[i]; j++, pfn++)
|
|
|
|
if (!page_is_ram(pfn))
|
|
|
|
zholes_size[i]++;
|
|
|
|
free_area_init_node(0, NODE_DATA(0), zones_size, 0, zholes_size);
|
|
|
|
#endif
|
2005-04-16 16:20:36 -06:00
|
|
|
}
|
|
|
|
|
2005-01-20 17:59:54 -07:00
|
|
|
static struct kcore_list kcore_mem, kcore_vmalloc;
|
|
|
|
#ifdef CONFIG_64BIT
|
|
|
|
static struct kcore_list kcore_kseg0;
|
|
|
|
#endif
|
|
|
|
|
2005-04-16 16:20:36 -06:00
|
|
|
void __init mem_init(void)
|
|
|
|
{
|
|
|
|
unsigned long codesize, reservedpages, datasize, initsize;
|
|
|
|
unsigned long tmp, ram;
|
|
|
|
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
|
#ifdef CONFIG_DISCONTIGMEM
|
|
|
|
#error "CONFIG_HIGHMEM and CONFIG_DISCONTIGMEM dont work together yet"
|
|
|
|
#endif
|
[MIPS] Do not count pages in holes with sparsemem
With some memory model other than FLATMEM, the single node can
contains some holes so there might be many invalid pages. For
example, with two 256M memory and one 256M hole, some variables
(num_physpage, totalpages, nr_kernel_pages, nr_all_pages, etc.) will
indicate that there are 768MB on this system. This is not desired
because, for example, alloc_large_system_hash() allocates too many
entries.
Use free_area_init_node() with counted zholes_size[] instead of
free_area_init().
For num_physpages, use number of ram pages instead of max_low_pfn.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-07-06 09:26:02 -06:00
|
|
|
max_mapnr = highend_pfn;
|
2005-04-16 16:20:36 -06:00
|
|
|
#else
|
[MIPS] Do not count pages in holes with sparsemem
With some memory model other than FLATMEM, the single node can
contains some holes so there might be many invalid pages. For
example, with two 256M memory and one 256M hole, some variables
(num_physpage, totalpages, nr_kernel_pages, nr_all_pages, etc.) will
indicate that there are 768MB on this system. This is not desired
because, for example, alloc_large_system_hash() allocates too many
entries.
Use free_area_init_node() with counted zholes_size[] instead of
free_area_init().
For num_physpages, use number of ram pages instead of max_low_pfn.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-07-06 09:26:02 -06:00
|
|
|
max_mapnr = max_low_pfn;
|
2005-04-16 16:20:36 -06:00
|
|
|
#endif
|
|
|
|
high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);
|
|
|
|
|
|
|
|
totalram_pages += free_all_bootmem();
|
|
|
|
totalram_pages -= setup_zero_pages(); /* Setup zeroed pages. */
|
|
|
|
|
|
|
|
reservedpages = ram = 0;
|
|
|
|
for (tmp = 0; tmp < max_low_pfn; tmp++)
|
|
|
|
if (page_is_ram(tmp)) {
|
|
|
|
ram++;
|
2006-05-30 18:16:49 -06:00
|
|
|
if (PageReserved(pfn_to_page(tmp)))
|
2005-04-16 16:20:36 -06:00
|
|
|
reservedpages++;
|
|
|
|
}
|
[MIPS] Do not count pages in holes with sparsemem
With some memory model other than FLATMEM, the single node can
contains some holes so there might be many invalid pages. For
example, with two 256M memory and one 256M hole, some variables
(num_physpage, totalpages, nr_kernel_pages, nr_all_pages, etc.) will
indicate that there are 768MB on this system. This is not desired
because, for example, alloc_large_system_hash() allocates too many
entries.
Use free_area_init_node() with counted zholes_size[] instead of
free_area_init().
For num_physpages, use number of ram pages instead of max_low_pfn.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-07-06 09:26:02 -06:00
|
|
|
num_physpages = ram;
|
2005-04-16 16:20:36 -06:00
|
|
|
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
|
for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) {
|
|
|
|
struct page *page = mem_map + tmp;
|
|
|
|
|
|
|
|
if (!page_is_ram(tmp)) {
|
|
|
|
SetPageReserved(page);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
ClearPageReserved(page);
|
|
|
|
#ifdef CONFIG_LIMITED_DMA
|
|
|
|
set_page_address(page, lowmem_page_address(page));
|
|
|
|
#endif
|
2006-03-22 01:08:40 -07:00
|
|
|
init_page_count(page);
|
2005-04-16 16:20:36 -06:00
|
|
|
__free_page(page);
|
|
|
|
totalhigh_pages++;
|
|
|
|
}
|
|
|
|
totalram_pages += totalhigh_pages;
|
[MIPS] Do not count pages in holes with sparsemem
With some memory model other than FLATMEM, the single node can
contains some holes so there might be many invalid pages. For
example, with two 256M memory and one 256M hole, some variables
(num_physpage, totalpages, nr_kernel_pages, nr_all_pages, etc.) will
indicate that there are 768MB on this system. This is not desired
because, for example, alloc_large_system_hash() allocates too many
entries.
Use free_area_init_node() with counted zholes_size[] instead of
free_area_init().
For num_physpages, use number of ram pages instead of max_low_pfn.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-07-06 09:26:02 -06:00
|
|
|
num_physpages += totalhigh_pages;
|
2005-04-16 16:20:36 -06:00
|
|
|
#endif
|
|
|
|
|
|
|
|
codesize = (unsigned long) &_etext - (unsigned long) &_text;
|
|
|
|
datasize = (unsigned long) &_edata - (unsigned long) &_etext;
|
|
|
|
initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin;
|
|
|
|
|
2005-01-20 17:59:54 -07:00
|
|
|
#ifdef CONFIG_64BIT
|
|
|
|
if ((unsigned long) &_text > (unsigned long) CKSEG0)
|
|
|
|
/* The -4 is a hack so that user tools don't have to handle
|
|
|
|
the overflow. */
|
|
|
|
kclist_add(&kcore_kseg0, (void *) CKSEG0, 0x80000000 - 4);
|
|
|
|
#endif
|
|
|
|
kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT);
|
|
|
|
kclist_add(&kcore_vmalloc, (void *)VMALLOC_START,
|
|
|
|
VMALLOC_END-VMALLOC_START);
|
|
|
|
|
2005-04-16 16:20:36 -06:00
|
|
|
printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
|
|
|
|
"%ldk reserved, %ldk data, %ldk init, %ldk highmem)\n",
|
|
|
|
(unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
|
|
|
|
ram << (PAGE_SHIFT-10),
|
|
|
|
codesize >> 10,
|
|
|
|
reservedpages << (PAGE_SHIFT-10),
|
|
|
|
datasize >> 10,
|
|
|
|
initsize >> 10,
|
|
|
|
(unsigned long) (totalhigh_pages << (PAGE_SHIFT-10)));
|
|
|
|
}
|
2005-06-25 15:54:31 -06:00
|
|
|
#endif /* !CONFIG_NEED_MULTIPLE_NODES */
|
2005-04-16 16:20:36 -06:00
|
|
|
|
2006-03-24 06:21:50 -07:00
|
|
|
void free_init_pages(char *what, unsigned long begin, unsigned long end)
|
|
|
|
{
|
|
|
|
unsigned long addr;
|
|
|
|
|
|
|
|
for (addr = begin; addr < end; addr += PAGE_SIZE) {
|
|
|
|
ClearPageReserved(virt_to_page(addr));
|
|
|
|
init_page_count(virt_to_page(addr));
|
|
|
|
memset((void *)addr, 0xcc, PAGE_SIZE);
|
|
|
|
free_page(addr);
|
|
|
|
totalram_pages++;
|
|
|
|
}
|
|
|
|
printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
|
|
|
|
}
|
|
|
|
|
2005-04-16 16:20:36 -06:00
|
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
|
|
void free_initrd_mem(unsigned long start, unsigned long end)
|
|
|
|
{
|
2005-09-03 16:56:16 -06:00
|
|
|
#ifdef CONFIG_64BIT
|
2005-04-16 16:20:36 -06:00
|
|
|
/* Switch from KSEG0 to XKPHYS addresses */
|
|
|
|
start = (unsigned long)phys_to_virt(CPHYSADDR(start));
|
|
|
|
end = (unsigned long)phys_to_virt(CPHYSADDR(end));
|
|
|
|
#endif
|
2006-03-24 06:21:50 -07:00
|
|
|
free_init_pages("initrd memory", start, end);
|
2005-04-16 16:20:36 -06:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
extern unsigned long prom_free_prom_memory(void);
|
|
|
|
|
|
|
|
void free_initmem(void)
|
|
|
|
{
|
2006-03-24 06:21:50 -07:00
|
|
|
unsigned long start, end, freed;
|
2005-04-16 16:20:36 -06:00
|
|
|
|
|
|
|
freed = prom_free_prom_memory();
|
2006-03-24 06:21:50 -07:00
|
|
|
if (freed)
|
|
|
|
printk(KERN_INFO "Freeing firmware memory: %ldk freed\n",freed);
|
2005-04-16 16:20:36 -06:00
|
|
|
|
2006-03-24 06:21:50 -07:00
|
|
|
start = (unsigned long)(&__init_begin);
|
|
|
|
end = (unsigned long)(&__init_end);
|
2005-09-03 16:56:16 -06:00
|
|
|
#ifdef CONFIG_64BIT
|
2006-03-24 06:21:50 -07:00
|
|
|
start = PAGE_OFFSET | CPHYSADDR(start);
|
|
|
|
end = PAGE_OFFSET | CPHYSADDR(end);
|
2005-04-16 16:20:36 -06:00
|
|
|
#endif
|
2006-03-24 06:21:50 -07:00
|
|
|
free_init_pages("unused kernel memory", start, end);
|
2005-04-16 16:20:36 -06:00
|
|
|
}
|