setup.c

来自「优龙2410linux2.6.8内核源代码」· C语言 代码 · 共 874 行 · 第 1/2 页

C
874
字号
/* *  linux/arch/arm/kernel/setup.c * *  Copyright (C) 1995-2001 Russell King * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/stddef.h>#include <linux/ioport.h>#include <linux/delay.h>#include <linux/utsname.h>#include <linux/initrd.h>#include <linux/console.h>#include <linux/bootmem.h>#include <linux/seq_file.h>#include <linux/tty.h>#include <linux/init.h>#include <linux/root_dev.h>#include <linux/cpu.h>#include <linux/interrupt.h>#include <asm/elf.h>#include <asm/hardware.h>#include <asm/io.h>#include <asm/procinfo.h>#include <asm/setup.h>#include <asm/mach-types.h>#include <asm/cacheflush.h>#include <asm/tlbflush.h>#include <asm/mach/arch.h>#include <asm/mach/irq.h>#include <asm/mach/time.h>#ifndef MEM_SIZE#define MEM_SIZE	(16*1024*1024)#endif#if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)char fpe_type[8];static int __init fpe_setup(char *line){	memcpy(fpe_type, line, 8);	return 1;}__setup("fpe=", fpe_setup);#endifextern unsigned int mem_fclk_21285;extern void paging_init(struct meminfo *, struct machine_desc *desc);extern void convert_to_tag_list(struct tag *tags);extern void squash_mem_tags(struct tag *tag);extern void bootmem_init(struct meminfo *);extern void reboot_setup(char *str);extern int root_mountflags;extern int _stext, _text, _etext, _edata, _end;unsigned int processor_id;unsigned int __machine_arch_type;EXPORT_SYMBOL(__machine_arch_type);unsigned int system_rev;EXPORT_SYMBOL(system_rev);unsigned int system_serial_low;EXPORT_SYMBOL(system_serial_low);unsigned int system_serial_high;EXPORT_SYMBOL(system_serial_high);unsigned int elf_hwcap;EXPORT_SYMBOL(elf_hwcap);#ifdef MULTI_CPUstruct processor processor;#endif#ifdef MULTI_TLBstruct cpu_tlb_fns cpu_tlb;#endif#ifdef MULTI_USERstruct cpu_user_fns cpu_user;#endif#ifdef MULTI_CACHEstruct cpu_cache_fns cpu_cache;#endifunsigned char aux_device_present;char elf_platform[ELF_PLATFORM_SIZE];EXPORT_SYMBOL(elf_platform);unsigned long phys_initrd_start __initdata = 0;unsigned long phys_initrd_size __initdata = 0;static struct meminfo meminfo __initdata = { 0, };static const char *cpu_name;static const char *machine_name;static char command_line[COMMAND_LINE_SIZE];static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };#define ENDIANNESS ((char)endian_test.l)/* * Standard memory resources */static struct resource mem_res[] = {	{ "Video RAM",   0,     0,     IORESOURCE_MEM			},	{ "Kernel code", 0,     0,     IORESOURCE_MEM			},	{ "Kernel data", 0,     0,     IORESOURCE_MEM			}};#define video_ram   mem_res[0]#define kernel_code mem_res[1]#define kernel_data mem_res[2]static struct resource io_res[] = {	{ "reserved",    0x3bc, 0x3be, IORESOURCE_IO | IORESOURCE_BUSY },	{ "reserved",    0x378, 0x37f, IORESOURCE_IO | IORESOURCE_BUSY },	{ "reserved",    0x278, 0x27f, IORESOURCE_IO | IORESOURCE_BUSY }};#define lp0 io_res[0]#define lp1 io_res[1]#define lp2 io_res[2]static const char *cache_types[16] = {	"VIVT write-through",	"VIVT write-back",	"VIVT write-back",	"undefined 3",	"undefined 4",	"undefined 5",	"VIVT write-back",	"VIVT write-back",	"undefined 8",	"undefined 9",	"undefined 10",	"undefined 11",	"undefined 12",	"undefined 13",	"VIPT write-back",	"undefined 15",};static const char *cache_clean[16] = {	"not required",	"read-block",	"cp15 c7 ops",	"undefined 3",	"undefined 4",	"undefined 5",	"cp15 c7 ops",	"cp15 c7 ops",	"undefined 8",	"undefined 9",	"undefined 10",	"undefined 11",	"undefined 12",	"undefined 13",	"cp15 c7 ops",	"undefined 15",};static const char *cache_lockdown[16] = {	"not supported",	"not supported",	"not supported",	"undefined 3",	"undefined 4",	"undefined 5",	"format A",	"format B",	"undefined 8",	"undefined 9",	"undefined 10",	"undefined 11",	"undefined 12",	"undefined 13",	"format C",	"undefined 15",};static const char *proc_arch[] = {	"undefined/unknown",	"3",	"4",	"4T",	"5",	"5T",	"5TE",	"5TEJ",	"6TEJ",	"?(10)",	"?(11)",	"?(12)",	"?(13)",	"?(14)",	"?(15)",	"?(16)",	"?(17)",};#define CACHE_TYPE(x)	(((x) >> 25) & 15)#define CACHE_S(x)	((x) & (1 << 24))#define CACHE_DSIZE(x)	(((x) >> 12) & 4095)	/* only if S=1 */#define CACHE_ISIZE(x)	((x) & 4095)#define CACHE_SIZE(y)	(((y) >> 6) & 7)#define CACHE_ASSOC(y)	(((y) >> 3) & 7)#define CACHE_M(y)	((y) & (1 << 2))#define CACHE_LINE(y)	((y) & 3)static inline void dump_cache(const char *prefix, unsigned int cache){	unsigned int mult = 2 + (CACHE_M(cache) ? 1 : 0);	printk("%s: %d bytes, associativity %d, %d byte lines, %d sets\n",		prefix,		mult << (8 + CACHE_SIZE(cache)),		(mult << CACHE_ASSOC(cache)) >> 1,		8 << CACHE_LINE(cache),		1 << (6 + CACHE_SIZE(cache) - CACHE_ASSOC(cache) -			CACHE_LINE(cache)));}static void __init dump_cpu_info(void){	unsigned int info = read_cpuid(CPUID_CACHETYPE);	if (info != processor_id) {		printk("CPU: D %s cache\n", cache_types[CACHE_TYPE(info)]);		if (CACHE_S(info)) {			dump_cache("CPU: I cache", CACHE_ISIZE(info));			dump_cache("CPU: D cache", CACHE_DSIZE(info));		} else {			dump_cache("CPU: cache", CACHE_ISIZE(info));		}	}}int cpu_architecture(void){	int cpu_arch;	if ((processor_id & 0x0000f000) == 0) {		cpu_arch = CPU_ARCH_UNKNOWN;	} else if ((processor_id & 0x0000f000) == 0x00007000) {		cpu_arch = (processor_id & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3;	} else {		cpu_arch = (processor_id >> 16) & 15;		if (cpu_arch)			cpu_arch += CPU_ARCH_ARMv3;	}	return cpu_arch;}static void __init setup_processor(void){	extern struct proc_info_list __proc_info_begin, __proc_info_end;	struct proc_info_list *list;	/*	 * locate processor in the list of supported processor	 * types.  The linker builds this table for us from the	 * entries in arch/arm/mm/proc-*.S	 */	for (list = &__proc_info_begin; list < &__proc_info_end ; list++)		if ((processor_id & list->cpu_mask) == list->cpu_val)			break;	/*	 * If processor type is unrecognised, then we	 * can do nothing...	 */	if (list >= &__proc_info_end) {		printk("CPU configuration botched (ID %08x), unable "		       "to continue.\n", processor_id);		while (1);	}	cpu_name = list->cpu_name;#ifdef MULTI_CPU	processor = *list->proc;#endif#ifdef MULTI_TLB	cpu_tlb = *list->tlb;#endif#ifdef MULTI_USER	cpu_user = *list->user;#endif#ifdef MULTI_CACHE	cpu_cache = *list->cache;#endif	printk("CPU: %s [%08x] revision %d (ARMv%s)\n",	       cpu_name, processor_id, (int)processor_id & 15,	       proc_arch[cpu_architecture()]);	dump_cpu_info();	sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS);	sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);	elf_hwcap = list->elf_hwcap;	cpu_proc_init();}static struct machine_desc * __init setup_machine(unsigned int nr){	extern struct machine_desc __arch_info_begin, __arch_info_end;	struct machine_desc *list;	/*	 * locate architecture in the list of supported architectures.	 */	for (list = &__arch_info_begin; list < &__arch_info_end; list++)		if (list->nr == nr)			break;	/*	 * If the architecture type is not recognised, then we	 * can co nothing...	 */	if (list >= &__arch_info_end) {		printk("Architecture configuration botched (nr %d), unable "		       "to continue.\n", nr);		while (1);	}	printk("Machine: %s\n", list->name);	return list;}static void __init early_initrd(char **p){	unsigned long start, size;	start = memparse(*p, p);	if (**p == ',') {		size = memparse((*p) + 1, p);		phys_initrd_start = start;		phys_initrd_size = size;	}}__early_param("initrd=", early_initrd);/* * Pick out the memory size.  We look for mem=size@start, * where start and size are "size[KkMm]" */static void __init early_mem(char **p){	static int usermem __initdata = 0;	unsigned long size, start;	/*	 * If the user specifies memory size, we	 * blow away any automatically generated	 * size.	 */	if (usermem == 0) {		usermem = 1;		meminfo.nr_banks = 0;	}	start = PHYS_OFFSET;	size  = memparse(*p, p);	if (**p == '@')		start = memparse(*p + 1, p);	meminfo.bank[meminfo.nr_banks].start = start;	meminfo.bank[meminfo.nr_banks].size  = size;	meminfo.bank[meminfo.nr_banks].node  = PHYS_TO_NID(start);	meminfo.nr_banks += 1;}__early_param("mem=", early_mem);/* * Initial parsing of the command line. */static void __init parse_cmdline(char **cmdline_p, char *from){	char c = ' ', *to = command_line;	int len = 0;	for (;;) {		if (c == ' ') {			extern struct early_params __early_begin, __early_end;			struct early_params *p;			for (p = &__early_begin; p < &__early_end; p++) {				int len = strlen(p->arg);				if (memcmp(from, p->arg, len) == 0) {					if (to != command_line)						to -= 1;					from += len;					p->fn(&from);					while (*from != ' ' && *from != '\0')						from++;					break;				}			}		}		c = *from++;		if (!c)			break;		if (COMMAND_LINE_SIZE <= ++len)			break;		*to++ = c;	}	*to = '\0';	*cmdline_p = command_line;}static void __initsetup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz){#ifdef CONFIG_BLK_DEV_RAM	extern int rd_size, rd_image_start, rd_prompt, rd_doload;	rd_image_start = image_start;	rd_prompt = prompt;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?