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 + -
显示快捷键?