[POWERPC] MPIC U3/U4 MSI backend
MPIC U3/U4 MSI backend. Based on code from Segher, heavily hacked by me. This only deals with MSI on U3/U4 MPICs, aka. CPC 9x5. If we find a U3/U4 then we enable this backend, ie. take over the ppc_md MSI hooks. We might need more elaborate logic in future to decide which backend is enabled. We need our own irq_chip so that we can do MSI masking/unmasking on the device itself. We also need to mask explicitly on shutdown to make sure we don't get bitten by lazy-disable semantics. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
a7de7c7422
commit
05af7bd2d7
@ -618,7 +618,7 @@ static irqreturn_t mpic_ipi_action(int irq, void *dev_id)
|
||||
*/
|
||||
|
||||
|
||||
static void mpic_unmask_irq(unsigned int irq)
|
||||
void mpic_unmask_irq(unsigned int irq)
|
||||
{
|
||||
unsigned int loops = 100000;
|
||||
struct mpic *mpic = mpic_from_irq(irq);
|
||||
@ -638,7 +638,7 @@ static void mpic_unmask_irq(unsigned int irq)
|
||||
} while(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK);
|
||||
}
|
||||
|
||||
static void mpic_mask_irq(unsigned int irq)
|
||||
void mpic_mask_irq(unsigned int irq)
|
||||
{
|
||||
unsigned int loops = 100000;
|
||||
struct mpic *mpic = mpic_from_irq(irq);
|
||||
@ -659,7 +659,7 @@ static void mpic_mask_irq(unsigned int irq)
|
||||
} while(!(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK));
|
||||
}
|
||||
|
||||
static void mpic_end_irq(unsigned int irq)
|
||||
void mpic_end_irq(unsigned int irq)
|
||||
{
|
||||
struct mpic *mpic = mpic_from_irq(irq);
|
||||
|
||||
@ -792,7 +792,7 @@ static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type)
|
||||
}
|
||||
}
|
||||
|
||||
static int mpic_set_irq_type(unsigned int virq, unsigned int flow_type)
|
||||
int mpic_set_irq_type(unsigned int virq, unsigned int flow_type)
|
||||
{
|
||||
struct mpic *mpic = mpic_from_irq(virq);
|
||||
unsigned int src = mpic_irq_to_hw(virq);
|
||||
@ -1203,8 +1203,10 @@ void __init mpic_init(struct mpic *mpic)
|
||||
|
||||
/* Do the HT PIC fixups on U3 broken mpic */
|
||||
DBG("MPIC flags: %x\n", mpic->flags);
|
||||
if ((mpic->flags & MPIC_U3_HT_IRQS) && (mpic->flags & MPIC_PRIMARY))
|
||||
if ((mpic->flags & MPIC_U3_HT_IRQS) && (mpic->flags & MPIC_PRIMARY)) {
|
||||
mpic_scan_ht_pics(mpic);
|
||||
mpic_u3msi_init(mpic);
|
||||
}
|
||||
|
||||
for (i = 0; i < mpic->num_sources; i++) {
|
||||
/* start with vector = source number, and masked */
|
||||
|
Reference in New Issue
Block a user