patch-2.1.121 linux/arch/arm/kernel/setup.c
Next file: linux/arch/arm/kernel/signal.c
Previous file: linux/arch/arm/kernel/setup-ebsa110.c
Back to the patch index
Back to the overall index
- Lines: 460
- Date:
Sun Sep 6 10:44:47 1998
- Orig file:
v2.1.120/linux/arch/arm/kernel/setup.c
- Orig date:
Tue Jul 21 00:15:30 1998
diff -u --recursive --new-file v2.1.120/linux/arch/arm/kernel/setup.c linux/arch/arm/kernel/setup.c
@@ -1,7 +1,7 @@
/*
* linux/arch/arm/kernel/setup.c
*
- * Copyright (C) 1995, 1996, 1997 Russell King
+ * Copyright (C) 1995-1998 Russell King
*/
/*
@@ -37,11 +37,37 @@
#include <asm/segment.h>
#include <asm/setup.h>
#include <asm/system.h>
-#include <asm/arch/mmu.h>
+
+/* Work out which CPUs to support */
+#ifdef CONFIG_ARCH_ACORN
+#define SUPPORT_CPU_ARM6
+#define SUPPORT_CPU_ARM7
+#define SUPPORT_CPU_SA110
+#else
+#define SUPPORT_CPU_SA110
+#endif
+#ifdef CONFIG_CPU_ARM6
+#define SUPPORT_CPU_ARM6
+#endif
+#ifdef CONFIG_CPU_ARM7
+#define SUPPORT_CPU_ARM7
+#endif
+#ifdef CONFIG_CPU_SA110
+#define SUPPORT_CPU_SA110
+#endif
+
+#ifndef CONFIG_CMDLINE
+#define CONFIG_CMDLINE "root=nfs rw console=ttyS1,38400n8"
+#endif
+#define MEM_SIZE (16*1024*1024)
+#define COMMAND_LINE_SIZE 256
struct drive_info_struct { char dummy[32]; } drive_info;
struct screen_info screen_info = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8
+ orig_video_mode: 0,
+ orig_video_ega_bx: 0,
+ orig_video_isVGA: 1,
+ orig_video_points: 8
};
struct processor processor;
unsigned char aux_device_present;
@@ -66,35 +92,36 @@
{ 0x41560300, 0xfffffff0, "ARM/VLSI", "arm3" , "armv2" , "v2", HWCAP_SWP,
&arm3_processor_functions },
#elif defined(CONFIG_CPU_32)
+#ifdef SUPPORT_CPU_ARM6
{ 0x41560600, 0xfffffff0, "ARM/VLSI", "arm6" , "armv3" , "v3", HWCAP_SWP,
&arm6_processor_functions },
{ 0x41560610, 0xfffffff0, "ARM/VLSI", "arm610" , "armv3" , "v3", HWCAP_SWP,
&arm6_processor_functions },
+#endif
+#ifdef SUPPORT_CPU_ARM7
{ 0x41007000, 0xffffff00, "ARM/VLSI", "arm7" , "armv3" , "v3", HWCAP_SWP,
&arm7_processor_functions },
/* ARM710 IDs are non-standard */
{ 0x41007100, 0xfff8ff00, "ARM/VLSI", "arm710" , "armv3" , "v3", HWCAP_SWP,
&arm7_processor_functions },
+#endif
+#ifdef SUPPORT_CPU_SA110
{ 0x4401a100, 0xfffffff0, "DEC", "sa110" , "armv4" , "v3", HWCAP_SWP|HWCAP_HALF,
&sa110_processor_functions },
#endif
+#endif
{ 0x00000000, 0x00000000, "***", "unknown", "unknown", "**", 0, NULL }
};
-static const struct param_struct *params = (struct param_struct *)PARAMS_BASE;
-
-unsigned long arm_id;
-unsigned int vram_half_sam;
+/*
+ * From head-armv.S
+ */
+unsigned int processor_id;
+unsigned int machine_type;
int armidindex;
-int memc_ctrl_reg;
-int number_ide_drives;
-int number_mfm_drives;
-extern int bytes_per_char_h;
-extern int bytes_per_char_v;
extern int root_mountflags;
extern int _etext, _edata, _end;
-extern unsigned long real_end_mem;
/*-------------------------------------------------------------------------
* Early initialisation routines for various configurable items in the
@@ -107,12 +134,15 @@
*/
#ifdef CONFIG_ARCH_RPC
-extern void
-init_dram_banks(const struct param_struct *params);
+#include <asm/arch/mmu.h>
+
+unsigned int vram_half_sam;
static void
-setup_rpc(const struct param_struct *params)
+setup_rpc(struct param_struct *params)
{
+ extern void init_dram_banks(const struct param_struct *params);
+
init_dram_banks(params);
switch (params->u1.s.pages_in_vram) {
@@ -123,41 +153,103 @@
default:
vram_half_sam = 2048;
}
-
- /*
- * Set ROM speed to maximum
- */
- outb (0x1d, IOMD_ROMCR0);
}
#else
#define setup_rpc(x)
#endif
-/*
- * ram disk
- */
-#ifdef CONFIG_BLK_DEV_RAM
-extern int rd_doload; /* 1 = load ramdisk, 0 = don't load */
-extern int rd_prompt; /* 1 = prompt for ramdisk, 0 = don't prompt */
-extern int rd_image_start; /* starting block # of image */
+#ifdef PARAMS_BASE
-static void
-setup_ramdisk(const struct param_struct *params)
+#ifdef CONFIG_ARCH_ACORN
+int memc_ctrl_reg;
+int number_ide_drives;
+int number_mfm_drives;
+#endif
+
+static struct param_struct *params = (struct param_struct *)PARAMS_BASE;
+
+__initfunc(static char *
+setup_params(unsigned long *mem_end_p))
{
- rd_image_start = params->u1.s.rd_start;
- rd_prompt = (params->u1.s.flags & FLAG_RDPROMPT) == 0;
- rd_doload = (params->u1.s.flags & FLAG_RDLOAD) == 0;
+ ROOT_DEV = to_kdev_t(params->u1.s.rootdev);
+ ORIG_X = params->u1.s.video_x;
+ ORIG_Y = params->u1.s.video_y;
+ ORIG_VIDEO_COLS = params->u1.s.video_num_cols;
+ ORIG_VIDEO_LINES = params->u1.s.video_num_rows;
+
+#ifdef CONFIG_ARCH_ACORN
+#ifndef CONFIG_FB
+ {
+ extern int bytes_per_char_h;
+ extern int bytes_per_char_v;
+
+ bytes_per_char_h = params->u1.s.bytes_per_char_h;
+ bytes_per_char_v = params->u1.s.bytes_per_char_v;
+ }
+#endif
+ memc_ctrl_reg = params->u1.s.memc_control_reg;
+ number_ide_drives = (params->u1.s.adfsdrives >> 6) & 3;
+ number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3;
+
+ setup_rpc(params);
+
+ if (!(params->u1.s.flags & FLAG_READONLY))
+ root_mountflags &= ~MS_RDONLY;
+#endif
+#ifdef CONFIG_BLK_DEV_RAM
+ {
+ extern int rd_doload;
+ extern int rd_prompt;
+ extern int rd_image_start;
+
+ rd_image_start = params->u1.s.rd_start;
+ rd_prompt = (params->u1.s.flags & FLAG_RDPROMPT) == 0;
+ rd_doload = (params->u1.s.flags & FLAG_RDLOAD) == 0;
+ }
+#endif
+
+#ifdef CONFIG_ARCH_ACORN
+ *mem_end_p = GET_MEMORY_END(params);
+#else
+ *mem_end_p = PAGE_OFFSET + MEM_SIZE;
+#endif
+
+ return params->commandline;
}
+
#else
-#define setup_ramdisk(p)
+
+static char default_command_line[] __initdata = CONFIG_CMDLINE;
+
+__initfunc(static char *
+setup_params(unsigned long *mem_end_p))
+{
+ ROOT_DEV = 0x00ff;
+
+#ifdef CONFIG_BLK_DEV_RAM
+ {
+ extern int rd_doload;
+ extern int rd_prompt;
+ extern int rd_image_start;
+
+ rd_image_start = 0;
+ rd_prompt = 1;
+ rd_doload = 1;
+ }
+#endif
+
+ *mem_end_p = PAGE_OFFSET + MEM_SIZE;
+
+ return default_command_line;
+}
#endif
/*
* initial ram disk
*/
#ifdef CONFIG_BLK_DEV_INITRD
-static void
-setup_initrd(const struct param_struct *params, unsigned long memory_end)
+__initfunc(static void
+setup_initrd(const struct param_struct *params))
{
if (params->u1.s.initrd_start) {
initrd_start = params->u1.s.initrd_start;
@@ -166,130 +258,130 @@
initrd_start = 0;
initrd_end = 0;
}
+}
- if (initrd_end > memory_end) {
+__initfunc(static void
+check_initrd(unsigned long mem_start, unsigned long mem_end))
+{
+ if (initrd_end > mem_end) {
printk ("initrd extends beyond end of memory "
"(0x%08lx > 0x%08lx) - disabling initrd\n",
- initrd_end, memory_end);
+ initrd_end, mem_end);
initrd_start = 0;
}
}
+
#else
-#define setup_initrd(p,m)
+#define setup_initrd(p)
+#define check_initrd(ms,me)
#endif
-static inline void
-get_processor_type(void)
+__initfunc(void
+setup_processor(void))
{
- for (armidindex = 0; ; armidindex ++)
- if (!((armidlist[armidindex].id ^ arm_id) &
- armidlist[armidindex].mask))
- break;
+ armidindex = 0;
+
+ while ((armidlist[armidindex].id ^ processor_id) &
+ armidlist[armidindex].mask)
+ armidindex += 1;
if (armidlist[armidindex].id == 0) {
+#ifdef CONFIG_ARCH_ACORN
int i;
for (i = 0; i < 3200; i++)
((unsigned long *)SCREEN2_BASE)[i] = 0x77113322;
-
+#endif
while (1);
}
+
processor = *armidlist[armidindex].proc;
+ processor._proc_init();
}
-#define COMMAND_LINE_SIZE 256
-
-/* Can this be initdata? --pb
- * command_line can be, saved_command_line can't though
- */
-static char command_line[COMMAND_LINE_SIZE] __initdata = { 0, };
+static char command_line[COMMAND_LINE_SIZE] = { 0, };
char saved_command_line[COMMAND_LINE_SIZE];
-__initfunc(void setup_arch(char **cmdline_p,
- unsigned long * memory_start_p, unsigned long * memory_end_p))
+__initfunc(static void
+setup_mem(char *cmd_line, unsigned long *mem_start, unsigned long *mem_end))
+{
+ char c = ' ', *to = command_line;
+ int len = 0;
+
+ *mem_start = (unsigned long)&_end;
+
+ for (;;) {
+ if (c == ' ' &&
+ cmd_line[0] == 'm' &&
+ cmd_line[1] == 'e' &&
+ cmd_line[2] == 'm' &&
+ cmd_line[3] == '=') {
+ *mem_end = simple_strtoul(cmd_line+4, &cmd_line, 0);
+ switch(*cmd_line) {
+ case 'M':
+ case 'm':
+ *mem_end <<= 10;
+ case 'K':
+ case 'k':
+ *mem_end <<= 10;
+ cmd_line++;
+ }
+ *mem_end = *mem_end + PAGE_OFFSET;
+ }
+ c = *cmd_line++;
+ if (!c)
+ break;
+ if (COMMAND_LINE_SIZE <= ++len)
+ break;
+ *to++ = c;
+ }
+
+ *to = '\0';
+}
+
+__initfunc(void
+setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * memory_end_p))
{
static unsigned char smptrap;
- unsigned long memory_start, memory_end;
- char endian = 'l', c = ' ', *to = command_line;
+ unsigned long memory_end;
+ char endian = 'l';
char *from;
- int len = 0;
if (smptrap == 1)
return;
smptrap = 1;
- get_processor_type ();
- processor._proc_init ();
+ setup_processor();
-#ifndef CONFIG_FB
- bytes_per_char_h = params->u1.s.bytes_per_char_h;
- bytes_per_char_v = params->u1.s.bytes_per_char_v;
-#endif
- from = (char *)params->commandline;
- ROOT_DEV = to_kdev_t (params->u1.s.rootdev);
- ORIG_X = params->u1.s.video_x;
- ORIG_Y = params->u1.s.video_y;
- ORIG_VIDEO_COLS = params->u1.s.video_num_cols;
- ORIG_VIDEO_LINES = params->u1.s.video_num_rows;
- memc_ctrl_reg = params->u1.s.memc_control_reg;
- number_ide_drives = (params->u1.s.adfsdrives >> 6) & 3;
- number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3;
+ from = setup_params(&memory_end);
+ setup_initrd(params);
- setup_rpc(params);
- setup_ramdisk(params);
-
- if (!(params->u1.s.flags & FLAG_READONLY))
- root_mountflags &= ~MS_RDONLY;
+ /* Save unparsed command line copy for /proc/cmdline */
+ memcpy(saved_command_line, from, COMMAND_LINE_SIZE);
+ saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
- memory_start = MAPTOPHYS((unsigned long)&_end);
- memory_end = GET_MEMORY_END(params);
+ setup_mem(from, memory_start_p, &memory_end);
+ check_initrd(*memory_start_p, memory_end);
init_task.mm->start_code = TASK_SIZE;
init_task.mm->end_code = TASK_SIZE + (unsigned long) &_etext;
init_task.mm->end_data = TASK_SIZE + (unsigned long) &_edata;
init_task.mm->brk = TASK_SIZE + (unsigned long) &_end;
- /* Save unparsed command line copy for /proc/cmdline */
- memcpy(saved_command_line, from, COMMAND_LINE_SIZE);
- saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
-
- for (;;) {
- if (c == ' ' &&
- from[0] == 'm' &&
- from[1] == 'e' &&
- from[2] == 'm' &&
- from[3] == '=') {
- memory_end = simple_strtoul(from+4, &from, 0);
- if (*from == 'K' || *from == 'k') {
- memory_end = memory_end << 10;
- from++;
- } else if (*from == 'M' || *from == 'm') {
- memory_end = memory_end << 20;
- from++;
- }
- memory_end = memory_end + PAGE_OFFSET;
- }
- c = *from++;
- if (!c)
- break;
- if (COMMAND_LINE_SIZE <= ++len)
- break;
- *to++ = c;
- }
-
- *to = '\0';
*cmdline_p = command_line;
- *memory_start_p = memory_start;
*memory_end_p = memory_end;
- setup_initrd(params, memory_end);
-
sprintf(system_utsname.machine, "%s%c", armidlist[armidindex].arch_vsn, endian);
sprintf(elf_platform, "%s%c", armidlist[armidindex].elf_vsn, endian);
-#ifdef CONFIG_FB
- conswitchp = &fb_con;
+#ifdef CONFIG_VT
+#if defined(CONFIG_VGA_CONSOLE)
+ conswitchp = &vga_con;
+#elif defined(CONFIG_DUMMY_CONSOLE)
+ conswitchp = &dummy_con;
+#endif
#endif
+printascii("setup_arch done\n");
}
#if defined(CONFIG_ARCH_ARC)
@@ -341,10 +433,10 @@
"BogoMips\t: %lu.%02lu\n"
"Hardware\t: %s\n"
"Optimisation\t: %s\n"
- "IO Bus\t: %s\n",
+ "IO Bus\t\t: %s\n",
armidlist[armidindex].manu,
armidlist[armidindex].name,
- (int)arm_id & 15,
+ (int)processor_id & 15,
(loops_per_sec+2500) / 500000,
((loops_per_sec+2500) / 5000) % 100,
HARDWARE,
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov