@@ -17,8 +17,8 @@
OBJECT_DECLARE_TYPE(AspeedINTCState, AspeedINTCClass, ASPEED_INTC)
#define ASPEED_INTC_NR_REGS (0x808 >> 2)
-#define ASPEED_INTC_NR_INTS 9
#define ASPEED_INTC_MAX_INPINS 9
+#define ASPEED_INTC_MAX_OUTPINS 9
struct AspeedINTCState {
/*< private >*/
@@ -30,7 +30,7 @@ struct AspeedINTCState {
uint32_t regs[ASPEED_INTC_NR_REGS];
OrIRQState orgates[ASPEED_INTC_MAX_INPINS];
- qemu_irq output_pins[ASPEED_INTC_NR_INTS];
+ qemu_irq output_pins[ASPEED_INTC_MAX_OUTPINS];
uint32_t enable[ASPEED_INTC_MAX_INPINS];
uint32_t mask[ASPEED_INTC_MAX_INPINS];
@@ -42,6 +42,7 @@ struct AspeedINTCClass {
uint32_t num_lines;
uint32_t num_inpins;
+ uint32_t num_outpins;
uint64_t mem_size;
uint64_t reg_size;
uint64_t reg_offset;
@@ -530,10 +530,14 @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
aspeed_mmio_map(s, SYS_BUS_DEVICE(&a->intc), 0,
sc->memmap[ASPEED_DEV_INTC]);
- /* GICINT orgates -> INTC -> GIC */
+ /* source orgates -> INTC */
for (i = 0; i < ic->num_inpins; i++) {
qdev_connect_gpio_out(DEVICE(&a->intc.orgates[i]), 0,
qdev_get_gpio_in(DEVICE(&a->intc), i));
+ }
+
+ /* INTC -> GIC128 - GIC136 */
+ for (i = 0; i < ic->num_outpins; i++) {
sysbus_connect_irq(SYS_BUS_DEVICE(&a->intc), i,
qdev_get_gpio_in(DEVICE(&a->gic),
aspeed_soc_ast2700_gic_intcmap[i].irq));
@@ -361,6 +361,9 @@ static void aspeed_intc_realize(DeviceState *dev, Error **errp)
if (!qdev_realize(DEVICE(&s->orgates[i]), NULL, errp)) {
return;
}
+ }
+
+ for (i = 0; i < aic->num_outpins; i++) {
sysbus_init_irq(sbd, &s->output_pins[i]);
}
}
@@ -396,6 +399,7 @@ static void aspeed_2700_intc_class_init(ObjectClass *klass, void *data)
dc->desc = "ASPEED 2700 INTC Controller";
aic->num_lines = 32;
aic->num_inpins = 9;
+ aic->num_outpins = 9;
aic->mem_size = 0x4000;
aic->reg_size = 0x808;
aic->reg_offset = 0x1000;