On 5/19/20 1:42 PM, Philippe Mathieu-Daudé wrote: > On 5/19/20 7:45 AM, Markus Armbruster wrote: >> "Andrew Jeffery" <and...@aj.id.au> writes: >> >>> On Mon, 18 May 2020, at 21:49, Cédric Le Goater wrote: >>>> On 5/18/20 7:03 AM, Markus Armbruster wrote: >>>>> These devices are optional, and controlled by @nb_nics. >>>>> aspeed_soc_ast2600_init() and aspeed_soc_init() create the maximum >>>>> supported number. aspeed_soc_ast2600_realize() and >>>>> aspeed_soc_realize() realize only the wanted number. Works, although >>>>> it can leave unrealized devices hanging around in the QOM composition >>>>> tree. Affects machines ast2500-evb, ast2600-evb, palmetto-bmc, >>>>> romulus-bmc, swift-bmc, tacoma-bmc, and witherspoon-bmc. >>>>> >>>>> Make the init functions create only the wanted ones. Visible in "info >>>>> qom-tree"; here's the change for ast2600-evb: >>>>> >>>>> /machine (ast2600-evb-machine) >>>>> [...] >>>>> /soc (ast2600-a1) >>>>> [...] >>>>> /ftgmac100[0] (ftgmac100) >>>>> /ftgmac100[0] (qemu:memory-region) >>>>> - /ftgmac100[1] (ftgmac100) >>>>> - /ftgmac100[2] (ftgmac100) >>>>> - /ftgmac100[3] (ftgmac100) >>>>> /gpio (aspeed.gpio-ast2600) >>>>> [...] >>>>> /mii[0] (aspeed-mmi) >>>>> /aspeed-mmi[0] (qemu:memory-region) >>>>> - /mii[1] (aspeed-mmi) >>>>> - /mii[2] (aspeed-mmi) >>>>> - /mii[3] (aspeed-mmi) >>>>> /rtc (aspeed.rtc) >>>>> >>>>> I'm not sure creating @nb_nics devices makes sense. How many does the >>>>> physical chip provide? >>>> >>>> The AST2400, AST2500 SoC have 2 macs and the AST2600 has 4. Each machine >>>> define the one it uses, generally MAC0 but the tacoma board uses MAC3. >>>> >>>> Shouldn't the model reflect the real address space independently from >>>> the NIC backends defined on the command line ? > > If the SoC has N ftgmac100 peripherals, you need to mmio-map the N instances, > else your guest will get MEMTX_DECODE_ERROR trying to access it, regardless > command line NIC plugged. yes. This is what I do with the patch attached below but I have another problem.
Get a witherspoon-tacoma flash image : https://openpower.xyz/job/openbmc-build/distro=ubuntu,label=builder,target=witherspoon-tacoma/lastSuccessfulBuild/artifact/deploy/images/witherspoon-tacoma/flash-witherspoon-tacoma Run : qemu-system-arm -M tacoma-bmc -nic user -drive file=./flash-witherspoon-tacoma,format=raw,if=mtd -nographic -nodefaults -serial mon:stdio qemu-system-arm: warning: nic ftgmac100.0 has no peer qemu-system-arm: warning: nic ftgmac100.1 has no peer qemu-system-arm: warning: nic ftgmac100.3 has no peer U-Boot 2019.04 (May 06 2020 - 04:20:01 +0000) SOC: AST2600-A1 LPC Mode: SIO:Enable : SuperIO-2e Eth: MAC0: RMII/NCSI, MAC1: RMII/NCSI, MAC2: RMII/NCSI, MAC3: RMII/NCSI Model: Tacoma DRAM: already initialized, 1008 MiB ... How do I deal with the "no peer" warnings ? Thanks, C. >From a3c2772eca8a541158345e6f219ce524f1bc017b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= <c...@kaod.org> Date: Tue, 19 May 2020 14:39:55 +0200 Subject: [PATCH] arm/aspeed: Rework NIC attachment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Cédric Le Goater <c...@kaod.org> --- include/hw/arm/aspeed.h | 1 + include/hw/arm/aspeed_soc.h | 1 + hw/arm/aspeed.c | 5 +++++ hw/arm/aspeed_ast2600.c | 9 +++++++-- hw/arm/aspeed_soc.c | 10 ++++++++-- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/include/hw/arm/aspeed.h b/include/hw/arm/aspeed.h index 18521484b90e..7e71152b3554 100644 --- a/include/hw/arm/aspeed.h +++ b/include/hw/arm/aspeed.h @@ -39,6 +39,7 @@ typedef struct AspeedMachineClass { const char *fmc_model; const char *spi_model; uint32_t num_cs; + uint32_t nic_mask; void (*i2c_init)(AspeedBoardState *bmc); } AspeedMachineClass; diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h index 914115f3ef77..32e9a232a049 100644 --- a/include/hw/arm/aspeed_soc.h +++ b/include/hw/arm/aspeed_soc.h @@ -55,6 +55,7 @@ typedef struct AspeedSoCState { AspeedSDMCState sdmc; AspeedWDTState wdt[ASPEED_WDTS_NUM]; FTGMAC100State ftgmac100[ASPEED_MACS_NUM]; + uint32_t nic_mask; AspeedMiiState mii[ASPEED_MACS_NUM]; AspeedGPIOState gpio; AspeedGPIOState gpio_1_8v; diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c index 6f8f4b88f8ab..338b5db20cf9 100644 --- a/hw/arm/aspeed.c +++ b/hw/arm/aspeed.c @@ -283,6 +283,8 @@ static void aspeed_machine_init(MachineState *machine) &error_abort); object_property_set_int(OBJECT(&bmc->soc), amc->num_cs, "num-cs", &error_abort); + object_property_set_int(OBJECT(&bmc->soc), amc->nic_mask, "nic-mask", + &error_abort); object_property_set_link(OBJECT(&bmc->soc), OBJECT(&bmc->ram_container), "dram", &error_abort); if (machine->kernel_filename) { @@ -556,12 +558,14 @@ static int aspeed_soc_num_cpus(const char *soc_name) static void aspeed_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc); mc->init = aspeed_machine_init; mc->no_floppy = 1; mc->no_cdrom = 1; mc->no_parallel = 1; mc->default_ram_id = "ram"; + amc->nic_mask = 1; /* First NIC */ aspeed_machine_class_props_init(oc); } @@ -698,6 +702,7 @@ static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data) amc->fmc_model = "mx66l1g45g"; amc->spi_model = "mx66l1g45g"; amc->num_cs = 2; + amc->nic_mask = 0x4; /* third NIC */ amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */ mc->default_ram_size = 1 * GiB; mc->default_cpus = mc->min_cpus = mc->max_cpus = diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c index 114b94f8f44d..0e303c3018e7 100644 --- a/hw/arm/aspeed_ast2600.c +++ b/hw/arm/aspeed_ast2600.c @@ -247,6 +247,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp) AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); Error *err = NULL, *local_err = NULL; qemu_irq irq; + NICInfo *nd = &nd_table[0]; /* IO space */ create_unimplemented_device("aspeed_soc.io", sc->memmap[ASPEED_IOMEM], @@ -462,8 +463,12 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp) } /* Net */ - for (i = 0; i < nb_nics && i < sc->macs_num; i++) { - qdev_set_nic_properties(DEVICE(&s->ftgmac100[i]), &nd_table[i]); + for (i = 0; i < sc->macs_num; i++) { + if ((s->nic_mask & (1 << i)) && nd->used) { + qemu_check_nic_model(nd, TYPE_FTGMAC100); + qdev_set_nic_properties(DEVICE(&s->ftgmac100[i]), nd); + nd++; + } object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed", &err); object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "realized", diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index 984d29087dce..cc4f6769e763 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -234,6 +234,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) AspeedSoCState *s = ASPEED_SOC(dev); AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); Error *err = NULL, *local_err = NULL; + NICInfo *nd = &nd_table[0]; /* IO space */ create_unimplemented_device("aspeed_soc.io", sc->memmap[ASPEED_IOMEM], @@ -405,8 +406,12 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) } /* Net */ - for (i = 0; i < nb_nics && i < sc->macs_num; i++) { - qdev_set_nic_properties(DEVICE(&s->ftgmac100[i]), &nd_table[i]); + for (i = 0; i < sc->macs_num; i++) { + if ((s->nic_mask & (1 << i)) && nd->used) { + qemu_check_nic_model(nd, TYPE_FTGMAC100); + qdev_set_nic_properties(DEVICE(&s->ftgmac100[i]), nd); + nd++; + } object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed", &err); object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "realized", @@ -455,6 +460,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp) aspeed_soc_get_irq(s, ASPEED_SDHCI)); } static Property aspeed_soc_properties[] = { + DEFINE_PROP_UINT32("nic-mask", AspeedSoCState, nic_mask, 0x1), DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION, MemoryRegion *), DEFINE_PROP_END_OF_LIST(), -- 2.25.4