📄 pmac_setup.c
字号:
int boot_part;extern kdev_t boot_dev;void __initpmac_init2(void){#ifdef CONFIG_ADB_PMU via_pmu_start();#endif#ifdef CONFIG_ADB_CUDA via_cuda_start();#endif#ifdef CONFIG_PMAC_PBOOK media_bay_init();#endif pmac_feature_late_init();}#ifdef CONFIG_SCSIvoid __initnote_scsi_host(struct device_node *node, void *host){ int l; char *p; l = strlen(node->full_name); if (bootpath != NULL && bootdevice != NULL && strncmp(node->full_name, bootdevice, l) == 0 && (bootdevice[l] == '/' || bootdevice[l] == 0)) { boot_host = host; /* * There's a bug in OF 1.0.5. (Why am I not surprised.) * If you pass a path like scsi/sd@1:0 to canon, it returns * something like /bandit@F2000000/gc@10/53c94@10000/sd@0,0 * That is, the scsi target number doesn't get preserved. * So we pick the target number out of bootpath and use that. */ p = strstr(bootpath, "/sd@"); if (p != NULL) { p += 4; boot_target = simple_strtoul(p, NULL, 10); p = strchr(p, ':'); if (p != NULL) boot_part = simple_strtoul(p + 1, NULL, 10); } }}#endif#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)kdev_t __initfind_ide_boot(void){ char *p; int n; kdev_t __init pmac_find_ide_boot(char *bootdevice, int n); if (bootdevice == NULL) return 0; p = strrchr(bootdevice, '/'); if (p == NULL) return 0; n = p - bootdevice; return pmac_find_ide_boot(bootdevice, n);}#endif /* CONFIG_BLK_DEV_IDE && CONFIG_BLK_DEV_IDE_PMAC */void __initfind_boot_device(void){#if defined(CONFIG_SCSI) && defined(CONFIG_BLK_DEV_SD) if (boot_host != NULL) { boot_dev = sd_find_target(boot_host, boot_target); if (boot_dev != 0) return; }#endif#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) boot_dev = find_ide_boot();#endif}/* can't be __init - can be called whenever a disk is first accessed */void __pmacnote_bootable_part(kdev_t dev, int part, int goodness){ static int found_boot = 0; char *p; /* Do nothing if the root has been mounted already. */ if (init_task.fs->rootmnt != NULL) return; if ((goodness <= current_root_goodness) && (ROOT_DEV != to_kdev_t(DEFAULT_ROOT_DEVICE))) return; p = strstr(saved_command_line, "root="); if (p != NULL && (p == saved_command_line || p[-1] == ' ')) return; if (!found_boot) { find_boot_device(); found_boot = 1; } if (boot_dev == 0 || dev == boot_dev) { ROOT_DEV = MKDEV(MAJOR(dev), MINOR(dev) + part); boot_dev = NODEV; current_root_goodness = goodness; }}void __pmacpmac_restart(char *cmd){#ifdef CONFIG_ADB_CUDA struct adb_request req;#endif /* CONFIG_ADB_CUDA */#ifdef CONFIG_NVRAM pmac_nvram_update();#endif switch (sys_ctrler) {#ifdef CONFIG_ADB_CUDA case SYS_CTRLER_CUDA: cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_RESET_SYSTEM); for (;;) cuda_poll(); break;#endif /* CONFIG_ADB_CUDA */#ifdef CONFIG_ADB_PMU case SYS_CTRLER_PMU: pmu_restart(); break;#endif /* CONFIG_ADB_PMU */ default: ; }}void __pmacpmac_power_off(void){#ifdef CONFIG_ADB_CUDA struct adb_request req;#endif /* CONFIG_ADB_CUDA */#ifdef CONFIG_NVRAM pmac_nvram_update();#endif switch (sys_ctrler) {#ifdef CONFIG_ADB_CUDA case SYS_CTRLER_CUDA: cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_POWERDOWN); for (;;) cuda_poll(); break;#endif /* CONFIG_ADB_CUDA */#ifdef CONFIG_ADB_PMU case SYS_CTRLER_PMU: pmu_shutdown(); break;#endif /* CONFIG_ADB_PMU */ default: ; }}void __pmacpmac_halt(void){ pmac_power_off();}#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)/* * IDE stuff. */static int __pmacpmac_ide_check_region(ide_ioreg_t from, unsigned int extent){#ifdef CONFIG_BLK_DEV_IDE_PMAC if (pmac_ide_check_base(from) >= 0) return 0;#endif return check_region(from, extent);}static void __pmacpmac_ide_request_region(ide_ioreg_t from, unsigned int extent, const char *name){#ifdef CONFIG_BLK_DEV_IDE_PMAC if (pmac_ide_check_base(from) >= 0) return;#endif request_region(from, extent, name);}static void __pmacpmac_ide_release_region(ide_ioreg_t from, unsigned int extent){#ifdef CONFIG_BLK_DEV_IDE_PMAC if (pmac_ide_check_base(from) >= 0) return;#endif release_region(from, extent);}#ifndef CONFIG_BLK_DEV_IDE_PMAC/* * This is only used if we have a PCI IDE controller, not * for the IDE controller in the ohare/paddington/heathrow/keylargo. */static void __pmacpmac_ide_pci_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq){ ide_ioreg_t reg = data_port; int i; for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { hw->io_ports[i] = reg; reg += 1; } hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;}#endif /* CONFIG_BLK_DEV_IDE_PMAC */#endif /* defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) *//* * Read in a property describing some pieces of memory. */static void __initget_mem_prop(char *name, struct mem_pieces *mp){ struct reg_property *rp; int i, s; unsigned int *ip; int nac = prom_n_addr_cells(memory_node); int nsc = prom_n_size_cells(memory_node); ip = (unsigned int *) get_property(memory_node, name, &s); if (ip == NULL) { printk(KERN_ERR "error: couldn't get %s property on /memory\n", name); abort(); } s /= (nsc + nac) * 4; rp = mp->regions; for (i = 0; i < s; ++i, ip += nac+nsc) { if (nac >= 2 && ip[nac-2] != 0) continue; rp->address = ip[nac-1]; if (nsc >= 2 && ip[nac+nsc-2] != 0) rp->size = ~0U; else rp->size = ip[nac+nsc-1]; ++rp; } mp->n_regions = rp - mp->regions; /* Make sure the pieces are sorted. */ mem_pieces_sort(mp); mem_pieces_coalesce(mp);}/* * On systems with Open Firmware, collect information about * physical RAM and which pieces are already in use. * At this point, we have (at least) the first 8MB mapped with a BAT. * Our text, data, bss use something over 1MB, starting at 0. * Open Firmware may be using 1MB at the 4MB point. */unsigned long __initpmac_find_end_of_memory(void){ unsigned long a, total; struct mem_pieces phys_mem; memory_node = find_devices("memory"); if (memory_node == NULL) { printk(KERN_ERR "can't find memory node\n"); abort(); } /* * Find out where physical memory is, and check that it * starts at 0 and is contiguous. It seems that RAM is * always physically contiguous on Power Macintoshes. * * Supporting discontiguous physical memory isn't hard, * it just makes the virtual <-> physical mapping functions * more complicated (or else you end up wasting space * in mem_map). */ get_mem_prop("reg", &phys_mem); if (phys_mem.n_regions == 0) panic("No RAM??"); a = phys_mem.regions[0].address; if (a != 0) panic("RAM doesn't start at physical address 0"); total = phys_mem.regions[0].size; if (phys_mem.n_regions > 1) { printk("RAM starting at 0x%x is not contiguous\n", phys_mem.regions[1].address); printk("Using RAM from 0 to 0x%lx\n", total-1); } return total;}void __initselect_adb_keyboard(void){#ifdef CONFIG_VT#ifdef CONFIG_INPUT ppc_md.kbd_init_hw = mac_hid_init_hw; ppc_md.kbd_translate = mac_hid_kbd_translate; ppc_md.kbd_unexpected_up = mac_hid_kbd_unexpected_up; ppc_md.kbd_setkeycode = 0; ppc_md.kbd_getkeycode = 0; ppc_md.kbd_leds = 0;#ifdef CONFIG_MAGIC_SYSRQ#ifdef CONFIG_MAC_ADBKEYCODES if (!keyboard_sends_linux_keycodes) { ppc_md.ppc_kbd_sysrq_xlate = mac_hid_kbd_sysrq_xlate; SYSRQ_KEY = 0x69; } else#endif /* CONFIG_MAC_ADBKEYCODES */ { ppc_md.ppc_kbd_sysrq_xlate = pckbd_sysrq_xlate; SYSRQ_KEY = 0x54; }#endif /* CONFIG_MAGIC_SYSRQ */#elif defined(CONFIG_ADB_KEYBOARD) ppc_md.kbd_setkeycode = mackbd_setkeycode; ppc_md.kbd_getkeycode = mackbd_getkeycode; ppc_md.kbd_translate = mackbd_translate; ppc_md.kbd_unexpected_up = mackbd_unexpected_up; ppc_md.kbd_leds = mackbd_leds; ppc_md.kbd_init_hw = mackbd_init_hw;#ifdef CONFIG_MAGIC_SYSRQ ppc_md.ppc_kbd_sysrq_xlate = mackbd_sysrq_xlate; SYSRQ_KEY = 0x69;#endif /* CONFIG_MAGIC_SYSRQ */#endif /* CONFIG_INPUT_ADBHID/CONFIG_ADB_KEYBOARD */#endif /* CONFIG_VT */}void __initpmac_init(unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, unsigned long r7){ /* isa_io_base gets set in pmac_find_bridges */ isa_mem_base = PMAC_ISA_MEM_BASE; pci_dram_offset = PMAC_PCI_DRAM_OFFSET; ISA_DMA_THRESHOLD = ~0L; DMA_MODE_READ = 1; DMA_MODE_WRITE = 2; ppc_md.setup_arch = pmac_setup_arch; ppc_md.show_cpuinfo = pmac_show_cpuinfo; ppc_md.show_percpuinfo = of_show_percpuinfo; ppc_md.irq_cannonicalize = NULL; ppc_md.init_IRQ = pmac_pic_init; ppc_md.get_irq = pmac_get_irq; /* Changed later on ... */ ppc_md.init = pmac_init2; ppc_md.pcibios_fixup = pmac_pcibios_fixup; ppc_md.pcibios_enable_device_hook = pmac_pci_enable_device_hook; ppc_md.pcibios_after_init = pmac_pcibios_after_init; ppc_md.restart = pmac_restart; ppc_md.power_off = pmac_power_off; ppc_md.halt = pmac_halt; ppc_md.time_init = pmac_time_init; ppc_md.set_rtc_time = pmac_set_rtc_time; ppc_md.get_rtc_time = pmac_get_rtc_time; ppc_md.calibrate_decr = pmac_calibrate_decr; ppc_md.find_end_of_memory = pmac_find_end_of_memory; ppc_md.feature_call = pmac_do_feature_call; select_adb_keyboard();#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) ppc_ide_md.ide_check_region = pmac_ide_check_region; ppc_ide_md.ide_request_region = pmac_ide_request_region; ppc_ide_md.ide_release_region = pmac_ide_release_region;#ifdef CONFIG_BLK_DEV_IDE_PMAC ppc_ide_md.ide_init_hwif = pmac_ide_init_hwif_ports; ppc_ide_md.default_io_base = pmac_ide_get_base;#else /* CONFIG_BLK_DEV_IDE_PMAC */ ppc_ide_md.ide_init_hwif = pmac_ide_pci_init_hwif_ports;#endif /* CONFIG_BLK_DEV_IDE_PMAC */#endif /* defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) */#ifdef CONFIG_BOOTX_TEXT ppc_md.progress = pmac_progress;#endif /* CONFIG_BOOTX_TEXT */ if (ppc_md.progress) ppc_md.progress("pmac_init(): exit", 0); }#ifdef CONFIG_BOOTX_TEXTextern void drawchar(char c);extern void drawstring(const char *c);extern boot_infos_t *disp_bi;void __initpmac_progress(char *s, unsigned short hex){ if (disp_bi == 0) return; btext_drawstring(s); btext_drawchar('\n');}#endif /* CONFIG_BOOTX_TEXT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -