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

📄 setup.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef CONFIG_MACH_SPECIFICvoid __initintuit_machine_type(void){	char *model;	struct device_node *root;				/* ask the OF info if we're a chrp or pmac */	root = find_path_device("/");	if (root != 0) {		/* assume pmac unless proven to be chrp -- Cort */		_machine = _MACH_Pmac;		model = get_property(root, "device_type", NULL);		if (model && !strncmp("chrp", model, 4))			_machine = _MACH_chrp;		else {			model = get_property(root, "model", NULL);			if (model && !strncmp(model, "IBM", 3))				_machine = _MACH_chrp;		}	}}#endif /* CONFIG_MACH_SPECIFIC *//* * Find out what kind of machine we're on and save any data we need * from the early boot process (devtree is copied on pmac by prom_init() ) */unsigned long __initidentify_machine(unsigned long r3, unsigned long r4, unsigned long r5,		 unsigned long r6, unsigned long r7){	parse_bootinfo();	if ( ppc_md.progress ) ppc_md.progress("id mach(): start", 0x100);	#if !defined(CONFIG_4xx) && !defined(CONFIG_8xx) && !defined(CONFIG_8260)#ifndef CONFIG_MACH_SPECIFIC	/* if we didn't get any bootinfo telling us what we are... */	if ( _machine == 0 )	{		/* boot loader will tell us if we're APUS */		if ( r3 == 0x61707573 )		{			_machine = _MACH_apus;			r3 = 0;		}		/* prep boot loader tells us if we're prep or not */		else if ( *(unsigned long *)(KERNELBASE) == (0xdeadc0de) )		{			_machine = _MACH_prep;		} else			have_of = 1;	}#endif /* CONFIG_MACH_SPECIFIC */	if ( have_of )	{		/* prom_init has already been called from __start */		if (boot_infos)			relocate_nodes();#ifndef CONFIG_MACH_SPECIFIC		/* we need to set _machine before calling finish_device_tree */		if (_machine == 0)			intuit_machine_type();#endif /* CONFIG_MACH_SPECIFIC */		finish_device_tree();		/*		 * If we were booted via quik, r3 points to the physical		 * address of the command-line parameters.		 * If we were booted from an xcoff image (i.e. netbooted or		 * booted from floppy), we get the command line from the		 * bootargs property of the /chosen node.		 * If an initial ramdisk is present, r3 and r4		 * are used for initrd_start and initrd_size,		 * otherwise they contain 0xdeadbeef.  		 */		cmd_line[0] = 0;		if (r3 >= 0x4000 && r3 < 0x800000 && r4 == 0) {			strncpy(cmd_line, (char *)r3 + KERNELBASE,				sizeof(cmd_line));		} else if (boot_infos != 0) {			/* booted by BootX - check for ramdisk */			if (boot_infos->kernelParamsOffset != 0)				strncpy(cmd_line, (char *) boot_infos					+ boot_infos->kernelParamsOffset,					sizeof(cmd_line));#ifdef CONFIG_BLK_DEV_INITRD			if (boot_infos->ramDisk) {				initrd_start = (unsigned long) boot_infos					+ boot_infos->ramDisk;				initrd_end = initrd_start + boot_infos->ramDiskSize;				initrd_below_start_ok = 1;			}#endif		} else {			struct device_node *chosen;			char *p;			#ifdef CONFIG_BLK_DEV_INITRD			if (r3 && r4 && r4 != 0xdeadbeef)			{				if (r3 < KERNELBASE)					r3 += KERNELBASE;				initrd_start = r3;				initrd_end = r3 + r4;				ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);				initrd_below_start_ok = 1;			}#endif			cmd_line[0] = 0;			chosen = find_devices("chosen");			if (chosen != NULL) {				p = get_property(chosen, "bootargs", NULL);				if (p != NULL)					strncpy(cmd_line, p, sizeof(cmd_line));			}		}		cmd_line[sizeof(cmd_line) - 1] = 0;	}	switch (_machine)	{	case _MACH_Pmac:                pmac_init(r3, r4, r5, r6, r7);		break;	case _MACH_prep:                prep_init(r3, r4, r5, r6, r7);		break;	case _MACH_chrp:                chrp_init(r3, r4, r5, r6, r7);		break;#ifdef CONFIG_APUS	case _MACH_apus:                apus_init(r3, r4, r5, r6, r7);		break;#endif#ifdef CONFIG_GEMINI	case _MACH_gemini:		gemini_init(r3, r4, r5, r6, r7);		break;#endif	default:		printk("Unknown machine type in identify_machine!\n");	}	/* Check for nobats option (used in mapin_ram). */	if (strstr(cmd_line, "nobats")) {		extern int __map_without_bats;		__map_without_bats = 1;	}#else#if defined(CONFIG_4xx)	oak_init(r3, r4, r5, r6, r7);#elif defined(CONFIG_8xx)        m8xx_init(r3, r4, r5, r6, r7);#elif defined(CONFIG_8260)        m8260_init(r3, r4, r5, r6, r7);#else#error "No board type has been defined for identify_machine()!"#endif /* CONFIG_4xx */#endif /* !CONFIG_4xx && !CONFIG_8xx */	/* Look for mem= option on command line */	if (strstr(cmd_line, "mem=")) {		char *p, *q;		unsigned long maxmem = 0;		extern unsigned long __max_memory;		for (q = cmd_line; (p = strstr(q, "mem=")) != 0; ) {			q = p + 4;			if (p > cmd_line && p[-1] != ' ')				continue;			maxmem = simple_strtoul(q, &q, 0);			if (*q == 'k' || *q == 'K') {				maxmem <<= 10;				++q;			} else if (*q == 'm' || *q == 'M') {				maxmem <<= 20;				++q;			}		}		__max_memory = maxmem;	}	/* this is for modules since _machine can be a define -- Cort */	ppc_md.ppc_machine = _machine;	if ( ppc_md.progress ) ppc_md.progress("id mach(): done", 0x200);	return 0;}int parse_bootinfo(void){	struct bi_record *rec;	extern char __bss_start[];	extern char *sysmap;	extern unsigned long sysmap_size;	rec = (struct bi_record *)_ALIGN((ulong)__bss_start+(1<<20)-1,(1<<20));	if ( rec->tag != BI_FIRST )	{		/*		 * This 0x10000 offset is a terrible hack but it will go away when		 * we have the bootloader handle all the relocation and		 * prom calls -- Cort		 */		rec = (struct bi_record *)_ALIGN((ulong)__bss_start+0x10000+(1<<20)-1,(1<<20));		if ( rec->tag != BI_FIRST )			return -1;	}	for ( ; rec->tag != BI_LAST ;	      rec = (struct bi_record *)((ulong)rec + rec->size) )	{		ulong *data = rec->data;		switch (rec->tag)		{		case BI_CMD_LINE:			memcpy(cmd_line, (void *)data, rec->size);			break;		case BI_SYSMAP:			sysmap = (char *)((data[0] >= (KERNELBASE)) ? data[0] :					  (data[0]+KERNELBASE));			sysmap_size = data[1];			break;#ifdef CONFIG_BLK_DEV_INITRD		case BI_INITRD:			initrd_start = data[0];			initrd_end = data[0] + rec->size;			break;#endif /* CONFIG_BLK_DEV_INITRD */#ifndef CONFIG_MACH_SPECIFIC		case BI_MACHTYPE:			_machine = data[0];			have_of = data[1];			break;#endif /* CONFIG_MACH_SPECIFIC */		}	}	return 0;}/* Checks "l2cr=xxxx" command-line option */int ppc_setup_l2cr(char *str){	if ( ((_get_PVR() >> 16) == 8) || ((_get_PVR() >> 16) == 12) )	{		unsigned long val = simple_strtoul(str, NULL, 0);		printk(KERN_INFO "l2cr set to %lx\n", val);                _set_L2CR(0);           /* force invalidate by disable cache */                _set_L2CR(val);         /* and enable it */	}	return 1;}__setup("l2cr=", ppc_setup_l2cr);void __init ppc_init(void){	/* clear the progress line */	if ( ppc_md.progress ) ppc_md.progress(" ", 0xffff);		if (ppc_md.init != NULL) {		ppc_md.init();	}}void __init setup_arch(char **cmdline_p){	extern int panic_timeout;	extern char _etext[], _edata[];	extern char *klimit;	extern void do_init_bootmem(void);	/* so udelay does something sensible, assume <= 1000 bogomips */	loops_per_sec = 500000000;#ifdef CONFIG_ALL_PPC	feature_init();#endif#ifdef CONFIG_XMON	xmon_map_scc();	if (strstr(cmd_line, "xmon"))		xmon(0);#endif /* CONFIG_XMON */	if ( ppc_md.progress ) ppc_md.progress("setup_arch: enter", 0x3eab);#if defined(CONFIG_KGDB)	kgdb_map_scc();	set_debug_traps();	breakpoint();#endif	/*	 * Set cache line size based on type of cpu as a default.	 * Systems with OF can look in the properties on the cpu node(s)	 * for a possibly more accurate value.	 */	dcache_bsize = icache_bsize = 32;	/* most common value */	switch (_get_PVR() >> 16) {	case 1:		/* 601, with unified cache */		ucache_bsize = 32;		break;	/* XXX need definitions in here for 8xx etc. */	case 0x40:	case 0x41:	case 0x35:	/* 64-bit POWER3, POWER3+, POWER4 */		dcache_bsize = icache_bsize = 128;		break;	}	/* reboot on panic */	panic_timeout = 180;	init_mm.start_code = PAGE_OFFSET;	init_mm.end_code = (unsigned long) _etext;	init_mm.end_data = (unsigned long) _edata;	init_mm.brk = (unsigned long) klimit;		/* Save unparsed command line copy for /proc/cmdline */	strcpy(saved_command_line, cmd_line);	*cmdline_p = cmd_line;	/* set up the bootmem stuff with available memory */	do_init_bootmem();	if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab);	ppc_md.setup_arch();	if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab);	paging_init();	sort_exception_table();}void ppc_generic_ide_fix_driveid(struct hd_driveid *id){        int i;	unsigned short *stringcast;	id->config         = __le16_to_cpu(id->config);	id->cyls           = __le16_to_cpu(id->cyls);	id->reserved2      = __le16_to_cpu(id->reserved2);	id->heads          = __le16_to_cpu(id->heads);	id->track_bytes    = __le16_to_cpu(id->track_bytes);	id->sector_bytes   = __le16_to_cpu(id->sector_bytes);	id->sectors        = __le16_to_cpu(id->sectors);	id->vendor0        = __le16_to_cpu(id->vendor0);	id->vendor1        = __le16_to_cpu(id->vendor1);	id->vendor2        = __le16_to_cpu(id->vendor2);	stringcast = (unsigned short *)&id->serial_no[0];	for (i = 0; i < (20/2); i++)	        stringcast[i] = __le16_to_cpu(stringcast[i]);	id->buf_type       = __le16_to_cpu(id->buf_type);	id->buf_size       = __le16_to_cpu(id->buf_size);	id->ecc_bytes      = __le16_to_cpu(id->ecc_bytes);	stringcast = (unsigned short *)&id->fw_rev[0];	for (i = 0; i < (8/2); i++)	        stringcast[i] = __le16_to_cpu(stringcast[i]);	stringcast = (unsigned short *)&id->model[0];	for (i = 0; i < (40/2); i++)	        stringcast[i] = __le16_to_cpu(stringcast[i]);	id->dword_io       = __le16_to_cpu(id->dword_io);	id->reserved50     = __le16_to_cpu(id->reserved50);	id->field_valid    = __le16_to_cpu(id->field_valid);	id->cur_cyls       = __le16_to_cpu(id->cur_cyls);	id->cur_heads      = __le16_to_cpu(id->cur_heads);	id->cur_sectors    = __le16_to_cpu(id->cur_sectors);	id->cur_capacity0  = __le16_to_cpu(id->cur_capacity0);	id->cur_capacity1  = __le16_to_cpu(id->cur_capacity1);	id->lba_capacity   = __le32_to_cpu(id->lba_capacity);	id->dma_1word      = __le16_to_cpu(id->dma_1word);	id->dma_mword      = __le16_to_cpu(id->dma_mword);	id->eide_pio_modes = __le16_to_cpu(id->eide_pio_modes);	id->eide_dma_min   = __le16_to_cpu(id->eide_dma_min);	id->eide_dma_time  = __le16_to_cpu(id->eide_dma_time);	id->eide_pio       = __le16_to_cpu(id->eide_pio);	id->eide_pio_iordy = __le16_to_cpu(id->eide_pio_iordy);	for (i = 0; i < 2; i++)		id->words69_70[i] = __le16_to_cpu(id->words69_70[i]);        for (i = 0; i < 4; i++)                id->words71_74[i] = __le16_to_cpu(id->words71_74[i]);	id->queue_depth	   = __le16_to_cpu(id->queue_depth);	for (i = 0; i < 4; i++)		id->words76_79[i] = __le16_to_cpu(id->words76_79[i]);	id->major_rev_num  = __le16_to_cpu(id->major_rev_num);	id->minor_rev_num  = __le16_to_cpu(id->minor_rev_num);	id->command_set_1  = __le16_to_cpu(id->command_set_1);	id->command_set_2  = __le16_to_cpu(id->command_set_2);	id->cfsse          = __le16_to_cpu(id->cfsse);	id->cfs_enable_1   = __le16_to_cpu(id->cfs_enable_1);	id->cfs_enable_2   = __le16_to_cpu(id->cfs_enable_2);	id->csf_default    = __le16_to_cpu(id->csf_default);	id->dma_ultra      = __le16_to_cpu(id->dma_ultra);	id->word89         = __le16_to_cpu(id->word89);	id->word90         = __le16_to_cpu(id->word90);	id->CurAPMvalues   = __le16_to_cpu(id->CurAPMvalues);	id->word92         = __le16_to_cpu(id->word92);	id->hw_config      = __le16_to_cpu(id->hw_config);	for (i = 0; i < 32; i++)		id->words94_125[i]  = __le16_to_cpu(id->words94_125[i]);	id->last_lun       = __le16_to_cpu(id->last_lun);	id->word127        = __le16_to_cpu(id->word127);	id->dlf            = __le16_to_cpu(id->dlf);	id->csfo           = __le16_to_cpu(id->csfo);	for (i = 0; i < 26; i++)		id->words130_155[i] = __le16_to_cpu(id->words130_155[i]);	id->word156        = __le16_to_cpu(id->word156);	for (i = 0; i < 3; i++)		id->words157_159[i] = __le16_to_cpu(id->words157_159[i]);	for (i = 0; i < 96; i++)		id->words160_255[i] = __le16_to_cpu(id->words160_255[i]);}

⌨️ 快捷键说明

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