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" 22ece09beeSCédric Le Goater #include "qemu/error-report.h" 2316020011SCédric Le Goater #include "hw/i2c/aspeed_i2c.h" 24ea337c65SCédric Le Goater #include "net/net.h" 2546517dd4SMarkus Armbruster #include "sysemu/sysemu.h" 2643e3346eSAndrew Jeffery 27ff90606fSCédric Le Goater #define ASPEED_SOC_IOMEM_SIZE 0x00200000 28d783d1feSCédric Le Goater 29d783d1feSCédric Le Goater static const hwaddr aspeed_soc_ast2400_memmap[] = { 30d783d1feSCédric Le Goater [ASPEED_IOMEM] = 0x1E600000, 31d783d1feSCédric Le Goater [ASPEED_FMC] = 0x1E620000, 32d783d1feSCédric Le Goater [ASPEED_SPI1] = 0x1E630000, 33d783d1feSCédric Le Goater [ASPEED_VIC] = 0x1E6C0000, 34d783d1feSCédric Le Goater [ASPEED_SDMC] = 0x1E6E0000, 35d783d1feSCédric Le Goater [ASPEED_SCU] = 0x1E6E2000, 36118c82e7SEddie James [ASPEED_XDMA] = 0x1E6E7000, 37514bcf6fSJoel Stanley [ASPEED_VIDEO] = 0x1E700000, 38d783d1feSCédric Le Goater [ASPEED_ADC] = 0x1E6E9000, 39d783d1feSCédric Le Goater [ASPEED_SRAM] = 0x1E720000, 402bea128cSEddie James [ASPEED_SDHCI] = 0x1E740000, 41d783d1feSCédric Le Goater [ASPEED_GPIO] = 0x1E780000, 42d783d1feSCédric Le Goater [ASPEED_RTC] = 0x1E781000, 43d783d1feSCédric Le Goater [ASPEED_TIMER1] = 0x1E782000, 44d783d1feSCédric Le Goater [ASPEED_WDT] = 0x1E785000, 45d783d1feSCédric Le Goater [ASPEED_PWM] = 0x1E786000, 46d783d1feSCédric Le Goater [ASPEED_LPC] = 0x1E789000, 47d783d1feSCédric Le Goater [ASPEED_IBT] = 0x1E789140, 48d783d1feSCédric Le Goater [ASPEED_I2C] = 0x1E78A000, 49d783d1feSCédric Le Goater [ASPEED_ETH1] = 0x1E660000, 50d783d1feSCédric Le Goater [ASPEED_ETH2] = 0x1E680000, 51d783d1feSCédric Le Goater [ASPEED_UART1] = 0x1E783000, 52d783d1feSCédric Le Goater [ASPEED_UART5] = 0x1E784000, 53d783d1feSCédric Le Goater [ASPEED_VUART] = 0x1E787000, 54d783d1feSCédric Le Goater [ASPEED_SDRAM] = 0x40000000, 55d783d1feSCédric Le Goater }; 56d783d1feSCédric Le Goater 57d783d1feSCédric Le Goater static const hwaddr aspeed_soc_ast2500_memmap[] = { 58d783d1feSCédric Le Goater [ASPEED_IOMEM] = 0x1E600000, 59d783d1feSCédric Le Goater [ASPEED_FMC] = 0x1E620000, 60d783d1feSCédric Le Goater [ASPEED_SPI1] = 0x1E630000, 61d783d1feSCédric Le Goater [ASPEED_SPI2] = 0x1E631000, 62d783d1feSCédric Le Goater [ASPEED_VIC] = 0x1E6C0000, 63d783d1feSCédric Le Goater [ASPEED_SDMC] = 0x1E6E0000, 64d783d1feSCédric Le Goater [ASPEED_SCU] = 0x1E6E2000, 65118c82e7SEddie James [ASPEED_XDMA] = 0x1E6E7000, 66d783d1feSCédric Le Goater [ASPEED_ADC] = 0x1E6E9000, 67514bcf6fSJoel Stanley [ASPEED_VIDEO] = 0x1E700000, 68d783d1feSCédric Le Goater [ASPEED_SRAM] = 0x1E720000, 692bea128cSEddie James [ASPEED_SDHCI] = 0x1E740000, 70d783d1feSCédric Le Goater [ASPEED_GPIO] = 0x1E780000, 71d783d1feSCédric Le Goater [ASPEED_RTC] = 0x1E781000, 72d783d1feSCédric Le Goater [ASPEED_TIMER1] = 0x1E782000, 73d783d1feSCédric Le Goater [ASPEED_WDT] = 0x1E785000, 74d783d1feSCédric Le Goater [ASPEED_PWM] = 0x1E786000, 75d783d1feSCédric Le Goater [ASPEED_LPC] = 0x1E789000, 76d783d1feSCédric Le Goater [ASPEED_IBT] = 0x1E789140, 77d783d1feSCédric Le Goater [ASPEED_I2C] = 0x1E78A000, 78d783d1feSCédric Le Goater [ASPEED_ETH1] = 0x1E660000, 79d783d1feSCédric Le Goater [ASPEED_ETH2] = 0x1E680000, 80d783d1feSCédric Le Goater [ASPEED_UART1] = 0x1E783000, 81d783d1feSCédric Le Goater [ASPEED_UART5] = 0x1E784000, 82d783d1feSCédric Le Goater [ASPEED_VUART] = 0x1E787000, 83d783d1feSCédric Le Goater [ASPEED_SDRAM] = 0x80000000, 84d783d1feSCédric Le Goater }; 8543e3346eSAndrew Jeffery 86b456b113SCédric Le Goater static const int aspeed_soc_ast2400_irqmap[] = { 87b456b113SCédric Le Goater [ASPEED_UART1] = 9, 88b456b113SCédric Le Goater [ASPEED_UART2] = 32, 89b456b113SCédric Le Goater [ASPEED_UART3] = 33, 90b456b113SCédric Le Goater [ASPEED_UART4] = 34, 91b456b113SCédric Le Goater [ASPEED_UART5] = 10, 92b456b113SCédric Le Goater [ASPEED_VUART] = 8, 93b456b113SCédric Le Goater [ASPEED_FMC] = 19, 94b456b113SCédric Le Goater [ASPEED_SDMC] = 0, 95b456b113SCédric Le Goater [ASPEED_SCU] = 21, 96b456b113SCédric Le Goater [ASPEED_ADC] = 31, 97b456b113SCédric Le Goater [ASPEED_GPIO] = 20, 98b456b113SCédric Le Goater [ASPEED_RTC] = 22, 99b456b113SCédric Le Goater [ASPEED_TIMER1] = 16, 100b456b113SCédric Le Goater [ASPEED_TIMER2] = 17, 101b456b113SCédric Le Goater [ASPEED_TIMER3] = 18, 102b456b113SCédric Le Goater [ASPEED_TIMER4] = 35, 103b456b113SCédric Le Goater [ASPEED_TIMER5] = 36, 104b456b113SCédric Le Goater [ASPEED_TIMER6] = 37, 105b456b113SCédric Le Goater [ASPEED_TIMER7] = 38, 106b456b113SCédric Le Goater [ASPEED_TIMER8] = 39, 107b456b113SCédric Le Goater [ASPEED_WDT] = 27, 108b456b113SCédric Le Goater [ASPEED_PWM] = 28, 109b456b113SCédric Le Goater [ASPEED_LPC] = 8, 110b456b113SCédric Le Goater [ASPEED_IBT] = 8, /* LPC */ 111b456b113SCédric Le Goater [ASPEED_I2C] = 12, 112b456b113SCédric Le Goater [ASPEED_ETH1] = 2, 113b456b113SCédric Le Goater [ASPEED_ETH2] = 3, 114118c82e7SEddie James [ASPEED_XDMA] = 6, 1152bea128cSEddie James [ASPEED_SDHCI] = 26, 116b456b113SCédric Le Goater }; 11743e3346eSAndrew Jeffery 118b456b113SCédric Le Goater #define aspeed_soc_ast2500_irqmap aspeed_soc_ast2400_irqmap 119b456b113SCédric Le Goater 120b456b113SCédric Le Goater static qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int ctrl) 121b456b113SCédric Le Goater { 122b456b113SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 123b456b113SCédric Le Goater 12454ecafb7SCédric Le Goater return qdev_get_gpio_in(DEVICE(&s->vic), sc->irqmap[ctrl]); 125b456b113SCédric Le Goater } 126b456b113SCédric Le Goater 127ff90606fSCédric Le Goater static void aspeed_soc_init(Object *obj) 12843e3346eSAndrew Jeffery { 129ff90606fSCédric Le Goater AspeedSoCState *s = ASPEED_SOC(obj); 130b033271fSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 131dbcabeebSCédric Le Goater int i; 132811a5b1dSCédric Le Goater char socname[8]; 133811a5b1dSCédric Le Goater char typename[64]; 134811a5b1dSCédric Le Goater 13554ecafb7SCédric Le Goater if (sscanf(sc->name, "%7s", socname) != 1) { 136811a5b1dSCédric Le Goater g_assert_not_reached(); 137811a5b1dSCédric Le Goater } 13843e3346eSAndrew Jeffery 13954ecafb7SCédric Le Goater for (i = 0; i < sc->num_cpus; i++) { 140ece09beeSCédric Le Goater object_initialize_child(obj, "cpu[*]", OBJECT(&s->cpu[i]), 14154ecafb7SCédric Le Goater sizeof(s->cpu[i]), sc->cpu_type, 142ece09beeSCédric Le Goater &error_abort, NULL); 143ece09beeSCédric Le Goater } 14443e3346eSAndrew Jeffery 1459a937f6cSCédric Le Goater snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname); 1461b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "scu", OBJECT(&s->scu), sizeof(s->scu), 1479a937f6cSCédric Le Goater typename); 148334973bbSAndrew Jeffery qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev", 14954ecafb7SCédric Le Goater sc->silicon_rev); 150334973bbSAndrew Jeffery object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu), 151334973bbSAndrew Jeffery "hw-strap1", &error_abort); 152334973bbSAndrew Jeffery object_property_add_alias(obj, "hw-strap2", OBJECT(&s->scu), 153334973bbSAndrew Jeffery "hw-strap2", &error_abort); 154b6e70d1dSJoel Stanley object_property_add_alias(obj, "hw-prot-key", OBJECT(&s->scu), 155b6e70d1dSJoel Stanley "hw-prot-key", &error_abort); 1567c1c69bcSCédric Le Goater 1571b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "vic", OBJECT(&s->vic), sizeof(s->vic), 1581b0ad567SPhilippe Mathieu-Daudé TYPE_ASPEED_VIC); 159e2a11ca8SCédric Le Goater 16075fb4577SJoel Stanley sysbus_init_child_obj(obj, "rtc", OBJECT(&s->rtc), sizeof(s->rtc), 16175fb4577SJoel Stanley TYPE_ASPEED_RTC); 16275fb4577SJoel Stanley 16372d96f8eSCédric Le Goater snprintf(typename, sizeof(typename), "aspeed.timer-%s", socname); 1641b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "timerctrl", OBJECT(&s->timerctrl), 16572d96f8eSCédric Le Goater sizeof(s->timerctrl), typename); 1669b945a9eSCédric Le Goater object_property_add_const_link(OBJECT(&s->timerctrl), "scu", 1679b945a9eSCédric Le Goater OBJECT(&s->scu), &error_abort); 168e2a11ca8SCédric Le Goater 169f7da1aa8SCédric Le Goater snprintf(typename, sizeof(typename), "aspeed.i2c-%s", socname); 1701b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "i2c", OBJECT(&s->i2c), sizeof(s->i2c), 171f7da1aa8SCédric Le Goater typename); 172e2a11ca8SCédric Le Goater 173811a5b1dSCédric Le Goater snprintf(typename, sizeof(typename), "aspeed.fmc-%s", socname); 1741b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "fmc", OBJECT(&s->fmc), sizeof(s->fmc), 175811a5b1dSCédric Le Goater typename); 17626d5df95SCédric Le Goater object_property_add_alias(obj, "num-cs", OBJECT(&s->fmc), "num-cs", 17726d5df95SCédric Le Goater &error_abort); 1787c1c69bcSCédric Le Goater 17954ecafb7SCédric Le Goater for (i = 0; i < sc->spis_num; i++) { 180811a5b1dSCédric Le Goater snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i + 1, socname); 1811b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "spi[*]", OBJECT(&s->spi[i]), 182811a5b1dSCédric Le Goater sizeof(s->spi[i]), typename); 183dbcabeebSCédric Le Goater } 184c2da8a8bSCédric Le Goater 1858e00d1a9SCédric Le Goater snprintf(typename, sizeof(typename), "aspeed.sdmc-%s", socname); 1861b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc), 1878e00d1a9SCédric Le Goater typename); 188c6c7cfb0SCédric Le Goater object_property_add_alias(obj, "ram-size", OBJECT(&s->sdmc), 189c6c7cfb0SCédric Le Goater "ram-size", &error_abort); 190ebe31c0aSCédric Le Goater object_property_add_alias(obj, "max-ram-size", OBJECT(&s->sdmc), 191ebe31c0aSCédric Le Goater "max-ram-size", &error_abort); 192013befe1SCédric Le Goater 19354ecafb7SCédric Le Goater for (i = 0; i < sc->wdts_num; i++) { 1946112bd6dSCédric Le Goater snprintf(typename, sizeof(typename), "aspeed.wdt-%s", socname); 1951b0ad567SPhilippe Mathieu-Daudé sysbus_init_child_obj(obj, "wdt[*]", OBJECT(&s->wdt[i]), 1966112bd6dSCédric Le Goater sizeof(s->wdt[i]), typename); 1973059c2f5SJoel Stanley object_property_add_const_link(OBJECT(&s->wdt[i]), "scu", 1983059c2f5SJoel Stanley OBJECT(&s->scu), &error_abort); 199f986ee1dSJoel Stanley } 200ea337c65SCédric Le Goater 201d300db02SJoel Stanley for (i = 0; i < sc->macs_num; i++) { 20267340990SCédric Le Goater sysbus_init_child_obj(obj, "ftgmac100[*]", OBJECT(&s->ftgmac100[i]), 20367340990SCédric Le Goater sizeof(s->ftgmac100[i]), TYPE_FTGMAC100); 20467340990SCédric Le Goater } 205118c82e7SEddie James 206118c82e7SEddie James sysbus_init_child_obj(obj, "xdma", OBJECT(&s->xdma), sizeof(s->xdma), 207118c82e7SEddie James TYPE_ASPEED_XDMA); 208fdcc7c06SRashmica Gupta 209811a5b1dSCédric Le Goater snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname); 210fdcc7c06SRashmica Gupta sysbus_init_child_obj(obj, "gpio", OBJECT(&s->gpio), sizeof(s->gpio), 211811a5b1dSCédric Le Goater typename); 2122bea128cSEddie James 2132bea128cSEddie James sysbus_init_child_obj(obj, "sdc", OBJECT(&s->sdhci), sizeof(s->sdhci), 2142bea128cSEddie James TYPE_ASPEED_SDHCI); 2152bea128cSEddie James 2162bea128cSEddie James /* Init sd card slot class here so that they're under the correct parent */ 2172bea128cSEddie James for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) { 2182bea128cSEddie James sysbus_init_child_obj(obj, "sdhci[*]", OBJECT(&s->sdhci.slots[i]), 2192bea128cSEddie James sizeof(s->sdhci.slots[i]), TYPE_SYSBUS_SDHCI); 2202bea128cSEddie James } 22143e3346eSAndrew Jeffery } 22243e3346eSAndrew Jeffery 223ff90606fSCédric Le Goater static void aspeed_soc_realize(DeviceState *dev, Error **errp) 22443e3346eSAndrew Jeffery { 22543e3346eSAndrew Jeffery int i; 226ff90606fSCédric Le Goater AspeedSoCState *s = ASPEED_SOC(dev); 227dbcabeebSCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); 2287c1c69bcSCédric Le Goater Error *err = NULL, *local_err = NULL; 22943e3346eSAndrew Jeffery 23043e3346eSAndrew Jeffery /* IO space */ 23154ecafb7SCédric Le Goater create_unimplemented_device("aspeed_soc.io", sc->memmap[ASPEED_IOMEM], 232d783d1feSCédric Le Goater ASPEED_SOC_IOMEM_SIZE); 23343e3346eSAndrew Jeffery 234514bcf6fSJoel Stanley /* Video engine stub */ 235514bcf6fSJoel Stanley create_unimplemented_device("aspeed.video", sc->memmap[ASPEED_VIDEO], 236514bcf6fSJoel Stanley 0x1000); 237514bcf6fSJoel Stanley 23854ecafb7SCédric Le Goater if (s->num_cpus > sc->num_cpus) { 239ece09beeSCédric Le Goater warn_report("%s: invalid number of CPUs %d, using default %d", 24054ecafb7SCédric Le Goater sc->name, s->num_cpus, sc->num_cpus); 24154ecafb7SCédric Le Goater s->num_cpus = sc->num_cpus; 242ece09beeSCédric Le Goater } 243ece09beeSCédric Le Goater 2442d105bd6SCédric Le Goater /* CPU */ 245ece09beeSCédric Le Goater for (i = 0; i < s->num_cpus; i++) { 246ece09beeSCédric Le Goater object_property_set_bool(OBJECT(&s->cpu[i]), true, "realized", &err); 2472d105bd6SCédric Le Goater if (err) { 2482d105bd6SCédric Le Goater error_propagate(errp, err); 2492d105bd6SCédric Le Goater return; 2502d105bd6SCédric Le Goater } 251ece09beeSCédric Le Goater } 2522d105bd6SCédric Le Goater 25374af4eecSCédric Le Goater /* SRAM */ 254a2e9989cSPeter Maydell memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram", 25554ecafb7SCédric Le Goater sc->sram_size, &err); 25674af4eecSCédric Le Goater if (err) { 25774af4eecSCédric Le Goater error_propagate(errp, err); 25874af4eecSCédric Le Goater return; 25974af4eecSCédric Le Goater } 260d783d1feSCédric Le Goater memory_region_add_subregion(get_system_memory(), 26154ecafb7SCédric Le Goater sc->memmap[ASPEED_SRAM], &s->sram); 26274af4eecSCédric Le Goater 263e2a11ca8SCédric Le Goater /* SCU */ 264e2a11ca8SCédric Le Goater object_property_set_bool(OBJECT(&s->scu), true, "realized", &err); 265e2a11ca8SCédric Le Goater if (err) { 266e2a11ca8SCédric Le Goater error_propagate(errp, err); 267e2a11ca8SCédric Le Goater return; 268e2a11ca8SCédric Le Goater } 26954ecafb7SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]); 270e2a11ca8SCédric Le Goater 27143e3346eSAndrew Jeffery /* VIC */ 27243e3346eSAndrew Jeffery object_property_set_bool(OBJECT(&s->vic), true, "realized", &err); 27343e3346eSAndrew Jeffery if (err) { 27443e3346eSAndrew Jeffery error_propagate(errp, err); 27543e3346eSAndrew Jeffery return; 27643e3346eSAndrew Jeffery } 27754ecafb7SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, sc->memmap[ASPEED_VIC]); 27843e3346eSAndrew Jeffery sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 0, 2792d105bd6SCédric Le Goater qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ)); 28043e3346eSAndrew Jeffery sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 1, 2812d105bd6SCédric Le Goater qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ)); 28243e3346eSAndrew Jeffery 28375fb4577SJoel Stanley /* RTC */ 28475fb4577SJoel Stanley object_property_set_bool(OBJECT(&s->rtc), true, "realized", &err); 28575fb4577SJoel Stanley if (err) { 28675fb4577SJoel Stanley error_propagate(errp, err); 28775fb4577SJoel Stanley return; 28875fb4577SJoel Stanley } 28954ecafb7SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]); 29075fb4577SJoel Stanley sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0, 29175fb4577SJoel Stanley aspeed_soc_get_irq(s, ASPEED_RTC)); 29275fb4577SJoel Stanley 29343e3346eSAndrew Jeffery /* Timer */ 29443e3346eSAndrew Jeffery object_property_set_bool(OBJECT(&s->timerctrl), true, "realized", &err); 29543e3346eSAndrew Jeffery if (err) { 29643e3346eSAndrew Jeffery error_propagate(errp, err); 29743e3346eSAndrew Jeffery return; 29843e3346eSAndrew Jeffery } 299d783d1feSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0, 30054ecafb7SCédric Le Goater sc->memmap[ASPEED_TIMER1]); 301b456b113SCédric Le Goater for (i = 0; i < ASPEED_TIMER_NR_TIMERS; i++) { 302b456b113SCédric Le Goater qemu_irq irq = aspeed_soc_get_irq(s, ASPEED_TIMER1 + i); 30343e3346eSAndrew Jeffery sysbus_connect_irq(SYS_BUS_DEVICE(&s->timerctrl), i, irq); 30443e3346eSAndrew Jeffery } 30543e3346eSAndrew Jeffery 30643e3346eSAndrew Jeffery /* UART - attach an 8250 to the IO space as our UART5 */ 3079bca0edbSPeter Maydell if (serial_hd(0)) { 308b456b113SCédric Le Goater qemu_irq uart5 = aspeed_soc_get_irq(s, ASPEED_UART5); 30954ecafb7SCédric Le Goater serial_mm_init(get_system_memory(), sc->memmap[ASPEED_UART5], 2, 3109bca0edbSPeter Maydell uart5, 38400, serial_hd(0), DEVICE_LITTLE_ENDIAN); 31143e3346eSAndrew Jeffery } 31216020011SCédric Le Goater 31316020011SCédric Le Goater /* I2C */ 314545d6befSCédric Le Goater object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram", &err); 315545d6befSCédric Le Goater if (err) { 316545d6befSCédric Le Goater error_propagate(errp, err); 317545d6befSCédric Le Goater return; 318545d6befSCédric Le Goater } 31916020011SCédric Le Goater object_property_set_bool(OBJECT(&s->i2c), true, "realized", &err); 32016020011SCédric Le Goater if (err) { 32116020011SCédric Le Goater error_propagate(errp, err); 32216020011SCédric Le Goater return; 32316020011SCédric Le Goater } 32454ecafb7SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]); 32516020011SCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c), 0, 326b456b113SCédric Le Goater aspeed_soc_get_irq(s, ASPEED_I2C)); 3277c1c69bcSCédric Le Goater 32826d5df95SCédric Le Goater /* FMC, The number of CS is set at the board level */ 32995b56e17SCédric Le Goater object_property_set_link(OBJECT(&s->fmc), OBJECT(s->dram_mr), "dram", &err); 33095b56e17SCédric Le Goater if (err) { 33195b56e17SCédric Le Goater error_propagate(errp, err); 33295b56e17SCédric Le Goater return; 33395b56e17SCédric Le Goater } 33454ecafb7SCédric Le Goater object_property_set_int(OBJECT(&s->fmc), sc->memmap[ASPEED_SDRAM], 3356da4433fSCédric Le Goater "sdram-base", &err); 3366da4433fSCédric Le Goater if (err) { 3376da4433fSCédric Le Goater error_propagate(errp, err); 3386da4433fSCédric Le Goater return; 3396da4433fSCédric Le Goater } 34026d5df95SCédric Le Goater object_property_set_bool(OBJECT(&s->fmc), true, "realized", &err); 3417c1c69bcSCédric Le Goater if (err) { 3427c1c69bcSCédric Le Goater error_propagate(errp, err); 3437c1c69bcSCédric Le Goater return; 3447c1c69bcSCédric Le Goater } 34554ecafb7SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]); 346dcb83444SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 1, 347dcb83444SCédric Le Goater s->fmc.ctrl->flash_window_base); 3480e5803dfSCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0, 349b456b113SCédric Le Goater aspeed_soc_get_irq(s, ASPEED_FMC)); 3507c1c69bcSCédric Le Goater 3517c1c69bcSCédric Le Goater /* SPI */ 35254ecafb7SCédric Le Goater for (i = 0; i < sc->spis_num; i++) { 353dbcabeebSCédric Le Goater object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs", &err); 354dbcabeebSCédric Le Goater object_property_set_bool(OBJECT(&s->spi[i]), true, "realized", 355dbcabeebSCédric Le Goater &local_err); 3567c1c69bcSCédric Le Goater error_propagate(&err, local_err); 3577c1c69bcSCédric Le Goater if (err) { 3587c1c69bcSCédric Le Goater error_propagate(errp, err); 3597c1c69bcSCédric Le Goater return; 3607c1c69bcSCédric Le Goater } 361d783d1feSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0, 36254ecafb7SCédric Le Goater sc->memmap[ASPEED_SPI1 + i]); 363dbcabeebSCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 1, 364dbcabeebSCédric Le Goater s->spi[i].ctrl->flash_window_base); 365dbcabeebSCédric Le Goater } 366c2da8a8bSCédric Le Goater 367c2da8a8bSCédric Le Goater /* SDMC - SDRAM Memory Controller */ 368c2da8a8bSCédric Le Goater object_property_set_bool(OBJECT(&s->sdmc), true, "realized", &err); 369c2da8a8bSCédric Le Goater if (err) { 370c2da8a8bSCédric Le Goater error_propagate(errp, err); 371c2da8a8bSCédric Le Goater return; 372c2da8a8bSCédric Le Goater } 37354ecafb7SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]); 374013befe1SCédric Le Goater 375013befe1SCédric Le Goater /* Watch dog */ 37654ecafb7SCédric Le Goater for (i = 0; i < sc->wdts_num; i++) { 3776112bd6dSCédric Le Goater AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(&s->wdt[i]); 3786112bd6dSCédric Le Goater 379f986ee1dSJoel Stanley object_property_set_bool(OBJECT(&s->wdt[i]), true, "realized", &err); 380013befe1SCédric Le Goater if (err) { 381013befe1SCédric Le Goater error_propagate(errp, err); 382013befe1SCédric Le Goater return; 383013befe1SCédric Le Goater } 384f986ee1dSJoel Stanley sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, 38554ecafb7SCédric Le Goater sc->memmap[ASPEED_WDT] + i * awc->offset); 386f986ee1dSJoel Stanley } 387ea337c65SCédric Le Goater 388ea337c65SCédric Le Goater /* Net */ 389d300db02SJoel Stanley for (i = 0; i < nb_nics && i < sc->macs_num; i++) { 39067340990SCédric Le Goater qdev_set_nic_properties(DEVICE(&s->ftgmac100[i]), &nd_table[i]); 39167340990SCédric Le Goater object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed", 39267340990SCédric Le Goater &err); 39367340990SCédric Le Goater object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "realized", 394ea337c65SCédric Le Goater &local_err); 395ea337c65SCédric Le Goater error_propagate(&err, local_err); 396ea337c65SCédric Le Goater if (err) { 397ea337c65SCédric Le Goater error_propagate(errp, err); 398ea337c65SCédric Le Goater return; 399ea337c65SCédric Le Goater } 40067340990SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0, 40154ecafb7SCédric Le Goater sc->memmap[ASPEED_ETH1 + i]); 40267340990SCédric Le Goater sysbus_connect_irq(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0, 40367340990SCédric Le Goater aspeed_soc_get_irq(s, ASPEED_ETH1 + i)); 40467340990SCédric Le Goater } 405118c82e7SEddie James 406118c82e7SEddie James /* XDMA */ 407118c82e7SEddie James object_property_set_bool(OBJECT(&s->xdma), true, "realized", &err); 408118c82e7SEddie James if (err) { 409118c82e7SEddie James error_propagate(errp, err); 410118c82e7SEddie James return; 411118c82e7SEddie James } 412118c82e7SEddie James sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0, 41354ecafb7SCédric Le Goater sc->memmap[ASPEED_XDMA]); 414118c82e7SEddie James sysbus_connect_irq(SYS_BUS_DEVICE(&s->xdma), 0, 415118c82e7SEddie James aspeed_soc_get_irq(s, ASPEED_XDMA)); 416fdcc7c06SRashmica Gupta 417fdcc7c06SRashmica Gupta /* GPIO */ 418fdcc7c06SRashmica Gupta object_property_set_bool(OBJECT(&s->gpio), true, "realized", &err); 419fdcc7c06SRashmica Gupta if (err) { 420fdcc7c06SRashmica Gupta error_propagate(errp, err); 421fdcc7c06SRashmica Gupta return; 422fdcc7c06SRashmica Gupta } 42354ecafb7SCédric Le Goater sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]); 424fdcc7c06SRashmica Gupta sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0, 425fdcc7c06SRashmica Gupta aspeed_soc_get_irq(s, ASPEED_GPIO)); 4262bea128cSEddie James 4272bea128cSEddie James /* SDHCI */ 4282bea128cSEddie James object_property_set_bool(OBJECT(&s->sdhci), true, "realized", &err); 4292bea128cSEddie James if (err) { 4302bea128cSEddie James error_propagate(errp, err); 4312bea128cSEddie James return; 4322bea128cSEddie James } 4332bea128cSEddie James sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0, 43454ecafb7SCédric Le Goater sc->memmap[ASPEED_SDHCI]); 4352bea128cSEddie James sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0, 4362bea128cSEddie James aspeed_soc_get_irq(s, ASPEED_SDHCI)); 43743e3346eSAndrew Jeffery } 438ece09beeSCédric Le Goater static Property aspeed_soc_properties[] = { 439ece09beeSCédric Le Goater DEFINE_PROP_UINT32("num-cpus", AspeedSoCState, num_cpus, 0), 44095b56e17SCédric Le Goater DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION, 44195b56e17SCédric Le Goater MemoryRegion *), 442ece09beeSCédric Le Goater DEFINE_PROP_END_OF_LIST(), 443ece09beeSCédric Le Goater }; 44443e3346eSAndrew Jeffery 445ff90606fSCédric Le Goater static void aspeed_soc_class_init(ObjectClass *oc, void *data) 44643e3346eSAndrew Jeffery { 44743e3346eSAndrew Jeffery DeviceClass *dc = DEVICE_CLASS(oc); 44843e3346eSAndrew Jeffery 449ff90606fSCédric Le Goater dc->realize = aspeed_soc_realize; 450469f3da4SThomas Huth /* Reason: Uses serial_hds and nd_table in realize() directly */ 451469f3da4SThomas Huth dc->user_creatable = false; 452ece09beeSCédric Le Goater dc->props = aspeed_soc_properties; 45343e3346eSAndrew Jeffery } 45443e3346eSAndrew Jeffery 455ff90606fSCédric Le Goater static const TypeInfo aspeed_soc_type_info = { 456ff90606fSCédric Le Goater .name = TYPE_ASPEED_SOC, 457b033271fSCédric Le Goater .parent = TYPE_DEVICE, 458b033271fSCédric Le Goater .instance_size = sizeof(AspeedSoCState), 459b033271fSCédric Le Goater .class_size = sizeof(AspeedSoCClass), 46054ecafb7SCédric Le Goater .class_init = aspeed_soc_class_init, 461b033271fSCédric Le Goater .abstract = true, 46243e3346eSAndrew Jeffery }; 46343e3346eSAndrew Jeffery 46454ecafb7SCédric Le Goater static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data) 46554ecafb7SCédric Le Goater { 46654ecafb7SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc); 46754ecafb7SCédric Le Goater 46854ecafb7SCédric Le Goater sc->name = "ast2400-a1"; 46954ecafb7SCédric Le Goater sc->cpu_type = ARM_CPU_TYPE_NAME("arm926"); 47054ecafb7SCédric Le Goater sc->silicon_rev = AST2400_A1_SILICON_REV; 47154ecafb7SCédric Le Goater sc->sram_size = 0x8000; 47254ecafb7SCédric Le Goater sc->spis_num = 1; 47354ecafb7SCédric Le Goater sc->wdts_num = 2; 474d300db02SJoel Stanley sc->macs_num = 2; 47554ecafb7SCédric Le Goater sc->irqmap = aspeed_soc_ast2400_irqmap; 47654ecafb7SCédric Le Goater sc->memmap = aspeed_soc_ast2400_memmap; 47754ecafb7SCédric Le Goater sc->num_cpus = 1; 47854ecafb7SCédric Le Goater } 47954ecafb7SCédric Le Goater 48054ecafb7SCédric Le Goater static const TypeInfo aspeed_soc_ast2400_type_info = { 48154ecafb7SCédric Le Goater .name = "ast2400-a1", 48254ecafb7SCédric Le Goater .parent = TYPE_ASPEED_SOC, 48354ecafb7SCédric Le Goater .instance_init = aspeed_soc_init, 48454ecafb7SCédric Le Goater .instance_size = sizeof(AspeedSoCState), 48554ecafb7SCédric Le Goater .class_init = aspeed_soc_ast2400_class_init, 48654ecafb7SCédric Le Goater }; 48754ecafb7SCédric Le Goater 48854ecafb7SCédric Le Goater static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data) 48954ecafb7SCédric Le Goater { 49054ecafb7SCédric Le Goater AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc); 49154ecafb7SCédric Le Goater 49254ecafb7SCédric Le Goater sc->name = "ast2500-a1"; 49354ecafb7SCédric Le Goater sc->cpu_type = ARM_CPU_TYPE_NAME("arm1176"); 49454ecafb7SCédric Le Goater sc->silicon_rev = AST2500_A1_SILICON_REV; 49554ecafb7SCédric Le Goater sc->sram_size = 0x9000; 49654ecafb7SCédric Le Goater sc->spis_num = 2; 49754ecafb7SCédric Le Goater sc->wdts_num = 3; 498d300db02SJoel Stanley sc->macs_num = 2; 49954ecafb7SCédric Le Goater sc->irqmap = aspeed_soc_ast2500_irqmap; 50054ecafb7SCédric Le Goater sc->memmap = aspeed_soc_ast2500_memmap; 50154ecafb7SCédric Le Goater sc->num_cpus = 1; 50254ecafb7SCédric Le Goater } 50354ecafb7SCédric Le Goater 50454ecafb7SCédric Le Goater static const TypeInfo aspeed_soc_ast2500_type_info = { 50554ecafb7SCédric Le Goater .name = "ast2500-a1", 50654ecafb7SCédric Le Goater .parent = TYPE_ASPEED_SOC, 50754ecafb7SCédric Le Goater .instance_init = aspeed_soc_init, 50854ecafb7SCédric Le Goater .instance_size = sizeof(AspeedSoCState), 50954ecafb7SCédric Le Goater .class_init = aspeed_soc_ast2500_class_init, 51054ecafb7SCédric Le Goater }; 511ff90606fSCédric Le Goater static void aspeed_soc_register_types(void) 51243e3346eSAndrew Jeffery { 513ff90606fSCédric Le Goater type_register_static(&aspeed_soc_type_info); 51454ecafb7SCédric Le Goater type_register_static(&aspeed_soc_ast2400_type_info); 51554ecafb7SCédric Le Goater type_register_static(&aspeed_soc_ast2500_type_info); 516b033271fSCédric Le Goater }; 51743e3346eSAndrew Jeffery 518ff90606fSCédric Le Goater type_init(aspeed_soc_register_types) 519