summaryrefslogtreecommitdiffstats
path: root/target/linux/adm5120-2.6/files/arch/mips/adm5120/memory.c
blob: e5c7f0c9146fd49c2c327e9c0a394066363b92fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*****************************************************************************
 * Carsten Langgaard, carstenl@mips.com
 * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
 * Copyright (C) 2003 ADMtek Incorporated.
 *	daniell@admtek.com.tw
 * Copyright (C) 2005 Jeroen Vreeken (pe1rxq@amsat.org)
 *
 * ########################################################################
 *
 *  This program is free software; you can distribute it and/or modify it
 *  under the terms of the GNU General Public License (Version 2) as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope it will be useful, but WITHOUT
 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 *  for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
 *
 * ########################################################################
 *
 *****************************************************************************/

#include <linux/autoconf.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/bootmem.h>
#include <linux/pfn.h>
#include <linux/string.h>

#include <asm/bootinfo.h>
#include <asm/page.h>
#include <asm/sections.h>

#include <asm-mips/mips-boards/prom.h>

extern char *prom_getenv(char *envname);

#define PFN_ALIGN(x)    (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK)

#define ADM5120_MEMCTRL			0x1200001c
#define ADM5120_MEMCTRL_SDRAM_MASK	0x7

static const unsigned long adm_sdramsize[] __initdata = {
	0x0,		/* Reserved */
	0x0400000,	/* 4Mb */
	0x0800000,	/* 8Mb */
	0x1000000,	/* 16Mb */
	0x4000000,	/* 64Mb */
	0x8000000,	/* 128Mb */
};

/* determined physical memory size, not overridden by command line args  */
unsigned long physical_memsize = 0L;

struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS];

struct prom_pmemblock * __init prom_getmdesc(void)
{
	char *memsize_str;
	unsigned int memsize;
	char cmdline[CL_SIZE], *ptr;

	memsize_str = prom_getenv("memsize");

	if (!memsize_str)
	{
		prom_printf("memsize not set in boot prom, set to default (8Mb)\n");
		physical_memsize = 0x00800000;
	}
	else
#ifdef DEBUG
		prom_printf("prom_memsize = %s\n", memsize_str);
#endif
		physical_memsize = simple_strtol(memsize_str, NULL, 0);

	/* Check the command line for a memsize directive that overrides
	 * the physical/default amount */
	strcpy(cmdline, arcs_cmdline);
	ptr = strstr(cmdline, "memsize=");
	if (ptr && (ptr != cmdline) && (*(ptr - 1) != ' '))
	ptr = strstr(ptr, " memsize=");

	if (ptr)
		memsize = memparse(ptr + 8, &ptr);
	else
		memsize = physical_memsize;

       memset(mdesc, 0, sizeof(mdesc));

       mdesc[0].type = BOOT_MEM_RAM;
       mdesc[0].base = CPHYSADDR(PFN_ALIGN(&_end));
       mdesc[0].size = memsize - mdesc[0].base;

       return &mdesc[0];
}

void __init prom_meminit(void)
{
	struct prom_pmemblock *p;

	p = prom_getmdesc();

	while (p->size)
	{
		long type;
		unsigned long base, size;
		base = p->base;
		type = p->type,
		size = p->size;
		add_memory_region(base, size, type);
		p++;
	}
}

#if 0
void __init prom_meminit(void)
{
	unsigned long base = CPHYSADDR(PFN_ALIGN(&_end));
	unsigned long size;

	u32 memctrl = *(u32*)KSEG1ADDR(ADM5120_MEMCTRL);
	size = adm_sdramsize[memctrl & ADM5120_MEMCTRL_SDRAM_MASK];
	add_memory_region(base, size-base, BOOT_MEM_RAM);
}
#endif

unsigned long __init prom_free_prom_memory(void)
{
	/* We do not have to prom memory to free */
        return 0;
}