Re: [PATCH RFC 1/2] hw/sd/ssi-sd: Do not create SD card within controller's realize

2021-11-15 Thread Markus Armbruster
Peter Maydell  writes:

> On Mon, 15 Nov 2021 at 12:56, Markus Armbruster  wrote:
>>
>> ssi_sd_realize() creates an "sd-card" device.  This is inappropriate,
>> and marked FIXME.
>>
>> Move it to the boards that create these devices.  Prior art: commit
>> eb4f566bbb for device "generic-sdhci", and commit 26c607b86b for
>> device "pl181".
>>
>> Signed-off-by: Markus Armbruster 
>> ---
>
>> @@ -670,7 +672,7 @@ static void sifive_u_machine_init(MachineState *machine)
>>
>>  /* Connect an SPI flash to SPI0 */
>>  flash_dev = qdev_new("is25wp256");
>> -dinfo = drive_get_next(IF_MTD);
>> +dinfo = drive_get(IF_MTD, 0, 0);
>>  if (dinfo) {
>>  qdev_prop_set_drive_err(flash_dev, "drive",
>>  blk_by_legacy_dinfo(dinfo),
>
>
> This part looks like it should have been in the other patch.

You're right.  Thanks!




Re: [PATCH RFC 1/2] hw/sd/ssi-sd: Do not create SD card within controller's realize

2021-11-15 Thread Peter Maydell
On Mon, 15 Nov 2021 at 12:56, Markus Armbruster  wrote:
>
> ssi_sd_realize() creates an "sd-card" device.  This is inappropriate,
> and marked FIXME.
>
> Move it to the boards that create these devices.  Prior art: commit
> eb4f566bbb for device "generic-sdhci", and commit 26c607b86b for
> device "pl181".
>
> Signed-off-by: Markus Armbruster 
> ---

> @@ -670,7 +672,7 @@ static void sifive_u_machine_init(MachineState *machine)
>
>  /* Connect an SPI flash to SPI0 */
>  flash_dev = qdev_new("is25wp256");
> -dinfo = drive_get_next(IF_MTD);
> +dinfo = drive_get(IF_MTD, 0, 0);
>  if (dinfo) {
>  qdev_prop_set_drive_err(flash_dev, "drive",
>  blk_by_legacy_dinfo(dinfo),


This part looks like it should have been in the other patch.

-- PMM



[PATCH RFC 1/2] hw/sd/ssi-sd: Do not create SD card within controller's realize

2021-11-15 Thread Markus Armbruster
ssi_sd_realize() creates an "sd-card" device.  This is inappropriate,
and marked FIXME.

Move it to the boards that create these devices.  Prior art: commit
eb4f566bbb for device "generic-sdhci", and commit 26c607b86b for
device "pl181".

Signed-off-by: Markus Armbruster 
---
 hw/arm/stellaris.c  | 15 ++-
 hw/riscv/sifive_u.c | 15 +--
 hw/sd/ssi-sd.c  | 29 -
 3 files changed, 27 insertions(+), 32 deletions(-)

diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 78827ace6b..b6c8a5d609 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -10,6 +10,7 @@
 #include "qemu/osdep.h"
 #include "qapi/error.h"
 #include "hw/sysbus.h"
+#include "hw/sd/sd.h"
 #include "hw/ssi/ssi.h"
 #include "hw/arm/boot.h"
 #include "qemu/timer.h"
@@ -1157,6 +1158,9 @@ static void stellaris_init(MachineState *ms, 
stellaris_board_info *board)
 void *bus;
 DeviceState *sddev;
 DeviceState *ssddev;
+DriveInfo *dinfo;
+DeviceState *carddev;
+BlockBackend *blk;
 
 /*
  * Some boards have both an OLED controller and SD card connected 
to
@@ -1221,8 +1225,17 @@ static void stellaris_init(MachineState *ms, 
stellaris_board_info *board)
  *  - Make the ssd0323 OLED controller chipselect active-low
  */
 bus = qdev_get_child_bus(dev, "ssi");
-
 sddev = ssi_create_peripheral(bus, "ssi-sd");
+
+dinfo = drive_get(IF_SD, 0, 0);
+blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
+carddev = qdev_new(TYPE_SD_CARD);
+qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal);
+qdev_prop_set_bit(carddev, "spi", true);
+qdev_realize_and_unref(carddev,
+   qdev_get_child_bus(sddev, "sd-bus"),
+   &error_fatal);
+
 ssddev = ssi_create_peripheral(bus, "ssd0323");
 gpio_out[GPIO_D][0] = qemu_irq_split(
 qdev_get_gpio_in_named(sddev, SSI_GPIO_CS, 0),
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index 589ae72a59..aa74e67889 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -46,6 +46,7 @@
 #include "hw/char/serial.h"
 #include "hw/cpu/cluster.h"
 #include "hw/misc/unimp.h"
+#include "hw/sd/sd.h"
 #include "hw/ssi/ssi.h"
 #include "target/riscv/cpu.h"
 #include "hw/riscv/riscv_hart.h"
@@ -536,7 +537,8 @@ static void sifive_u_machine_init(MachineState *machine)
 uint32_t fdt_load_addr;
 uint64_t kernel_entry;
 DriveInfo *dinfo;
-DeviceState *flash_dev, *sd_dev;
+BlockBackend *blk;
+DeviceState *flash_dev, *sd_dev, *card_dev;
 qemu_irq flash_cs, sd_cs;
 
 /* Initialize SoC */
@@ -670,7 +672,7 @@ static void sifive_u_machine_init(MachineState *machine)
 
 /* Connect an SPI flash to SPI0 */
 flash_dev = qdev_new("is25wp256");
-dinfo = drive_get_next(IF_MTD);
+dinfo = drive_get(IF_MTD, 0, 0);
 if (dinfo) {
 qdev_prop_set_drive_err(flash_dev, "drive",
 blk_by_legacy_dinfo(dinfo),
@@ -686,6 +688,15 @@ static void sifive_u_machine_init(MachineState *machine)
 
 sd_cs = qdev_get_gpio_in_named(sd_dev, SSI_GPIO_CS, 0);
 sysbus_connect_irq(SYS_BUS_DEVICE(&s->soc.spi2), 1, sd_cs);
+
+dinfo = drive_get(IF_SD, 0, 0);
+blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
+card_dev = qdev_new(TYPE_SD_CARD);
+qdev_prop_set_drive_err(card_dev, "drive", blk, &error_fatal);
+qdev_prop_set_bit(card_dev, "spi", true);
+qdev_realize_and_unref(card_dev,
+   qdev_get_child_bus(sd_dev, "sd-bus"),
+   &error_fatal);
 }
 
 static bool sifive_u_machine_get_start_in_flash(Object *obj, Error **errp)
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
index e60854eeef..558506f6a0 100644
--- a/hw/sd/ssi-sd.c
+++ b/hw/sd/ssi-sd.c
@@ -368,36 +368,9 @@ static const VMStateDescription vmstate_ssi_sd = {
 
 static void ssi_sd_realize(SSIPeripheral *d, Error **errp)
 {
-ERRP_GUARD();
 ssi_sd_state *s = SSI_SD(d);
-DeviceState *carddev;
-DriveInfo *dinfo;
 
 qbus_init(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS, DEVICE(d), "sd-bus");
-
-/* Create and plug in the sd card */
-/* FIXME use a qdev drive property instead of drive_get_next() */
-dinfo = drive_get_next(IF_SD);
-carddev = qdev_new(TYPE_SD_CARD);
-if (dinfo) {
-if (!qdev_prop_set_drive_err(carddev, "drive",
- blk_by_legacy_dinfo(dinfo), errp)) {
-goto fail;
-}
-}
-
-if (!object_property_set_bool(OBJECT(carddev), "spi", true, errp)) {
-goto fail;
-}
-
-if (!qdev_realize_and_unref(carddev, BUS(&s->sdbus), errp)) {
-goto fail;
-}
-
-return;
-
-fail:
-error_prepend(errp, "failed to init SD card: ");
 }
 
 static void ssi_sd_reset(DeviceS