static void tsi108_pci_irq_end(u_int irq) { tsi108_pci_int_unmask(irq); /* Enable interrupts from PCI block */ tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE, tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE) | TSI108_PCI_IRP_ENABLE_P_INT); mb(); }
static void tsi108_pci_irq_unmask(struct irq_data *d) { tsi108_pci_int_unmask(d->irq); tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE, tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE) | TSI108_PCI_IRP_ENABLE_P_INT); mb(); }
static void tsi108_pci_int_unmask(u_int irq) { u_int irp_cfg; int int_line = (irq - IRQ_PCI_INTAD_BASE); irp_cfg = tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL); mb(); irp_cfg &= ~(1 << int_line); irp_cfg |= (3 << (8 + (int_line * 2))); tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL, irp_cfg); mb(); }
static void tsi108_pci_int_mask(u_int irq) { u_int irp_cfg; int int_line = (irq - IRQ_PCI_INTAD_BASE); irp_cfg = tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL); mb(); irp_cfg |= (1 << int_line); /* INTx_DIR = output */ irp_cfg &= ~(3 << (8 + (int_line * 2))); /* INTx_TYPE = unused */ tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL, irp_cfg); mb(); irp_cfg = tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL); }
/* * Interrupt setup and service. Interrupts on the holly come * from the four external INT pins, PCI interrupts are routed via * PCI interrupt control registers, it generates internal IRQ23 * * Interrupt routing on the Holly Board: * TSI108:PB_INT[0] -> CPU0:INT# * TSI108:PB_INT[1] -> CPU0:MCP# * TSI108:PB_INT[2] -> N/C * TSI108:PB_INT[3] -> N/C */ static void __init holly_init_IRQ(void) { struct mpic *mpic; #ifdef CONFIG_PCI unsigned int cascade_pci_irq; struct device_node *tsi_pci; struct device_node *cascade_node = NULL; #endif mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN | MPIC_SPV_EOI | MPIC_NO_PTHROU_DIS | MPIC_REGSET_TSI108, 24, 0, "Tsi108_PIC"); BUG_ON(mpic == NULL); mpic_assign_isu(mpic, 0, mpic->paddr + 0x100); mpic_init(mpic); #ifdef CONFIG_PCI tsi_pci = of_find_node_by_type(NULL, "pci"); if (tsi_pci == NULL) { printk(KERN_ERR "%s: No tsi108 pci node found !\n", __func__); return; } cascade_node = of_find_node_by_type(NULL, "pic-router"); if (cascade_node == NULL) { printk(KERN_ERR "%s: No tsi108 pci cascade node found !\n", __func__); return; } cascade_pci_irq = irq_of_parse_and_map(tsi_pci, 0); pr_debug("%s: tsi108 cascade_pci_irq = 0x%x\n", __func__, (u32) cascade_pci_irq); tsi108_pci_int_init(cascade_node); irq_set_handler_data(cascade_pci_irq, mpic); irq_set_chained_handler(cascade_pci_irq, tsi108_irq_cascade); #endif /* Configure MPIC outputs to CPU0 */ tsi108_write_reg(TSI108_MPIC_OFFSET + 0x30c, 0); }
/* * Interrupt setup and service. Interrupts on the mpc7448_hpc2 come * from the four external INT pins, PCI interrupts are routed via * PCI interrupt control registers, it generates internal IRQ23 * * Interrupt routing on the Taiga Board: * TSI108:PB_INT[0] -> CPU0:INT# * TSI108:PB_INT[1] -> CPU0:MCP# * TSI108:PB_INT[2] -> N/C * TSI108:PB_INT[3] -> N/C */ static void __init mpc7448_hpc2_init_IRQ(void) { struct mpic *mpic; phys_addr_t mpic_paddr = 0; struct device_node *tsi_pic; #ifdef CONFIG_PCI unsigned int cascade_pci_irq; struct device_node *tsi_pci; struct device_node *cascade_node = NULL; #endif tsi_pic = of_find_node_by_type(NULL, "open-pic"); if (tsi_pic) { unsigned int size; const void *prop = of_get_property(tsi_pic, "reg", &size); mpic_paddr = of_translate_address(tsi_pic, prop); } if (mpic_paddr == 0) { printk("%s: No tsi108 PIC found !\n", __func__); return; } DBG("%s: tsi108 pic phys_addr = 0x%x\n", __func__, (u32) mpic_paddr); mpic = mpic_alloc(tsi_pic, mpic_paddr, MPIC_PRIMARY | MPIC_BIG_ENDIAN | MPIC_WANTS_RESET | MPIC_SPV_EOI | MPIC_NO_PTHROU_DIS | MPIC_REGSET_TSI108, 24, NR_IRQS-4, /* num_sources used */ "Tsi108_PIC"); BUG_ON(mpic == NULL); mpic_assign_isu(mpic, 0, mpic_paddr + 0x100); mpic_init(mpic); #ifdef CONFIG_PCI tsi_pci = of_find_node_by_type(NULL, "pci"); if (tsi_pci == NULL) { printk("%s: No tsi108 pci node found !\n", __func__); return; } cascade_node = of_find_node_by_type(NULL, "pic-router"); if (cascade_node == NULL) { printk("%s: No tsi108 pci cascade node found !\n", __func__); return; } cascade_pci_irq = irq_of_parse_and_map(tsi_pci, 0); DBG("%s: tsi108 cascade_pci_irq = 0x%x\n", __func__, (u32) cascade_pci_irq); tsi108_pci_int_init(cascade_node); set_irq_data(cascade_pci_irq, mpic); set_irq_chained_handler(cascade_pci_irq, tsi108_irq_cascade); #endif /* Configure MPIC outputs to CPU0 */ tsi108_write_reg(TSI108_MPIC_OFFSET + 0x30c, 0); of_node_put(tsi_pic); }
static void holly_remap_bridge(void) { u32 lut_val, lut_addr; int i; printk(KERN_INFO "Remapping PCI bridge\n"); /* Re-init the PCI bridge and LUT registers to have mappings that don't * rely on PIBS */ lut_addr = 0x900; for (i = 0; i < 31; i++) { tsi108_write_reg(TSI108_PB_OFFSET + lut_addr, 0x00000201); lut_addr += 4; tsi108_write_reg(TSI108_PB_OFFSET + lut_addr, 0x0); lut_addr += 4; } /* Reserve the last LUT entry for PCI I/O space */ tsi108_write_reg(TSI108_PB_OFFSET + lut_addr, 0x00000241); lut_addr += 4; tsi108_write_reg(TSI108_PB_OFFSET + lut_addr, 0x0); /* Map PCI I/O space */ tsi108_write_reg(TSI108_PCI_PFAB_IO_UPPER, 0x0); tsi108_write_reg(TSI108_PCI_PFAB_IO, 0x1); /* Map PCI CFG space */ tsi108_write_reg(TSI108_PCI_PFAB_BAR0_UPPER, 0x0); tsi108_write_reg(TSI108_PCI_PFAB_BAR0, 0x7c000000 | 0x01); /* We don't need MEM32 and PRM remapping so disable them */ tsi108_write_reg(TSI108_PCI_PFAB_MEM32, 0x0); tsi108_write_reg(TSI108_PCI_PFAB_PFM3, 0x0); tsi108_write_reg(TSI108_PCI_PFAB_PFM4, 0x0); /* Set P2O_BAR0 */ tsi108_write_reg(TSI108_PCI_P2O_BAR0_UPPER, 0x0); tsi108_write_reg(TSI108_PCI_P2O_BAR0, 0xc0000000); /* Init the PCI LUTs to do no remapping */ lut_addr = 0x500; lut_val = 0x00000002; for (i = 0; i < 32; i++) { tsi108_write_reg(TSI108_PCI_OFFSET + lut_addr, lut_val); lut_addr += 4; tsi108_write_reg(TSI108_PCI_OFFSET + lut_addr, 0x40000000); lut_addr += 4; lut_val += 0x02000000; } tsi108_write_reg(TSI108_PCI_P2O_PAGE_SIZES, 0x00007900); /* Set 64-bit PCI bus address for system memory */ tsi108_write_reg(TSI108_PCI_P2O_BAR2_UPPER, 0x0); tsi108_write_reg(TSI108_PCI_P2O_BAR2, 0x0); }