📄 pmac_setup.c
字号:
if (((sysctrl_regs[2] >> 24) & 0xf) >= 3) { if (sysctrl_regs[4] & 0x10) sysctrl_regs[4] |= 0x04000020; else sysctrl_regs[4] |= 0x04000000; if(has_l2cache) printk(KERN_INFO "Level 2 cache enabled\n"); } }}extern char *bootpath;extern char *bootdevice;void *boot_host;int boot_target;int boot_part;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 }#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 __init find_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 __init find_boot_device(void){#ifdef CONFIG_SCSI 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 */__pmacvoid note_bootable_part(kdev_t dev, int part, int goodness){ static int found_boot = 0; char *p; /* Do nothing if the root has been set already. */ 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; }}voidpmac_restart(char *cmd){#ifdef CONFIG_ADB_CUDA struct adb_request req;#endif /* CONFIG_ADB_CUDA */ pmac_nvram_update(); 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: }}voidpmac_power_off(void){#ifdef CONFIG_ADB_CUDA struct adb_request req;#endif /* CONFIG_ADB_CUDA */ pmac_nvram_update(); 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: }}voidpmac_halt(void){ pmac_power_off();}#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)/* * IDE stuff. */voidpmac_ide_insw(ide_ioreg_t port, void *buf, int ns){ _insw_ns((unsigned short *)(port+_IO_BASE), buf, ns);}voidpmac_ide_outsw(ide_ioreg_t port, void *buf, int ns){ _outsw_ns((unsigned short *)(port+_IO_BASE), buf, ns);}intpmac_ide_default_irq(ide_ioreg_t base){ return 0;}#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)extern ide_ioreg_t pmac_ide_get_base(int index);#endifide_ioreg_tpmac_ide_default_io_base(int index){#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) return pmac_ide_get_base(index);#else return 0;#endif}intpmac_ide_check_region(ide_ioreg_t from, unsigned int extent){ return 0;}voidpmac_ide_request_region(ide_ioreg_t from, unsigned int extent, const char *name){}voidpmac_ide_release_region(ide_ioreg_t from, unsigned int extent){}/* Convert the shorts/longs in hd_driveid from little to big endian; * chars are endian independant, of course, but strings need to be flipped. * (Despite what it says in drivers/block/ide.h, they come up as little * endian...) * * Changes to linux/hdreg.h may require changes here. */voidpmac_ide_fix_driveid(struct hd_driveid *id){ ppc_generic_ide_fix_driveid(id);}#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)/* This is declared in drivers/block/ide-pmac.c */void pmac_ide_init_hwif_ports (hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq);#else/* * This registers the standard ports for this architecture with the IDE * driver. */void pmac_ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq){}#endif#endifvoid __initpmac_init(unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, unsigned long r7){ pmac_setup_pci_ptrs(); /* 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.setup_residual = NULL; ppc_md.get_cpuinfo = pmac_get_cpuinfo; ppc_md.irq_cannonicalize = NULL; ppc_md.init_IRQ = pmac_pic_init; ppc_md.get_irq = pmac_get_irq; ppc_md.init = pmac_init2; 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.pci_dev_io_base = pmac_pci_dev_io_base; ppc_md.pci_dev_mem_base = pmac_pci_dev_mem_base; ppc_md.pci_dev_root_bridge = pmac_pci_dev_root_bridge;#ifdef CONFIG_VT#ifdef CONFIG_INPUT_ADBHID 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;#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 */#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC) ppc_ide_md.insw = pmac_ide_insw; ppc_ide_md.outsw = pmac_ide_outsw; ppc_ide_md.default_irq = pmac_ide_default_irq; ppc_ide_md.default_io_base = pmac_ide_default_io_base; 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; ppc_ide_md.fix_driveid = pmac_ide_fix_driveid; ppc_ide_md.ide_init_hwif = pmac_ide_init_hwif_ports; ppc_ide_md.io_base = _IO_BASE; /* actually too early for this :-( */#endif#ifdef CONFIG_BOOTX_TEXT ppc_md.progress = pmac_progress;#endif 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;voidpmac_progress(char *s, unsigned short hex){ if (disp_bi == 0) return; prom_drawstring(s); prom_drawchar('\n');}#endif CONFIG_BOOTX_TEXT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -