setup.c

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

C
756
字号
	min = pvr & 0xFF;	seq_printf(m, "processor\t: %lu\n", cpu_id);	seq_printf(m, "cpu\t\t: ");	if (cur_cpu_spec->pvr_mask)		seq_printf(m, "%s", cur_cpu_spec->cpu_name);	else		seq_printf(m, "unknown (%08x)", pvr);#ifdef CONFIG_ALTIVEC	if (cur_cpu_spec->cpu_features & CPU_FTR_ALTIVEC)		seq_printf(m, ", altivec supported");#endif /* CONFIG_ALTIVEC */	seq_printf(m, "\n");	/*	 * Assume here that all clock rates are the same in a	 * smp system.  -- Cort	 */	seq_printf(m, "clock\t\t: %lu.%06luMHz\n", ppc_proc_freq / 1000000,		   ppc_proc_freq % 1000000);	seq_printf(m, "revision\t: %hd.%hd\n\n", maj, min);	preempt_enable();	return 0;}static void *c_start(struct seq_file *m, loff_t *pos){	return *pos <= NR_CPUS ? (void *)((*pos)+1) : NULL;}static void *c_next(struct seq_file *m, void *v, loff_t *pos){	++*pos;	return c_start(m, pos);}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 =	show_cpuinfo,};/* * Fetch the cmd_line from open firmware.  */void parse_cmd_line(unsigned long r3, unsigned long r4, unsigned long r5,		  unsigned long r6, unsigned long r7){	cmd_line[0] = 0;#ifdef CONFIG_CMDLINE	strlcpy(cmd_line, CONFIG_CMDLINE, sizeof(cmd_line));#endif /* CONFIG_CMDLINE */#ifdef CONFIG_PPC_PSERIES	{	struct device_node *chosen;	chosen = of_find_node_by_name(NULL, "chosen");	if (chosen != NULL) {		char *p;		p = get_property(chosen, "bootargs", NULL);		if (p != NULL && p[0] != 0)			strlcpy(cmd_line, p, sizeof(cmd_line));		of_node_put(chosen);	}	}#endif	/* 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;	}}#ifdef CONFIG_PPC_PSERIESstatic int __init set_preferred_console(void){	struct device_node *prom_stdout;	char *name;	int offset;	/* The user has requested a console so this is already set up. */	if (strstr(saved_command_line, "console="))		return -EBUSY;	prom_stdout = find_path_device(of_stdout_device);	if (!prom_stdout)		return -ENODEV;	name = (char *)get_property(prom_stdout, "name", NULL);	if (!name)		return -ENODEV;	if (strcmp(name, "serial") == 0) {		int i;		u32 *reg = (u32 *)get_property(prom_stdout, "reg", &i);		if (i > 8) {			switch (reg[1]) {				case 0x3f8:					offset = 0;					break;				case 0x2f8:					offset = 1;					break;				case 0x898:					offset = 2;					break;				case 0x890:					offset = 3;					break;				default:					/* We dont recognise the serial port */					return -ENODEV;			}		}	} else if (strcmp(name, "vty") == 0)		/* pSeries LPAR virtual console */		return add_preferred_console("hvc", 0, NULL);	else if (strcmp(name, "ch-a") == 0)		offset = 0;	else if (strcmp(name, "ch-b") == 0)		offset = 1;	else		return -ENODEV;	return add_preferred_console("ttyS", offset, NULL);}console_initcall(set_preferred_console);int parse_bootinfo(void){	struct bi_record *rec;	rec = prom.bi_recs;	if ( rec == NULL || rec->tag != BI_FIRST )		return -1;	for ( ; rec->tag != BI_LAST ; rec = bi_rec_next(rec) ) {		switch (rec->tag) {		case BI_CMD_LINE:			strlcpy(cmd_line, (void *)rec->data, sizeof(cmd_line));			break;		}	}	return 0;}#endifint __init ppc_init(void){	/* clear the progress line */	ppc_md.progress(" ", 0xffff);	if (ppc_md.init != NULL) {		ppc_md.init();	}	return 0;}arch_initcall(ppc_init);void __init ppc64_calibrate_delay(void){	loops_per_jiffy = tb_ticks_per_jiffy;	printk("Calibrating delay loop... %lu.%02lu BogoMips\n",			       loops_per_jiffy/(500000/HZ),			       loops_per_jiffy/(5000/HZ) % 100);}	extern void (*calibrate_delay)(void);#ifdef CONFIG_IRQSTACKSstatic void __init irqstack_early_init(void){	int i;	/* interrupt stacks must be under 256MB, we cannot afford to take SLB misses on them */	for (i = 0; i < NR_CPUS; i++) {		softirq_ctx[i] = (struct thread_info *)__va(lmb_alloc_base(THREAD_SIZE,					THREAD_SIZE, 0x10000000));		hardirq_ctx[i] = (struct thread_info *)__va(lmb_alloc_base(THREAD_SIZE,					THREAD_SIZE, 0x10000000));	}}#else#define irqstack_early_init()#endif/* * Called into from start_kernel, after lock_kernel has been called. * Initializes bootmem, which is unsed to manage page allocation until * mem_init is called. */void __init setup_arch(char **cmdline_p){	extern int panic_timeout;	extern void do_init_bootmem(void);	calibrate_delay = ppc64_calibrate_delay;	ppc64_boot_msg(0x12, "Setup Arch");#ifdef CONFIG_XMON	if (strstr(cmd_line, "xmon")) {		/* ensure xmon is enabled */		xmon_init();		debugger(0);	}#endif /* CONFIG_XMON */	/*	 * 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 = systemcfg->dCacheL1LineSize; 	icache_bsize = systemcfg->iCacheL1LineSize; 	/* reboot on panic */	panic_timeout = 180;	if (ppc_md.panic)		notifier_chain_register(&panic_notifier_list, &ppc64_panic_block);	init_mm.start_code = PAGE_OFFSET;	init_mm.end_code = (unsigned long) _etext;	init_mm.end_data = (unsigned long) _edata;	init_mm.brk = klimit;		/* Save unparsed command line copy for /proc/cmdline */	strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);	*cmdline_p = cmd_line;	irqstack_early_init();	/* set up the bootmem stuff with available memory */	do_init_bootmem();	ppc_md.setup_arch();	paging_init();	ppc64_boot_msg(0x15, "Setup Done");}/* ToDo: do something useful if ppc_md is not yet setup. */#define PPC64_LINUX_FUNCTION 0x0f000000#define PPC64_IPL_MESSAGE 0xc0000000#define PPC64_TERM_MESSAGE 0xb0000000#define PPC64_ATTN_MESSAGE 0xa0000000#define PPC64_DUMP_MESSAGE 0xd0000000static void ppc64_do_msg(unsigned int src, const char *msg){	if (ppc_md.progress) {		char buf[32];		sprintf(buf, "%08x        \n", src);		ppc_md.progress(buf, 0);		sprintf(buf, "%-16s", msg);		ppc_md.progress(buf, 0);	}}/* Print a boot progress message. */void ppc64_boot_msg(unsigned int src, const char *msg){	ppc64_do_msg(PPC64_LINUX_FUNCTION|PPC64_IPL_MESSAGE|src, msg);	printk("[boot]%04x %s\n", src, msg);}/* Print a termination message (print only -- does not stop the kernel) */void ppc64_terminate_msg(unsigned int src, const char *msg){	ppc64_do_msg(PPC64_LINUX_FUNCTION|PPC64_TERM_MESSAGE|src, msg);	printk("[terminate]%04x %s\n", src, msg);}/* Print something that needs attention (device error, etc) */void ppc64_attention_msg(unsigned int src, const char *msg){	ppc64_do_msg(PPC64_LINUX_FUNCTION|PPC64_ATTN_MESSAGE|src, msg);	printk("[attention]%04x %s\n", src, msg);}/* Print a dump progress message. */void ppc64_dump_msg(unsigned int src, const char *msg){	ppc64_do_msg(PPC64_LINUX_FUNCTION|PPC64_DUMP_MESSAGE|src, msg);	printk("[dump]%04x %s\n", src, msg);}int set_spread_lpevents( char * str ){	/* The parameter is the number of processors to share in processing lp events */	unsigned long i;	unsigned long val = simple_strtoul( str, NULL, 0 );	if ( ( val > 0 ) && ( val <= NR_CPUS ) ) {		for ( i=1; i<val; ++i )			paca[i].lpqueue_ptr = paca[0].lpqueue_ptr;		printk("lpevent processing spread over %ld processors\n", val);	}	else		printk("invalid spreaqd_lpevents %ld\n", val);	return 1;}	/* This should only be called on processor 0 during calibrate decr */void setup_default_decr(void){	struct paca_struct *lpaca = get_paca();	if ( decr_overclock_set && !decr_overclock_proc0_set )		decr_overclock_proc0 = decr_overclock;	lpaca->default_decr = tb_ticks_per_jiffy / decr_overclock_proc0;		lpaca->next_jiffy_update_tb = get_tb() + tb_ticks_per_jiffy;}int set_decr_overclock_proc0( char * str ){	unsigned long val = simple_strtoul( str, NULL, 0 );	if ( ( val >= 1 ) && ( val <= 48 ) ) {		decr_overclock_proc0_set = 1;		decr_overclock_proc0 = val;		printk("proc 0 decrementer overclock factor of %ld\n", val);	}	else		printk("invalid proc 0 decrementer overclock factor of %ld\n", val);	return 1;}int set_decr_overclock( char * str ){	unsigned long val = simple_strtoul( str, NULL, 0 );	if ( ( val >= 1 ) && ( val <= 48 ) ) {		decr_overclock_set = 1;		decr_overclock = val;		printk("decrementer overclock factor of %ld\n", val);	}	else		printk("invalid decrementer overclock factor of %ld\n", val);	return 1;}__setup("spread_lpevents=", set_spread_lpevents );__setup("decr_overclock_proc0=", set_decr_overclock_proc0 );__setup("decr_overclock=", set_decr_overclock );

⌨️ 快捷键说明

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