Hello Jamin,
I refer to versal_create_apu_gic function, 
https://github.com/qemu/qemu/blob/master/hw/arm/xlnx-versal.c#L67
and updated aspeed_soc_ast2700_gic as following.
If you have any concerned about the new changes, please let me know.
Thanks-Jamin

static bool aspeed_soc_ast2700_gic(DeviceState *dev, Error **errp)

Please rename to aspeed_soc_ast2700_gic_realize()

{
     Aspeed27x0SoCState *a = ASPEED27X0_SOC(dev);
     AspeedSoCState *s = ASPEED_SOC(dev);
     AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
     SysBusDevice *gicbusdev;
     DeviceState *gicdev;
     QList *redist_region_count;
     int i;

     object_initialize_child(OBJECT(a), "ast2700-gic", &a->gic,
                             gicv3_class_name());

and object_initialize_child() can be called in aspeed_soc_ast2700_init().

     gicbusdev = SYS_BUS_DEVICE(&a->gic);
     gicdev = DEVICE(&a->gic);
     qdev_prop_set_uint32(gicdev, "revision", 3);
     qdev_prop_set_uint32(gicdev, "num-cpu", sc->num_cpus);
     qdev_prop_set_uint32(gicdev, "num-irq", AST2700_MAX_IRQ);

     redist_region_count = qlist_new();
     qlist_append_int(redist_region_count, sc->num_cpus);
     qdev_prop_set_array(gicdev, "redist-region-count", redist_region_count);

     if (!sysbus_realize(gicbusdev, errp)) {
         return false;
     }
     sysbus_mmio_map(gicbusdev, 0, sc->memmap[ASPEED_GIC_DIST]);
     sysbus_mmio_map(gicbusdev, 1, sc->memmap[ASPEED_GIC_REDIST]);

     for (i = 0; i < sc->num_cpus; i++) {
         DeviceState *cpudev = DEVICE(qemu_get_cpu(i));

Could we avoid qemu_get_cpu() and use the cpu array of the SoC instead ?

         int NUM_IRQS = 256, ARCH_GIC_MAINT_IRQ = 9, VIRTUAL_PMU_IRQ = 7;
         int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;

         const int timer_irq[] = {
             [GTIMER_PHYS] = 14,
             [GTIMER_VIRT] = 11,
             [GTIMER_HYP]  = 10,
             [GTIMER_SEC]  = 13,
         };
         int j;

         for (j = 0; j < ARRAY_SIZE(timer_irq); j++) {
             qdev_connect_gpio_out(cpudev, j,
                     qdev_get_gpio_in(gicdev, ppibase + timer_irq[j]));
         }

         qemu_irq irq = qdev_get_gpio_in(gicdev,
                                         ppibase + ARCH_GIC_MAINT_IRQ);
         qdev_connect_gpio_out_named(cpudev, "gicv3-maintenance-interrupt",
                                     0, irq);
         qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0,
                 qdev_get_gpio_in(gicdev, ppibase + VIRTUAL_PMU_IRQ));

         sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, 
ARM_CPU_IRQ));
         sysbus_connect_irq(gicbusdev, i + sc->num_cpus,
                            qdev_get_gpio_in(cpudev, ARM_CPU_FIQ));
         sysbus_connect_irq(gicbusdev, i + 2 * sc->num_cpus,
                            qdev_get_gpio_in(cpudev, ARM_CPU_VIRQ));
         sysbus_connect_irq(gicbusdev, i + 3 * sc->num_cpus,
                            qdev_get_gpio_in(cpudev, ARM_CPU_VFIQ));
     }

     return true;
}

struct Aspeed27x0SoCState {
     AspeedSoCState parent;

     ARMCPU cpu[ASPEED_CPUS_NUM];
     AspeedINTCState intc;
     GICv3State gic;
};

#define TYPE_ASPEED27X0_SOC "aspeed27x0-soc"
OBJECT_DECLARE_SIMPLE_TYPE(Aspeed27x0SoCState, ASPEED27X0_SOC)

Thanks,

C.




Reply via email to