11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  linux/arch/m32r/kernel/setup.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Setup routines for Renesas M32R
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (c) 2001, 2002  Hiroyuki Kondo, Hirokazu Takata,
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *                            Hitoshi Yamamoto
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
117c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu Takata#include <linux/kernel.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/stddef.h>
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/fs.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bootmem.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/console.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/initrd.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/major.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/root_dev.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/seq_file.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/timex.h>
24894673ee6122a3ce1958e1fe096901ba5356a96bJon Smirl#include <linux/screen_info.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/cpu.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/nodemask.h>
2722a9835c350782a5c3257343713932af3ac92ee0Dave Hansen#include <linux/pfn.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/processor.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pgtable.h>
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mmu_context.h>
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/m32r.h>
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/setup.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/sections.h>
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MMU
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void init_mmu(void);
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern char _end[];
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Machine setup..
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct cpuinfo_m32r boot_cpu_data;
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_BLK_DEV_RAM
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int rd_doload;	/* 1 = load ramdisk, 0 = don't load */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int rd_prompt;	/* 1 = prompt for ramdisk, 0 = don't prompt */
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int rd_image_start;	/* starting block # of image */
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_VGA_CONSOLE)
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct screen_info screen_info = {
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.orig_video_lines      = 25,
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.orig_video_cols       = 80,
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.orig_video_mode       = 0,
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.orig_video_ega_bx     = 0,
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.orig_video_isVGA      = 1,
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.orig_video_points     = 8
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int root_mountflags;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
673561794d80843588ed8b47fffb20e2dcd9c40ff3Alon Bar-Levstatic char __initdata command_line[COMMAND_LINE_SIZE];
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource data_resource = {
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.name   = "Kernel data",
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.start  = 0,
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.end    = 0,
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.flags  = IORESOURCE_BUSY | IORESOURCE_MEM
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource code_resource = {
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.name   = "Kernel code",
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.start  = 0,
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.end    = 0,
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.flags  = IORESOURCE_BUSY | IORESOURCE_MEM
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long memory_start;
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long memory_end;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init setup_arch(char **);
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint get_cpuinfo(char *);
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic __inline__ void parse_mem_cmdline(char ** cmdline_p)
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char c = ' ';
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *to = command_line;
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *from = COMMAND_LINE;
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int len = 0;
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int usermem = 0;
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Save unparsed command line copy for /proc/cmdline */
983561794d80843588ed8b47fffb20e2dcd9c40ff3Alon Bar-Lev	memcpy(boot_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
993561794d80843588ed8b47fffb20e2dcd9c40ff3Alon Bar-Lev	boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memory_start = (unsigned long)CONFIG_MEMORY_START+PAGE_OFFSET;
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memory_end = memory_start+(unsigned long)CONFIG_MEMORY_SIZE;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for ( ; ; ) {
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (c == ' ' && !memcmp(from, "mem=", 4)) {
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (to != command_line)
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				to--;
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			{
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				unsigned long mem_size;
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				usermem = 1;
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				mem_size = memparse(from+4, &from);
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				memory_end = memory_start + mem_size;
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		c = *(from++);
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!c)
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (COMMAND_LINE_SIZE <= ++len)
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*(to++) = c;
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*to = '\0';
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*cmdline_p = command_line;
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (usermem)
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "user-defined physical RAM map:\n");
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_DISCONTIGMEM
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned long __init setup_memory(void)
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long start_pfn, max_low_pfn, bootmap_size;
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	start_pfn = PFN_UP( __pa(_end) );
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	max_low_pfn = PFN_DOWN( __pa(memory_end) );
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Initialize the boot-time allocator (with low memory only):
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn,
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		CONFIG_MEMORY_START>>PAGE_SHIFT, max_low_pfn);
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Register fully available low RAM pages with the bootmem allocator.
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned long curr_pfn;
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned long last_pfn;
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned long pages;
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * We are rounding up the start address of usable memory:
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		curr_pfn = PFN_UP(__pa(memory_start));
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * ... and at the end of the usable range downwards:
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		last_pfn = PFN_DOWN(__pa(memory_end));
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (last_pfn > max_low_pfn)
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			last_pfn = max_low_pfn;
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pages = last_pfn - curr_pfn;
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(pages));
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Reserve the kernel text and
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Reserve the bootmem bitmap. We do this in two steps (first step
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * was init_bootmem()), because this catches the (definitely buggy)
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * case of us accidentally initializing the bootmem allocator with
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * an invalid RAM area.
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	reserve_bootmem(CONFIG_MEMORY_START + PAGE_SIZE,
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		(PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE - 1)
18072a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle		- CONFIG_MEMORY_START,
18172a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle		BOOTMEM_DEFAULT);
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * reserve physical page 0 - it's a special BIOS page on many boxes,
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * enabling clean reboots, SMP operation, laptop functions.
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
18772a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle	reserve_bootmem(CONFIG_MEMORY_START, PAGE_SIZE, BOOTMEM_DEFAULT);
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * reserve memory hole
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MEMHOLE
19372a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle	reserve_bootmem(CONFIG_MEMHOLE_START, CONFIG_MEMHOLE_SIZE,
19472a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle			BOOTMEM_DEFAULT);
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_BLK_DEV_INITRD
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (LOADER_TYPE && INITRD_START) {
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
20072a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle			reserve_bootmem(INITRD_START, INITRD_SIZE,
20172a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle					BOOTMEM_DEFAULT);
20219e5d9c0d2194b4b47189cbec2921cbf72b0bd1cHenry Nestler			initrd_start = INITRD_START + PAGE_OFFSET;
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			initrd_end = initrd_start + INITRD_SIZE;
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("initrd:start[%08lx],size[%08lx]\n",
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				initrd_start, INITRD_SIZE);
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("initrd extends beyond end of memory "
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"(0x%08lx > 0x%08lx)\ndisabling initrd\n",
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				INITRD_START + INITRD_SIZE,
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				max_low_pfn << PAGE_SHIFT);
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			initrd_start = 0;
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return max_low_pfn;
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else	/* CONFIG_DISCONTIGMEM */
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern unsigned long setup_memory(void);
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif	/* CONFIG_DISCONTIGMEM */
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init setup_arch(char **cmdline_p)
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	boot_cpu_data.cpu_clock = M32R_CPUCLK;
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	boot_cpu_data.bus_clock = M32R_BUSCLK;
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	boot_cpu_data.timer_divide = M32R_TIMER_DIVIDE;
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_BLK_DEV_RAM
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!MOUNT_ROOT_RDONLY)
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		root_mountflags &= ~MS_RDONLY;
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_VT
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_VGA_CONSOLE)
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	conswitchp = &vga_con;
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(CONFIG_DUMMY_CONSOLE)
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	conswitchp = &dummy_con;
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_DISCONTIGMEM
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	nodes_clear(node_online_map);
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	node_set_online(0);
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	node_set_online(1);
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif	/* CONFIG_DISCONTIGMEM */
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_mm.start_code = (unsigned long) _text;
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_mm.end_code = (unsigned long) _etext;
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_mm.end_data = (unsigned long) _edata;
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_mm.brk = (unsigned long) _end;
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	code_resource.start = virt_to_phys(_text);
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	code_resource.end = virt_to_phys(_etext)-1;
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	data_resource.start = virt_to_phys(_etext);
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	data_resource.end = virt_to_phys(_edata)-1;
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	parse_mem_cmdline(cmdline_p);
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	setup_memory();
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	paging_init();
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2717c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu Takatastatic struct cpu cpu_devices[NR_CPUS];
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init topology_init(void)
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2757c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu Takata	int i;
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2777c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu Takata	for_each_present_cpu(i)
27876b67ed9dce69a6a329cdd66f94af1787f417b62KAMEZAWA Hiroyuki		register_cpu(&cpu_devices[i], i);
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssubsys_initcall(topology_init);
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PROC_FS
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Get CPU information for use by the procfs.
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int show_cpuinfo(struct seq_file *m, void *v)
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct cpuinfo_m32r *c = v;
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long cpu = c - cpu_data;
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_SMP
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!cpu_online(cpu))
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif	/* CONFIG_SMP */
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "processor\t: %ld\n", cpu);
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
301c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#if defined(CONFIG_CHIP_VDEC2)
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "cpu family\t: VDEC2\n"
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		"cache size\t: Unknown\n");
304c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_CHIP_M32700)
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m,"cpu family\t: M32700\n"
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		"cache size\t: I-8KB/D-8KB\n");
307c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_CHIP_M32102)
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m,"cpu family\t: M32102\n"
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		"cache size\t: I-8KB\n");
310c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_CHIP_OPSP)
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m,"cpu family\t: OPSP\n"
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		"cache size\t: I-8KB/D-8KB\n");
313c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_CHIP_MP)
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "cpu family\t: M32R-MP\n"
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		"cache size\t: I-xxKB/D-xxKB\n");
3169287d95ea194abf32fab24c6909f8ea55ab0292fHirokazu Takata#elif  defined(CONFIG_CHIP_M32104)
3179287d95ea194abf32fab24c6909f8ea55ab0292fHirokazu Takata	seq_printf(m,"cpu family\t: M32104\n"
3189287d95ea194abf32fab24c6909f8ea55ab0292fHirokazu Takata		"cache size\t: I-8KB/D-8KB\n");
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "cpu family\t: Unknown\n");
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "bogomips\t: %lu.%02lu\n",
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		c->loops_per_jiffy/(500000/HZ),
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		(c->loops_per_jiffy/(5000/HZ)) % 100);
325c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#if defined(CONFIG_PLAT_MAPPI)
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "Machine\t\t: Mappi Evaluation board\n");
327c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_PLAT_MAPPI2)
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "Machine\t\t: Mappi-II Evaluation board\n");
329c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_PLAT_MAPPI3)
3302368086344c3d67b0f4aecac39d620fb9b8795c3Hirokazu Takata	seq_printf(m, "Machine\t\t: Mappi-III Evaluation board\n");
331c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_PLAT_M32700UT)
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "Machine\t\t: M32700UT Evaluation board\n");
333c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_PLAT_OPSPUT)
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "Machine\t\t: OPSPUT Evaluation board\n");
335c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_PLAT_USRV)
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "Machine\t\t: uServer\n");
337c978b0179b31600394d5ebdb0940b492ec05500fHirokazu Takata#elif defined(CONFIG_PLAT_OAKS32R)
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "Machine\t\t: OAKS32R\n");
3399287d95ea194abf32fab24c6909f8ea55ab0292fHirokazu Takata#elif  defined(CONFIG_PLAT_M32104UT)
3409287d95ea194abf32fab24c6909f8ea55ab0292fHirokazu Takata	seq_printf(m, "Machine\t\t: M3T-M32104UT uT Engine board\n");
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "Machine\t\t: Unknown\n");
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PRINT_CLOCK(name, value)				\
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, name " clock\t: %d.%02dMHz\n",		\
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		((value) / 1000000), ((value) % 1000000)/10000)
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PRINT_CLOCK("CPU", (int)c->cpu_clock);
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PRINT_CLOCK("Bus", (int)c->bus_clock);
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "\n");
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void *c_start(struct seq_file *m, loff_t *pos)
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return *pos < NR_CPUS ? cpu_data + *pos : NULL;
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void *c_next(struct seq_file *m, void *v, loff_t *pos)
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	++*pos;
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return c_start(m, pos);
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void c_stop(struct seq_file *m, void *v)
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
37203a44825be987d720df854f63b2f7bd30e46bddeJan Engelhardtconst struct seq_operations cpuinfo_op = {
3737857a7f59d5d0b4e8c15606a79c0bcdbdef18ab6Al Viro	.start = c_start,
3747857a7f59d5d0b4e8c15606a79c0bcdbdef18ab6Al Viro	.next = c_next,
3757857a7f59d5d0b4e8c15606a79c0bcdbdef18ab6Al Viro	.stop = c_stop,
3767857a7f59d5d0b4e8c15606a79c0bcdbdef18ab6Al Viro	.show = show_cpuinfo,
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif	/* CONFIG_PROC_FS */
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long cpu_initialized __initdata = 0;
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * cpu_init() initializes state that is per-CPU. Some data is already
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * initialized (naturally) in the bootstrap process.
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We reload them nevertheless, this function acts as a
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 'CPU state barrier', nothing should get across.
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_XNUX2)	\
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	|| defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_M32102) \
3909287d95ea194abf32fab24c6909f8ea55ab0292fHirokazu Takata	|| defined(CONFIG_CHIP_OPSP) || defined(CONFIG_CHIP_M32104)
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init cpu_init (void)
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cpu_id = smp_processor_id();
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (test_and_set_bit(cpu_id, &cpu_initialized)) {
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_WARNING "CPU#%d already initialized!\n", cpu_id);
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for ( ; ; )
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			local_irq_enable();
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "Initializing CPU#%d\n", cpu_id);
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up and load the per-CPU TSS and LDT */
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_inc(&init_mm.mm_count);
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	current->active_mm = &init_mm;
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (current->mm)
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		BUG();
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Force FPU initialization */
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	current_thread_info()->status = 0;
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clear_used_math();
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MMU
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up MMU */
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_mmu();
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up ICUIMASK */
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outl(0x00070000, M32R_ICU_IMASK_PORTL);		/* imask=111 */
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif	/* defined(CONFIG_CHIP_VDEC2) ... */
421