mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 03:59:52 +00:00
aspeed: Introduce an object class per SoC
It prepares ground for the AST2600. Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Joel Stanley <joel@jms.id.au> Message-id: 20190925143248.10000-18-clg@kaod.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
51dd49236b
commit
54ecafb7f9
@ -215,7 +215,7 @@ static void aspeed_board_init(MachineState *machine,
|
||||
memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
|
||||
memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
|
||||
memory_region_add_subregion(get_system_memory(),
|
||||
sc->info->memmap[ASPEED_SDRAM],
|
||||
sc->memmap[ASPEED_SDRAM],
|
||||
&bmc->ram_container);
|
||||
|
||||
max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
|
||||
@ -246,7 +246,7 @@ static void aspeed_board_init(MachineState *machine,
|
||||
}
|
||||
|
||||
aspeed_board_binfo.ram_size = ram_size;
|
||||
aspeed_board_binfo.loader_start = sc->info->memmap[ASPEED_SDRAM];
|
||||
aspeed_board_binfo.loader_start = sc->memmap[ASPEED_SDRAM];
|
||||
aspeed_board_binfo.nb_cpus = bmc->soc.num_cpus;
|
||||
|
||||
if (cfg->i2c_init) {
|
||||
|
@ -115,35 +115,11 @@ static const int aspeed_soc_ast2400_irqmap[] = {
|
||||
|
||||
#define aspeed_soc_ast2500_irqmap aspeed_soc_ast2400_irqmap
|
||||
|
||||
static const AspeedSoCInfo aspeed_socs[] = {
|
||||
{
|
||||
.name = "ast2400-a1",
|
||||
.cpu_type = ARM_CPU_TYPE_NAME("arm926"),
|
||||
.silicon_rev = AST2400_A1_SILICON_REV,
|
||||
.sram_size = 0x8000,
|
||||
.spis_num = 1,
|
||||
.wdts_num = 2,
|
||||
.irqmap = aspeed_soc_ast2400_irqmap,
|
||||
.memmap = aspeed_soc_ast2400_memmap,
|
||||
.num_cpus = 1,
|
||||
}, {
|
||||
.name = "ast2500-a1",
|
||||
.cpu_type = ARM_CPU_TYPE_NAME("arm1176"),
|
||||
.silicon_rev = AST2500_A1_SILICON_REV,
|
||||
.sram_size = 0x9000,
|
||||
.spis_num = 2,
|
||||
.wdts_num = 3,
|
||||
.irqmap = aspeed_soc_ast2500_irqmap,
|
||||
.memmap = aspeed_soc_ast2500_memmap,
|
||||
.num_cpus = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int ctrl)
|
||||
{
|
||||
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
|
||||
|
||||
return qdev_get_gpio_in(DEVICE(&s->vic), sc->info->irqmap[ctrl]);
|
||||
return qdev_get_gpio_in(DEVICE(&s->vic), sc->irqmap[ctrl]);
|
||||
}
|
||||
|
||||
static void aspeed_soc_init(Object *obj)
|
||||
@ -154,13 +130,13 @@ static void aspeed_soc_init(Object *obj)
|
||||
char socname[8];
|
||||
char typename[64];
|
||||
|
||||
if (sscanf(sc->info->name, "%7s", socname) != 1) {
|
||||
if (sscanf(sc->name, "%7s", socname) != 1) {
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
for (i = 0; i < sc->info->num_cpus; i++) {
|
||||
for (i = 0; i < sc->num_cpus; i++) {
|
||||
object_initialize_child(obj, "cpu[*]", OBJECT(&s->cpu[i]),
|
||||
sizeof(s->cpu[i]), sc->info->cpu_type,
|
||||
sizeof(s->cpu[i]), sc->cpu_type,
|
||||
&error_abort, NULL);
|
||||
}
|
||||
|
||||
@ -168,7 +144,7 @@ static void aspeed_soc_init(Object *obj)
|
||||
sysbus_init_child_obj(obj, "scu", OBJECT(&s->scu), sizeof(s->scu),
|
||||
typename);
|
||||
qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev",
|
||||
sc->info->silicon_rev);
|
||||
sc->silicon_rev);
|
||||
object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu),
|
||||
"hw-strap1", &error_abort);
|
||||
object_property_add_alias(obj, "hw-strap2", OBJECT(&s->scu),
|
||||
@ -200,7 +176,7 @@ static void aspeed_soc_init(Object *obj)
|
||||
object_property_add_alias(obj, "dram", OBJECT(&s->fmc), "dram",
|
||||
&error_abort);
|
||||
|
||||
for (i = 0; i < sc->info->spis_num; i++) {
|
||||
for (i = 0; i < sc->spis_num; i++) {
|
||||
snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i + 1, socname);
|
||||
sysbus_init_child_obj(obj, "spi[*]", OBJECT(&s->spi[i]),
|
||||
sizeof(s->spi[i]), typename);
|
||||
@ -214,7 +190,7 @@ static void aspeed_soc_init(Object *obj)
|
||||
object_property_add_alias(obj, "max-ram-size", OBJECT(&s->sdmc),
|
||||
"max-ram-size", &error_abort);
|
||||
|
||||
for (i = 0; i < sc->info->wdts_num; i++) {
|
||||
for (i = 0; i < sc->wdts_num; i++) {
|
||||
snprintf(typename, sizeof(typename), "aspeed.wdt-%s", socname);
|
||||
sysbus_init_child_obj(obj, "wdt[*]", OBJECT(&s->wdt[i]),
|
||||
sizeof(s->wdt[i]), typename);
|
||||
@ -252,13 +228,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
Error *err = NULL, *local_err = NULL;
|
||||
|
||||
/* IO space */
|
||||
create_unimplemented_device("aspeed_soc.io", sc->info->memmap[ASPEED_IOMEM],
|
||||
create_unimplemented_device("aspeed_soc.io", sc->memmap[ASPEED_IOMEM],
|
||||
ASPEED_SOC_IOMEM_SIZE);
|
||||
|
||||
if (s->num_cpus > sc->info->num_cpus) {
|
||||
if (s->num_cpus > sc->num_cpus) {
|
||||
warn_report("%s: invalid number of CPUs %d, using default %d",
|
||||
sc->info->name, s->num_cpus, sc->info->num_cpus);
|
||||
s->num_cpus = sc->info->num_cpus;
|
||||
sc->name, s->num_cpus, sc->num_cpus);
|
||||
s->num_cpus = sc->num_cpus;
|
||||
}
|
||||
|
||||
/* CPU */
|
||||
@ -272,13 +248,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
|
||||
/* SRAM */
|
||||
memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram",
|
||||
sc->info->sram_size, &err);
|
||||
sc->sram_size, &err);
|
||||
if (err) {
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
memory_region_add_subregion(get_system_memory(),
|
||||
sc->info->memmap[ASPEED_SRAM], &s->sram);
|
||||
sc->memmap[ASPEED_SRAM], &s->sram);
|
||||
|
||||
/* SCU */
|
||||
object_property_set_bool(OBJECT(&s->scu), true, "realized", &err);
|
||||
@ -286,7 +262,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->info->memmap[ASPEED_SCU]);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]);
|
||||
|
||||
/* VIC */
|
||||
object_property_set_bool(OBJECT(&s->vic), true, "realized", &err);
|
||||
@ -294,7 +270,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, sc->info->memmap[ASPEED_VIC]);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, sc->memmap[ASPEED_VIC]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 0,
|
||||
qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ));
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 1,
|
||||
@ -306,7 +282,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->info->memmap[ASPEED_RTC]);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0,
|
||||
aspeed_soc_get_irq(s, ASPEED_RTC));
|
||||
|
||||
@ -317,7 +293,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
|
||||
sc->info->memmap[ASPEED_TIMER1]);
|
||||
sc->memmap[ASPEED_TIMER1]);
|
||||
for (i = 0; i < ASPEED_TIMER_NR_TIMERS; i++) {
|
||||
qemu_irq irq = aspeed_soc_get_irq(s, ASPEED_TIMER1 + i);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->timerctrl), i, irq);
|
||||
@ -326,7 +302,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
/* UART - attach an 8250 to the IO space as our UART5 */
|
||||
if (serial_hd(0)) {
|
||||
qemu_irq uart5 = aspeed_soc_get_irq(s, ASPEED_UART5);
|
||||
serial_mm_init(get_system_memory(), sc->info->memmap[ASPEED_UART5], 2,
|
||||
serial_mm_init(get_system_memory(), sc->memmap[ASPEED_UART5], 2,
|
||||
uart5, 38400, serial_hd(0), DEVICE_LITTLE_ENDIAN);
|
||||
}
|
||||
|
||||
@ -336,12 +312,12 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->info->memmap[ASPEED_I2C]);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c), 0,
|
||||
aspeed_soc_get_irq(s, ASPEED_I2C));
|
||||
|
||||
/* FMC, The number of CS is set at the board level */
|
||||
object_property_set_int(OBJECT(&s->fmc), sc->info->memmap[ASPEED_SDRAM],
|
||||
object_property_set_int(OBJECT(&s->fmc), sc->memmap[ASPEED_SDRAM],
|
||||
"sdram-base", &err);
|
||||
if (err) {
|
||||
error_propagate(errp, err);
|
||||
@ -352,14 +328,14 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->info->memmap[ASPEED_FMC]);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 1,
|
||||
s->fmc.ctrl->flash_window_base);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0,
|
||||
aspeed_soc_get_irq(s, ASPEED_FMC));
|
||||
|
||||
/* SPI */
|
||||
for (i = 0; i < sc->info->spis_num; i++) {
|
||||
for (i = 0; i < sc->spis_num; i++) {
|
||||
object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs", &err);
|
||||
object_property_set_bool(OBJECT(&s->spi[i]), true, "realized",
|
||||
&local_err);
|
||||
@ -369,7 +345,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
|
||||
sc->info->memmap[ASPEED_SPI1 + i]);
|
||||
sc->memmap[ASPEED_SPI1 + i]);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 1,
|
||||
s->spi[i].ctrl->flash_window_base);
|
||||
}
|
||||
@ -380,10 +356,10 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->info->memmap[ASPEED_SDMC]);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]);
|
||||
|
||||
/* Watch dog */
|
||||
for (i = 0; i < sc->info->wdts_num; i++) {
|
||||
for (i = 0; i < sc->wdts_num; i++) {
|
||||
AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(&s->wdt[i]);
|
||||
|
||||
object_property_set_bool(OBJECT(&s->wdt[i]), true, "realized", &err);
|
||||
@ -392,7 +368,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
|
||||
sc->info->memmap[ASPEED_WDT] + i * awc->offset);
|
||||
sc->memmap[ASPEED_WDT] + i * awc->offset);
|
||||
}
|
||||
|
||||
/* Net */
|
||||
@ -408,7 +384,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
|
||||
sc->info->memmap[ASPEED_ETH1 + i]);
|
||||
sc->memmap[ASPEED_ETH1 + i]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
|
||||
aspeed_soc_get_irq(s, ASPEED_ETH1 + i));
|
||||
}
|
||||
@ -420,7 +396,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0,
|
||||
sc->info->memmap[ASPEED_XDMA]);
|
||||
sc->memmap[ASPEED_XDMA]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->xdma), 0,
|
||||
aspeed_soc_get_irq(s, ASPEED_XDMA));
|
||||
|
||||
@ -430,7 +406,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->info->memmap[ASPEED_GPIO]);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
|
||||
aspeed_soc_get_irq(s, ASPEED_GPIO));
|
||||
|
||||
@ -441,7 +417,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
|
||||
return;
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
|
||||
sc->info->memmap[ASPEED_SDHCI]);
|
||||
sc->memmap[ASPEED_SDHCI]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
|
||||
aspeed_soc_get_irq(s, ASPEED_SDHCI));
|
||||
}
|
||||
@ -453,9 +429,7 @@ static Property aspeed_soc_properties[] = {
|
||||
static void aspeed_soc_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(oc);
|
||||
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
|
||||
|
||||
sc->info = (AspeedSoCInfo *) data;
|
||||
dc->realize = aspeed_soc_realize;
|
||||
/* Reason: Uses serial_hds and nd_table in realize() directly */
|
||||
dc->user_creatable = false;
|
||||
@ -465,26 +439,62 @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data)
|
||||
static const TypeInfo aspeed_soc_type_info = {
|
||||
.name = TYPE_ASPEED_SOC,
|
||||
.parent = TYPE_DEVICE,
|
||||
.instance_init = aspeed_soc_init,
|
||||
.instance_size = sizeof(AspeedSoCState),
|
||||
.class_size = sizeof(AspeedSoCClass),
|
||||
.class_init = aspeed_soc_class_init,
|
||||
.abstract = true,
|
||||
};
|
||||
|
||||
static void aspeed_soc_register_types(void)
|
||||
static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
int i;
|
||||
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
|
||||
|
||||
type_register_static(&aspeed_soc_type_info);
|
||||
for (i = 0; i < ARRAY_SIZE(aspeed_socs); ++i) {
|
||||
TypeInfo ti = {
|
||||
.name = aspeed_socs[i].name,
|
||||
.parent = TYPE_ASPEED_SOC,
|
||||
.class_init = aspeed_soc_class_init,
|
||||
.class_data = (void *) &aspeed_socs[i],
|
||||
};
|
||||
type_register(&ti);
|
||||
}
|
||||
sc->name = "ast2400-a1";
|
||||
sc->cpu_type = ARM_CPU_TYPE_NAME("arm926");
|
||||
sc->silicon_rev = AST2400_A1_SILICON_REV;
|
||||
sc->sram_size = 0x8000;
|
||||
sc->spis_num = 1;
|
||||
sc->wdts_num = 2;
|
||||
sc->irqmap = aspeed_soc_ast2400_irqmap;
|
||||
sc->memmap = aspeed_soc_ast2400_memmap;
|
||||
sc->num_cpus = 1;
|
||||
}
|
||||
|
||||
static const TypeInfo aspeed_soc_ast2400_type_info = {
|
||||
.name = "ast2400-a1",
|
||||
.parent = TYPE_ASPEED_SOC,
|
||||
.instance_init = aspeed_soc_init,
|
||||
.instance_size = sizeof(AspeedSoCState),
|
||||
.class_init = aspeed_soc_ast2400_class_init,
|
||||
};
|
||||
|
||||
static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
|
||||
|
||||
sc->name = "ast2500-a1";
|
||||
sc->cpu_type = ARM_CPU_TYPE_NAME("arm1176");
|
||||
sc->silicon_rev = AST2500_A1_SILICON_REV;
|
||||
sc->sram_size = 0x9000;
|
||||
sc->spis_num = 2;
|
||||
sc->wdts_num = 3;
|
||||
sc->irqmap = aspeed_soc_ast2500_irqmap;
|
||||
sc->memmap = aspeed_soc_ast2500_memmap;
|
||||
sc->num_cpus = 1;
|
||||
}
|
||||
|
||||
static const TypeInfo aspeed_soc_ast2500_type_info = {
|
||||
.name = "ast2500-a1",
|
||||
.parent = TYPE_ASPEED_SOC,
|
||||
.instance_init = aspeed_soc_init,
|
||||
.instance_size = sizeof(AspeedSoCState),
|
||||
.class_init = aspeed_soc_ast2500_class_init,
|
||||
};
|
||||
static void aspeed_soc_register_types(void)
|
||||
{
|
||||
type_register_static(&aspeed_soc_type_info);
|
||||
type_register_static(&aspeed_soc_ast2400_type_info);
|
||||
type_register_static(&aspeed_soc_ast2500_type_info);
|
||||
};
|
||||
|
||||
type_init(aspeed_soc_register_types)
|
||||
|
@ -57,7 +57,9 @@ typedef struct AspeedSoCState {
|
||||
#define TYPE_ASPEED_SOC "aspeed-soc"
|
||||
#define ASPEED_SOC(obj) OBJECT_CHECK(AspeedSoCState, (obj), TYPE_ASPEED_SOC)
|
||||
|
||||
typedef struct AspeedSoCInfo {
|
||||
typedef struct AspeedSoCClass {
|
||||
DeviceClass parent_class;
|
||||
|
||||
const char *name;
|
||||
const char *cpu_type;
|
||||
uint32_t silicon_rev;
|
||||
@ -67,11 +69,6 @@ typedef struct AspeedSoCInfo {
|
||||
const int *irqmap;
|
||||
const hwaddr *memmap;
|
||||
uint32_t num_cpus;
|
||||
} AspeedSoCInfo;
|
||||
|
||||
typedef struct AspeedSoCClass {
|
||||
DeviceClass parent_class;
|
||||
AspeedSoCInfo *info;
|
||||
} AspeedSoCClass;
|
||||
|
||||
#define ASPEED_SOC_CLASS(klass) \
|
||||
|
Loading…
Reference in New Issue
Block a user