diff options
Diffstat (limited to 'arch/arm/kernel/setup.c')
-rw-r--r-- | arch/arm/kernel/setup.c | 198 |
1 files changed, 126 insertions, 72 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index a3b86fef7..b69ce22cb 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -27,7 +27,9 @@ #include <linux/utsname.h> #include <linux/blk.h> #include <linux/init.h> +#include <linux/console.h> +#include <asm/elf.h> #include <asm/hardware.h> #include <asm/io.h> #include <asm/pgtable.h> @@ -38,7 +40,9 @@ #include <asm/arch/mmu.h> struct drive_info_struct { char dummy[32]; } drive_info; -struct screen_info screen_info; +struct screen_info screen_info = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8 +}; struct processor processor; unsigned char aux_device_present; @@ -49,28 +53,39 @@ extern const struct processor arm6_processor_functions; extern const struct processor arm7_processor_functions; extern const struct processor sa110_processor_functions; -struct armversions armidlist[] = { -#if defined(CONFIG_CPU_ARM2) || defined(CONFIG_CPU_ARM3) - { 0x41560200, 0xfffffff0, F_MEMC , "ARM/VLSI", "arm2" , &arm2_processor_functions }, - { 0x41560250, 0xfffffff0, F_MEMC , "ARM/VLSI", "arm250" , &arm250_processor_functions }, - { 0x41560300, 0xfffffff0, F_MEMC|F_CACHE, "ARM/VLSI", "arm3" , &arm3_processor_functions }, -#endif -#if defined(CONFIG_CPU_ARM6) || defined(CONFIG_CPU_SA110) - { 0x41560600, 0xfffffff0, F_MMU|F_32BIT , "ARM/VLSI", "arm6" , &arm6_processor_functions }, - { 0x41560610, 0xfffffff0, F_MMU|F_32BIT , "ARM/VLSI", "arm610" , &arm6_processor_functions }, - { 0x41007000, 0xffffff00, F_MMU|F_32BIT , "ARM/VLSI", "arm7" , &arm7_processor_functions }, - { 0x41007100, 0xffffff00, F_MMU|F_32BIT , "ARM/VLSI", "arm710" , &arm7_processor_functions }, - { 0x4401a100, 0xfffffff0, F_MMU|F_32BIT , "DEC", "sa110" , &sa110_processor_functions }, +char elf_platform[ELF_PLATFORM_SIZE]; + +const struct armversions armidlist[] = { + /*-- Match -- --- Mask -- -- Manu -- Processor uname -m --- ELF STUFF --- + --- processor asm funcs --- */ +#if defined(CONFIG_CPU_26) + { 0x41560200, 0xfffffff0, "ARM/VLSI", "arm2" , "armv1" , "v1", 0, + &arm2_processor_functions }, + { 0x41560250, 0xfffffff0, "ARM/VLSI", "arm250" , "armv2" , "v2", HWCAP_SWP, + &arm250_processor_functions }, + { 0x41560300, 0xfffffff0, "ARM/VLSI", "arm3" , "armv2" , "v2", HWCAP_SWP, + &arm3_processor_functions }, +#elif defined(CONFIG_CPU_32) + { 0x41560600, 0xfffffff0, "ARM/VLSI", "arm6" , "armv3" , "v3", HWCAP_SWP, + &arm6_processor_functions }, + { 0x41560610, 0xfffffff0, "ARM/VLSI", "arm610" , "armv3" , "v3", HWCAP_SWP, + &arm6_processor_functions }, + { 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 }, + { 0x4401a100, 0xfffffff0, "DEC", "sa110" , "armv4" , "v3", HWCAP_SWP|HWCAP_HALF, + &sa110_processor_functions }, #endif - { 0x00000000, 0x00000000, 0 , "***", "*unknown*" , NULL } + { 0x00000000, 0x00000000, "***", "unknown", "unknown", "**", 0, NULL } }; -static struct param_struct *params = (struct param_struct *)PARAMS_BASE; +static const struct param_struct *params = (struct param_struct *)PARAMS_BASE; unsigned long arm_id; unsigned int vram_half_sam; int armidindex; -int ioebpresent; int memc_ctrl_reg; int number_ide_drives; int number_mfm_drives; @@ -92,9 +107,11 @@ extern unsigned long real_end_mem; */ #ifdef CONFIG_ARCH_RPC -extern void init_dram_banks(struct param_struct *params); +extern void +init_dram_banks(const struct param_struct *params); -static void setup_rpc (struct param_struct *params) +static void +setup_rpc(const struct param_struct *params) { init_dram_banks(params); @@ -124,11 +141,12 @@ 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 */ -static void setup_ramdisk (struct param_struct *params) +static void +setup_ramdisk(const struct param_struct *params) { - 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; + 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; } #else #define setup_ramdisk(p) @@ -138,33 +156,30 @@ static void setup_ramdisk (struct param_struct *params) * initial ram disk */ #ifdef CONFIG_BLK_DEV_INITRD -static void setup_initrd (struct param_struct *params, unsigned long memory_end) +static void +setup_initrd(const struct param_struct *params, unsigned long memory_end) { - initrd_start = params->u1.s.initrd_start; - initrd_end = params->u1.s.initrd_start + params->u1.s.initrd_size; - - if (initrd_end > memory_end) { - printk ("initrd extends beyond end of memory " - "(0x%08lx > 0x%08lx) - disabling initrd\n", - initrd_end, memory_end); - initrd_start = 0; - } -} -#else -#define setup_initrd(p,m) -#endif + if (params->u1.s.initrd_start) { + initrd_start = params->u1.s.initrd_start; + initrd_end = initrd_start + params->u1.s.initrd_size; + } else { + initrd_start = 0; + initrd_end = 0; + } -#ifdef IOEB_BASE -static inline void check_ioeb_present(void) -{ - if (((*IOEB_BASE) & 15) == 5) - armidlist[armidindex].features |= F_IOEB; + if (initrd_end > memory_end) { + printk ("initrd extends beyond end of memory " + "(0x%08lx > 0x%08lx) - disabling initrd\n", + initrd_end, memory_end); + initrd_start = 0; + } } #else -#define check_ioeb_present() +#define setup_initrd(p,m) #endif -static inline void get_processor_type (void) +static inline void +get_processor_type(void) { for (armidindex = 0; ; armidindex ++) if (!((armidlist[armidindex].id ^ arm_id) & @@ -187,7 +202,7 @@ static inline void get_processor_type (void) /* Can this be initdata? --pb * command_line can be, saved_command_line can't though */ -static char command_line[COMMAND_LINE_SIZE] = { 0, }; +static char command_line[COMMAND_LINE_SIZE] __initdata = { 0, }; char saved_command_line[COMMAND_LINE_SIZE]; __initfunc(void setup_arch(char **cmdline_p, @@ -195,7 +210,8 @@ __initfunc(void setup_arch(char **cmdline_p, { static unsigned char smptrap; unsigned long memory_start, memory_end; - char c = ' ', *to = command_line, *from; + char endian = 'l', c = ' ', *to = command_line; + char *from; int len = 0; if (smptrap == 1) @@ -203,12 +219,13 @@ __initfunc(void setup_arch(char **cmdline_p, smptrap = 1; get_processor_type (); - check_ioeb_present (); processor._proc_init (); +#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; - from = params->commandline; +#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; @@ -218,8 +235,8 @@ __initfunc(void setup_arch(char **cmdline_p, number_ide_drives = (params->u1.s.adfsdrives >> 6) & 3; number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3; - setup_rpc (params); - setup_ramdisk (params); + setup_rpc(params); + setup_ramdisk(params); if (!(params->u1.s.flags & FLAG_READONLY)) root_mountflags &= ~MS_RDONLY; @@ -265,36 +282,73 @@ __initfunc(void setup_arch(char **cmdline_p, *memory_start_p = memory_start; *memory_end_p = memory_end; - setup_initrd (params, 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); - strcpy (system_utsname.machine, armidlist[armidindex].name); +#ifdef CONFIG_FB + conswitchp = &fb_con; +#endif } -#define ISSET(bit) (armidlist[armidindex].features & bit) +#if defined(CONFIG_ARCH_ARC) +#define HARDWARE "Acorn-Archimedes" +#define IO_BUS "Acorn" +#elif defined(CONFIG_ARCH_A5K) +#define HARDWARE "Acorn-A5000" +#define IO_BUS "Acorn" +#elif defined(CONFIG_ARCH_RPC) +#define HARDWARE "Acorn-RiscPC" +#define IO_BUS "Acorn" +#elif defined(CONFIG_ARCH_EBSA110) +#define HARDWARE "DEC-EBSA110" +#define IO_BUS "DEC" +#elif defined(CONFIG_ARCH_EBSA285) +#define HARDWARE "DEC-EBSA285" +#define IO_BUS "PCI" +#elif defined(CONFIG_ARCH_NEXUSPCI) +#define HARDWARE "Nexus-NexusPCI" +#define IO_BUS "PCI" +#elif defined(CONFIG_ARCH_VNC) +#define HARDWARE "Corel-VNC" +#define IO_BUS "PCI" +#else +#define HARDWARE "unknown" +#define IO_BUS "unknown" +#endif + +#if defined(CONFIG_CPU_ARM2) +#define OPTIMISATION "ARM2" +#elif defined(CONFIG_CPU_ARM3) +#define OPTIMISATION "ARM3" +#elif defined(CONFIG_CPU_ARM6) +#define OPTIMISATION "ARM6" +#elif defined(CONFIG_CPU_ARM7) +#define OPTIMISATION "ARM7" +#elif defined(CONFIG_CPU_SA110) +#define OPTIMISATION "StrongARM" +#else +#define OPTIMISATION "unknown" +#endif int get_cpuinfo(char * buffer) { int len; - len = sprintf (buffer, "CPU:\n" - "Type\t\t: %s\n" - "Revision\t: %d\n" - "Manufacturer\t: %s\n" - "32bit modes\t: %s\n" - "BogoMips\t: %lu.%02lu\n", - armidlist[armidindex].name, - (int)arm_id & 15, - armidlist[armidindex].manu, - ISSET (F_32BIT) ? "yes" : "no", - (loops_per_sec+2500) / 500000, - ((loops_per_sec+2500) / 5000) % 100); - len += sprintf (buffer + len, - "\nHardware:\n" - "Mem System\t: %s\n" - "IOEB\t\t: %s\n", - ISSET(F_MEMC) ? "MEMC" : - ISSET(F_MMU) ? "MMU" : "*unknown*", - ISSET(F_IOEB) ? "present" : "absent" - ); + len = sprintf(buffer, + "Processor\t: %s %s rev %d\n" + "BogoMips\t: %lu.%02lu\n" + "Hardware\t: %s\n" + "Optimisation\t: %s\n" + "IO Bus\t: %s\n", + armidlist[armidindex].manu, + armidlist[armidindex].name, + (int)arm_id & 15, + (loops_per_sec+2500) / 500000, + ((loops_per_sec+2500) / 5000) % 100, + HARDWARE, + OPTIMISATION, + IO_BUS); return len; } |