From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, "Peter Maydell" <peter.maydell@linaro.org>,
"Alistair Francis" <Alistair.Francis@wdc.com>,
"Bin Meng" <bin.meng@windriver.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
qemu-arm@nongnu.org, qemu-riscv@nongnu.org
Subject: [PATCH v2 01/13] hw/sd/ssi-sd: Do not create SD card within controller's realize
Date: Wed, 17 Nov 2021 17:33:57 +0100 [thread overview]
Message-ID: <20211117163409.3587705-2-armbru@redhat.com> (raw)
In-Reply-To: <20211117163409.3587705-1-armbru@redhat.com>
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".
The device remains not user-creatable, because its users should (and
do) wire up its GPIO chip-select line.
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Alistair Francis <Alistair.Francis@wdc.com>
Cc: Bin Meng <bin.meng@windriver.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: "Philippe Mathieu-Daudé" <f4bug@amsat.org>
Cc: qemu-arm@nongnu.org
Cc: qemu-riscv@nongnu.org
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/arm/stellaris.c | 15 ++++++++++++++-
hw/riscv/sifive_u.c | 13 ++++++++++++-
hw/sd/ssi-sd.c | 29 +----------------------------
3 files changed, 27 insertions(+), 30 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..a4ecadaf12 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 */
@@ -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..167c03b780 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(DeviceState *dev)
@@ -426,7 +399,7 @@ static void ssi_sd_class_init(ObjectClass *klass, void *data)
k->cs_polarity = SSI_CS_LOW;
dc->vmsd = &vmstate_ssi_sd;
dc->reset = ssi_sd_reset;
- /* Reason: init() method uses drive_get_next() */
+ /* Reason: GPIO chip-select line should be wired up */
dc->user_creatable = false;
}
--
2.31.1
WARNING: multiple messages have this Message-ID (diff)
From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
qemu-riscv@nongnu.org, qemu-block@nongnu.org,
"Bin Meng" <bin.meng@windriver.com>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
qemu-arm@nongnu.org,
"Alistair Francis" <Alistair.Francis@wdc.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>
Subject: [PATCH v2 01/13] hw/sd/ssi-sd: Do not create SD card within controller's realize
Date: Wed, 17 Nov 2021 17:33:57 +0100 [thread overview]
Message-ID: <20211117163409.3587705-2-armbru@redhat.com> (raw)
In-Reply-To: <20211117163409.3587705-1-armbru@redhat.com>
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".
The device remains not user-creatable, because its users should (and
do) wire up its GPIO chip-select line.
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Alistair Francis <Alistair.Francis@wdc.com>
Cc: Bin Meng <bin.meng@windriver.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: "Philippe Mathieu-Daudé" <f4bug@amsat.org>
Cc: qemu-arm@nongnu.org
Cc: qemu-riscv@nongnu.org
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/arm/stellaris.c | 15 ++++++++++++++-
hw/riscv/sifive_u.c | 13 ++++++++++++-
hw/sd/ssi-sd.c | 29 +----------------------------
3 files changed, 27 insertions(+), 30 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..a4ecadaf12 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 */
@@ -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..167c03b780 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(DeviceState *dev)
@@ -426,7 +399,7 @@ static void ssi_sd_class_init(ObjectClass *klass, void *data)
k->cs_polarity = SSI_CS_LOW;
dc->vmsd = &vmstate_ssi_sd;
dc->reset = ssi_sd_reset;
- /* Reason: init() method uses drive_get_next() */
+ /* Reason: GPIO chip-select line should be wired up */
dc->user_creatable = false;
}
--
2.31.1
next prev parent reply other threads:[~2021-11-17 16:34 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-17 16:33 [PATCH v2 00/13] Eliminate drive_get_next() Markus Armbruster
2021-11-17 16:33 ` Markus Armbruster [this message]
2021-11-17 16:33 ` [PATCH v2 01/13] hw/sd/ssi-sd: Do not create SD card within controller's realize Markus Armbruster
2021-11-17 19:45 ` Philippe Mathieu-Daudé
2021-12-06 12:34 ` Markus Armbruster
2021-12-06 12:34 ` Markus Armbruster
2021-12-06 13:05 ` Peter Maydell
2021-12-06 13:05 ` Peter Maydell
2021-11-19 13:04 ` Alistair Francis
2021-11-19 13:04 ` Alistair Francis
2021-11-17 16:33 ` [PATCH v2 02/13] hw: Replace trivial drive_get_next() by drive_get() Markus Armbruster
2021-11-17 16:33 ` Markus Armbruster
2021-11-19 13:02 ` Alistair Francis
2021-11-19 13:02 ` Alistair Francis
2021-11-17 16:33 ` [PATCH v2 03/13] hw/arm/npcm7xx_boards: Replace " Markus Armbruster
2021-11-17 16:53 ` Havard Skinnemoen
2021-11-17 17:50 ` Hao Wu
2021-11-18 6:56 ` Markus Armbruster
2021-11-17 16:34 ` [PATCH v2 04/13] hw/arm/versatilepb hw/arm/vexpress: " Markus Armbruster
2021-11-29 13:21 ` Peter Maydell
2021-11-17 16:34 ` [PATCH v2 05/13] hw/arm/imx25_pdk: " Markus Armbruster
2021-11-29 13:22 ` Peter Maydell
2021-11-17 16:34 ` [PATCH v2 06/13] hw/arm/mcimx6ul-evk: " Markus Armbruster
2021-11-29 13:22 ` Peter Maydell
2021-11-17 16:34 ` [PATCH v2 07/13] hw/arm/mcimx7d-sabre: " Markus Armbruster
2021-11-29 13:23 ` Peter Maydell
2021-11-17 16:34 ` [PATCH v2 08/13] hw/arm/xlnx-versal-virt: " Markus Armbruster
2021-11-17 16:34 ` Markus Armbruster
2021-11-18 14:47 ` Edgar E. Iglesias
2021-11-17 16:34 ` [PATCH v2 09/13] hw/microblaze: " Markus Armbruster
2021-11-18 14:46 ` Edgar E. Iglesias
2021-11-17 16:34 ` [PATCH v2 10/13] hw/arm/xlnx-zcu102: " Markus Armbruster
2021-11-17 16:34 ` Markus Armbruster
2021-11-18 14:46 ` Edgar E. Iglesias
2021-11-17 16:34 ` [PATCH v2 11/13] hw/arm/xilinx_zynq: " Markus Armbruster
2021-11-17 16:34 ` Markus Armbruster
2021-11-18 14:46 ` Edgar E. Iglesias
2021-11-17 16:34 ` [PATCH v2 12/13] hw/arm/aspeed: " Markus Armbruster
2021-11-18 14:41 ` Cédric Le Goater
2021-11-17 16:34 ` [PATCH v2 13/13] blockdev: Drop unused drive_get_next() Markus Armbruster
2021-11-18 8:07 ` Hanna Reitz
2021-12-06 15:28 ` [PATCH v2 00/13] Eliminate drive_get_next() 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=20211117163409.3587705-2-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=Alistair.Francis@wdc.com \
--cc=bin.meng@windriver.com \
--cc=f4bug@amsat.org \
--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 \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.