📄 setup.c
字号:
#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 + -