qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Cédric Le Goater" <clg@kaod.org>
To: "Markus Armbruster" <armbru@redhat.com>,
	"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, 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: Tue, 16 Nov 2021 09:52:35 +0100	[thread overview]
Message-ID: <39b908d3-57aa-ab1e-f10a-87afd887a341@kaod.org> (raw)
In-Reply-To: <87lf1pfm2z.fsf@dusky.pond.sub.org>

On 11/15/21 16:57, Markus Armbruster wrote:
> 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.

All Aspeed SoCs have 3 SPI busses, each with multiple CS, and also multiple
sdhci controllers with multiple slots.

How drives are defined for the aspeed machines can/should be improved.
The machine init iterates on the command line drives, attaches the
DriveInfo, in the order found, to a m25p80 device model first and then
follows on with the SD devices. This is fragile clearly and a bus+id
would be most welcome to identify the drive backend.

May be this is a prereq for this patchset ?

Thanks,

C.


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



  parent reply	other threads:[~2021-11-16  8:53 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
2021-11-15 21:15       ` Philippe Mathieu-Daudé
2021-11-16  7:47         ` Markus Armbruster
2021-11-16  8:52       ` Cédric Le Goater [this message]
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=39b908d3-57aa-ab1e-f10a-87afd887a341@kaod.org \
    --to=clg@kaod.org \
    --cc=Andrew.Baumann@microsoft.com \
    --cc=alistair@alistair23.me \
    --cc=andrew.smirnov@gmail.com \
    --cc=andrew@aj.id.au \
    --cc=armbru@redhat.com \
    --cc=atar4qemu@gmail.com \
    --cc=b.galvani@gmail.com \
    --cc=bin.meng@windriver.com \
    --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).