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

📄 setup.c

📁 上传linux-jx2410的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	/*	 * Some machines don't have the possibility of ever	 * possessing lp0, lp1 or lp2	 */	if (mdesc->reserve_lp0)		request_resource(&ioport_resource, &lp0);	if (mdesc->reserve_lp1)		request_resource(&ioport_resource, &lp1);	if (mdesc->reserve_lp2)		request_resource(&ioport_resource, &lp2);}/* *  Tag parsing. * * This is the new way of passing data to the kernel at boot time.  Rather * than passing a fixed inflexible structure to the kernel, we pass a list * of variable-sized tags to the kernel.  The first tag must be a ATAG_CORE * tag for the list to be recognised (to distinguish the tagged list from * a param_struct).  The list is terminated with a zero-length tag (this tag * is not parsed in any way). */static int __init parse_tag_core(const struct tag *tag){	if (tag->hdr.size > 2) {		if ((tag->u.core.flags & 1) == 0)			root_mountflags &= ~MS_RDONLY;		ROOT_DEV = to_kdev_t(tag->u.core.rootdev);	}	return 0;}__tagtable(ATAG_CORE, parse_tag_core);static int __init parse_tag_mem32(const struct tag *tag){	if (meminfo.nr_banks >= NR_BANKS) {		printk(KERN_WARNING		       "Ignoring memory bank 0x%08x size %dKB\n",			tag->u.mem.start, tag->u.mem.size / 1024);		return -EINVAL;	}	meminfo.bank[meminfo.nr_banks].start = tag->u.mem.start;	meminfo.bank[meminfo.nr_banks].size  = tag->u.mem.size;	meminfo.bank[meminfo.nr_banks].node  = PHYS_TO_NID(tag->u.mem.start);	meminfo.nr_banks += 1;	return 0;}__tagtable(ATAG_MEM, parse_tag_mem32);#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)struct screen_info screen_info = { orig_video_lines:	30, orig_video_cols:	80, orig_video_mode:	0, orig_video_ega_bx:	0, orig_video_isVGA:	1, orig_video_points:	8};static int __init parse_tag_videotext(const struct tag *tag){	screen_info.orig_x            = tag->u.videotext.x;	screen_info.orig_y            = tag->u.videotext.y;	screen_info.orig_video_page   = tag->u.videotext.video_page;	screen_info.orig_video_mode   = tag->u.videotext.video_mode;	screen_info.orig_video_cols   = tag->u.videotext.video_cols;	screen_info.orig_video_ega_bx = tag->u.videotext.video_ega_bx;	screen_info.orig_video_lines  = tag->u.videotext.video_lines;	screen_info.orig_video_isVGA  = tag->u.videotext.video_isvga;	screen_info.orig_video_points = tag->u.videotext.video_points;	return 0;}__tagtable(ATAG_VIDEOTEXT, parse_tag_videotext);#endifstatic int __init parse_tag_ramdisk(const struct tag *tag){	setup_ramdisk((tag->u.ramdisk.flags & 1) == 0,		      (tag->u.ramdisk.flags & 2) == 0,		      tag->u.ramdisk.start, tag->u.ramdisk.size);	return 0;}__tagtable(ATAG_RAMDISK, parse_tag_ramdisk);static int __init parse_tag_initrd(const struct tag *tag){	setup_initrd(tag->u.initrd.start, tag->u.initrd.size);	return 0;}__tagtable(ATAG_INITRD, parse_tag_initrd);static int __init parse_tag_initrd2(const struct tag *tag){	unsigned long start = 0;	if (tag->u.initrd.size) {		start = (unsigned long)phys_to_virt(tag->u.initrd.start);		setup_initrd(start, tag->u.initrd.size);	}	return 0;}__tagtable(ATAG_INITRD2, parse_tag_initrd2);static int __init parse_tag_serialnr(const struct tag *tag){	system_serial_low = tag->u.serialnr.low;	system_serial_high = tag->u.serialnr.high;	return 0;}__tagtable(ATAG_SERIAL, parse_tag_serialnr);static int __init parse_tag_revision(const struct tag *tag){	system_rev = tag->u.revision.rev;	return 0;}__tagtable(ATAG_REVISION, parse_tag_revision);static int __init parse_tag_cmdline(const struct tag *tag){#ifndef CONFIG_NO_TAG_CMDLINE	strncpy(default_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);#endif	default_command_line[COMMAND_LINE_SIZE - 1] = '\0';	return 0;}__tagtable(ATAG_CMDLINE, parse_tag_cmdline);/* * Scan the tag table for this tag, and call its parse function. * The tag table is built by the linker from all the __tagtable * declarations. */static int __init parse_tag(const struct tag *tag){	extern struct tagtable __tagtable_begin, __tagtable_end;	struct tagtable *t;	for (t = &__tagtable_begin; t < &__tagtable_end; t++)		if (tag->hdr.tag == t->tag) {			t->parse(tag);			break;		}	return t < &__tagtable_end;}/* * Parse all tags in the list, checking both the global and architecture * specific tag tables. */static void __init parse_tags(const struct tag *t){	for (; t->hdr.size; t = tag_next(t))		if (!parse_tag(t))			printk(KERN_WARNING				"Ignoring unrecognised tag 0x%08x\n",				t->hdr.tag);}void __init setup_arch(char **cmdline_p){	struct tag *tags = NULL;	struct machine_desc *mdesc;	char *from = default_command_line;	ROOT_DEV = MKDEV(0, 255);	setup_processor();	mdesc = setup_machine(machine_arch_type);	machine_name = mdesc->name;	if (mdesc->soft_reboot)		reboot_setup("s");	if (mdesc->param_offset)		tags = phys_to_virt(mdesc->param_offset);	/*	 * Do the machine-specific fixups before we parse the	 * parameters or tags.	 */	if (mdesc->fixup)		mdesc->fixup(mdesc, (struct param_struct *)tags,			     &from, &meminfo);	/*	 * If we have the old style parameters, convert them to	 * a tag list before.	 */	if (tags && tags->hdr.tag != ATAG_CORE)		convert_to_tag_list((struct param_struct *)tags,				    meminfo.nr_banks == 0);	if (tags && tags->hdr.tag == ATAG_CORE)		parse_tags(tags);	if (meminfo.nr_banks == 0) {		meminfo.nr_banks      = 1;		meminfo.bank[0].start = PHYS_OFFSET;		meminfo.bank[0].size  = MEM_SIZE;	}	init_mm.start_code = (unsigned long) &_text;	init_mm.end_code   = (unsigned long) &_etext;	init_mm.end_data   = (unsigned long) &_edata;	init_mm.brk	   = (unsigned long) &_end;	memcpy(saved_command_line, from, COMMAND_LINE_SIZE);	saved_command_line[COMMAND_LINE_SIZE-1] = '\0';	parse_cmdline(&meminfo, cmdline_p, from);	bootmem_init(&meminfo);	paging_init(&meminfo, mdesc);	request_standard_resources(&meminfo, mdesc);	/*	 * Set up various architecture-specific pointers	 */	init_arch_irq = mdesc->init_irq;#ifdef CONFIG_VT#if defined(CONFIG_VGA_CONSOLE)	conswitchp = &vga_con;#elif defined(CONFIG_DUMMY_CONSOLE)	conswitchp = &dummy_con;#endif#endif}static const char *hwcap_str[] = {	"swp",	"half",	"thumb",	"26bit",	"fastmult",	"fpa",	"vfp",	"edsp",	NULL};static const char *proc_arch[16] = {	"undefined 0",	"4",	"4T",	"5",	"5T",	"5TE",	"undefined 6",	"undefined 7",	"undefined 8",	"undefined 9",	"undefined 10",	"undefined 11",	"undefined 12",	"undefined 13",	"undefined 14",	"undefined 15"};static voidc_show_cache(struct seq_file *m, const char *type, unsigned int cache){	unsigned int mult = 2 + CACHE_M(cache) ? 1 : 0;	seq_printf(m, "%s size\t\t: %d\n"		      "%s assoc\t\t: %d\n"		      "%s line length\t: %d\n"		      "%s sets\t\t: %d\n",		type, mult << (8 + CACHE_SIZE(cache)),		type, (mult << CACHE_ASSOC(cache)) >> 1,		type, 8 << CACHE_LINE(cache),		type, 1 << (6 + CACHE_SIZE(cache) - CACHE_ASSOC(cache) -			    CACHE_LINE(cache)));}static int c_show(struct seq_file *m, void *v){	int i;	seq_printf(m, "Processor\t: %s %s rev %d (%s)\n",		   proc_info.manufacturer, proc_info.cpu_name,		   (int)processor_id & 15, elf_platform);	seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",		   loops_per_jiffy / (500000/HZ),		   (loops_per_jiffy / (5000/HZ)) % 100);	/* dump out the processor features */	seq_puts(m, "Features\t: ");	for (i = 0; hwcap_str[i]; i++)		if (elf_hwcap & (1 << i))			seq_printf(m, "%s ", hwcap_str[i]);	seq_puts(m, "\n");	if ((processor_id & 0x0000f000) == 0x00000000) {		/* pre-ARM7 */		seq_printf(m, "CPU part\t\t: %07x\n", processor_id >> 4);	} else if ((processor_id & 0x0000f000) == 0x00007000) {		/* ARM7 */		seq_printf(m, "CPU implementor\t: 0x%02x\n"			      "CPU architecture: %s\n"			      "CPU variant\t: 0x%02x\n"			      "CPU part\t: 0x%03x\n",			   processor_id >> 24,			   processor_id & (1 << 23) ? "4T" : "3",			   (processor_id >> 16) & 127,			   (processor_id >> 4) & 0xfff);	} else {		/* post-ARM7 */		seq_printf(m, "CPU implementor\t: 0x%02x\n"			      "CPU architecture: %s\n"			      "CPU variant\t: 0x%x\n"			      "CPU part\t: 0x%03x\n",			   processor_id >> 24,			   proc_arch[(processor_id >> 16) & 15],			   (processor_id >> 20) & 15,			   (processor_id >> 4) & 0xfff);	}	seq_printf(m, "CPU revision\t: %d\n", processor_id & 15);#ifdef CONFIG_CPU_32	{		unsigned int cache_info;		asm("mrc p15, 0, %0, c0, c0, 1" : "=r" (cache_info));		if (cache_info != processor_id) {			seq_printf(m, "Cache type\t: %s\n"				      "Cache clean\t: %s\n"				      "Cache lockdown\t: %s\n"				      "Cache unified\t: %s\n",				   cache_types[CACHE_TYPE(cache_info)],				   cache_clean[CACHE_TYPE(cache_info)],				   cache_lockdown[CACHE_TYPE(cache_info)],				   CACHE_S(cache_info) ? "harvard" : "unified");			if (CACHE_S(cache_info)) {				c_show_cache(m, "I", CACHE_ISIZE(cache_info));				c_show_cache(m, "D", CACHE_DSIZE(cache_info));			} else {				c_show_cache(m, "Cache", CACHE_ISIZE(cache_info));			}		}	}#endif	seq_puts(m, "\n");	seq_printf(m, "Hardware\t: %s\n", machine_name);	seq_printf(m, "Revision\t: %04x\n", system_rev);	seq_printf(m, "Serial\t\t: %08x%08x\n",		   system_serial_high, system_serial_low);	return 0;}static void *c_start(struct seq_file *m, loff_t *pos){	return *pos < 1 ? (void *)1 : NULL;}static void *c_next(struct seq_file *m, void *v, loff_t *pos){	++*pos;	return NULL;}static void c_stop(struct seq_file *m, void *v){}struct seq_operations cpuinfo_op = {	start:	c_start,	next:	c_next,	stop:	c_stop,	show:	c_show};

⌨️ 快捷键说明

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