From: Markus Armbruster <armbru@redhat.com>
To: "Philippe Mathieu-Daudé" <f4bug@amsat.org>
Cc: peter.maydell@linaro.org, bin.meng@windriver.com,
mark.cave-ayland@ilande.co.uk, qemu-devel@nongnu.org,
jcd@tribudubois.net, qemu-block@nongnu.org,
andrew.smirnov@gmail.com, hskinnemoen@google.com, joel@jms.id.au,
atar4qemu@gmail.com, alistair@alistair23.me, b.galvani@gmail.com,
nieklinnenbank@gmail.com, qemu-arm@nongnu.org, clg@kaod.org,
kwolf@redhat.com, qemu-riscv@nongnu.org, andrew@aj.id.au,
Andrew.Baumann@microsoft.com, sundeep.lkml@gmail.com,
kfting@nuvoton.com, hreitz@redhat.com, palmer@dabbelt.com
Subject: Re: [PATCH RFC 2/2] hw: Replace drive_get_next() by drive_get()
Date: Mon, 15 Nov 2021 16:57:40 +0100 [thread overview]
Message-ID: <87lf1pfm2z.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <5b799ad5-a552-454f-dcc7-1ea6de22b397@amsat.org> ("Philippe =?utf-8?Q?Mathieu-Daud=C3=A9=22's?= message of "Mon, 15 Nov 2021 14:59:51 +0100")
Philippe Mathieu-Daudé <f4bug@amsat.org> writes:
> On 11/15/21 13:55, Markus Armbruster wrote:
>> drive_get_next() is basically a bad idea. It returns the "next" block
>> backend of a certain interface type. "Next" means bus=0,unit=N, where
>> subsequent calls count N up from zero, per interface type.
>>
>> This lets you define unit numbers implicitly by execution order. If the
>> order changes, or new calls appear "in the middle", unit numbers change.
>> ABI break. Hard to spot in review.
>>
>> Explicit is better than implicit: use drive_get() directly.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>> include/sysemu/blockdev.h | 1 -
>> blockdev.c | 10 ----------
>> hw/arm/aspeed.c | 21 +++++++++++++--------
>> hw/arm/cubieboard.c | 2 +-
>> hw/arm/imx25_pdk.c | 2 +-
>> hw/arm/integratorcp.c | 2 +-
>> hw/arm/mcimx6ul-evk.c | 2 +-
>> hw/arm/mcimx7d-sabre.c | 2 +-
>> hw/arm/msf2-som.c | 2 +-
>> hw/arm/npcm7xx_boards.c | 6 +++---
>> hw/arm/orangepi.c | 2 +-
>> hw/arm/raspi.c | 2 +-
>> hw/arm/realview.c | 2 +-
>> hw/arm/sabrelite.c | 2 +-
>> hw/arm/versatilepb.c | 4 ++--
>> hw/arm/vexpress.c | 6 +++---
>> hw/arm/xilinx_zynq.c | 16 +++++++++-------
>> hw/arm/xlnx-versal-virt.c | 3 ++-
>> hw/arm/xlnx-zcu102.c | 6 +++---
>> hw/microblaze/petalogix_ml605_mmu.c | 2 +-
>> hw/misc/sifive_u_otp.c | 2 +-
>> hw/riscv/microchip_pfsoc.c | 2 +-
>> hw/sparc64/niagara.c | 2 +-
>> 23 files changed, 49 insertions(+), 52 deletions(-)
>
>> @@ -435,11 +438,13 @@ static void aspeed_machine_init(MachineState *machine)
>> }
>>
>> for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
>> - sdhci_attach_drive(&bmc->soc.sdhci.slots[i], drive_get_next(IF_SD));
>> + sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
>> + drive_get(IF_SD, 0, i));
>
> If we put SD on bus #0, ...
>
>> }
>>
>> if (bmc->soc.emmc.num_slots) {
>> - sdhci_attach_drive(&bmc->soc.emmc.slots[0], drive_get_next(IF_SD));
>> + sdhci_attach_drive(&bmc->soc.emmc.slots[0],
>> + drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
>
> ... we'd want to put eMMC on bus #1
Using separate buses for different kinds of devices would be neater, but
it also would be an incompatible change. This patch keeps existing
bus/unit numbers working. drive_get_next() can only use bus 0.
> but I see having eMMC cards on a
> IF_SD bus as a bug, since these cards are soldered on the board.
IF_SD is not a bus, it's an "block interface type", which is really just
a user interface thing.
>> --- a/hw/arm/vexpress.c
>> +++ b/hw/arm/vexpress.c
>> @@ -625,7 +625,7 @@ static void vexpress_common_init(MachineState *machine)
>> qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_WPROT));
>> qdev_connect_gpio_out_named(dev, "card-inserted", 0,
>> qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_CARDIN));
>> - dinfo = drive_get_next(IF_SD);
>> + dinfo = drive_get(IF_SD, 0, 0);
>
> Can we have one interface refactor per patch (IF_SD, IF_PFLASH, IF_MTD...)?
Peter asked for one patch per "board/SoC model". I'll do whatever helps
reviewers.
>> @@ -657,7 +657,7 @@ static void vexpress_common_init(MachineState *machine)
>>
>> sysbus_create_simple("pl111", map[VE_CLCD], pic[14]);
>>
>> - dinfo = drive_get_next(IF_PFLASH);
>> + dinfo = drive_get(IF_PFLASH, 0, 0);
>
>> -static inline void zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
>> - bool is_qspi)
>> +static inline int zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
>> + bool is_qspi, int unit0)
>> {
>> + int unit = unit0;
>> DeviceState *dev;
>> SysBusDevice *busdev;
>> SSIBus *spi;
>> @@ -156,7 +157,7 @@ static inline void zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
>> spi = (SSIBus *)qdev_get_child_bus(dev, bus_name);
>>
>> for (j = 0; j < num_ss; ++j) {
>> - DriveInfo *dinfo = drive_get_next(IF_MTD);
>> + DriveInfo *dinfo = drive_get(IF_MTD, 0, unit++);
>
>> diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
>> index 3dc2b5e8ca..45eb19ab3b 100644
>> --- a/hw/arm/xlnx-zcu102.c
>> +++ b/hw/arm/xlnx-zcu102.c
>> @@ -190,7 +190,7 @@ static void xlnx_zcu102_init(MachineState *machine)
>> BusState *spi_bus;
>> DeviceState *flash_dev;
>> qemu_irq cs_line;
>> - DriveInfo *dinfo = drive_get_next(IF_MTD);
>> + DriveInfo *dinfo = drive_get(IF_MTD, 0, i);
>
> If this is bus #0, ...
>
>> gchar *bus_name = g_strdup_printf("spi%d", i);
>>
>> spi_bus = qdev_get_child_bus(DEVICE(&s->soc), bus_name);
>> @@ -212,7 +212,7 @@ static void xlnx_zcu102_init(MachineState *machine)
>> BusState *spi_bus;
>> DeviceState *flash_dev;
>> qemu_irq cs_line;
>> - DriveInfo *dinfo = drive_get_next(IF_MTD);
>> + DriveInfo *dinfo = drive_get(IF_MTD, 0, XLNX_ZYNQMP_NUM_SPIS + i);
>
> ... I'd expect we use bus #1 here (different connector on the board).
See above.
>> int bus = i / XLNX_ZYNQMP_NUM_QSPI_BUS_CS;
>> gchar *bus_name = g_strdup_printf("qspi%d", bus);
next prev parent reply other threads:[~2021-11-15 15:58 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-15 12:55 [PATCH RFC 0/2] Eliminate drive_get_next() Markus Armbruster
2021-11-15 12:55 ` [PATCH RFC 1/2] hw/sd/ssi-sd: Do not create SD card within controller's realize Markus Armbruster
2021-11-15 13:40 ` Peter Maydell
2021-11-15 13:48 ` Markus Armbruster
2021-11-15 12:55 ` [PATCH RFC 2/2] hw: Replace drive_get_next() by drive_get() Markus Armbruster
2021-11-15 13:38 ` Peter Maydell
2021-11-15 13:48 ` Markus Armbruster
2021-11-15 13:59 ` Philippe Mathieu-Daudé
2021-11-15 15:57 ` Markus Armbruster [this message]
2021-11-15 21:15 ` Philippe Mathieu-Daudé
2021-11-16 7:47 ` Markus Armbruster
2021-11-16 8:52 ` Cédric Le Goater
2021-11-16 9:29 ` Markus Armbruster
2021-11-16 12:14 ` Cédric Le Goater
2021-11-15 14:05 ` [PATCH RFC 0/2] Eliminate drive_get_next() Peter Maydell
2021-11-15 16:01 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87lf1pfm2z.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=Andrew.Baumann@microsoft.com \
--cc=alistair@alistair23.me \
--cc=andrew.smirnov@gmail.com \
--cc=andrew@aj.id.au \
--cc=atar4qemu@gmail.com \
--cc=b.galvani@gmail.com \
--cc=bin.meng@windriver.com \
--cc=clg@kaod.org \
--cc=f4bug@amsat.org \
--cc=hreitz@redhat.com \
--cc=hskinnemoen@google.com \
--cc=jcd@tribudubois.net \
--cc=joel@jms.id.au \
--cc=kfting@nuvoton.com \
--cc=kwolf@redhat.com \
--cc=mark.cave-ayland@ilande.co.uk \
--cc=nieklinnenbank@gmail.com \
--cc=palmer@dabbelt.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=sundeep.lkml@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).