Esempio n. 1
0
void __init arch_init_irq(void)
{
	int corehi_irq;

	/*
	 * Preallocate the i8259's expected virq's here. Since irqchip_init()
	 * will probe the irqchips in hierarchial order, i8259 is probed last.
	 * If anything allocates a virq before the i8259 is probed, it will
	 * be given one of the i8259's expected range and consequently setup
	 * of the i8259 will fail.
	 */
	WARN(irq_alloc_descs(I8259A_IRQ_BASE, I8259A_IRQ_BASE,
			    16, numa_node_id()) < 0,
		"Cannot reserve i8259 virqs at IRQ%d\n", I8259A_IRQ_BASE);

	i8259_set_poll(mips_pcibios_iack);
	irqchip_init();

	switch (mips_revision_sconid) {
	case MIPS_REVISION_SCON_SOCIT:
	case MIPS_REVISION_SCON_ROCIT:
		if (cpu_has_veic)
			init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
					MSC01E_INT_BASE, msc_eicirqmap,
					msc_nr_eicirqs);
		else
			init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
					MSC01C_INT_BASE, msc_irqmap,
					msc_nr_irqs);
		break;

	case MIPS_REVISION_SCON_SOCITSC:
	case MIPS_REVISION_SCON_SOCITSCP:
		if (cpu_has_veic)
			init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
					MSC01E_INT_BASE, msc_eicirqmap,
					msc_nr_eicirqs);
		else
			init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
					MSC01C_INT_BASE, msc_irqmap,
					msc_nr_irqs);
	}

	if (gic_present) {
		corehi_irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_COREHI;
	} else if (cpu_has_veic) {
		set_vi_handler(MSC01E_INT_COREHI, corehi_irqdispatch);
		corehi_irq = MSC01E_INT_BASE + MSC01E_INT_COREHI;
	} else {
		corehi_irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_COREHI;
	}

	setup_irq(corehi_irq, &corehi_irqaction);
}
Esempio n. 2
0
void __init arch_init_irq(void)
{
    int corehi_irq;

    i8259_set_poll(mips_pcibios_iack);
    irqchip_init();

    switch (mips_revision_sconid) {
    case MIPS_REVISION_SCON_SOCIT:
    case MIPS_REVISION_SCON_ROCIT:
        if (cpu_has_veic)
            init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
                          MSC01E_INT_BASE, msc_eicirqmap,
                          msc_nr_eicirqs);
        else
            init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
                          MSC01C_INT_BASE, msc_irqmap,
                          msc_nr_irqs);
        break;

    case MIPS_REVISION_SCON_SOCITSC:
    case MIPS_REVISION_SCON_SOCITSCP:
        if (cpu_has_veic)
            init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
                          MSC01E_INT_BASE, msc_eicirqmap,
                          msc_nr_eicirqs);
        else
            init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
                          MSC01C_INT_BASE, msc_irqmap,
                          msc_nr_irqs);
    }

    if (gic_present) {
        corehi_irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_COREHI;
    } else {
#if defined(CONFIG_MIPS_MT_SMP)
        /* set up ipi interrupts */
        if (cpu_has_veic) {
            set_vi_handler (MSC01E_INT_SW0, ipi_resched_dispatch);
            set_vi_handler (MSC01E_INT_SW1, ipi_call_dispatch);
            cpu_ipi_resched_irq = MSC01E_INT_SW0;
            cpu_ipi_call_irq = MSC01E_INT_SW1;
        } else {
            cpu_ipi_resched_irq = MIPS_CPU_IRQ_BASE +
                                  MIPS_CPU_IPI_RESCHED_IRQ;
            cpu_ipi_call_irq = MIPS_CPU_IRQ_BASE +
                               MIPS_CPU_IPI_CALL_IRQ;
        }
        arch_init_ipiirq(cpu_ipi_resched_irq, &irq_resched);
        arch_init_ipiirq(cpu_ipi_call_irq, &irq_call);
#endif
        if (cpu_has_veic) {
            set_vi_handler(MSC01E_INT_COREHI,
                           corehi_irqdispatch);
            corehi_irq = MSC01E_INT_BASE + MSC01E_INT_COREHI;
        } else {
            corehi_irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_COREHI;
        }
    }

    setup_irq(corehi_irq, &corehi_irqaction);
}