Clean up the GICv3 intrng code:

* In gic_v3_attach free the correct data on failure.
 * Implement gic_v3_teardown_intr.
 * Update the panic string when enabling/disabling an invalid interrupt.

Obtained from:	ABT Systems Ltd
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
andrew 2016-05-17 12:46:50 +00:00
parent 970c8ffe26
commit bc26af2c81

View File

@ -267,7 +267,7 @@ gic_v3_attach(device_t dev)
}
if (err != 0) {
/* XXX call intr_isrc_deregister() */
free(irqs, M_DEVBUF);
free(sc->gic_irqs, M_DEVBUF);
return (err);
}
}
@ -611,8 +611,14 @@ static int
gic_v3_teardown_intr(device_t dev, struct intr_irqsrc *isrc,
struct resource *res, struct intr_map_data *data)
{
struct gic_v3_irqsrc *gi = (struct gic_v3_irqsrc *)isrc;
panic("gic_v3_teardown_intr");
if (isrc->isrc_handlers == 0) {
gi->gi_pol = INTR_POLARITY_CONFORM;
gi->gi_trig = INTR_TRIGGER_CONFORM;
}
return (0);
}
static void
@ -636,7 +642,7 @@ gic_v3_disable_intr(device_t dev, struct intr_irqsrc *isrc)
gic_d_write(sc, 4, GICD_ICENABLER(irq), GICD_I_MASK(irq));
gic_v3_wait_for_rwp(sc, DIST);
} else
panic("gic_v3_disable_intr");
panic("%s: Unsupported IRQ %u", __func__, irq);
}
static void
@ -660,7 +666,7 @@ gic_v3_enable_intr(device_t dev, struct intr_irqsrc *isrc)
gic_d_write(sc, 4, GICD_ISENABLER(irq), GICD_I_MASK(irq));
gic_v3_wait_for_rwp(sc, DIST);
} else
panic("gic_v3_enable_intr");
panic("%s: Unsupported IRQ %u", __func__, irq);
}
static void