提交 54ecafb7 编写于 作者: C Cédric Le Goater 提交者: Peter Maydell

aspeed: Introduce an object class per SoC

It prepares ground for the AST2600.
Signed-off-by: NCédric Le Goater <clg@kaod.org>
Reviewed-by: NJoel Stanley <joel@jms.id.au>
Message-id: 20190925143248.10000-18-clg@kaod.org
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
上级 51dd4923
...@@ -215,7 +215,7 @@ static void aspeed_board_init(MachineState *machine, ...@@ -215,7 +215,7 @@ static void aspeed_board_init(MachineState *machine,
memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size); 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(&bmc->ram_container, 0, &bmc->ram);
memory_region_add_subregion(get_system_memory(), memory_region_add_subregion(get_system_memory(),
sc->info->memmap[ASPEED_SDRAM], sc->memmap[ASPEED_SDRAM],
&bmc->ram_container); &bmc->ram_container);
max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size", max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
...@@ -246,7 +246,7 @@ static void aspeed_board_init(MachineState *machine, ...@@ -246,7 +246,7 @@ static void aspeed_board_init(MachineState *machine,
} }
aspeed_board_binfo.ram_size = ram_size; 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; aspeed_board_binfo.nb_cpus = bmc->soc.num_cpus;
if (cfg->i2c_init) { if (cfg->i2c_init) {
......
...@@ -115,35 +115,11 @@ static const int aspeed_soc_ast2400_irqmap[] = { ...@@ -115,35 +115,11 @@ static const int aspeed_soc_ast2400_irqmap[] = {
#define aspeed_soc_ast2500_irqmap 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) static qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int ctrl)
{ {
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 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) static void aspeed_soc_init(Object *obj)
...@@ -154,13 +130,13 @@ static void aspeed_soc_init(Object *obj) ...@@ -154,13 +130,13 @@ static void aspeed_soc_init(Object *obj)
char socname[8]; char socname[8];
char typename[64]; char typename[64];
if (sscanf(sc->info->name, "%7s", socname) != 1) { if (sscanf(sc->name, "%7s", socname) != 1) {
g_assert_not_reached(); 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]), 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); &error_abort, NULL);
} }
...@@ -168,7 +144,7 @@ static void aspeed_soc_init(Object *obj) ...@@ -168,7 +144,7 @@ static void aspeed_soc_init(Object *obj)
sysbus_init_child_obj(obj, "scu", OBJECT(&s->scu), sizeof(s->scu), sysbus_init_child_obj(obj, "scu", OBJECT(&s->scu), sizeof(s->scu),
typename); typename);
qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev", 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), object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu),
"hw-strap1", &error_abort); "hw-strap1", &error_abort);
object_property_add_alias(obj, "hw-strap2", OBJECT(&s->scu), object_property_add_alias(obj, "hw-strap2", OBJECT(&s->scu),
...@@ -200,7 +176,7 @@ static void aspeed_soc_init(Object *obj) ...@@ -200,7 +176,7 @@ static void aspeed_soc_init(Object *obj)
object_property_add_alias(obj, "dram", OBJECT(&s->fmc), "dram", object_property_add_alias(obj, "dram", OBJECT(&s->fmc), "dram",
&error_abort); &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); snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i + 1, socname);
sysbus_init_child_obj(obj, "spi[*]", OBJECT(&s->spi[i]), sysbus_init_child_obj(obj, "spi[*]", OBJECT(&s->spi[i]),
sizeof(s->spi[i]), typename); sizeof(s->spi[i]), typename);
...@@ -214,7 +190,7 @@ static void aspeed_soc_init(Object *obj) ...@@ -214,7 +190,7 @@ static void aspeed_soc_init(Object *obj)
object_property_add_alias(obj, "max-ram-size", OBJECT(&s->sdmc), object_property_add_alias(obj, "max-ram-size", OBJECT(&s->sdmc),
"max-ram-size", &error_abort); "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); snprintf(typename, sizeof(typename), "aspeed.wdt-%s", socname);
sysbus_init_child_obj(obj, "wdt[*]", OBJECT(&s->wdt[i]), sysbus_init_child_obj(obj, "wdt[*]", OBJECT(&s->wdt[i]),
sizeof(s->wdt[i]), typename); sizeof(s->wdt[i]), typename);
...@@ -252,13 +228,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -252,13 +228,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
Error *err = NULL, *local_err = NULL; Error *err = NULL, *local_err = NULL;
/* IO space */ /* 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); 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", warn_report("%s: invalid number of CPUs %d, using default %d",
sc->info->name, s->num_cpus, sc->info->num_cpus); sc->name, s->num_cpus, sc->num_cpus);
s->num_cpus = sc->info->num_cpus; s->num_cpus = sc->num_cpus;
} }
/* CPU */ /* CPU */
...@@ -272,13 +248,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -272,13 +248,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
/* SRAM */ /* SRAM */
memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram", memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram",
sc->info->sram_size, &err); sc->sram_size, &err);
if (err) { if (err) {
error_propagate(errp, err); error_propagate(errp, err);
return; return;
} }
memory_region_add_subregion(get_system_memory(), memory_region_add_subregion(get_system_memory(),
sc->info->memmap[ASPEED_SRAM], &s->sram); sc->memmap[ASPEED_SRAM], &s->sram);
/* SCU */ /* SCU */
object_property_set_bool(OBJECT(&s->scu), true, "realized", &err); object_property_set_bool(OBJECT(&s->scu), true, "realized", &err);
...@@ -286,7 +262,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -286,7 +262,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate(errp, err); error_propagate(errp, err);
return; 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 */ /* VIC */
object_property_set_bool(OBJECT(&s->vic), true, "realized", &err); object_property_set_bool(OBJECT(&s->vic), true, "realized", &err);
...@@ -294,7 +270,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -294,7 +270,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate(errp, err); error_propagate(errp, err);
return; 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, sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 0,
qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ)); qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ));
sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 1, sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 1,
...@@ -306,7 +282,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -306,7 +282,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate(errp, err); error_propagate(errp, err);
return; 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, sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0,
aspeed_soc_get_irq(s, ASPEED_RTC)); aspeed_soc_get_irq(s, ASPEED_RTC));
...@@ -317,7 +293,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -317,7 +293,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return; return;
} }
sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0, 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++) { for (i = 0; i < ASPEED_TIMER_NR_TIMERS; i++) {
qemu_irq irq = aspeed_soc_get_irq(s, ASPEED_TIMER1 + i); qemu_irq irq = aspeed_soc_get_irq(s, ASPEED_TIMER1 + i);
sysbus_connect_irq(SYS_BUS_DEVICE(&s->timerctrl), i, irq); sysbus_connect_irq(SYS_BUS_DEVICE(&s->timerctrl), i, irq);
...@@ -326,7 +302,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -326,7 +302,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
/* UART - attach an 8250 to the IO space as our UART5 */ /* UART - attach an 8250 to the IO space as our UART5 */
if (serial_hd(0)) { if (serial_hd(0)) {
qemu_irq uart5 = aspeed_soc_get_irq(s, ASPEED_UART5); 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); uart5, 38400, serial_hd(0), DEVICE_LITTLE_ENDIAN);
} }
...@@ -336,12 +312,12 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -336,12 +312,12 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate(errp, err); error_propagate(errp, err);
return; 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, sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c), 0,
aspeed_soc_get_irq(s, ASPEED_I2C)); aspeed_soc_get_irq(s, ASPEED_I2C));
/* FMC, The number of CS is set at the board level */ /* 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); "sdram-base", &err);
if (err) { if (err) {
error_propagate(errp, err); error_propagate(errp, err);
...@@ -352,14 +328,14 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -352,14 +328,14 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate(errp, err); error_propagate(errp, err);
return; 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, sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 1,
s->fmc.ctrl->flash_window_base); s->fmc.ctrl->flash_window_base);
sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0, sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0,
aspeed_soc_get_irq(s, ASPEED_FMC)); aspeed_soc_get_irq(s, ASPEED_FMC));
/* SPI */ /* 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_int(OBJECT(&s->spi[i]), 1, "num-cs", &err);
object_property_set_bool(OBJECT(&s->spi[i]), true, "realized", object_property_set_bool(OBJECT(&s->spi[i]), true, "realized",
&local_err); &local_err);
...@@ -369,7 +345,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -369,7 +345,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return; return;
} }
sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0, 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, sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 1,
s->spi[i].ctrl->flash_window_base); s->spi[i].ctrl->flash_window_base);
} }
...@@ -380,10 +356,10 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -380,10 +356,10 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate(errp, err); error_propagate(errp, err);
return; 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 */ /* 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]); AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(&s->wdt[i]);
object_property_set_bool(OBJECT(&s->wdt[i]), true, "realized", &err); object_property_set_bool(OBJECT(&s->wdt[i]), true, "realized", &err);
...@@ -392,7 +368,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -392,7 +368,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return; return;
} }
sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, 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 */ /* Net */
...@@ -408,7 +384,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -408,7 +384,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return; return;
} }
sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0, 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, sysbus_connect_irq(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
aspeed_soc_get_irq(s, ASPEED_ETH1 + i)); aspeed_soc_get_irq(s, ASPEED_ETH1 + i));
} }
...@@ -420,7 +396,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -420,7 +396,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return; return;
} }
sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0, 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, sysbus_connect_irq(SYS_BUS_DEVICE(&s->xdma), 0,
aspeed_soc_get_irq(s, ASPEED_XDMA)); aspeed_soc_get_irq(s, ASPEED_XDMA));
...@@ -430,7 +406,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -430,7 +406,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
error_propagate(errp, err); error_propagate(errp, err);
return; 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, sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
aspeed_soc_get_irq(s, ASPEED_GPIO)); aspeed_soc_get_irq(s, ASPEED_GPIO));
...@@ -441,7 +417,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) ...@@ -441,7 +417,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
return; return;
} }
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0, 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, sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
aspeed_soc_get_irq(s, ASPEED_SDHCI)); aspeed_soc_get_irq(s, ASPEED_SDHCI));
} }
...@@ -453,9 +429,7 @@ static Property aspeed_soc_properties[] = { ...@@ -453,9 +429,7 @@ static Property aspeed_soc_properties[] = {
static void aspeed_soc_class_init(ObjectClass *oc, void *data) static void aspeed_soc_class_init(ObjectClass *oc, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(oc); DeviceClass *dc = DEVICE_CLASS(oc);
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
sc->info = (AspeedSoCInfo *) data;
dc->realize = aspeed_soc_realize; dc->realize = aspeed_soc_realize;
/* Reason: Uses serial_hds and nd_table in realize() directly */ /* Reason: Uses serial_hds and nd_table in realize() directly */
dc->user_creatable = false; dc->user_creatable = false;
...@@ -465,26 +439,62 @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data) ...@@ -465,26 +439,62 @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data)
static const TypeInfo aspeed_soc_type_info = { static const TypeInfo aspeed_soc_type_info = {
.name = TYPE_ASPEED_SOC, .name = TYPE_ASPEED_SOC,
.parent = TYPE_DEVICE, .parent = TYPE_DEVICE,
.instance_init = aspeed_soc_init,
.instance_size = sizeof(AspeedSoCState), .instance_size = sizeof(AspeedSoCState),
.class_size = sizeof(AspeedSoCClass), .class_size = sizeof(AspeedSoCClass),
.class_init = aspeed_soc_class_init,
.abstract = true, .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); sc->name = "ast2400-a1";
for (i = 0; i < ARRAY_SIZE(aspeed_socs); ++i) { sc->cpu_type = ARM_CPU_TYPE_NAME("arm926");
TypeInfo ti = { sc->silicon_rev = AST2400_A1_SILICON_REV;
.name = aspeed_socs[i].name, sc->sram_size = 0x8000;
.parent = TYPE_ASPEED_SOC, sc->spis_num = 1;
.class_init = aspeed_soc_class_init, sc->wdts_num = 2;
.class_data = (void *) &aspeed_socs[i], sc->irqmap = aspeed_soc_ast2400_irqmap;
}; sc->memmap = aspeed_soc_ast2400_memmap;
type_register(&ti); 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) type_init(aspeed_soc_register_types)
...@@ -57,7 +57,9 @@ typedef struct AspeedSoCState { ...@@ -57,7 +57,9 @@ typedef struct AspeedSoCState {
#define TYPE_ASPEED_SOC "aspeed-soc" #define TYPE_ASPEED_SOC "aspeed-soc"
#define ASPEED_SOC(obj) OBJECT_CHECK(AspeedSoCState, (obj), TYPE_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 *name;
const char *cpu_type; const char *cpu_type;
uint32_t silicon_rev; uint32_t silicon_rev;
...@@ -67,11 +69,6 @@ typedef struct AspeedSoCInfo { ...@@ -67,11 +69,6 @@ typedef struct AspeedSoCInfo {
const int *irqmap; const int *irqmap;
const hwaddr *memmap; const hwaddr *memmap;
uint32_t num_cpus; uint32_t num_cpus;
} AspeedSoCInfo;
typedef struct AspeedSoCClass {
DeviceClass parent_class;
AspeedSoCInfo *info;
} AspeedSoCClass; } AspeedSoCClass;
#define ASPEED_SOC_CLASS(klass) \ #define ASPEED_SOC_CLASS(klass) \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册