⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setup.c

📁 上传linux-jx2410的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  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/kernel.h>#include <linux/stddef.h>#include <linux/ioport.h>#include <linux/delay.h>#include <linux/utsname.h>#include <linux/blk.h>#include <linux/console.h>#include <linux/bootmem.h>#include <linux/seq_file.h>#include <linux/init.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/mach/arch.h>#include <asm/mach/irq.h>#ifndef MEM_SIZE#define MEM_SIZE	(16*1024*1024)#endif#ifndef CONFIG_CMDLINE#define CONFIG_CMDLINE ""#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 param_struct *params, int mem_init);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;unsigned int system_rev;unsigned int system_serial_low;unsigned int system_serial_high;unsigned int elf_hwcap;#ifdef MULTI_CPUstruct processor processor;#endifunsigned char aux_device_present;char elf_platform[ELF_PLATFORM_SIZE];char saved_command_line[COMMAND_LINE_SIZE];static struct meminfo meminfo __initdata = { 0, };static struct proc_info_item proc_info;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]#ifdef CONFIG_CPU_32static const char *cache_types[16] = {	"write-through",	"write-back",	"write-back",	"undefined 3",	"undefined 4",	"undefined 5",	"write-back",	"write-back",	"undefined 8",	"undefined 9",	"undefined 10",	"undefined 11",	"undefined 12",	"undefined 13",	"undefined 14",	"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",	"undefined 14",	"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",	"undefined 14",	"undefined 15",};#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 size %dK associativity %d line length %d sets %d\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 inline void dump_cpu_cache_id(void){	unsigned int cache_info;	asm("mrc p15, 0, %0, c0, c0, 1" : "=r" (cache_info));	if (cache_info == processor_id)		return;	printk("CPU: D %s cache\n", cache_types[CACHE_TYPE(cache_info)]);	if (CACHE_S(cache_info)) {		dump_cache("CPU: I cache", CACHE_ISIZE(cache_info));		dump_cache("CPU: D cache", CACHE_DSIZE(cache_info));	} else {		dump_cache("CPU: cache", CACHE_ISIZE(cache_info));	}}#else#define dump_cpu_cache_id() do { } while (0)#endifstatic 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);	}	proc_info = *list->info;#ifdef MULTI_CPU	processor = *list->proc;#endif	printk("CPU: %s %s revision %d\n",	       proc_info.manufacturer, proc_info.cpu_name,	       (int)processor_id & 15);	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;}/* * Initial parsing of the command line.  We need to pick out the * memory size.  We look for mem=size@start, where start and size * are "size[KkMm]" */static void __initparse_cmdline(struct meminfo *mi, char **cmdline_p, char *from){	char c = ' ', *to = command_line;	int usermem = 0, len = 0;	for (;;) {		if (c == ' ' && !memcmp(from, "mem=", 4)) {			unsigned long size, start;			if (to != command_line)				to -= 1;			/*			 * If the user specifies memory size, we			 * blow away any automatically generated			 * size.			 */			if (usermem == 0) {				usermem = 1;				mi->nr_banks = 0;			}			start = PHYS_OFFSET;			size  = memparse(from + 4, &from);			if (*from == '@')				start = memparse(from + 1, &from);			mi->bank[mi->nr_banks].start = start;			mi->bank[mi->nr_banks].size  = size;			mi->bank[mi->nr_banks].node  = PHYS_TO_NID(start);			mi->nr_banks += 1;		}		c = *from++;		if (!c)			break;		if (COMMAND_LINE_SIZE <= ++len)			break;		*to++ = c;	}	*to = '\0';	*cmdline_p = command_line;}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 = image_start;	rd_prompt = prompt;	rd_doload = doload;	if (rd_sz)		rd_size = rd_sz;#endif}/* * initial ram disk */void __init setup_initrd(unsigned int start, unsigned int size){#ifdef CONFIG_BLK_DEV_INITRD	if (start == 0)		size = 0;	initrd_start = start;	initrd_end   = start + size;#endif}static void __initrequest_standard_resources(struct meminfo *mi, struct machine_desc *mdesc){	struct resource *res;	int i;	kernel_code.start  = __virt_to_phys(init_mm.start_code);	kernel_code.end    = __virt_to_phys(init_mm.end_code - 1);	kernel_data.start  = __virt_to_phys(init_mm.end_code);	kernel_data.end    = __virt_to_phys(init_mm.brk - 1);	for (i = 0; i < mi->nr_banks; i++) {		unsigned long virt_start, virt_end;		if (mi->bank[i].size == 0)			continue;		virt_start = __phys_to_virt(mi->bank[i].start);		virt_end   = virt_start + mi->bank[i].size - 1;		res = alloc_bootmem_low(sizeof(*res));		res->name  = "System RAM";		res->start = __virt_to_phys(virt_start);		res->end   = __virt_to_phys(virt_end);		res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;		request_resource(&iomem_resource, res);		if (kernel_code.start >= res->start &&		    kernel_code.end <= res->end)			request_resource(res, &kernel_code);		if (kernel_data.start >= res->start &&		    kernel_data.end <= res->end)			request_resource(res, &kernel_data);	}	if (mdesc->video_start) {		video_ram.start = mdesc->video_start;		video_ram.end   = mdesc->video_end;		request_resource(&iomem_resource, &video_ram);

⌨️ 快捷键说明

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