143e3346eSAndrew Jeffery /* 2ff90606fSCédric Le Goater * ASPEED SoC family 343e3346eSAndrew Jeffery * 443e3346eSAndrew Jeffery * Andrew Jeffery <andrew@aj.id.au> 543e3346eSAndrew Jeffery * Jeremy Kerr <jk@ozlabs.org> 643e3346eSAndrew Jeffery * 743e3346eSAndrew Jeffery * Copyright 2016 IBM Corp. 843e3346eSAndrew Jeffery * 943e3346eSAndrew Jeffery * This code is licensed under the GPL version 2 or later. See 1043e3346eSAndrew Jeffery * the COPYING file in the top-level directory. 1143e3346eSAndrew Jeffery */ 1243e3346eSAndrew Jeffery 1343e3346eSAndrew Jeffery #include "qemu/osdep.h" 14da34e65cSMarkus Armbruster #include "qapi/error.h" 154771d756SPaolo Bonzini #include "cpu.h" 1643e3346eSAndrew Jeffery #include "exec/address-spaces.h" 17c7c3c9f8SPhilippe Mathieu-Daudé #include "hw/misc/unimp.h" 1800442402SCédric Le Goater #include "hw/arm/aspeed_soc.h" 1943e3346eSAndrew Jeffery #include "hw/char/serial.h" 2003dd024fSPaolo Bonzini #include "qemu/log.h" 210b8fa32fSMarkus Armbruster #include "qemu/module.h" 2216020011SCédric Le Goater #include "hw/i2c/aspeed_i2c.h" 23ea337c65SCédric Le Goater #include "net/net.h" 2443e3346eSAndrew Jeffery 25ff90606fSCédric Le Goater #define ASPEED_SOC_UART_5_BASE 0x00184000 26ff90606fSCédric Le Goater #define ASPEED_SOC_IOMEM_SIZE 0x00200000 27ff90606fSCédric Le Goater #define ASPEED_SOC_IOMEM_BASE 0x1E600000 28ff90606fSCédric Le Goater #define ASPEED_SOC_FMC_BASE 0x1E620000 29ff90606fSCédric Le Goater #define ASPEED_SOC_SPI_BASE 0x1E630000 306dc52326SCédric Le Goater #define ASPEED_SOC_SPI2_BASE 0x1E631000 31ff90606fSCédric Le Goater #define ASPEED_SOC_VIC_BASE 0x1E6C0000 32ff90606fSCédric Le Goater #define ASPEED_SOC_SDMC_BASE 0x1E6E0000 33ff90606fSCédric Le Goater #define ASPEED_SOC_SCU_BASE 0x1E6E2000 3474af4eecSCédric Le Goater #define ASPEED_SOC_SRAM_BASE 0x1E720000 35ff90606fSCédric Le Goater #define ASPEED_SOC_TIMER_BASE 0x1E782000 36013befe1SCédric Le Goater #define ASPEED_SOC_WDT_BASE 0x1E785000 37ff90606fSCédric Le Goater #define ASPEED_SOC_I2C_BASE 0x1E78A000 38ea337c65SCédric Le Goater #define ASPEED_SOC_ETH1_BASE 0x1E660000 39ea337c65SCédric Le Goater #define ASPEED_SOC_ETH2_BASE 0x1E680000 4043e3346eSAndrew Jeffery 41b456b113SCédric Le Goater static const int aspeed_soc_ast2400_irqmap[] = { 42b456b113SCédric Le Goater [ASPEED_UART1] = 9, 43b456b113SCédric Le Goater [ASPEED_UART2] = 32, 44b456b113SCédric Le Goater [ASPEED_UART3] = 33, 45b456b113SCédric Le Goater [ASPEED_UART4] = 34, 46b456b113SCédric Le Goater [ASPEED_UART5] = 10, 47b456b113SCédric Le Goater [ASPEED_VUART] = 8, 48b456b113SCédric Le Goater [ASPEED_FMC] = 19, 49b456b113SCédric Le Goater [ASPEED_SDMC] = 0, 50b456b113SCédric Le Goater [ASPEED_SCU] = 21, 51b456b113SCédric Le Goater [ASPEED_ADC] = 31, 52b456b113SCédric Le Goater [ASPEED_GPIO] = 20, 53b456b113SCédric Le Goater [ASPEED_RTC] = 22, 54b456b113SCédric Le Goater [ASPEED_TIMER1] = 16, 55b456b113SCédric Le Goater [ASPEED_TIMER2] = 17, 56b456b113SCédric Le Goater [ASPEED_TIMER3] = 18, 57b456b113SCédric Le Goater [ASPEED_TIMER4] = 35, 58b456b113SCédric Le Goater [ASPEED_TIMER5] = 36, 59b456b113SCédric Le Goater [ASPEED_TIMER6] = 37, 60b456b113SCédric Le Goater [ASPEED_TIMER7] = 38, 61b456b113SCédric Le Goater [ASPEED_TIMER8] = 39, 62b456b113SCédric Le Goater [ASPEED_WDT] = 27, 63b456b113SCédric Le Goater [ASPEED_PWM] = 28, 64b456b113SCédric Le Goater [ASPEED_LPC] = 8, 65b456b113SCédric Le Goater [ASPEED_IBT] = 8, /* LPC */ 66b456b113SCédric Le Goater [ASPEED_I2C] = 12, 67b456b113SCédric Le Goater [ASPEED_ETH1] = 2, 68b456b113SCédric Le Goater [ASPEED_ETH2] = 3, 69b456b113SCédric Le Goater }; 7043e3346eSAndrew Jeffery 71b033271fSCédric Le Goater #define AST2400_SDRAM_BASE 0x40000000 72365aff1eSCédric Le Goater #define AST2500_SDRAM_BASE 0x80000000 73b033271fSCédric Le Goater 74b456b113SCédric Le Goater /* AST2500 uses the same IRQs as the AST2400 */ 75b456b113SCédric Le Goater #define aspeed_soc_ast2500_irqmap aspeed_soc_ast2400_irqmap 76b456b113SCédric Le Goater 77dbcabeebSCédric Le Goater static const hwaddr aspeed_soc_ast2400_spi_bases[] = { ASPEED_SOC_SPI_BASE }; 786dc52326SCédric Le Goater static const char *aspeed_soc_ast2400_typenames[] = { "aspeed.smc.spi" }; 79dbcabeebSCédric Le Goater 806dc52326SCédric Le Goater static const hwaddr aspeed_soc_ast2500_spi_bases[] = { ASPEED_SOC_SPI_BASE, 816dc52326SCédric Le Goater ASPEED_SOC_SPI2_BASE}; 826dc52326SCédric Le Goater static const char *aspeed_soc_ast2500_typenames[] = { 836dc52326SCédric Le Goater "aspeed.smc.ast2500-spi1", "aspeed.smc.ast2500-spi2" }; 84dbcabeebSCédric Le Goater 85b033271fSCédric Le Goater static const AspeedSoCInfo aspeed_socs[] = { 8674af4eecSCédric Le Goater { 8774af4eecSCédric Le Goater .name = "ast2400-a0", 88ba1ba5ccSIgor Mammedov .cpu_type = ARM_CPU_TYPE_NAME("arm926"), 8974af4eecSCédric Le Goater .silicon_rev = AST2400_A0_SILICON_REV, 9074af4eecSCédric Le Goater .sdram_base = AST2400_SDRAM_BASE, 9174af4eecSCédric Le Goater .sram_size = 0x8000, 9274af4eecSCédric Le Goater .spis_num = 1, 9374af4eecSCédric Le Goater .spi_bases = aspeed_soc_ast2400_spi_bases, 9474af4eecSCédric Le Goater .fmc_typename = "aspeed.smc.fmc", 9574af4eecSCédric Le Goater .spi_typename = aspeed_soc_ast2400_typenames, 96f986ee1dSJoel Stanley .wdts_num = 2, 97b456b113SCédric Le Goater .irqmap = aspeed_soc_ast2400_irqmap, 9874af4eecSCédric Le Goater }, { 996efbac90SCédric Le Goater .name = "ast2400-a1", 100ba1ba5ccSIgor Mammedov .cpu_type = ARM_CPU_TYPE_NAME("arm926"), 1016efbac90SCédric Le Goater .silicon_rev = AST2400_A1_SILICON_REV, 1026efbac90SCédric Le Goater .sdram_base = AST2400_SDRAM_BASE, 1036efbac90SCédric Le Goater .sram_size = 0x8000, 1046efbac90SCédric Le Goater .spis_num = 1, 1056efbac90SCédric Le Goater .spi_bases = aspeed_soc_ast2400_spi_bases, 1066efbac90SCédric Le Goater .fmc_typename = "aspeed.smc.fmc", 1076efbac90SCédric Le Goater .spi_typename = aspeed_soc_ast2400_typenames, 108f986ee1dSJoel Stanley .wdts_num = 2, 109b456b113SCédric Le Goater .irqmap = aspeed_soc_ast2400_irqmap, 1106efbac90SCédric Le Goater }, { 11174af4eecSCédric Le Goater .name = "ast2400", 112ba1ba5ccSIgor Mammedov .cpu_type = ARM_CPU_TYPE_NAME("arm926"), 11374af4eecSCédric Le Goater .silicon_rev = AST2400_A0_SILICON_REV, 11474af4eecSCédric Le Goater .sdram_base = AST2400_SDRAM_BASE, 11574af4eecSCédric Le Goater .sram_size = 0x8000, 11674af4eecSCédric Le Goater .spis_num = 1, 11774af4eecSCédric Le Goater .spi_bases = aspeed_soc_ast2400_spi_bases, 11874af4eecSCédric Le Goater .fmc_typename = "aspeed.smc.fmc", 11974af4eecSCédric Le Goater .spi_typename = aspeed_soc_ast2400_typenames, 120f986ee1dSJoel Stanley .wdts_num = 2, 121b456b113SCédric Le Goater .irqmap = aspeed_soc_ast2400_irqmap, 12274af4eecSCédric Le Goater }, { 12374af4eecSCédric Le Goater .name = "ast2500-a1", 124ba1ba5ccSIgor Mammedov .cpu_type = ARM_CPU_TYPE_NAME("arm1176"), 12574af4eecSCédric Le Goater .silicon_rev = AST2500_A1_SILICON_REV, 12674af4eecSCédric Le Goater .sdram_base = AST2500_SDRAM_BASE, 12774af4eecSCédric Le Goater .sram_size = 0x9000, 12874af4eecSCédric Le Goater .spis_num = 2, 12974af4eecSCédric Le Goater .spi_bases = aspeed_soc_ast2500_spi_bases, 13074af4eecSCédric Le Goater .fmc_typename = "aspeed.smc.ast2500-fmc", 13174af4eecSCédric Le Goater .spi_typename = aspeed_soc_ast2500_typenames, 132f986ee1dSJoel Stanley .wdts_num = 3, 133b456b113SCédric Le Goater .irqmap = aspeed_soc_ast2500_irqmap, 13474af4eecSCédric Le Goater }, 135b033271fSCédric Le Goater }; 136b033271fSCédric Le Goater 137b456b113SCédric Le Goater static qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int ctrl) 138b456b113SCédric Le Goater { 139b456b113SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 140b456b113SCédric Le Goater 141b456b113SCédric Le Goater return qdev_get_gpio_in(DEVICE(&s->vic), sc->info->irqmap[ctrl]); 142b456b113SCédric Le Goater } 143b456b113SCédric Le Goater 144ff90606fSCédric Le Goater static void aspeed_soc_init(Object *obj) 14543e3346eSAndrew Jeffery { 146ff90606fSCédric Le Goater AspeedSoCState *s = ASPEED_SOC(obj); 147b033271fSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 148dbcabeebSCédric Le Goater int i; 14943e3346eSAndrew Jeffery 1501b0ad567SPhilippe Mathieu-Daudé object_initialize_child(obj, "cpu", OBJECT(&s->cpu), sizeof(s->cpu), 1511b0ad567SPhilippe Mathieu-Daudé sc->info->cpu_type, &error_abort, NULL); 15243e3346eSAndrew Jeffery 1531b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "scu", OBJECT(&s->scu), sizeof(s->scu), 1541b0ad567SPhilippe Mathieu-Daudé TYPE_ASPEED_SCU); 155334973bbSAndrew Jeffery qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev", 156b033271fSCédric Le Goater sc->info->silicon_rev); 157334973bbSAndrew Jeffery object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu), 158334973bbSAndrew Jeffery "hw-strap1", &error_abort); 159334973bbSAndrew Jeffery object_property_add_alias(obj, "hw-strap2", OBJECT(&s->scu), 160334973bbSAndrew Jeffery "hw-strap2", &error_abort); 161b6e70d1dSJoel Stanley object_property_add_alias(obj, "hw-prot-key", OBJECT(&s->scu), 162b6e70d1dSJoel Stanley "hw-prot-key", &error_abort); 1637c1c69bcSCédric Le Goater 1641b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "vic", OBJECT(&s->vic), sizeof(s->vic), 1651b0ad567SPhilippe Mathieu-Daudé TYPE_ASPEED_VIC); 166e2a11ca8SCédric Le Goater 1671b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "timerctrl", OBJECT(&s->timerctrl), 1681b0ad567SPhilippe Mathieu-Daudé sizeof(s->timerctrl), TYPE_ASPEED_TIMER); 1699b945a9eSCédric Le Goater object_property_add_const_link(OBJECT(&s->timerctrl), "scu", 1709b945a9eSCédric Le Goater OBJECT(&s->scu), &error_abort); 171e2a11ca8SCédric Le Goater 1721b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "i2c", OBJECT(&s->i2c), sizeof(s->i2c), 1731b0ad567SPhilippe Mathieu-Daudé TYPE_ASPEED_I2C); 174e2a11ca8SCédric Le Goater 1751b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "fmc", OBJECT(&s->fmc), sizeof(s->fmc), 1761b0ad567SPhilippe Mathieu-Daudé sc->info->fmc_typename); 17726d5df95SCédric Le Goater object_property_add_alias(obj, "num-cs", OBJECT(&s->fmc), "num-cs", 17826d5df95SCédric Le Goater &error_abort); 1797c1c69bcSCédric Le Goater 180dbcabeebSCédric Le Goater for (i = 0; i < sc->info->spis_num; i++) { 1811b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "spi[*]", OBJECT(&s->spi[i]), 1821b0ad567SPhilippe Mathieu-Daudé sizeof(s->spi[i]), sc->info->spi_typename[i]); 183dbcabeebSCédric Le Goater } 184c2da8a8bSCédric Le Goater 1851b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc), 1861b0ad567SPhilippe Mathieu-Daudé TYPE_ASPEED_SDMC); 187c2da8a8bSCédric Le Goater qdev_prop_set_uint32(DEVICE(&s->sdmc), "silicon-rev", 188b033271fSCédric Le Goater sc->info->silicon_rev); 189c6c7cfb0SCédric Le Goater object_property_add_alias(obj, "ram-size", OBJECT(&s->sdmc), 190c6c7cfb0SCédric Le Goater "ram-size", &error_abort); 191ebe31c0aSCédric Le Goater object_property_add_alias(obj, "max-ram-size", OBJECT(&s->sdmc), 192ebe31c0aSCédric Le Goater "max-ram-size", &error_abort); 193013befe1SCédric Le Goater 194f986ee1dSJoel Stanley for (i = 0; i < sc->info->wdts_num; i++) { 1951b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "wdt[*]", OBJECT(&s->wdt[i]), 1961b0ad567SPhilippe Mathieu-Daudé sizeof(s->wdt[i]), TYPE_ASPEED_WDT); 197429789ccSAndrew Jeffery qdev_prop_set_uint32(DEVICE(&s->wdt[i]), "silicon-rev", 198429789ccSAndrew Jeffery sc->info->silicon_rev); 199f986ee1dSJoel Stanley } 200ea337c65SCédric Le Goater 2011b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "ftgmac100", OBJECT(&s->ftgmac100), 2021b0ad567SPhilippe Mathieu-Daudé sizeof(s->ftgmac100), TYPE_FTGMAC100); 20343e3346eSAndrew Jeffery } 20443e3346eSAndrew Jeffery 205ff90606fSCédric Le Goater static void aspeed_soc_realize(DeviceState *dev, Error **errp) 20643e3346eSAndrew Jeffery { 20743e3346eSAndrew Jeffery int i; 208ff90606fSCédric Le Goater AspeedSoCState *s = ASPEED_SOC(dev); 209dbcabeebSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 2107c1c69bcSCédric Le Goater Error *err = NULL, *local_err = NULL; 21143e3346eSAndrew Jeffery 21243e3346eSAndrew Jeffery /* IO space */ 213c7c3c9f8SPhilippe Mathieu-Daudé create_unimplemented_device("aspeed_soc.io", 214c7c3c9f8SPhilippe Mathieu-Daudé ASPEED_SOC_IOMEM_BASE, ASPEED_SOC_IOMEM_SIZE); 21543e3346eSAndrew Jeffery 2162d105bd6SCédric Le Goater /* CPU */ 2172d105bd6SCédric Le Goater object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err); 2182d105bd6SCédric Le Goater if (err) { 2192d105bd6SCédric Le Goater error_propagate(errp, err); 2202d105bd6SCédric Le Goater return; 2212d105bd6SCédric Le Goater } 2222d105bd6SCédric Le Goater 22374af4eecSCédric Le Goater /* SRAM */ 224a2e9989cSPeter Maydell memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram", 22574af4eecSCédric Le Goater sc->info->sram_size, &err); 22674af4eecSCédric Le Goater if (err) { 22774af4eecSCédric Le Goater error_propagate(errp, err); 22874af4eecSCédric Le Goater return; 22974af4eecSCédric Le Goater } 23074af4eecSCédric Le Goater memory_region_add_subregion(get_system_memory(), ASPEED_SOC_SRAM_BASE, 23174af4eecSCédric Le Goater &s->sram); 23274af4eecSCédric Le Goater 233e2a11ca8SCédric Le Goater /* SCU */ 234e2a11ca8SCédric Le Goater object_property_set_bool(OBJECT(&s->scu), true, "realized", &err); 235e2a11ca8SCédric Le Goater if (err) { 236e2a11ca8SCédric Le Goater error_propagate(errp, err); 237e2a11ca8SCédric Le Goater return; 238e2a11ca8SCédric Le Goater } 239e2a11ca8SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, ASPEED_SOC_SCU_BASE); 240e2a11ca8SCédric Le Goater 24143e3346eSAndrew Jeffery /* VIC */ 24243e3346eSAndrew Jeffery object_property_set_bool(OBJECT(&s->vic), true, "realized", &err); 24343e3346eSAndrew Jeffery if (err) { 24443e3346eSAndrew Jeffery error_propagate(errp, err); 24543e3346eSAndrew Jeffery return; 24643e3346eSAndrew Jeffery } 247ff90606fSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, ASPEED_SOC_VIC_BASE); 24843e3346eSAndrew Jeffery sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 0, 2492d105bd6SCédric Le Goater qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ)); 25043e3346eSAndrew Jeffery sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 1, 2512d105bd6SCédric Le Goater qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ)); 25243e3346eSAndrew Jeffery 25343e3346eSAndrew Jeffery /* Timer */ 25443e3346eSAndrew Jeffery object_property_set_bool(OBJECT(&s->timerctrl), true, "realized", &err); 25543e3346eSAndrew Jeffery if (err) { 25643e3346eSAndrew Jeffery error_propagate(errp, err); 25743e3346eSAndrew Jeffery return; 25843e3346eSAndrew Jeffery } 259ff90606fSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0, ASPEED_SOC_TIMER_BASE); 260b456b113SCédric Le Goater for (i = 0; i < ASPEED_TIMER_NR_TIMERS; i++) { 261b456b113SCédric Le Goater qemu_irq irq = aspeed_soc_get_irq(s, ASPEED_TIMER1 + i); 26243e3346eSAndrew Jeffery sysbus_connect_irq(SYS_BUS_DEVICE(&s->timerctrl), i, irq); 26343e3346eSAndrew Jeffery } 26443e3346eSAndrew Jeffery 26543e3346eSAndrew Jeffery /* UART - attach an 8250 to the IO space as our UART5 */ 2669bca0edbSPeter Maydell if (serial_hd(0)) { 267b456b113SCédric Le Goater qemu_irq uart5 = aspeed_soc_get_irq(s, ASPEED_UART5); 268022d72d0SPhilippe Mathieu-Daudé serial_mm_init(get_system_memory(), 269022d72d0SPhilippe Mathieu-Daudé ASPEED_SOC_IOMEM_BASE + ASPEED_SOC_UART_5_BASE, 2, 2709bca0edbSPeter Maydell uart5, 38400, serial_hd(0), DEVICE_LITTLE_ENDIAN); 27143e3346eSAndrew Jeffery } 27216020011SCédric Le Goater 27316020011SCédric Le Goater /* I2C */ 27416020011SCédric Le Goater object_property_set_bool(OBJECT(&s->i2c), true, "realized", &err); 27516020011SCédric Le Goater if (err) { 27616020011SCédric Le Goater error_propagate(errp, err); 27716020011SCédric Le Goater return; 27816020011SCédric Le Goater } 279ff90606fSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, ASPEED_SOC_I2C_BASE); 28016020011SCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c), 0, 281b456b113SCédric Le Goater aspeed_soc_get_irq(s, ASPEED_I2C)); 2827c1c69bcSCédric Le Goater 28326d5df95SCédric Le Goater /* FMC, The number of CS is set at the board level */ 28426d5df95SCédric Le Goater object_property_set_bool(OBJECT(&s->fmc), true, "realized", &err); 2857c1c69bcSCédric Le Goater if (err) { 2867c1c69bcSCédric Le Goater error_propagate(errp, err); 2877c1c69bcSCédric Le Goater return; 2887c1c69bcSCédric Le Goater } 2890e5803dfSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, ASPEED_SOC_FMC_BASE); 290dcb83444SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 1, 291dcb83444SCédric Le Goater s->fmc.ctrl->flash_window_base); 2920e5803dfSCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0, 293b456b113SCédric Le Goater aspeed_soc_get_irq(s, ASPEED_FMC)); 2947c1c69bcSCédric Le Goater 2957c1c69bcSCédric Le Goater /* SPI */ 296dbcabeebSCédric Le Goater for (i = 0; i < sc->info->spis_num; i++) { 297dbcabeebSCédric Le Goater object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs", &err); 298dbcabeebSCédric Le Goater object_property_set_bool(OBJECT(&s->spi[i]), true, "realized", 299dbcabeebSCédric Le Goater &local_err); 3007c1c69bcSCédric Le Goater error_propagate(&err, local_err); 3017c1c69bcSCédric Le Goater if (err) { 3027c1c69bcSCédric Le Goater error_propagate(errp, err); 3037c1c69bcSCédric Le Goater return; 3047c1c69bcSCédric Le Goater } 305dbcabeebSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0, sc->info->spi_bases[i]); 306dbcabeebSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 1, 307dbcabeebSCédric Le Goater s->spi[i].ctrl->flash_window_base); 308dbcabeebSCédric Le Goater } 309c2da8a8bSCédric Le Goater 310c2da8a8bSCédric Le Goater /* SDMC - SDRAM Memory Controller */ 311c2da8a8bSCédric Le Goater object_property_set_bool(OBJECT(&s->sdmc), true, "realized", &err); 312c2da8a8bSCédric Le Goater if (err) { 313c2da8a8bSCédric Le Goater error_propagate(errp, err); 314c2da8a8bSCédric Le Goater return; 315c2da8a8bSCédric Le Goater } 316ff90606fSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, ASPEED_SOC_SDMC_BASE); 317013befe1SCédric Le Goater 318013befe1SCédric Le Goater /* Watch dog */ 319f986ee1dSJoel Stanley for (i = 0; i < sc->info->wdts_num; i++) { 320f986ee1dSJoel Stanley object_property_set_bool(OBJECT(&s->wdt[i]), true, "realized", &err); 321013befe1SCédric Le Goater if (err) { 322013befe1SCédric Le Goater error_propagate(errp, err); 323013befe1SCédric Le Goater return; 324013befe1SCédric Le Goater } 325f986ee1dSJoel Stanley sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, 326f986ee1dSJoel Stanley ASPEED_SOC_WDT_BASE + i * 0x20); 327f986ee1dSJoel Stanley } 328ea337c65SCédric Le Goater 329ea337c65SCédric Le Goater /* Net */ 330ea337c65SCédric Le Goater qdev_set_nic_properties(DEVICE(&s->ftgmac100), &nd_table[0]); 331ea337c65SCédric Le Goater object_property_set_bool(OBJECT(&s->ftgmac100), true, "aspeed", &err); 332ea337c65SCédric Le Goater object_property_set_bool(OBJECT(&s->ftgmac100), true, "realized", 333ea337c65SCédric Le Goater &local_err); 334ea337c65SCédric Le Goater error_propagate(&err, local_err); 335ea337c65SCédric Le Goater if (err) { 336ea337c65SCédric Le Goater error_propagate(errp, err); 337ea337c65SCédric Le Goater return; 338ea337c65SCédric Le Goater } 339ea337c65SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100), 0, ASPEED_SOC_ETH1_BASE); 340ea337c65SCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(&s->ftgmac100), 0, 341b456b113SCédric Le Goater aspeed_soc_get_irq(s, ASPEED_ETH1)); 34243e3346eSAndrew Jeffery } 34343e3346eSAndrew Jeffery 344ff90606fSCédric Le Goater static void aspeed_soc_class_init(ObjectClass *oc, void *data) 34543e3346eSAndrew Jeffery { 34643e3346eSAndrew Jeffery DeviceClass *dc = DEVICE_CLASS(oc); 347b033271fSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc); 34843e3346eSAndrew Jeffery 349b033271fSCédric Le Goater sc->info = (AspeedSoCInfo *) data; 350ff90606fSCédric Le Goater dc->realize = aspeed_soc_realize; 351469f3da4SThomas Huth /* Reason: Uses serial_hds and nd_table in realize() directly */ 352469f3da4SThomas Huth dc->user_creatable = false; 35343e3346eSAndrew Jeffery } 35443e3346eSAndrew Jeffery 355ff90606fSCédric Le Goater static const TypeInfo aspeed_soc_type_info = { 356ff90606fSCédric Le Goater .name = TYPE_ASPEED_SOC, 357b033271fSCédric Le Goater .parent = TYPE_DEVICE, 358ff90606fSCédric Le Goater .instance_init = aspeed_soc_init, 359b033271fSCédric Le Goater .instance_size = sizeof(AspeedSoCState), 360b033271fSCédric Le Goater .class_size = sizeof(AspeedSoCClass), 361b033271fSCédric Le Goater .abstract = true, 36243e3346eSAndrew Jeffery }; 36343e3346eSAndrew Jeffery 364ff90606fSCédric Le Goater static void aspeed_soc_register_types(void) 36543e3346eSAndrew Jeffery { 366b033271fSCédric Le Goater int i; 367b033271fSCédric Le Goater 368ff90606fSCédric Le Goater type_register_static(&aspeed_soc_type_info); 369b033271fSCédric Le Goater for (i = 0; i < ARRAY_SIZE(aspeed_socs); ++i) { 370b033271fSCédric Le Goater TypeInfo ti = { 371b033271fSCédric Le Goater .name = aspeed_socs[i].name, 372b033271fSCédric Le Goater .parent = TYPE_ASPEED_SOC, 373b033271fSCédric Le Goater .class_init = aspeed_soc_class_init, 374b033271fSCédric Le Goater .class_data = (void *) &aspeed_socs[i], 375b033271fSCédric Le Goater }; 376b033271fSCédric Le Goater type_register(&ti); 377b033271fSCédric Le Goater } 37843e3346eSAndrew Jeffery } 37943e3346eSAndrew Jeffery 380ff90606fSCédric Le Goater type_init(aspeed_soc_register_types) 381