static void __init ixdp2800_pci_postinit(void) { if (!ixdp2x00_master_npu()) { ixdp2x00_slave_pci_postinit(); ixdp2800_slave_signal_bus_scan_completion(); } }
void __init ixdp2800_pci_preinit(void) { printk("ixdp2x00_pci_preinit called\n"); *IXP2000_PCI_ADDR_EXT = 0x0001e000; if (!ixdp2x00_master_npu()) ixdp2800_slave_disable_pci_master(); *IXP2000_PCI_SRAM_BASE_ADDR_MASK = (0x2000000 - 1) & ~0x3ffff; *IXP2000_PCI_DRAM_BASE_ADDR_MASK = (0x40000000 - 1) & ~0xfffff; ixp2000_pci_preinit(); if (ixdp2x00_master_npu()) { /* * Wait until the slave set its SRAM/SDRAM BAR sizes * correctly before we proceed to scan and enumerate * the bus. */ ixdp2800_master_wait_for_slave(); /* * We configure the SDRAM BARs by hand because they * are 1G and fall outside of the regular allocated * PCI address space. */ *IXP2000_PCI_SDRAM_BAR = 0x00000008; } else { /* * Wait for the master to complete scanning the bus * and assigning resources before we proceed to scan * the bus ourselves. Set pci=firmware to honor the * master's resource assignment. */ ixdp2800_slave_wait_for_master_enable(); pcibios_setup("firmware"); } }
static void ixdp2400_pci_postinit(void) { struct pci_dev *dev; if (ixdp2x00_master_npu()) { dev = pci_find_slot(1, IXDP2400_SLAVE_ENET_DEVFN); pci_remove_bus_device(dev); } else { dev = pci_find_slot(1, IXDP2400_MASTER_ENET_DEVFN); pci_remove_bus_device(dev); ixdp2x00_slave_pci_postinit(); } }
static int __init ixdp2400_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) { if (ixdp2x00_master_npu()) { /* * Root bus devices. Slave NPU is only one with interrupt. * Everything else, we just return -1 b/c nothing else * on the root bus has interrupts. */ if(!dev->bus->self) { if(dev->devfn == IXDP2X00_SLAVE_NPU_DEVFN ) return IRQ_IXDP2400_INGRESS_NPU; return -1; } /* * Bridge behind the PMC slot. * NOTE: Only INTA from the PMC slot is routed. VERY BAD. */ if(dev->bus->self->devfn == IXDP2X00_PMC_DEVFN && dev->bus->parent->self->devfn == IXDP2X00_P2P_DEVFN && !dev->bus->parent->self->bus->parent) return IRQ_IXDP2400_PMC; /* * Device behind the first bridge */ if(dev->bus->self->devfn == IXDP2X00_P2P_DEVFN) { switch(dev->devfn) { case IXDP2400_MASTER_ENET_DEVFN: return IRQ_IXDP2400_ENET; case IXDP2400_MEDIA_DEVFN: return IRQ_IXDP2400_MEDIA_PCI; case IXDP2400_SWITCH_FABRIC_DEVFN: return IRQ_IXDP2400_SF_PCI; case IXDP2X00_PMC_DEVFN: return IRQ_IXDP2400_PMC; } } return -1; } else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */ }
static int __init ixdp2800_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) { if (ixdp2x00_master_npu()) { /* * Root bus devices. Slave NPU is only one with interrupt. * Everything else, we just return -1 which is invalid. */ if(!dev->bus->self) { if(dev->devfn == IXDP2X00_SLAVE_NPU_DEVFN ) return IRQ_IXDP2800_INGRESS_NPU; return -1; } /* * Bridge behind the PMC slot. */ if(dev->bus->self->devfn == IXDP2X00_PMC_DEVFN && dev->bus->parent->self->devfn == IXDP2X00_P2P_DEVFN && !dev->bus->parent->self->bus->parent) return IRQ_IXDP2800_PMC; /* * Device behind the first bridge */ if(dev->bus->self->devfn == IXDP2X00_P2P_DEVFN) { switch(dev->devfn) { case IXDP2X00_PMC_DEVFN: return IRQ_IXDP2800_PMC; case IXDP2800_MASTER_ENET_DEVFN: return IRQ_IXDP2800_EGRESS_ENET; case IXDP2800_SWITCH_FABRIC_DEVFN: return IRQ_IXDP2800_FABRIC; } } return -1; } else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */ }
int __init ixdp2800_pci_init(void) { if (machine_is_ixdp2800()) { struct pci_dev *dev; pci_common_init(&ixdp2800_pci); if (ixdp2x00_master_npu()) { dev = pci_find_slot(1, IXDP2800_SLAVE_ENET_DEVFN); pci_remove_bus_device(dev); ixdp2800_master_enable_slave(); ixdp2800_master_wait_for_slave_bus_scan(); } else { dev = pci_find_slot(1, IXDP2800_MASTER_ENET_DEVFN); pci_remove_bus_device(dev); } } return 0; }
void __init ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_of_irqs) { unsigned int irq; ixp2000_init_irq(); if (!ixdp2x00_master_npu()) return; board_irq_stat = stat_reg; board_irq_mask = mask_reg; board_irq_count = nr_of_irqs; *board_irq_mask = 0xffffffff; for(irq = IXP2000_BOARD_IRQ(0); irq < IXP2000_BOARD_IRQ(board_irq_count); irq++) { irq_set_chip_and_handler(irq, &ixdp2x00_cpld_irq_chip, handle_level_irq); set_irq_flags(irq, IRQF_VALID); } /* Hook into PCI interrupt */ irq_set_chained_handler(IRQ_IXP2000_PCIB, ixdp2x00_irq_handler); }