📄 chrp_setup.c
字号:
return irq; }}int __chrp chrp_get_irq( struct pt_regs *regs ){ int irq; irq = openpic_irq( smp_processor_id() ); if (irq == IRQ_8259_CASCADE) { /* * This magic address generates a PCI IACK cycle. */ if ( chrp_int_ack_special ) irq = *chrp_int_ack_special; else irq = i8259_irq( smp_processor_id() ); openpic_eoi( smp_processor_id() ); } if (irq == OPENPIC_VEC_SPURIOUS) /* * Spurious interrupts should never be * acknowledged */ irq = -1; /* * I would like to openpic_eoi here but there seem to be timing problems * between the openpic ack and the openpic eoi. * -- Cort */ return irq;}void __chrp chrp_post_irq(struct pt_regs* regs, int irq){ /* * If it's an i8259 irq then we've already done the * openpic irq. So we just check to make sure the controller * is an openpic and if it is then eoi * * We do it this way since our irq_desc[irq].handler can change * with RTL and no longer be open_pic -- Cort */ if ( irq >= open_pic_irq_offset) openpic_eoi( smp_processor_id() );}void __init chrp_init_IRQ(void){ struct device_node *np; int i; unsigned long *addrp; if (!(np = find_devices("pci")) || !(addrp = (unsigned long *) get_property(np, "8259-interrupt-acknowledge", NULL))) printk("Cannot find pci to get ack address\n"); else chrp_int_ack_special = (volatile unsigned char *) ioremap(*addrp, 1); open_pic_irq_offset = 16; for ( i = 16 ; i < NR_IRQS ; i++ ) irq_desc[i].handler = &open_pic; openpic_init(1); enable_irq(IRQ_8259_CASCADE); for ( i = 0 ; i < 16 ; i++ ) irq_desc[i].handler = &i8259_pic; i8259_init();#ifdef CONFIG_XMON request_irq(openpic_to_irq(HYDRA_INT_ADB_NMI), xmon_irq, 0, "NMI", 0);#endif /* CONFIG_XMON */#ifdef CONFIG_SMP request_irq(openpic_to_irq(OPENPIC_VEC_IPI), openpic_ipi_action, 0, "IPI0", 0);#endif /* CONFIG_SMP */}void __initchrp_init2(void){#if defined(CONFIG_VT) && defined(CONFIG_ADB_KEYBOARD) struct device_node *kbd;#endif#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) /* 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) { 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_VT && CONFIG_ADB_KEYBOARD */}#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)/* * IDE stuff. */unsigned int chrp_ide_irq = 0;int chrp_ide_ports_known = 0;ide_ioreg_t chrp_ide_regbase[MAX_HWIFS];ide_ioreg_t chrp_idedma_regbase;void __chrpchrp_ide_probe(void){ struct pci_dev *pdev = pci_find_device(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105, NULL); chrp_ide_ports_known = 1; if(pdev) { chrp_ide_regbase[0]=pdev->resource[0].start; chrp_ide_regbase[1]=pdev->resource[2].start; chrp_idedma_regbase=pdev->resource[4].start; chrp_ide_irq=pdev->irq; }}void __chrpchrp_ide_insw(ide_ioreg_t port, void *buf, int ns){ ide_insw(port+_IO_BASE, buf, ns);}void __chrpchrp_ide_outsw(ide_ioreg_t port, void *buf, int ns){ ide_outsw(port+_IO_BASE, buf, ns);}int __chrpchrp_ide_default_irq(ide_ioreg_t base){ if (chrp_ide_ports_known == 0) chrp_ide_probe(); return chrp_ide_irq;}ide_ioreg_t __chrpchrp_ide_default_io_base(int index){ if (chrp_ide_ports_known == 0) chrp_ide_probe(); return chrp_ide_regbase[index];}int __chrpchrp_ide_check_region(ide_ioreg_t from, unsigned int extent){ return check_region(from, extent);}void __chrpchrp_ide_request_region(ide_ioreg_t from, unsigned int extent, const char *name){ request_region(from, extent, name);}void __chrpchrp_ide_release_region(ide_ioreg_t from, unsigned int extent){ release_region(from, extent);}void __chrpchrp_ide_fix_driveid(struct hd_driveid *id){ ppc_generic_ide_fix_driveid(id);}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; } if (ctrl_port) { hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port; } else { hw->io_ports[IDE_CONTROL_OFFSET] = 0; } if (irq != NULL) hw->irq = chrp_ide_irq;}#endifvoid __init chrp_init(unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, unsigned long r7){ chrp_setup_pci_ptrs();#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 */ /* pci_dram_offset/isa_io_base/isa_mem_base set by setup_pci_ptrs() */ ISA_DMA_THRESHOLD = ~0L; DMA_MODE_READ = 0x44; DMA_MODE_WRITE = 0x48; ppc_md.setup_arch = chrp_setup_arch; ppc_md.setup_residual = NULL; ppc_md.get_cpuinfo = chrp_get_cpuinfo; ppc_md.irq_cannonicalize = chrp_irq_cannonicalize;#ifndef CONFIG_POWER4 ppc_md.init_IRQ = chrp_init_IRQ; ppc_md.get_irq = chrp_get_irq; ppc_md.post_irq = chrp_post_irq;#else ppc_md.init_IRQ = xics_init_IRQ; ppc_md.get_irq = xics_get_irq; ppc_md.post_irq = NULL;#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;#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 && bootx_text_mapped) ppc_md.progress = bootx_text_progress;#endif#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) ppc_ide_md.insw = chrp_ide_insw; ppc_ide_md.outsw = chrp_ide_outsw; ppc_ide_md.default_irq = chrp_ide_default_irq; ppc_ide_md.default_io_base = chrp_ide_default_io_base; 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.fix_driveid = chrp_ide_fix_driveid; ppc_ide_md.ide_init_hwif = chrp_ide_init_hwif_ports; ppc_ide_md.io_base = _IO_BASE;#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_TEXTvoidbootx_text_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 + -