/* * This is called by init_IRQ. set in ppc_md.init_IRQ by iSeries_setup.c * It must be called before the bus walk. */ void __init iSeries_init_IRQ(void) { /* Register PCI event handler and open an event path */ struct irq_host *host; int ret; /* * The Hypervisor only allows us up to 256 interrupt * sources (the irq number is passed in a u8). */ irq_set_virq_count(256); /* Create irq host. No need for a revmap since HV will give us * back our virtual irq number */ host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0, &iseries_irq_host_ops, 0); BUG_ON(host == NULL); irq_set_default_host(host); ret = HvLpEvent_registerHandler(HvLpEvent_Type_PciIo, &pci_event_handler); if (ret == 0) { ret = HvLpEvent_openPath(HvLpEvent_Type_PciIo, 0); if (ret != 0) printk(KERN_ERR "iseries_init_IRQ: open event path " "failed with rc 0x%x\n", ret); } else printk(KERN_ERR "iseries_init_IRQ: register handler " "failed with rc 0x%x\n", ret); }
/* This should be called sometime prior to buswalk (init_IRQ would be good) */ int XmPciLpEvent_init() { int xRc; PPCDBG(PPCDBG_BUSWALK,"XmPciLpEvent_init, Register Event type 0x%04X\n",HvLpEvent_Type_PciIo); xRc = HvLpEvent_registerHandler(HvLpEvent_Type_PciIo, &XmPciLpEvent_handler); if (xRc == 0) { xRc = HvLpEvent_openPath(HvLpEvent_Type_PciIo, 0); if (xRc != 0) { printk(KERN_ERR "XmPciLpEvent.c: open event path failed with rc 0x%x\n", xRc); } } else { printk(KERN_ERR "XmPciLpEvent.c: register handler failed with rc 0x%x\n", xRc); } return xRc; }