|
@@ -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)
|