📄 chrp_setup.c
字号:
chrp_restart(char *cmd){ printk("RTAS system-reboot returned %d\n", call_rtas("system-reboot", 0, 1, NULL)); for (;;);}void __chrpchrp_power_off(void){ /* allow power on only with power button press */ printk("RTAS power-off returned %d\n", call_rtas("power-off", 2, 1, NULL,0xffffffff,0xffffffff)); for (;;);}void __chrpchrp_halt(void){ chrp_power_off();}u_int __chrpchrp_irq_cannonicalize(u_int irq){ if (irq == 2) return 9; return irq;}void __init chrp_init_IRQ(void){ struct device_node *np; int i; unsigned int *addrp; unsigned char* chrp_int_ack_special = 0; unsigned char init_senses[NR_IRQS - NUM_8259_INTERRUPTS]; int nmi_irq = -1;#if defined(CONFIG_VT) && defined(CONFIG_ADB_KEYBOARD) && defined(XMON) struct device_node *kbd;#endif if (!(np = find_devices("pci")) || !(addrp = (unsigned int *) get_property(np, "8259-interrupt-acknowledge", NULL))) printk("Cannot find pci to get ack address\n"); else chrp_int_ack_special = (unsigned char *) ioremap(addrp[prom_n_addr_cells(np)-1], 1); /* hydra still sets OpenPIC_InitSenses to a static set of values */ if (OpenPIC_InitSenses == NULL) { prom_get_irq_senses(init_senses, NUM_8259_INTERRUPTS, NR_IRQS); OpenPIC_InitSenses = init_senses; OpenPIC_NumInitSenses = NR_IRQS - NUM_8259_INTERRUPTS; } openpic_init(1, NUM_8259_INTERRUPTS, chrp_int_ack_special, nmi_irq); for ( i = 0 ; i < NUM_8259_INTERRUPTS ; i++ ) irq_desc[i].handler = &i8259_pic; i8259_init(NULL);#if defined(CONFIG_VT) && defined(CONFIG_ADB_KEYBOARD) && defined(XMON) /* see if there is a keyboard in the device tree with a parent of type "adb" */ for (kbd = find_devices("keyboard"); kbd; kbd = kbd->next) if (kbd->parent && kbd->parent->type && strcmp(kbd->parent->type, "adb") == 0) break; if (kbd) request_irq( HYDRA_INT_ADB_NMI, xmon_irq, 0, "XMON break", 0);#endif}void __initchrp_init2(void){#ifdef CONFIG_NVRAM pmac_nvram_init();#endif request_region(0x20,0x20,"pic1"); request_region(0xa0,0x20,"pic2"); request_region(0x00,0x20,"dma1"); request_region(0x40,0x20,"timer"); request_region(0x80,0x10,"dma page reg"); request_region(0xc0,0x20,"dma2"); if (ppc_md.progress) ppc_md.progress(" Have fun! ", 0x7777);#if defined(CONFIG_VT) && (defined(CONFIG_ADB_KEYBOARD) || defined(CONFIG_INPUT)) /* see if there is a keyboard in the device tree with a parent of type "adb" */ { struct device_node *kbd; for (kbd = find_devices("keyboard"); kbd; kbd = kbd->next) { if (kbd->parent && kbd->parent->type && strcmp(kbd->parent->type, "adb") == 0) { select_adb_keyboard(); break; } } }#endif /* CONFIG_VT && (CONFIG_ADB_KEYBOARD || CONFIG_INPUT) */}#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)/* * IDE stuff. */static int __chrpchrp_ide_check_region(ide_ioreg_t from, unsigned int extent){ return check_region(from, extent);}static void __chrpchrp_ide_request_region(ide_ioreg_t from, unsigned int extent, const char *name){ request_region(from, extent, name);}static void __chrpchrp_ide_release_region(ide_ioreg_t from, unsigned int extent){ release_region(from, extent);}static void __chrpchrp_ide_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/* * One of the main thing these mappings are needed for is so that * xmon can get to the serial port early on. We probably should * handle the machines with the mpc106 as well as the python (F50) * and the GG2 (longtrail). Actually we should look in the device * tree and do the right thing. */static void __initchrp_map_io(void){ char *name; /* * The code below tends to get removed, please don't take it out. * The F50 needs this mapping and it you take it out I'll track you * down and slap your hands. If it causes problems please email me. * -- Cort <cort@fsmlabs.com> */ name = get_property(find_path_device("/"), "name", NULL); if (name && strncmp(name, "IBM-70", 6) == 0 && strstr(name, "-F50")) { io_block_mapping(0x80000000, 0x80000000, 0x10000000, _PAGE_IO); io_block_mapping(0x90000000, 0x90000000, 0x10000000, _PAGE_IO); return; } else { io_block_mapping(0xf8000000, 0xf8000000, 0x04000000, _PAGE_IO); }}void __initchrp_init(unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, unsigned long r7){#ifdef CONFIG_BLK_DEV_INITRD /* take care of initrd if we have one */ if ( r6 ) { initrd_start = r6 + KERNELBASE; initrd_end = r6 + r7 + KERNELBASE; }#endif /* CONFIG_BLK_DEV_INITRD */ ISA_DMA_THRESHOLD = ~0L; DMA_MODE_READ = 0x44; DMA_MODE_WRITE = 0x48; isa_io_base = CHRP_ISA_IO_BASE; /* default value */ ppc_md.setup_arch = chrp_setup_arch; ppc_md.show_percpuinfo = of_show_percpuinfo; ppc_md.show_cpuinfo = chrp_show_cpuinfo; ppc_md.irq_cannonicalize = chrp_irq_cannonicalize;#ifndef CONFIG_POWER4 ppc_md.init_IRQ = chrp_init_IRQ; ppc_md.get_irq = openpic_get_irq;#else ppc_md.init_IRQ = xics_init_IRQ; ppc_md.get_irq = xics_get_irq;#endif /* CONFIG_POWER4 */ ppc_md.init = chrp_init2; ppc_md.restart = chrp_restart; ppc_md.power_off = chrp_power_off; ppc_md.halt = chrp_halt; ppc_md.time_init = chrp_time_init; ppc_md.set_rtc_time = chrp_set_rtc_time; ppc_md.get_rtc_time = chrp_get_rtc_time; ppc_md.calibrate_decr = chrp_calibrate_decr; ppc_md.find_end_of_memory = pmac_find_end_of_memory; ppc_md.setup_io_mappings = chrp_map_io;#ifdef CONFIG_VT /* these are adjusted in chrp_init2 if we have an ADB keyboard */ ppc_md.kbd_setkeycode = pckbd_setkeycode; ppc_md.kbd_getkeycode = pckbd_getkeycode; ppc_md.kbd_translate = pckbd_translate; ppc_md.kbd_unexpected_up = pckbd_unexpected_up; ppc_md.kbd_leds = pckbd_leds; ppc_md.kbd_init_hw = pckbd_init_hw;#ifdef CONFIG_MAGIC_SYSRQ ppc_md.ppc_kbd_sysrq_xlate = pckbd_sysrq_xlate; SYSRQ_KEY = 0x54;#endif /* CONFIG_MAGIC_SYSRQ */#endif /* CONFIG_VT */ if (rtas_data) { struct device_node *rtas; unsigned int *p; rtas = find_devices("rtas"); if (rtas != NULL) { if (get_property(rtas, "display-character", NULL)) { ppc_md.progress = rtas_display_progress; p = (unsigned int *) get_property (rtas, "ibm,display-line-length", NULL); if (p) max_width = *p; } else if (get_property(rtas, "set-indicator", NULL)) ppc_md.progress = rtas_indicator_progress; } }#ifdef CONFIG_BOOTX_TEXT if (ppc_md.progress == NULL && boot_text_mapped) ppc_md.progress = btext_progress;#endif#ifdef CONFIG_SMP#ifndef CONFIG_POWER4 ppc_md.smp_ops = &chrp_smp_ops;#else ppc_md.smp_ops = &xics_smp_ops;#endif /* CONFIG_POWER4 */#endif /* CONFIG_SMP */#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) ppc_ide_md.ide_check_region = chrp_ide_check_region; ppc_ide_md.ide_request_region = chrp_ide_request_region; ppc_ide_md.ide_release_region = chrp_ide_release_region; ppc_ide_md.ide_init_hwif = chrp_ide_init_hwif_ports;#endif /* * Print the banner, then scroll down so boot progress * can be printed. -- Cort */ if ( ppc_md.progress ) ppc_md.progress("Linux/PPC "UTS_RELEASE"\n", 0x0);}void __chrprtas_display_progress(char *s, unsigned short hex){ int width; char *os = s; if ( call_rtas( "display-character", 1, 1, NULL, '\r' ) ) return; width = max_width; while ( *os ) { if ( (*os == '\n') || (*os == '\r') ) width = max_width; else width--; call_rtas( "display-character", 1, 1, NULL, *os++ ); /* if we overwrite the screen length */ if ( width == 0 ) while ( (*os != 0) && (*os != '\n') && (*os != '\r') ) os++; } /*while ( width-- > 0 )*/ call_rtas( "display-character", 1, 1, NULL, ' ' );}void __chrprtas_indicator_progress(char *s, unsigned short hex){ call_rtas("set-indicator", 3, 1, NULL, 6, 0, hex);}#ifdef CONFIG_BOOTX_TEXTvoidbtext_progress(char *s, unsigned short hex){ prom_print(s); prom_print("\n");}#endif /* CONFIG_BOOTX_TEXT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -