linux/arch/mips/mipssim/sim_mem.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2005 MIPS Technologies, Inc.  All rights reserved.
   3 *
   4 *  This program is free software; you can distribute it and/or modify it
   5 *  under the terms of the GNU General Public License (Version 2) as
   6 *  published by the Free Software Foundation.
   7 *
   8 *  This program is distributed in the hope it will be useful, but WITHOUT
   9 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  11 *  for more details.
  12 *
  13 *  You should have received a copy of the GNU General Public License along
  14 *  with this program; if not, write to the Free Software Foundation, Inc.,
  15 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  16 *
  17 */
  18#include <linux/init.h>
  19#include <linux/mm.h>
  20#include <linux/bootmem.h>
  21#include <linux/pfn.h>
  22
  23#include <asm/bootinfo.h>
  24#include <asm/page.h>
  25#include <asm/sections.h>
  26
  27#include <asm/mips-boards/prom.h>
  28
  29/*#define DEBUG*/
  30
  31enum simmem_memtypes {
  32        simmem_reserved = 0,
  33        simmem_free,
  34};
  35struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS];
  36
  37#ifdef DEBUG
  38static char *mtypes[3] = {
  39        "SIM reserved memory",
  40        "SIM free memory",
  41};
  42#endif
  43
  44struct prom_pmemblock * __init prom_getmdesc(void)
  45{
  46        unsigned int memsize;
  47
  48        memsize = 0x02000000;
  49        pr_info("Setting default memory size 0x%08x\n", memsize);
  50
  51        memset(mdesc, 0, sizeof(mdesc));
  52
  53        mdesc[0].type = simmem_reserved;
  54        mdesc[0].base = 0x00000000;
  55        mdesc[0].size = 0x00001000;
  56
  57        mdesc[1].type = simmem_free;
  58        mdesc[1].base = 0x00001000;
  59        mdesc[1].size = 0x000ff000;
  60
  61        mdesc[2].type = simmem_reserved;
  62        mdesc[2].base = 0x00100000;
  63        mdesc[2].size = CPHYSADDR(PFN_ALIGN(&_end)) - mdesc[2].base;
  64
  65        mdesc[3].type = simmem_free;
  66        mdesc[3].base = CPHYSADDR(PFN_ALIGN(&_end));
  67        mdesc[3].size = memsize - mdesc[3].base;
  68
  69        return &mdesc[0];
  70}
  71
  72static int __init prom_memtype_classify(unsigned int type)
  73{
  74        switch (type) {
  75        case simmem_free:
  76                return BOOT_MEM_RAM;
  77        case simmem_reserved:
  78        default:
  79                return BOOT_MEM_RESERVED;
  80        }
  81}
  82
  83void __init prom_meminit(void)
  84{
  85        struct prom_pmemblock *p;
  86
  87        p = prom_getmdesc();
  88
  89        while (p->size) {
  90                long type;
  91                unsigned long base, size;
  92
  93                type = prom_memtype_classify(p->type);
  94                base = p->base;
  95                size = p->size;
  96
  97                add_memory_region(base, size, type);
  98                p++;
  99        }
 100}
 101
 102void __init prom_free_prom_memory(void)
 103{
 104        int i;
 105        unsigned long addr;
 106
 107        for (i = 0; i < boot_mem_map.nr_map; i++) {
 108                if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
 109                        continue;
 110
 111                addr = boot_mem_map.map[i].addr;
 112                free_init_pages("prom memory",
 113                                addr, addr + boot_mem_map.map[i].size);
 114        }
 115}
 116
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.