PageRenderTime 25ms CodeModel.GetById 18ms app.highlight 4ms RepoModel.GetById 0ms app.codeStats 0ms

/arch/mips/powertv/memory.c

https://bitbucket.org/thekraven/iscream_thunderc-2.6.35
C | 181 lines | 92 code | 15 blank | 74 comment | 19 complexity | baf54cbec4dc2bbaace76a525a6a05cc MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1/*
  2 * Carsten Langgaard, carstenl@mips.com
  3 * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
  4 * Portions copyright (C) 2009 Cisco Systems, Inc.
  5 *
  6 *  This program is free software; you can distribute it and/or modify it
  7 *  under the terms of the GNU General Public License (Version 2) as
  8 *  published by the Free Software Foundation.
  9 *
 10 *  This program is distributed in the hope it will be useful, but WITHOUT
 11 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 12 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 13 *  for more details.
 14 *
 15 *  You should have received a copy of the GNU General Public License along
 16 *  with this program; if not, write to the Free Software Foundation, Inc.,
 17 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
 18 *
 19 * Apparently originally from arch/mips/malta-memory.c. Modified to work
 20 * with the PowerTV bootloader.
 21 */
 22#include <linux/init.h>
 23#include <linux/mm.h>
 24#include <linux/bootmem.h>
 25#include <linux/pfn.h>
 26#include <linux/string.h>
 27
 28#include <asm/bootinfo.h>
 29#include <asm/page.h>
 30#include <asm/sections.h>
 31
 32#include <asm/mips-boards/prom.h>
 33
 34#include "init.h"
 35
 36/* Memory constants */
 37#define KIBIBYTE(n)		((n) * 1024)	/* Number of kibibytes */
 38#define MEBIBYTE(n)		((n) * KIBIBYTE(1024)) /* Number of mebibytes */
 39#define DEFAULT_MEMSIZE		MEBIBYTE(256)	/* If no memsize provided */
 40#define LOW_MEM_MAX		MEBIBYTE(252)	/* Max usable low mem */
 41#define RES_BOOTLDR_MEMSIZE	MEBIBYTE(1)	/* Memory reserved for bldr */
 42#define BOOT_MEM_SIZE		KIBIBYTE(256)	/* Memory reserved for bldr */
 43#define PHYS_MEM_START		0x10000000	/* Start of physical memory */
 44
 45char __initdata cmdline[COMMAND_LINE_SIZE];
 46
 47void __init prom_meminit(void)
 48{
 49	char *memsize_str;
 50	unsigned long memsize = 0;
 51	unsigned int physend;
 52	char *ptr;
 53	int low_mem;
 54	int high_mem;
 55
 56	/* Check the command line first for a memsize directive */
 57	strcpy(cmdline, arcs_cmdline);
 58	ptr = strstr(cmdline, "memsize=");
 59	if (ptr && (ptr != cmdline) && (*(ptr - 1) != ' '))
 60		ptr = strstr(ptr, " memsize=");
 61
 62	if (ptr) {
 63		memsize = memparse(ptr + 8, &ptr);
 64	} else {
 65		/* otherwise look in the environment */
 66		memsize_str = prom_getenv("memsize");
 67
 68		if (memsize_str != NULL) {
 69			pr_info("prom memsize = %s\n", memsize_str);
 70			memsize = simple_strtol(memsize_str, NULL, 0);
 71		}
 72
 73		if (memsize == 0) {
 74			if (_prom_memsize != 0) {
 75				memsize = _prom_memsize;
 76				pr_info("_prom_memsize = 0x%lx\n", memsize);
 77				/* add in memory that the bootloader doesn't
 78				 * report */
 79				memsize += BOOT_MEM_SIZE;
 80			} else {
 81				memsize = DEFAULT_MEMSIZE;
 82				pr_info("Memsize not passed by bootloader, "
 83					"defaulting to 0x%lx\n", memsize);
 84			}
 85		}
 86	}
 87
 88	physend = PFN_ALIGN(&_end) - 0x80000000;
 89	if (memsize > LOW_MEM_MAX) {
 90		low_mem = LOW_MEM_MAX;
 91		high_mem = memsize - low_mem;
 92	} else {
 93		low_mem = memsize;
 94		high_mem = 0;
 95	}
 96
 97/*
 98 * TODO: We will use the hard code for memory configuration until
 99 * the bootloader releases their device tree to us.
100 */
101	/*
102	 * Add the memory reserved for use by the bootloader to the
103	 * memory map.
104	 */
105	add_memory_region(PHYS_MEM_START, RES_BOOTLDR_MEMSIZE,
106		BOOT_MEM_RESERVED);
107#ifdef CONFIG_HIGHMEM_256_128
108	/*
109	 * Add memory in low for general use by the kernel and its friends
110	 * (like drivers, applications, etc).
111	 */
112	add_memory_region(PHYS_MEM_START + RES_BOOTLDR_MEMSIZE,
113		LOW_MEM_MAX - RES_BOOTLDR_MEMSIZE, BOOT_MEM_RAM);
114	/*
115	 * Add the memory reserved for reset vector.
116	 */
117	add_memory_region(0x1fc00000, MEBIBYTE(4), BOOT_MEM_RESERVED);
118	/*
119	 * Add the memory reserved.
120	 */
121	add_memory_region(0x20000000, MEBIBYTE(1024 + 75), BOOT_MEM_RESERVED);
122	/*
123	 * Add memory in high for general use by the kernel and its friends
124	 * (like drivers, applications, etc).
125	 *
126	 * 75MB is reserved for devices which are using the memory in high.
127	 */
128	add_memory_region(0x60000000 + MEBIBYTE(75), MEBIBYTE(128 - 75),
129		BOOT_MEM_RAM);
130#elif defined CONFIG_HIGHMEM_128_128
131	/*
132	 * Add memory in low for general use by the kernel and its friends
133	 * (like drivers, applications, etc).
134	 */
135	add_memory_region(PHYS_MEM_START + RES_BOOTLDR_MEMSIZE,
136		MEBIBYTE(128) - RES_BOOTLDR_MEMSIZE, BOOT_MEM_RAM);
137	/*
138	 * Add the memory reserved.
139	 */
140	add_memory_region(PHYS_MEM_START + MEBIBYTE(128),
141		MEBIBYTE(128 + 1024 + 75), BOOT_MEM_RESERVED);
142	/*
143	 * Add memory in high for general use by the kernel and its friends
144	 * (like drivers, applications, etc).
145	 *
146	 * 75MB is reserved for devices which are using the memory in high.
147	 */
148	add_memory_region(0x60000000 + MEBIBYTE(75), MEBIBYTE(128 - 75),
149		BOOT_MEM_RAM);
150#else
151	/* Add low memory regions for either:
152	 *   - no-highmemory configuration case -OR-
153	 *   - highmemory "HIGHMEM_LOWBANK_ONLY" case
154	 */
155	/*
156	 * Add memory for general use by the kernel and its friends
157	 * (like drivers, applications, etc).
158	 */
159	add_memory_region(PHYS_MEM_START + RES_BOOTLDR_MEMSIZE,
160		low_mem - RES_BOOTLDR_MEMSIZE, BOOT_MEM_RAM);
161	/*
162	 * Add the memory reserved for reset vector.
163	 */
164	add_memory_region(0x1fc00000, MEBIBYTE(4), BOOT_MEM_RESERVED);
165#endif
166}
167
168void __init prom_free_prom_memory(void)
169{
170	unsigned long addr;
171	int i;
172
173	for (i = 0; i < boot_mem_map.nr_map; i++) {
174		if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
175			continue;
176
177		addr = boot_mem_map.map[i].addr;
178		free_init_pages("prom memory",
179				addr, addr + boot_mem_map.map[i].size);
180	}
181}