* [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6)
@ 2018-01-23 3:58 Philippe Mathieu-Daudé
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 1/6] hw/sd/milkymist-memcard: use qemu_log_mask() Philippe Mathieu-Daudé
` (6 more replies)
0 siblings, 7 replies; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23 3:58 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell, Michael Walle
Cc: Philippe Mathieu-Daudé,
qemu-devel, Andrzej Zaborowski, Edgar E . Iglesias, Stefan Weil
Hi,
Since v1:
- rebased on /master (Peter sdcard reset() patches)
- fix milkymist-mmc from previous seris using instance_init (Michael Walle)
This series convert 3 devices using the legacy SDCard API to the SDBus API:
- milkymist-mmc
- pl181
- ssi-sd
Then move the legacy API to a separate header "sdcard_legacy.h".
Now the OMAP MMC is the last device using the legacy API, but need to get
QOM'ified first.
Having a common sdbus interface simplify qtesting (next series)
Regards,
Phil.
$ git backport-diff
001/6:[----] [--] 'hw/sd/milkymist-memcard: use qemu_log_mask()'
002/6:[0014] [FC] 'hw/sd/milkymist-memcard: split realize() out of SysBusDevice init()'
003/6:[0004] [FC] 'hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it'
004/6:[0006] [FC] 'hw/sd/pl181: expose a SDBus and connect the SDCard to it'
005/6:[down] 'hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus'
006/6:[----] [-C] 'hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h"'
Based-on: 20180123033034.29493-19-f4bug@amsat.org
(or /master)
Philippe Mathieu-Daudé (6):
hw/sd/milkymist-memcard: use qemu_log_mask()
hw/sd/milkymist-memcard: split realize() out of SysBusDevice init()
hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it
hw/sd/pl181: expose a SDBus and connect the SDCard to it
hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus
hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h"
include/hw/sd/sd.h | 17 ---------
include/hw/sd/sdcard_legacy.h | 51 +++++++++++++++++++++++++++
hw/sd/milkymist-memcard.c | 81 ++++++++++++++++++++++++-------------------
hw/sd/omap_mmc.c | 2 +-
hw/sd/pl181.c | 32 +++++++++++------
hw/sd/sd.c | 1 +
hw/sd/ssi-sd.c | 32 ++++++++++-------
7 files changed, 139 insertions(+), 77 deletions(-)
create mode 100644 include/hw/sd/sdcard_legacy.h
--
2.15.1
^ permalink raw reply [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH v2 1/6] hw/sd/milkymist-memcard: use qemu_log_mask()
2018-01-23 3:58 [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
@ 2018-01-23 3:58 ` Philippe Mathieu-Daudé
2018-01-31 16:29 ` Alistair Francis
2018-02-01 9:07 ` Michael Walle
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 2/6] hw/sd/milkymist-memcard: split realize() out of SysBusDevice init() Philippe Mathieu-Daudé
` (5 subsequent siblings)
6 siblings, 2 replies; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23 3:58 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell, Michael Walle
Cc: Philippe Mathieu-Daudé,
qemu-devel, Andrzej Zaborowski, Edgar E . Iglesias, Stefan Weil
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/milkymist-memcard.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
index 341da88552..1292c0c099 100644
--- a/hw/sd/milkymist-memcard.c
+++ b/hw/sd/milkymist-memcard.c
@@ -22,11 +22,12 @@
*/
#include "qemu/osdep.h"
+#include "qemu/log.h"
#include "hw/hw.h"
#include "hw/sysbus.h"
#include "sysemu/sysemu.h"
#include "trace.h"
-#include "qemu/error-report.h"
+#include "include/qapi/error.h"
#include "sysemu/block-backend.h"
#include "sysemu/blockdev.h"
#include "hw/sd/sd.h"
@@ -138,8 +139,8 @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
} else {
r = s->response[s->response_read_ptr++];
if (s->response_read_ptr > s->response_len) {
- error_report("milkymist_memcard: "
- "read more cmd bytes than available. Clipping.");
+ qemu_log_mask(LOG_GUEST_ERROR, "milkymist_memcard: "
+ "read more cmd bytes than available. Clipping.");
s->response_read_ptr = 0;
}
}
@@ -163,8 +164,9 @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
break;
default:
- error_report("milkymist_memcard: read access to unknown register 0x"
- TARGET_FMT_plx, addr << 2);
+ qemu_log_mask(LOG_UNIMP, "milkymist_memcard: "
+ "read access to unknown register 0x%" HWADDR_PRIx "\n",
+ addr << 2);
break;
}
@@ -220,8 +222,9 @@ static void memcard_write(void *opaque, hwaddr addr, uint64_t value,
break;
default:
- error_report("milkymist_memcard: write access to unknown register 0x"
- TARGET_FMT_plx, addr << 2);
+ qemu_log_mask(LOG_UNIMP, "milkymist_memcard: "
+ "write access to unknown register 0x%" HWADDR_PRIx " "
+ "(value 0x%" PRIx64 ")\n", addr << 2, value);
break;
}
}
--
2.15.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH v2 2/6] hw/sd/milkymist-memcard: split realize() out of SysBusDevice init()
2018-01-23 3:58 [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 1/6] hw/sd/milkymist-memcard: use qemu_log_mask() Philippe Mathieu-Daudé
@ 2018-01-23 3:58 ` Philippe Mathieu-Daudé
2018-01-31 16:30 ` Alistair Francis
2018-02-01 9:07 ` Michael Walle
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 3/6] hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it Philippe Mathieu-Daudé
` (4 subsequent siblings)
6 siblings, 2 replies; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23 3:58 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell, Michael Walle
Cc: Philippe Mathieu-Daudé,
qemu-devel, Andrzej Zaborowski, Edgar E . Iglesias, Stefan Weil
Create the SDCard in the realize() function.
Suggested-by: Michael Walle <michael@walle.cc>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/milkymist-memcard.c | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
index 1292c0c099..a8e65892c7 100644
--- a/hw/sd/milkymist-memcard.c
+++ b/hw/sd/milkymist-memcard.c
@@ -257,27 +257,31 @@ static void milkymist_memcard_reset(DeviceState *d)
device_reset(DEVICE(s->card));
}
-static int milkymist_memcard_init(SysBusDevice *dev)
+static void milkymist_memcard_init(Object *obj)
+{
+ MilkymistMemcardState *s = MILKYMIST_MEMCARD(obj);
+ SysBusDevice *dev = SYS_BUS_DEVICE(obj);
+
+ memory_region_init_io(&s->regs_region, OBJECT(s), &memcard_mmio_ops, s,
+ "milkymist-memcard", R_MAX * 4);
+ sysbus_init_mmio(dev, &s->regs_region);
+}
+
+static void milkymist_memcard_realize(DeviceState *dev, Error **errp)
{
MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
- DriveInfo *dinfo;
BlockBackend *blk;
+ DriveInfo *dinfo;
/* FIXME use a qdev drive property instead of drive_get_next() */
dinfo = drive_get_next(IF_SD);
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
s->card = sd_init(blk, false);
if (s->card == NULL) {
- return -1;
+ error_setg(errp, "failed to init SD card");
+ return;
}
-
s->enabled = blk && blk_is_inserted(blk);
-
- memory_region_init_io(&s->regs_region, OBJECT(s), &memcard_mmio_ops, s,
- "milkymist-memcard", R_MAX * 4);
- sysbus_init_mmio(dev, &s->regs_region);
-
- return 0;
}
static const VMStateDescription vmstate_milkymist_memcard = {
@@ -300,9 +304,8 @@ static const VMStateDescription vmstate_milkymist_memcard = {
static void milkymist_memcard_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
- k->init = milkymist_memcard_init;
+ dc->realize = milkymist_memcard_realize;
dc->reset = milkymist_memcard_reset;
dc->vmsd = &vmstate_milkymist_memcard;
/* Reason: init() method uses drive_get_next() */
@@ -313,6 +316,7 @@ static const TypeInfo milkymist_memcard_info = {
.name = TYPE_MILKYMIST_MEMCARD,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(MilkymistMemcardState),
+ .instance_init = milkymist_memcard_init,
.class_init = milkymist_memcard_class_init,
};
--
2.15.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH v2 3/6] hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it
2018-01-23 3:58 [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 1/6] hw/sd/milkymist-memcard: use qemu_log_mask() Philippe Mathieu-Daudé
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 2/6] hw/sd/milkymist-memcard: split realize() out of SysBusDevice init() Philippe Mathieu-Daudé
@ 2018-01-23 3:58 ` Philippe Mathieu-Daudé
2018-01-31 16:31 ` Alistair Francis
2018-02-01 9:08 ` Michael Walle
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: " Philippe Mathieu-Daudé
` (3 subsequent siblings)
6 siblings, 2 replies; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23 3:58 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell, Michael Walle
Cc: Philippe Mathieu-Daudé,
qemu-devel, Andrzej Zaborowski, Edgar E . Iglesias, Stefan Weil
using the sdbus_*() API.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/milkymist-memcard.c | 38 +++++++++++++++++++++-----------------
1 file changed, 21 insertions(+), 17 deletions(-)
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
index a8e65892c7..5570c1e9a0 100644
--- a/hw/sd/milkymist-memcard.c
+++ b/hw/sd/milkymist-memcard.c
@@ -69,7 +69,7 @@ struct MilkymistMemcardState {
SysBusDevice parent_obj;
MemoryRegion regs_region;
- SDState *card;
+ SDBus sdbus;
int command_write_ptr;
int response_read_ptr;
@@ -105,7 +105,7 @@ static void memcard_sd_command(MilkymistMemcardState *s)
req.crc = s->command[5];
s->response[0] = req.cmd;
- s->response_len = sd_do_command(s->card, &req, s->response+1);
+ s->response_len = sdbus_do_command(&s->sdbus, &req, s->response + 1);
s->response_read_ptr = 0;
if (s->response_len == 16) {
@@ -150,10 +150,10 @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
r = 0xffffffff;
} else {
r = 0;
- r |= sd_read_data(s->card) << 24;
- r |= sd_read_data(s->card) << 16;
- r |= sd_read_data(s->card) << 8;
- r |= sd_read_data(s->card);
+ r |= sdbus_read_data(&s->sdbus) << 24;
+ r |= sdbus_read_data(&s->sdbus) << 16;
+ r |= sdbus_read_data(&s->sdbus) << 8;
+ r |= sdbus_read_data(&s->sdbus);
}
break;
case R_CLK2XDIV:
@@ -207,10 +207,10 @@ static void memcard_write(void *opaque, hwaddr addr, uint64_t value,
if (!s->enabled) {
break;
}
- sd_write_data(s->card, (value >> 24) & 0xff);
- sd_write_data(s->card, (value >> 16) & 0xff);
- sd_write_data(s->card, (value >> 8) & 0xff);
- sd_write_data(s->card, value & 0xff);
+ sdbus_write_data(&s->sdbus, (value >> 24) & 0xff);
+ sdbus_write_data(&s->sdbus, (value >> 16) & 0xff);
+ sdbus_write_data(&s->sdbus, (value >> 8) & 0xff);
+ sdbus_write_data(&s->sdbus, value & 0xff);
break;
case R_ENABLE:
s->regs[addr] = value;
@@ -251,10 +251,6 @@ static void milkymist_memcard_reset(DeviceState *d)
for (i = 0; i < R_MAX; i++) {
s->regs[i] = 0;
}
- /* Since we're still using the legacy SD API the card is not plugged
- * into any bus, and we must reset it manually.
- */
- device_reset(DEVICE(s->card));
}
static void milkymist_memcard_init(Object *obj)
@@ -270,15 +266,23 @@ static void milkymist_memcard_init(Object *obj)
static void milkymist_memcard_realize(DeviceState *dev, Error **errp)
{
MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
+ DeviceState *carddev;
BlockBackend *blk;
DriveInfo *dinfo;
+ Error *err = NULL;
+ qbus_create_inplace(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS,
+ dev, "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);
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
- s->card = sd_init(blk, false);
- if (s->card == NULL) {
- error_setg(errp, "failed to init SD card");
+ carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
+ qdev_prop_set_drive(carddev, "drive", blk, &err);
+ object_property_set_bool(OBJECT(carddev), true, "realized", &err);
+ if (err) {
+ error_setg(errp, "failed to init SD card: %s", error_get_pretty(err));
return;
}
s->enabled = blk && blk_is_inserted(blk);
--
2.15.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: expose a SDBus and connect the SDCard to it
2018-01-23 3:58 [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
` (2 preceding siblings ...)
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 3/6] hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it Philippe Mathieu-Daudé
@ 2018-01-23 3:58 ` Philippe Mathieu-Daudé
2018-01-31 16:41 ` Alistair Francis
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 5/6] hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus Philippe Mathieu-Daudé
` (2 subsequent siblings)
6 siblings, 1 reply; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23 3:58 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell, Michael Walle
Cc: Philippe Mathieu-Daudé,
qemu-devel, Andrzej Zaborowski, Edgar E . Iglesias, Stefan Weil,
open list:ARM PrimeCell and...
using the sdbus_*() API.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/pl181.c | 31 ++++++++++++++++++++-----------
1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
index 3ba1f7dd23..ce696c5d7d 100644
--- a/hw/sd/pl181.c
+++ b/hw/sd/pl181.c
@@ -33,6 +33,7 @@ typedef struct PL181State {
SysBusDevice parent_obj;
MemoryRegion iomem;
+ SDBus sdbus;
SDState *card;
uint32_t clock;
uint32_t power;
@@ -179,7 +180,7 @@ static void pl181_send_command(PL181State *s)
request.cmd = s->cmd & PL181_CMD_INDEX;
request.arg = s->cmdarg;
DPRINTF("Command %d %08x\n", request.cmd, request.arg);
- rlen = sd_do_command(s->card, &request, response);
+ rlen = sdbus_do_command(&s->sdbus, &request, response);
if (rlen < 0)
goto error;
if (s->cmd & PL181_CMD_RESPONSE) {
@@ -223,12 +224,12 @@ static void pl181_fifo_run(PL181State *s)
int is_read;
is_read = (s->datactrl & PL181_DATA_DIRECTION) != 0;
- if (s->datacnt != 0 && (!is_read || sd_data_ready(s->card))
+ if (s->datacnt != 0 && (!is_read || sdbus_data_ready(&s->sdbus))
&& !s->linux_hack) {
if (is_read) {
n = 0;
while (s->datacnt && s->fifo_len < PL181_FIFO_LEN) {
- value |= (uint32_t)sd_read_data(s->card) << (n * 8);
+ value |= (uint32_t)sdbus_read_data(&s->sdbus) << (n * 8);
s->datacnt--;
n++;
if (n == 4) {
@@ -249,7 +250,7 @@ static void pl181_fifo_run(PL181State *s)
}
n--;
s->datacnt--;
- sd_write_data(s->card, value & 0xff);
+ sdbus_write_data(&s->sdbus, value & 0xff);
value >>= 8;
}
}
@@ -480,10 +481,6 @@ static void pl181_reset(DeviceState *d)
/* We can assume our GPIO outputs have been wired up now */
sd_set_cb(s->card, s->cardstatus[0], s->cardstatus[1]);
- /* Since we're still using the legacy SD API the card is not plugged
- * into any bus, and we must reset it manually.
- */
- device_reset(DEVICE(s->card));
}
static void pl181_init(Object *obj)
@@ -502,14 +499,26 @@ static void pl181_init(Object *obj)
static void pl181_realize(DeviceState *dev, Error **errp)
{
PL181State *s = PL181(dev);
+ DeviceState *carddev;
DriveInfo *dinfo;
+ Error *err = NULL;
+
+ qbus_create_inplace(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS,
+ dev, "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);
- s->card = sd_init(dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, false);
- if (s->card == NULL) {
- error_setg(errp, "sd_init failed");
+ carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
+ if (dinfo) {
+ qdev_prop_set_drive(carddev, "drive", blk_by_legacy_dinfo(dinfo), &err);
+ }
+ object_property_set_bool(OBJECT(carddev), true, "realized", &err);
+ if (err) {
+ error_setg(errp, "failed to init SD card: %s", error_get_pretty(err));
+ return;
}
+ s->card = SD_CARD(carddev);
}
static void pl181_class_init(ObjectClass *klass, void *data)
--
2.15.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH v2 5/6] hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus
2018-01-23 3:58 [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
` (3 preceding siblings ...)
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: " Philippe Mathieu-Daudé
@ 2018-01-23 3:58 ` Philippe Mathieu-Daudé
2018-01-31 16:42 ` Alistair Francis
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 6/6] hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h" Philippe Mathieu-Daudé
2018-01-31 14:05 ` [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
6 siblings, 1 reply; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23 3:58 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell, Michael Walle
Cc: Philippe Mathieu-Daudé,
qemu-devel, Andrzej Zaborowski, Edgar E . Iglesias, Stefan Weil
On reset the bus will reset the card,
we can now drop the device_reset() call.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/ssi-sd.c | 32 +++++++++++++++++++-------------
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
index f88f509e0a..ae04b6641b 100644
--- a/hw/sd/ssi-sd.c
+++ b/hw/sd/ssi-sd.c
@@ -47,7 +47,7 @@ typedef struct {
int32_t arglen;
int32_t response_pos;
int32_t stopping;
- SDState *sd;
+ SDBus sdbus;
} ssi_sd_state;
#define TYPE_SSI_SD "ssi-sd"
@@ -100,7 +100,7 @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
request.arg = (s->cmdarg[0] << 24) | (s->cmdarg[1] << 16)
| (s->cmdarg[2] << 8) | s->cmdarg[3];
DPRINTF("CMD%d arg 0x%08x\n", s->cmd, request.arg);
- s->arglen = sd_do_command(s->sd, &request, longresp);
+ s->arglen = sdbus_do_command(&s->sdbus, &request, longresp);
if (s->arglen <= 0) {
s->arglen = 1;
s->response[0] = 4;
@@ -177,7 +177,7 @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
DPRINTF("Response 0x%02x\n", s->response[s->response_pos]);
return s->response[s->response_pos++];
}
- if (sd_data_ready(s->sd)) {
+ if (sdbus_data_ready(&s->sdbus)) {
DPRINTF("Data read\n");
s->mode = SSI_SD_DATA_START;
} else {
@@ -190,8 +190,8 @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
s->mode = SSI_SD_DATA_READ;
return 0xfe;
case SSI_SD_DATA_READ:
- val = sd_read_data(s->sd);
- if (!sd_data_ready(s->sd)) {
+ val = sdbus_read_data(&s->sdbus);
+ if (!sdbus_data_ready(&s->sdbus)) {
DPRINTF("Data read end\n");
s->mode = SSI_SD_CMD;
}
@@ -242,13 +242,24 @@ static const VMStateDescription vmstate_ssi_sd = {
static void ssi_sd_realize(SSISlave *d, Error **errp)
{
ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, d);
+ DeviceState *carddev;
DriveInfo *dinfo;
+ Error *err = NULL;
+ qbus_create_inplace(&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);
- s->sd = sd_init(dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, true);
- if (s->sd == NULL) {
- error_setg(errp, "Device initialization failed.");
+ carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
+ if (dinfo) {
+ qdev_prop_set_drive(carddev, "drive", blk_by_legacy_dinfo(dinfo), &err);
+ }
+ object_property_set_bool(OBJECT(carddev), true, "spi", &err);
+ object_property_set_bool(OBJECT(carddev), true, "realized", &err);
+ if (err) {
+ error_setg(errp, "failed to init SD card: %s", error_get_pretty(err));
return;
}
}
@@ -264,11 +275,6 @@ static void ssi_sd_reset(DeviceState *dev)
s->arglen = 0;
s->response_pos = 0;
s->stopping = 0;
-
- /* Since we're still using the legacy SD API the card is not plugged
- * into any bus, and we must reset it manually.
- */
- device_reset(DEVICE(s->sd));
}
static void ssi_sd_class_init(ObjectClass *klass, void *data)
--
2.15.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH v2 6/6] hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h"
2018-01-23 3:58 [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
` (4 preceding siblings ...)
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 5/6] hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus Philippe Mathieu-Daudé
@ 2018-01-23 3:58 ` Philippe Mathieu-Daudé
2018-01-31 16:43 ` Alistair Francis
2018-01-31 14:05 ` [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
6 siblings, 1 reply; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-23 3:58 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell, Michael Walle
Cc: Philippe Mathieu-Daudé,
qemu-devel, Andrzej Zaborowski, Edgar E . Iglesias, Stefan Weil,
open list:ARM PrimeCell and...
roughly 2 users left.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
include/hw/sd/sd.h | 17 ---------------
include/hw/sd/sdcard_legacy.h | 51 +++++++++++++++++++++++++++++++++++++++++++
hw/sd/omap_mmc.c | 2 +-
hw/sd/pl181.c | 1 +
hw/sd/sd.c | 1 +
5 files changed, 54 insertions(+), 18 deletions(-)
create mode 100644 include/hw/sd/sdcard_legacy.h
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 9bdb3c9285..74bfab9386 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -130,23 +130,6 @@ typedef struct {
void (*set_readonly)(DeviceState *dev, bool readonly);
} SDBusClass;
-/* Legacy functions to be used only by non-qdevified callers */
-SDState *sd_init(BlockBackend *bs, bool is_spi);
-int sd_do_command(SDState *sd, SDRequest *req,
- uint8_t *response);
-void sd_write_data(SDState *sd, uint8_t value);
-uint8_t sd_read_data(SDState *sd);
-void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert);
-bool sd_data_ready(SDState *sd);
-/* sd_enable should not be used -- it is only used on the nseries boards,
- * where it is part of a broken implementation of the MMC card slot switch
- * (there should be two card slots which are multiplexed to a single MMC
- * controller, but instead we model it with one card and controller and
- * disable the card when the second slot is selected, so it looks like the
- * second slot is always empty).
- */
-void sd_enable(SDState *sd, bool enable);
-
/* Functions to be used by qdevified callers (working via
* an SDBus rather than directly with SDState)
*/
diff --git a/include/hw/sd/sdcard_legacy.h b/include/hw/sd/sdcard_legacy.h
new file mode 100644
index 0000000000..882e13a8f1
--- /dev/null
+++ b/include/hw/sd/sdcard_legacy.h
@@ -0,0 +1,51 @@
+/*
+ * SD Memory Card emulation (deprecated legacy API)
+ *
+ * Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef HW_SDCARD_LEGACY_H
+#define HW_SDCARD_LEGACY_H
+
+#include "hw/sd/sd.h"
+
+/* Legacy functions to be used only by non-qdevified callers */
+SDState *sd_init(BlockBackend *blk, bool is_spi);
+int sd_do_command(SDState *card, SDRequest *request, uint8_t *response);
+void sd_write_data(SDState *card, uint8_t value);
+uint8_t sd_read_data(SDState *card);
+void sd_set_cb(SDState *card, qemu_irq readonly, qemu_irq insert);
+bool sd_data_ready(SDState *card);
+
+/* sd_enable should not be used -- it is only used on the nseries boards,
+ * where it is part of a broken implementation of the MMC card slot switch
+ * (there should be two card slots which are multiplexed to a single MMC
+ * controller, but instead we model it with one card and controller and
+ * disable the card when the second slot is selected, so it looks like the
+ * second slot is always empty).
+ */
+void sd_enable(SDState *card, bool enable);
+
+#endif /* HW_SDCARD_LEGACY_H */
diff --git a/hw/sd/omap_mmc.c b/hw/sd/omap_mmc.c
index 5b47cadf11..be14ac4f40 100644
--- a/hw/sd/omap_mmc.c
+++ b/hw/sd/omap_mmc.c
@@ -19,7 +19,7 @@
#include "qemu/osdep.h"
#include "hw/hw.h"
#include "hw/arm/omap.h"
-#include "hw/sd/sd.h"
+#include "hw/sd/sdcard_legacy.h"
struct omap_mmc_s {
qemu_irq irq;
diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
index ce696c5d7d..7591d016cd 100644
--- a/hw/sd/pl181.c
+++ b/hw/sd/pl181.c
@@ -12,6 +12,7 @@
#include "sysemu/blockdev.h"
#include "hw/sysbus.h"
#include "hw/sd/sd.h"
+#include "hw/sd/sdcard_legacy.h"
#include "qemu/log.h"
#include "qapi/error.h"
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 9880a5d090..6942aa4df3 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -35,6 +35,7 @@
#include "hw/registerfields.h"
#include "sysemu/block-backend.h"
#include "hw/sd/sd.h"
+#include "hw/sd/sdcard_legacy.h"
#include "qapi/error.h"
#include "qemu/bitmap.h"
#include "qemu/cutils.h"
--
2.15.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6)
2018-01-23 3:58 [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
` (5 preceding siblings ...)
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 6/6] hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h" Philippe Mathieu-Daudé
@ 2018-01-31 14:05 ` Philippe Mathieu-Daudé
6 siblings, 0 replies; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-01-31 14:05 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell, Michael Walle
Cc: qemu-devel, Andrzej Zaborowski, Edgar E . Iglesias, Stefan Weil
Hi,
On 01/23/2018 12:58 AM, Philippe Mathieu-Daudé wrote:
> Since v1:
> - rebased on /master (Peter sdcard reset() patches)
> - fix milkymist-mmc from previous seris using instance_init (Michael Walle)
>
> This series convert 3 devices using the legacy SDCard API to the SDBus API:
> - milkymist-mmc
> - pl181
> - ssi-sd
>
> Then move the legacy API to a separate header "sdcard_legacy.h".
This series is not related to the previous set (2/3/4/5) and can be
applied independently.
>
> Now the OMAP MMC is the last device using the legacy API, but need to get
> QOM'ified first.
>
> Having a common sdbus interface simplify qtesting (next series)
>
> Regards,
>
> Phil.
>
> $ git backport-diff
> 001/6:[----] [--] 'hw/sd/milkymist-memcard: use qemu_log_mask()'
> 002/6:[0014] [FC] 'hw/sd/milkymist-memcard: split realize() out of SysBusDevice init()'
> 003/6:[0004] [FC] 'hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it'
> 004/6:[0006] [FC] 'hw/sd/pl181: expose a SDBus and connect the SDCard to it'
> 005/6:[down] 'hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus'
> 006/6:[----] [-C] 'hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h"'
>
> Based-on: 20180123033034.29493-19-f4bug@amsat.org
> (or /master)
>
> Philippe Mathieu-Daudé (6):
> hw/sd/milkymist-memcard: use qemu_log_mask()
> hw/sd/milkymist-memcard: split realize() out of SysBusDevice init()
> hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it
> hw/sd/pl181: expose a SDBus and connect the SDCard to it
> hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus
> hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h"
>
> include/hw/sd/sd.h | 17 ---------
> include/hw/sd/sdcard_legacy.h | 51 +++++++++++++++++++++++++++
> hw/sd/milkymist-memcard.c | 81 ++++++++++++++++++++++++-------------------
> hw/sd/omap_mmc.c | 2 +-
> hw/sd/pl181.c | 32 +++++++++++------
> hw/sd/sd.c | 1 +
> hw/sd/ssi-sd.c | 32 ++++++++++-------
> 7 files changed, 139 insertions(+), 77 deletions(-)
> create mode 100644 include/hw/sd/sdcard_legacy.h
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/6] hw/sd/milkymist-memcard: use qemu_log_mask()
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 1/6] hw/sd/milkymist-memcard: use qemu_log_mask() Philippe Mathieu-Daudé
@ 2018-01-31 16:29 ` Alistair Francis
2018-02-01 9:07 ` Michael Walle
1 sibling, 0 replies; 21+ messages in thread
From: Alistair Francis @ 2018-01-31 16:29 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Peter Maydell, Michael Walle,
Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers
On Mon, Jan 22, 2018 at 7:58 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
Alistair
> ---
> hw/sd/milkymist-memcard.c | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
> index 341da88552..1292c0c099 100644
> --- a/hw/sd/milkymist-memcard.c
> +++ b/hw/sd/milkymist-memcard.c
> @@ -22,11 +22,12 @@
> */
>
> #include "qemu/osdep.h"
> +#include "qemu/log.h"
> #include "hw/hw.h"
> #include "hw/sysbus.h"
> #include "sysemu/sysemu.h"
> #include "trace.h"
> -#include "qemu/error-report.h"
> +#include "include/qapi/error.h"
> #include "sysemu/block-backend.h"
> #include "sysemu/blockdev.h"
> #include "hw/sd/sd.h"
> @@ -138,8 +139,8 @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
> } else {
> r = s->response[s->response_read_ptr++];
> if (s->response_read_ptr > s->response_len) {
> - error_report("milkymist_memcard: "
> - "read more cmd bytes than available. Clipping.");
> + qemu_log_mask(LOG_GUEST_ERROR, "milkymist_memcard: "
> + "read more cmd bytes than available. Clipping.");
> s->response_read_ptr = 0;
> }
> }
> @@ -163,8 +164,9 @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
> break;
>
> default:
> - error_report("milkymist_memcard: read access to unknown register 0x"
> - TARGET_FMT_plx, addr << 2);
> + qemu_log_mask(LOG_UNIMP, "milkymist_memcard: "
> + "read access to unknown register 0x%" HWADDR_PRIx "\n",
> + addr << 2);
> break;
> }
>
> @@ -220,8 +222,9 @@ static void memcard_write(void *opaque, hwaddr addr, uint64_t value,
> break;
>
> default:
> - error_report("milkymist_memcard: write access to unknown register 0x"
> - TARGET_FMT_plx, addr << 2);
> + qemu_log_mask(LOG_UNIMP, "milkymist_memcard: "
> + "write access to unknown register 0x%" HWADDR_PRIx " "
> + "(value 0x%" PRIx64 ")\n", addr << 2, value);
> break;
> }
> }
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 2/6] hw/sd/milkymist-memcard: split realize() out of SysBusDevice init()
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 2/6] hw/sd/milkymist-memcard: split realize() out of SysBusDevice init() Philippe Mathieu-Daudé
@ 2018-01-31 16:30 ` Alistair Francis
2018-02-01 9:07 ` Michael Walle
1 sibling, 0 replies; 21+ messages in thread
From: Alistair Francis @ 2018-01-31 16:30 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Peter Maydell, Michael Walle,
Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers
On Mon, Jan 22, 2018 at 7:58 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Create the SDCard in the realize() function.
>
> Suggested-by: Michael Walle <michael@walle.cc>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
Alistair
> ---
> hw/sd/milkymist-memcard.c | 28 ++++++++++++++++------------
> 1 file changed, 16 insertions(+), 12 deletions(-)
>
> diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
> index 1292c0c099..a8e65892c7 100644
> --- a/hw/sd/milkymist-memcard.c
> +++ b/hw/sd/milkymist-memcard.c
> @@ -257,27 +257,31 @@ static void milkymist_memcard_reset(DeviceState *d)
> device_reset(DEVICE(s->card));
> }
>
> -static int milkymist_memcard_init(SysBusDevice *dev)
> +static void milkymist_memcard_init(Object *obj)
> +{
> + MilkymistMemcardState *s = MILKYMIST_MEMCARD(obj);
> + SysBusDevice *dev = SYS_BUS_DEVICE(obj);
> +
> + memory_region_init_io(&s->regs_region, OBJECT(s), &memcard_mmio_ops, s,
> + "milkymist-memcard", R_MAX * 4);
> + sysbus_init_mmio(dev, &s->regs_region);
> +}
> +
> +static void milkymist_memcard_realize(DeviceState *dev, Error **errp)
> {
> MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
> - DriveInfo *dinfo;
> BlockBackend *blk;
> + DriveInfo *dinfo;
>
> /* FIXME use a qdev drive property instead of drive_get_next() */
> dinfo = drive_get_next(IF_SD);
> blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
> s->card = sd_init(blk, false);
> if (s->card == NULL) {
> - return -1;
> + error_setg(errp, "failed to init SD card");
> + return;
> }
> -
> s->enabled = blk && blk_is_inserted(blk);
> -
> - memory_region_init_io(&s->regs_region, OBJECT(s), &memcard_mmio_ops, s,
> - "milkymist-memcard", R_MAX * 4);
> - sysbus_init_mmio(dev, &s->regs_region);
> -
> - return 0;
> }
>
> static const VMStateDescription vmstate_milkymist_memcard = {
> @@ -300,9 +304,8 @@ static const VMStateDescription vmstate_milkymist_memcard = {
> static void milkymist_memcard_class_init(ObjectClass *klass, void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
> - SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
>
> - k->init = milkymist_memcard_init;
> + dc->realize = milkymist_memcard_realize;
> dc->reset = milkymist_memcard_reset;
> dc->vmsd = &vmstate_milkymist_memcard;
> /* Reason: init() method uses drive_get_next() */
> @@ -313,6 +316,7 @@ static const TypeInfo milkymist_memcard_info = {
> .name = TYPE_MILKYMIST_MEMCARD,
> .parent = TYPE_SYS_BUS_DEVICE,
> .instance_size = sizeof(MilkymistMemcardState),
> + .instance_init = milkymist_memcard_init,
> .class_init = milkymist_memcard_class_init,
> };
>
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 3/6] hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 3/6] hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it Philippe Mathieu-Daudé
@ 2018-01-31 16:31 ` Alistair Francis
2018-02-01 9:08 ` Michael Walle
1 sibling, 0 replies; 21+ messages in thread
From: Alistair Francis @ 2018-01-31 16:31 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Peter Maydell, Michael Walle,
Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers
On Mon, Jan 22, 2018 at 7:58 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> using the sdbus_*() API.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
Alistair
> ---
> hw/sd/milkymist-memcard.c | 38 +++++++++++++++++++++-----------------
> 1 file changed, 21 insertions(+), 17 deletions(-)
>
> diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
> index a8e65892c7..5570c1e9a0 100644
> --- a/hw/sd/milkymist-memcard.c
> +++ b/hw/sd/milkymist-memcard.c
> @@ -69,7 +69,7 @@ struct MilkymistMemcardState {
> SysBusDevice parent_obj;
>
> MemoryRegion regs_region;
> - SDState *card;
> + SDBus sdbus;
>
> int command_write_ptr;
> int response_read_ptr;
> @@ -105,7 +105,7 @@ static void memcard_sd_command(MilkymistMemcardState *s)
> req.crc = s->command[5];
>
> s->response[0] = req.cmd;
> - s->response_len = sd_do_command(s->card, &req, s->response+1);
> + s->response_len = sdbus_do_command(&s->sdbus, &req, s->response + 1);
> s->response_read_ptr = 0;
>
> if (s->response_len == 16) {
> @@ -150,10 +150,10 @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
> r = 0xffffffff;
> } else {
> r = 0;
> - r |= sd_read_data(s->card) << 24;
> - r |= sd_read_data(s->card) << 16;
> - r |= sd_read_data(s->card) << 8;
> - r |= sd_read_data(s->card);
> + r |= sdbus_read_data(&s->sdbus) << 24;
> + r |= sdbus_read_data(&s->sdbus) << 16;
> + r |= sdbus_read_data(&s->sdbus) << 8;
> + r |= sdbus_read_data(&s->sdbus);
> }
> break;
> case R_CLK2XDIV:
> @@ -207,10 +207,10 @@ static void memcard_write(void *opaque, hwaddr addr, uint64_t value,
> if (!s->enabled) {
> break;
> }
> - sd_write_data(s->card, (value >> 24) & 0xff);
> - sd_write_data(s->card, (value >> 16) & 0xff);
> - sd_write_data(s->card, (value >> 8) & 0xff);
> - sd_write_data(s->card, value & 0xff);
> + sdbus_write_data(&s->sdbus, (value >> 24) & 0xff);
> + sdbus_write_data(&s->sdbus, (value >> 16) & 0xff);
> + sdbus_write_data(&s->sdbus, (value >> 8) & 0xff);
> + sdbus_write_data(&s->sdbus, value & 0xff);
> break;
> case R_ENABLE:
> s->regs[addr] = value;
> @@ -251,10 +251,6 @@ static void milkymist_memcard_reset(DeviceState *d)
> for (i = 0; i < R_MAX; i++) {
> s->regs[i] = 0;
> }
> - /* Since we're still using the legacy SD API the card is not plugged
> - * into any bus, and we must reset it manually.
> - */
> - device_reset(DEVICE(s->card));
> }
>
> static void milkymist_memcard_init(Object *obj)
> @@ -270,15 +266,23 @@ static void milkymist_memcard_init(Object *obj)
> static void milkymist_memcard_realize(DeviceState *dev, Error **errp)
> {
> MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
> + DeviceState *carddev;
> BlockBackend *blk;
> DriveInfo *dinfo;
> + Error *err = NULL;
>
> + qbus_create_inplace(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS,
> + dev, "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);
> blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
> - s->card = sd_init(blk, false);
> - if (s->card == NULL) {
> - error_setg(errp, "failed to init SD card");
> + carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
> + qdev_prop_set_drive(carddev, "drive", blk, &err);
> + object_property_set_bool(OBJECT(carddev), true, "realized", &err);
> + if (err) {
> + error_setg(errp, "failed to init SD card: %s", error_get_pretty(err));
> return;
> }
> s->enabled = blk && blk_is_inserted(blk);
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: expose a SDBus and connect the SDCard to it
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: " Philippe Mathieu-Daudé
@ 2018-01-31 16:41 ` Alistair Francis
2018-02-06 12:43 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 21+ messages in thread
From: Alistair Francis @ 2018-01-31 16:41 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Peter Maydell, Michael Walle,
Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers, open list:ARM PrimeCell and...
On Mon, Jan 22, 2018 at 7:58 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> using the sdbus_*() API.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> hw/sd/pl181.c | 31 ++++++++++++++++++++-----------
> 1 file changed, 20 insertions(+), 11 deletions(-)
>
> diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
> index 3ba1f7dd23..ce696c5d7d 100644
> --- a/hw/sd/pl181.c
> +++ b/hw/sd/pl181.c
> @@ -33,6 +33,7 @@ typedef struct PL181State {
> SysBusDevice parent_obj;
>
> MemoryRegion iomem;
> + SDBus sdbus;
> SDState *card;
Shouludn't card be removed?
Alistair
> uint32_t clock;
> uint32_t power;
> @@ -179,7 +180,7 @@ static void pl181_send_command(PL181State *s)
> request.cmd = s->cmd & PL181_CMD_INDEX;
> request.arg = s->cmdarg;
> DPRINTF("Command %d %08x\n", request.cmd, request.arg);
> - rlen = sd_do_command(s->card, &request, response);
> + rlen = sdbus_do_command(&s->sdbus, &request, response);
> if (rlen < 0)
> goto error;
> if (s->cmd & PL181_CMD_RESPONSE) {
> @@ -223,12 +224,12 @@ static void pl181_fifo_run(PL181State *s)
> int is_read;
>
> is_read = (s->datactrl & PL181_DATA_DIRECTION) != 0;
> - if (s->datacnt != 0 && (!is_read || sd_data_ready(s->card))
> + if (s->datacnt != 0 && (!is_read || sdbus_data_ready(&s->sdbus))
> && !s->linux_hack) {
> if (is_read) {
> n = 0;
> while (s->datacnt && s->fifo_len < PL181_FIFO_LEN) {
> - value |= (uint32_t)sd_read_data(s->card) << (n * 8);
> + value |= (uint32_t)sdbus_read_data(&s->sdbus) << (n * 8);
> s->datacnt--;
> n++;
> if (n == 4) {
> @@ -249,7 +250,7 @@ static void pl181_fifo_run(PL181State *s)
> }
> n--;
> s->datacnt--;
> - sd_write_data(s->card, value & 0xff);
> + sdbus_write_data(&s->sdbus, value & 0xff);
> value >>= 8;
> }
> }
> @@ -480,10 +481,6 @@ static void pl181_reset(DeviceState *d)
>
> /* We can assume our GPIO outputs have been wired up now */
> sd_set_cb(s->card, s->cardstatus[0], s->cardstatus[1]);
> - /* Since we're still using the legacy SD API the card is not plugged
> - * into any bus, and we must reset it manually.
> - */
> - device_reset(DEVICE(s->card));
> }
>
> static void pl181_init(Object *obj)
> @@ -502,14 +499,26 @@ static void pl181_init(Object *obj)
> static void pl181_realize(DeviceState *dev, Error **errp)
> {
> PL181State *s = PL181(dev);
> + DeviceState *carddev;
> DriveInfo *dinfo;
> + Error *err = NULL;
> +
> + qbus_create_inplace(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS,
> + dev, "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);
> - s->card = sd_init(dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, false);
> - if (s->card == NULL) {
> - error_setg(errp, "sd_init failed");
> + carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
> + if (dinfo) {
> + qdev_prop_set_drive(carddev, "drive", blk_by_legacy_dinfo(dinfo), &err);
> + }
> + object_property_set_bool(OBJECT(carddev), true, "realized", &err);
> + if (err) {
> + error_setg(errp, "failed to init SD card: %s", error_get_pretty(err));
> + return;
> }
> + s->card = SD_CARD(carddev);
> }
>
> static void pl181_class_init(ObjectClass *klass, void *data)
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 5/6] hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 5/6] hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus Philippe Mathieu-Daudé
@ 2018-01-31 16:42 ` Alistair Francis
0 siblings, 0 replies; 21+ messages in thread
From: Alistair Francis @ 2018-01-31 16:42 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Peter Maydell, Michael Walle,
Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers
On Mon, Jan 22, 2018 at 7:58 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> On reset the bus will reset the card,
> we can now drop the device_reset() call.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
Alistair
> ---
> hw/sd/ssi-sd.c | 32 +++++++++++++++++++-------------
> 1 file changed, 19 insertions(+), 13 deletions(-)
>
> diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
> index f88f509e0a..ae04b6641b 100644
> --- a/hw/sd/ssi-sd.c
> +++ b/hw/sd/ssi-sd.c
> @@ -47,7 +47,7 @@ typedef struct {
> int32_t arglen;
> int32_t response_pos;
> int32_t stopping;
> - SDState *sd;
> + SDBus sdbus;
> } ssi_sd_state;
>
> #define TYPE_SSI_SD "ssi-sd"
> @@ -100,7 +100,7 @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
> request.arg = (s->cmdarg[0] << 24) | (s->cmdarg[1] << 16)
> | (s->cmdarg[2] << 8) | s->cmdarg[3];
> DPRINTF("CMD%d arg 0x%08x\n", s->cmd, request.arg);
> - s->arglen = sd_do_command(s->sd, &request, longresp);
> + s->arglen = sdbus_do_command(&s->sdbus, &request, longresp);
> if (s->arglen <= 0) {
> s->arglen = 1;
> s->response[0] = 4;
> @@ -177,7 +177,7 @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
> DPRINTF("Response 0x%02x\n", s->response[s->response_pos]);
> return s->response[s->response_pos++];
> }
> - if (sd_data_ready(s->sd)) {
> + if (sdbus_data_ready(&s->sdbus)) {
> DPRINTF("Data read\n");
> s->mode = SSI_SD_DATA_START;
> } else {
> @@ -190,8 +190,8 @@ static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
> s->mode = SSI_SD_DATA_READ;
> return 0xfe;
> case SSI_SD_DATA_READ:
> - val = sd_read_data(s->sd);
> - if (!sd_data_ready(s->sd)) {
> + val = sdbus_read_data(&s->sdbus);
> + if (!sdbus_data_ready(&s->sdbus)) {
> DPRINTF("Data read end\n");
> s->mode = SSI_SD_CMD;
> }
> @@ -242,13 +242,24 @@ static const VMStateDescription vmstate_ssi_sd = {
> static void ssi_sd_realize(SSISlave *d, Error **errp)
> {
> ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, d);
> + DeviceState *carddev;
> DriveInfo *dinfo;
> + Error *err = NULL;
>
> + qbus_create_inplace(&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);
> - s->sd = sd_init(dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, true);
> - if (s->sd == NULL) {
> - error_setg(errp, "Device initialization failed.");
> + carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
> + if (dinfo) {
> + qdev_prop_set_drive(carddev, "drive", blk_by_legacy_dinfo(dinfo), &err);
> + }
> + object_property_set_bool(OBJECT(carddev), true, "spi", &err);
> + object_property_set_bool(OBJECT(carddev), true, "realized", &err);
> + if (err) {
> + error_setg(errp, "failed to init SD card: %s", error_get_pretty(err));
> return;
> }
> }
> @@ -264,11 +275,6 @@ static void ssi_sd_reset(DeviceState *dev)
> s->arglen = 0;
> s->response_pos = 0;
> s->stopping = 0;
> -
> - /* Since we're still using the legacy SD API the card is not plugged
> - * into any bus, and we must reset it manually.
> - */
> - device_reset(DEVICE(s->sd));
> }
>
> static void ssi_sd_class_init(ObjectClass *klass, void *data)
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 6/6] hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h"
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 6/6] hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h" Philippe Mathieu-Daudé
@ 2018-01-31 16:43 ` Alistair Francis
0 siblings, 0 replies; 21+ messages in thread
From: Alistair Francis @ 2018-01-31 16:43 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Peter Maydell, Michael Walle,
Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers, open list:ARM PrimeCell and...
On Mon, Jan 22, 2018 at 7:58 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> roughly 2 users left.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
Alistair
> ---
> include/hw/sd/sd.h | 17 ---------------
> include/hw/sd/sdcard_legacy.h | 51 +++++++++++++++++++++++++++++++++++++++++++
> hw/sd/omap_mmc.c | 2 +-
> hw/sd/pl181.c | 1 +
> hw/sd/sd.c | 1 +
> 5 files changed, 54 insertions(+), 18 deletions(-)
> create mode 100644 include/hw/sd/sdcard_legacy.h
>
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index 9bdb3c9285..74bfab9386 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -130,23 +130,6 @@ typedef struct {
> void (*set_readonly)(DeviceState *dev, bool readonly);
> } SDBusClass;
>
> -/* Legacy functions to be used only by non-qdevified callers */
> -SDState *sd_init(BlockBackend *bs, bool is_spi);
> -int sd_do_command(SDState *sd, SDRequest *req,
> - uint8_t *response);
> -void sd_write_data(SDState *sd, uint8_t value);
> -uint8_t sd_read_data(SDState *sd);
> -void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert);
> -bool sd_data_ready(SDState *sd);
> -/* sd_enable should not be used -- it is only used on the nseries boards,
> - * where it is part of a broken implementation of the MMC card slot switch
> - * (there should be two card slots which are multiplexed to a single MMC
> - * controller, but instead we model it with one card and controller and
> - * disable the card when the second slot is selected, so it looks like the
> - * second slot is always empty).
> - */
> -void sd_enable(SDState *sd, bool enable);
> -
> /* Functions to be used by qdevified callers (working via
> * an SDBus rather than directly with SDState)
> */
> diff --git a/include/hw/sd/sdcard_legacy.h b/include/hw/sd/sdcard_legacy.h
> new file mode 100644
> index 0000000000..882e13a8f1
> --- /dev/null
> +++ b/include/hw/sd/sdcard_legacy.h
> @@ -0,0 +1,51 @@
> +/*
> + * SD Memory Card emulation (deprecated legacy API)
> + *
> + * Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + *
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in
> + * the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
> + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
> + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
> + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
> + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
> + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
> + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +#ifndef HW_SDCARD_LEGACY_H
> +#define HW_SDCARD_LEGACY_H
> +
> +#include "hw/sd/sd.h"
> +
> +/* Legacy functions to be used only by non-qdevified callers */
> +SDState *sd_init(BlockBackend *blk, bool is_spi);
> +int sd_do_command(SDState *card, SDRequest *request, uint8_t *response);
> +void sd_write_data(SDState *card, uint8_t value);
> +uint8_t sd_read_data(SDState *card);
> +void sd_set_cb(SDState *card, qemu_irq readonly, qemu_irq insert);
> +bool sd_data_ready(SDState *card);
> +
> +/* sd_enable should not be used -- it is only used on the nseries boards,
> + * where it is part of a broken implementation of the MMC card slot switch
> + * (there should be two card slots which are multiplexed to a single MMC
> + * controller, but instead we model it with one card and controller and
> + * disable the card when the second slot is selected, so it looks like the
> + * second slot is always empty).
> + */
> +void sd_enable(SDState *card, bool enable);
> +
> +#endif /* HW_SDCARD_LEGACY_H */
> diff --git a/hw/sd/omap_mmc.c b/hw/sd/omap_mmc.c
> index 5b47cadf11..be14ac4f40 100644
> --- a/hw/sd/omap_mmc.c
> +++ b/hw/sd/omap_mmc.c
> @@ -19,7 +19,7 @@
> #include "qemu/osdep.h"
> #include "hw/hw.h"
> #include "hw/arm/omap.h"
> -#include "hw/sd/sd.h"
> +#include "hw/sd/sdcard_legacy.h"
>
> struct omap_mmc_s {
> qemu_irq irq;
> diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
> index ce696c5d7d..7591d016cd 100644
> --- a/hw/sd/pl181.c
> +++ b/hw/sd/pl181.c
> @@ -12,6 +12,7 @@
> #include "sysemu/blockdev.h"
> #include "hw/sysbus.h"
> #include "hw/sd/sd.h"
> +#include "hw/sd/sdcard_legacy.h"
> #include "qemu/log.h"
> #include "qapi/error.h"
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 9880a5d090..6942aa4df3 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -35,6 +35,7 @@
> #include "hw/registerfields.h"
> #include "sysemu/block-backend.h"
> #include "hw/sd/sd.h"
> +#include "hw/sd/sdcard_legacy.h"
> #include "qapi/error.h"
> #include "qemu/bitmap.h"
> #include "qemu/cutils.h"
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/6] hw/sd/milkymist-memcard: use qemu_log_mask()
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 1/6] hw/sd/milkymist-memcard: use qemu_log_mask() Philippe Mathieu-Daudé
2018-01-31 16:29 ` Alistair Francis
@ 2018-02-01 9:07 ` Michael Walle
1 sibling, 0 replies; 21+ messages in thread
From: Michael Walle @ 2018-02-01 9:07 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Peter Maydell, qemu-devel, Andrzej Zaborowski,
Edgar E . Iglesias, Stefan Weil, Philippe Mathieu-Daudé
Am 2018-01-23 04:58, schrieb Philippe Mathieu-Daudé:
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Acked-by: Michael Walle <michael@walle.cc>
> ---
> hw/sd/milkymist-memcard.c | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
> index 341da88552..1292c0c099 100644
> --- a/hw/sd/milkymist-memcard.c
> +++ b/hw/sd/milkymist-memcard.c
> @@ -22,11 +22,12 @@
> */
>
> #include "qemu/osdep.h"
> +#include "qemu/log.h"
> #include "hw/hw.h"
> #include "hw/sysbus.h"
> #include "sysemu/sysemu.h"
> #include "trace.h"
> -#include "qemu/error-report.h"
> +#include "include/qapi/error.h"
> #include "sysemu/block-backend.h"
> #include "sysemu/blockdev.h"
> #include "hw/sd/sd.h"
> @@ -138,8 +139,8 @@ static uint64_t memcard_read(void *opaque, hwaddr
> addr,
> } else {
> r = s->response[s->response_read_ptr++];
> if (s->response_read_ptr > s->response_len) {
> - error_report("milkymist_memcard: "
> - "read more cmd bytes than available.
> Clipping.");
> + qemu_log_mask(LOG_GUEST_ERROR, "milkymist_memcard: "
> + "read more cmd bytes than available.
> Clipping.");
> s->response_read_ptr = 0;
> }
> }
> @@ -163,8 +164,9 @@ static uint64_t memcard_read(void *opaque, hwaddr
> addr,
> break;
>
> default:
> - error_report("milkymist_memcard: read access to unknown
> register 0x"
> - TARGET_FMT_plx, addr << 2);
> + qemu_log_mask(LOG_UNIMP, "milkymist_memcard: "
> + "read access to unknown register 0x%"
> HWADDR_PRIx "\n",
> + addr << 2);
> break;
> }
>
> @@ -220,8 +222,9 @@ static void memcard_write(void *opaque, hwaddr
> addr, uint64_t value,
> break;
>
> default:
> - error_report("milkymist_memcard: write access to unknown
> register 0x"
> - TARGET_FMT_plx, addr << 2);
> + qemu_log_mask(LOG_UNIMP, "milkymist_memcard: "
> + "write access to unknown register 0x%"
> HWADDR_PRIx " "
> + "(value 0x%" PRIx64 ")\n", addr << 2, value);
> break;
> }
> }
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 2/6] hw/sd/milkymist-memcard: split realize() out of SysBusDevice init()
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 2/6] hw/sd/milkymist-memcard: split realize() out of SysBusDevice init() Philippe Mathieu-Daudé
2018-01-31 16:30 ` Alistair Francis
@ 2018-02-01 9:07 ` Michael Walle
1 sibling, 0 replies; 21+ messages in thread
From: Michael Walle @ 2018-02-01 9:07 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Peter Maydell, qemu-devel, Andrzej Zaborowski,
Edgar E . Iglesias, Stefan Weil, Philippe Mathieu-Daudé
Am 2018-01-23 04:58, schrieb Philippe Mathieu-Daudé:
> Create the SDCard in the realize() function.
>
> Suggested-by: Michael Walle <michael@walle.cc>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Acked-by: Michael Walle <michael@walle.cc>
> ---
> hw/sd/milkymist-memcard.c | 28 ++++++++++++++++------------
> 1 file changed, 16 insertions(+), 12 deletions(-)
>
> diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
> index 1292c0c099..a8e65892c7 100644
> --- a/hw/sd/milkymist-memcard.c
> +++ b/hw/sd/milkymist-memcard.c
> @@ -257,27 +257,31 @@ static void milkymist_memcard_reset(DeviceState
> *d)
> device_reset(DEVICE(s->card));
> }
>
> -static int milkymist_memcard_init(SysBusDevice *dev)
> +static void milkymist_memcard_init(Object *obj)
> +{
> + MilkymistMemcardState *s = MILKYMIST_MEMCARD(obj);
> + SysBusDevice *dev = SYS_BUS_DEVICE(obj);
> +
> + memory_region_init_io(&s->regs_region, OBJECT(s),
> &memcard_mmio_ops, s,
> + "milkymist-memcard", R_MAX * 4);
> + sysbus_init_mmio(dev, &s->regs_region);
> +}
> +
> +static void milkymist_memcard_realize(DeviceState *dev, Error **errp)
> {
> MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
> - DriveInfo *dinfo;
> BlockBackend *blk;
> + DriveInfo *dinfo;
>
> /* FIXME use a qdev drive property instead of drive_get_next() */
> dinfo = drive_get_next(IF_SD);
> blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
> s->card = sd_init(blk, false);
> if (s->card == NULL) {
> - return -1;
> + error_setg(errp, "failed to init SD card");
> + return;
> }
> -
> s->enabled = blk && blk_is_inserted(blk);
> -
> - memory_region_init_io(&s->regs_region, OBJECT(s),
> &memcard_mmio_ops, s,
> - "milkymist-memcard", R_MAX * 4);
> - sysbus_init_mmio(dev, &s->regs_region);
> -
> - return 0;
> }
>
> static const VMStateDescription vmstate_milkymist_memcard = {
> @@ -300,9 +304,8 @@ static const VMStateDescription
> vmstate_milkymist_memcard = {
> static void milkymist_memcard_class_init(ObjectClass *klass, void
> *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
> - SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
>
> - k->init = milkymist_memcard_init;
> + dc->realize = milkymist_memcard_realize;
> dc->reset = milkymist_memcard_reset;
> dc->vmsd = &vmstate_milkymist_memcard;
> /* Reason: init() method uses drive_get_next() */
> @@ -313,6 +316,7 @@ static const TypeInfo milkymist_memcard_info = {
> .name = TYPE_MILKYMIST_MEMCARD,
> .parent = TYPE_SYS_BUS_DEVICE,
> .instance_size = sizeof(MilkymistMemcardState),
> + .instance_init = milkymist_memcard_init,
> .class_init = milkymist_memcard_class_init,
> };
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 3/6] hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 3/6] hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it Philippe Mathieu-Daudé
2018-01-31 16:31 ` Alistair Francis
@ 2018-02-01 9:08 ` Michael Walle
1 sibling, 0 replies; 21+ messages in thread
From: Michael Walle @ 2018-02-01 9:08 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Peter Maydell, qemu-devel, Andrzej Zaborowski,
Edgar E . Iglesias, Stefan Weil, Philippe Mathieu-Daudé
Am 2018-01-23 04:58, schrieb Philippe Mathieu-Daudé:
> using the sdbus_*() API.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Acked-by: Michael Walle <michael@walle.cc>
> ---
> hw/sd/milkymist-memcard.c | 38 +++++++++++++++++++++-----------------
> 1 file changed, 21 insertions(+), 17 deletions(-)
>
> diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
> index a8e65892c7..5570c1e9a0 100644
> --- a/hw/sd/milkymist-memcard.c
> +++ b/hw/sd/milkymist-memcard.c
> @@ -69,7 +69,7 @@ struct MilkymistMemcardState {
> SysBusDevice parent_obj;
>
> MemoryRegion regs_region;
> - SDState *card;
> + SDBus sdbus;
>
> int command_write_ptr;
> int response_read_ptr;
> @@ -105,7 +105,7 @@ static void
> memcard_sd_command(MilkymistMemcardState *s)
> req.crc = s->command[5];
>
> s->response[0] = req.cmd;
> - s->response_len = sd_do_command(s->card, &req, s->response+1);
> + s->response_len = sdbus_do_command(&s->sdbus, &req, s->response +
> 1);
> s->response_read_ptr = 0;
>
> if (s->response_len == 16) {
> @@ -150,10 +150,10 @@ static uint64_t memcard_read(void *opaque, hwaddr
> addr,
> r = 0xffffffff;
> } else {
> r = 0;
> - r |= sd_read_data(s->card) << 24;
> - r |= sd_read_data(s->card) << 16;
> - r |= sd_read_data(s->card) << 8;
> - r |= sd_read_data(s->card);
> + r |= sdbus_read_data(&s->sdbus) << 24;
> + r |= sdbus_read_data(&s->sdbus) << 16;
> + r |= sdbus_read_data(&s->sdbus) << 8;
> + r |= sdbus_read_data(&s->sdbus);
> }
> break;
> case R_CLK2XDIV:
> @@ -207,10 +207,10 @@ static void memcard_write(void *opaque, hwaddr
> addr, uint64_t value,
> if (!s->enabled) {
> break;
> }
> - sd_write_data(s->card, (value >> 24) & 0xff);
> - sd_write_data(s->card, (value >> 16) & 0xff);
> - sd_write_data(s->card, (value >> 8) & 0xff);
> - sd_write_data(s->card, value & 0xff);
> + sdbus_write_data(&s->sdbus, (value >> 24) & 0xff);
> + sdbus_write_data(&s->sdbus, (value >> 16) & 0xff);
> + sdbus_write_data(&s->sdbus, (value >> 8) & 0xff);
> + sdbus_write_data(&s->sdbus, value & 0xff);
> break;
> case R_ENABLE:
> s->regs[addr] = value;
> @@ -251,10 +251,6 @@ static void milkymist_memcard_reset(DeviceState
> *d)
> for (i = 0; i < R_MAX; i++) {
> s->regs[i] = 0;
> }
> - /* Since we're still using the legacy SD API the card is not
> plugged
> - * into any bus, and we must reset it manually.
> - */
> - device_reset(DEVICE(s->card));
> }
>
> static void milkymist_memcard_init(Object *obj)
> @@ -270,15 +266,23 @@ static void milkymist_memcard_init(Object *obj)
> static void milkymist_memcard_realize(DeviceState *dev, Error **errp)
> {
> MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
> + DeviceState *carddev;
> BlockBackend *blk;
> DriveInfo *dinfo;
> + Error *err = NULL;
>
> + qbus_create_inplace(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS,
> + dev, "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);
> blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
> - s->card = sd_init(blk, false);
> - if (s->card == NULL) {
> - error_setg(errp, "failed to init SD card");
> + carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
> + qdev_prop_set_drive(carddev, "drive", blk, &err);
> + object_property_set_bool(OBJECT(carddev), true, "realized", &err);
> + if (err) {
> + error_setg(errp, "failed to init SD card: %s",
> error_get_pretty(err));
> return;
> }
> s->enabled = blk && blk_is_inserted(blk);
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: expose a SDBus and connect the SDCard to it
2018-01-31 16:41 ` Alistair Francis
@ 2018-02-06 12:43 ` Philippe Mathieu-Daudé
2018-02-06 13:06 ` Peter Maydell
0 siblings, 1 reply; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-02-06 12:43 UTC (permalink / raw)
To: Alistair Francis, Peter Maydell
Cc: Michael Walle, Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers, open list:ARM PrimeCell and...
Hi Alistair,
On 01/31/2018 01:41 PM, Alistair Francis wrote:
> On Mon, Jan 22, 2018 at 7:58 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>> using the sdbus_*() API.
>>
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>> hw/sd/pl181.c | 31 ++++++++++++++++++++-----------
>> 1 file changed, 20 insertions(+), 11 deletions(-)
>>
>> diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
>> index 3ba1f7dd23..ce696c5d7d 100644
>> --- a/hw/sd/pl181.c
>> +++ b/hw/sd/pl181.c
>> @@ -33,6 +33,7 @@ typedef struct PL181State {
>> SysBusDevice parent_obj;
>>
>> MemoryRegion iomem;
>> + SDBus sdbus;
>> SDState *card;
>
> Shouludn't card be removed?
Not yet :( It is still used by sd_set_cb() in pl181_reset().
In my first approach [1] I added the SDBus SLAVE/MASTER interfaces and
the cards inserted/readonly signals were only accessible by the bus, not
the HCI, leaving the SDCard objects only pluggable to SDBus (removing
the sdbus_reparent_card() need). But since it was out of scope for the
UHS cards goal, I kept it for later.
[1]
http://lists.nongnu.org/archive/html/qemu-devel/2017-12/msg02318.html
>
> Alistair
>
>> uint32_t clock;
>> uint32_t power;
>> @@ -179,7 +180,7 @@ static void pl181_send_command(PL181State *s)
>> request.cmd = s->cmd & PL181_CMD_INDEX;
>> request.arg = s->cmdarg;
>> DPRINTF("Command %d %08x\n", request.cmd, request.arg);
>> - rlen = sd_do_command(s->card, &request, response);
>> + rlen = sdbus_do_command(&s->sdbus, &request, response);
>> if (rlen < 0)
>> goto error;
>> if (s->cmd & PL181_CMD_RESPONSE) {
>> @@ -223,12 +224,12 @@ static void pl181_fifo_run(PL181State *s)
>> int is_read;
>>
>> is_read = (s->datactrl & PL181_DATA_DIRECTION) != 0;
>> - if (s->datacnt != 0 && (!is_read || sd_data_ready(s->card))
>> + if (s->datacnt != 0 && (!is_read || sdbus_data_ready(&s->sdbus))
>> && !s->linux_hack) {
>> if (is_read) {
>> n = 0;
>> while (s->datacnt && s->fifo_len < PL181_FIFO_LEN) {
>> - value |= (uint32_t)sd_read_data(s->card) << (n * 8);
>> + value |= (uint32_t)sdbus_read_data(&s->sdbus) << (n * 8);
>> s->datacnt--;
>> n++;
>> if (n == 4) {
>> @@ -249,7 +250,7 @@ static void pl181_fifo_run(PL181State *s)
>> }
>> n--;
>> s->datacnt--;
>> - sd_write_data(s->card, value & 0xff);
>> + sdbus_write_data(&s->sdbus, value & 0xff);
>> value >>= 8;
>> }
>> }
>> @@ -480,10 +481,6 @@ static void pl181_reset(DeviceState *d)
>>
>> /* We can assume our GPIO outputs have been wired up now */
>> sd_set_cb(s->card, s->cardstatus[0], s->cardstatus[1]);
>> - /* Since we're still using the legacy SD API the card is not plugged
>> - * into any bus, and we must reset it manually.
>> - */
>> - device_reset(DEVICE(s->card));
>> }
>>
>> static void pl181_init(Object *obj)
>> @@ -502,14 +499,26 @@ static void pl181_init(Object *obj)
>> static void pl181_realize(DeviceState *dev, Error **errp)
>> {
>> PL181State *s = PL181(dev);
>> + DeviceState *carddev;
>> DriveInfo *dinfo;
>> + Error *err = NULL;
>> +
>> + qbus_create_inplace(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS,
>> + dev, "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);
>> - s->card = sd_init(dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, false);
>> - if (s->card == NULL) {
>> - error_setg(errp, "sd_init failed");
>> + carddev = qdev_create(&s->sdbus.qbus, TYPE_SD_CARD);
>> + if (dinfo) {
>> + qdev_prop_set_drive(carddev, "drive", blk_by_legacy_dinfo(dinfo), &err);
>> + }
>> + object_property_set_bool(OBJECT(carddev), true, "realized", &err);
>> + if (err) {
>> + error_setg(errp, "failed to init SD card: %s", error_get_pretty(err));
>> + return;
>> }
>> + s->card = SD_CARD(carddev);
>> }
>>
>> static void pl181_class_init(ObjectClass *klass, void *data)
>> --
>> 2.15.1
>>
>>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: expose a SDBus and connect the SDCard to it
2018-02-06 12:43 ` Philippe Mathieu-Daudé
@ 2018-02-06 13:06 ` Peter Maydell
2018-02-06 13:53 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 21+ messages in thread
From: Peter Maydell @ 2018-02-06 13:06 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Michael Walle, Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers, open list:ARM PrimeCell and...
On 6 February 2018 at 12:43, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Hi Alistair,
>
> On 01/31/2018 01:41 PM, Alistair Francis wrote:
>> On Mon, Jan 22, 2018 at 7:58 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>>> using the sdbus_*() API.
>>>
>>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>> ---
>>> hw/sd/pl181.c | 31 ++++++++++++++++++++-----------
>>> 1 file changed, 20 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
>>> index 3ba1f7dd23..ce696c5d7d 100644
>>> --- a/hw/sd/pl181.c
>>> +++ b/hw/sd/pl181.c
>>> @@ -33,6 +33,7 @@ typedef struct PL181State {
>>> SysBusDevice parent_obj;
>>>
>>> MemoryRegion iomem;
>>> + SDBus sdbus;
>>> SDState *card;
>>
>> Shouludn't card be removed?
>
> Not yet :( It is still used by sd_set_cb() in pl181_reset().
I think you have to change that sd_set_cb() code now.
If you look at sd_cardchange() it uses "is this SD card
object on an SDBus" to determine whether to notify the
controller via the old-API IRQ lines, or using the
set_inserted() and set_readonly() callbacks on the SDBusClass.
> In my first approach [1] I added the SDBus SLAVE/MASTER interfaces and
> the cards inserted/readonly signals were only accessible by the bus, not
> the HCI, leaving the SDCard objects only pluggable to SDBus (removing
> the sdbus_reparent_card() need). But since it was out of scope for the
> UHS cards goal, I kept it for later.
How do you manage to get rid of sdbus_reparent_card()? Raspi
needs it for its weirdo multiplexed SD controller setup, and
AFAIK we don't have a way to say "this thing is hotpluggable
but not by the user" yet...
PS: have you checked that these sd card refactorings don't
accidentally break the monitor "change" and "eject" commands
operating on SD cards ? (They are a bit weird because they
affect which backing file is attached to the SD card object,
rather than actually deleting and recreating the SD card
object.)
thanks
-- PMM
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: expose a SDBus and connect the SDCard to it
2018-02-06 13:06 ` Peter Maydell
@ 2018-02-06 13:53 ` Philippe Mathieu-Daudé
2018-02-06 13:59 ` Peter Maydell
0 siblings, 1 reply; 21+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-02-06 13:53 UTC (permalink / raw)
To: Peter Maydell
Cc: Alistair Francis, Michael Walle, Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers, open list:ARM PrimeCell and...
Hi Peter,
On 02/06/2018 10:06 AM, Peter Maydell wrote:
> On 6 February 2018 at 12:43, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>> Hi Alistair,
>>
>> On 01/31/2018 01:41 PM, Alistair Francis wrote:
>>> On Mon, Jan 22, 2018 at 7:58 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>>>> using the sdbus_*() API.
>>>>
>>>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>>> ---
>>>> hw/sd/pl181.c | 31 ++++++++++++++++++++-----------
>>>> 1 file changed, 20 insertions(+), 11 deletions(-)
>>>>
>>>> diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
>>>> index 3ba1f7dd23..ce696c5d7d 100644
>>>> --- a/hw/sd/pl181.c
>>>> +++ b/hw/sd/pl181.c
>>>> @@ -33,6 +33,7 @@ typedef struct PL181State {
>>>> SysBusDevice parent_obj;
>>>>
>>>> MemoryRegion iomem;
>>>> + SDBus sdbus;
>>>> SDState *card;
>>>
>>> Shouludn't card be removed?
>>
>> Not yet :( It is still used by sd_set_cb() in pl181_reset().
>
> I think you have to change that sd_set_cb() code now.
> If you look at sd_cardchange() it uses "is this SD card
> object on an SDBus" to determine whether to notify the
> controller via the old-API IRQ lines, or using the
> set_inserted() and set_readonly() callbacks on the SDBusClass.
Oh, this can get simplified, cool!
>> In my first approach [1] I added the SDBus SLAVE/MASTER interfaces and
>> the cards inserted/readonly signals were only accessible by the bus, not
>> the HCI, leaving the SDCard objects only pluggable to SDBus (removing
>> the sdbus_reparent_card() need). But since it was out of scope for the
>> UHS cards goal, I kept it for later.
>
> How do you manage to get rid of sdbus_reparent_card()? Raspi
> needs it for its weirdo multiplexed SD controller setup, and
> AFAIK we don't have a way to say "this thing is hotpluggable
> but not by the user" yet...
The card is hotpluggable, the bus isn't.
An unique SDBus is created in the bcm2835_peripherals object (model
closer than hardware), sdhci/sdhost/gpio controllers use it via property
links.
What I don't do is checking the gpio selector (sd_fsel), hoping the
guest isn't nasty enough to use both SD controllers at once...
> PS: have you checked that these sd card refactorings don't
> accidentally break the monitor "change" and "eject" commands
> operating on SD cards ? (They are a bit weird because they
> affect which backing file is attached to the SD card object,
> rather than actually deleting and recreating the SD card
> object.)
Nop, but I can now add a qtest for this :)
Regards,
Phil.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: expose a SDBus and connect the SDCard to it
2018-02-06 13:53 ` Philippe Mathieu-Daudé
@ 2018-02-06 13:59 ` Peter Maydell
0 siblings, 0 replies; 21+ messages in thread
From: Peter Maydell @ 2018-02-06 13:59 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Michael Walle, Edgar E . Iglesias, Stefan Weil,
qemu-devel@nongnu.org Developers, open list:ARM PrimeCell and...
On 6 February 2018 at 13:53, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> On 02/06/2018 10:06 AM, Peter Maydell wrote:
>> How do you manage to get rid of sdbus_reparent_card()? Raspi
>> needs it for its weirdo multiplexed SD controller setup, and
>> AFAIK we don't have a way to say "this thing is hotpluggable
>> but not by the user" yet...
>
> The card is hotpluggable, the bus isn't.
>
> An unique SDBus is created in the bcm2835_peripherals object (model
> closer than hardware), sdhci/sdhost/gpio controllers use it via property
> links.
> What I don't do is checking the gpio selector (sd_fsel), hoping the
> guest isn't nasty enough to use both SD controllers at once...
We do need to honour the sd_fsel -- otherwise newer Linux rpi
kernels don't boot, because they want to use the non-default
SD controller and they select it accordingly. At the moment
this works using sdbus_reparent_card(). (I do vaguely recall
looking at whether this could be done using hotplug but I
forget why I decided it was a bad idea.)
thanks
-- PMM
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2018-02-06 13:59 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-23 3:58 [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 1/6] hw/sd/milkymist-memcard: use qemu_log_mask() Philippe Mathieu-Daudé
2018-01-31 16:29 ` Alistair Francis
2018-02-01 9:07 ` Michael Walle
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 2/6] hw/sd/milkymist-memcard: split realize() out of SysBusDevice init() Philippe Mathieu-Daudé
2018-01-31 16:30 ` Alistair Francis
2018-02-01 9:07 ` Michael Walle
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 3/6] hw/sd/milkymist-memcard: expose a SDBus and connect the SDCard to it Philippe Mathieu-Daudé
2018-01-31 16:31 ` Alistair Francis
2018-02-01 9:08 ` Michael Walle
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 4/6] hw/sd/pl181: " Philippe Mathieu-Daudé
2018-01-31 16:41 ` Alistair Francis
2018-02-06 12:43 ` Philippe Mathieu-Daudé
2018-02-06 13:06 ` Peter Maydell
2018-02-06 13:53 ` Philippe Mathieu-Daudé
2018-02-06 13:59 ` Peter Maydell
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 5/6] hw/sd/ssi-sd: use the SDBus API, connect the SDCard to the bus Philippe Mathieu-Daudé
2018-01-31 16:42 ` Alistair Francis
2018-01-23 3:58 ` [Qemu-devel] [PATCH v2 6/6] hw/sd: move sdcard legacy API to "hw/sd/sdcard_legacy.h" Philippe Mathieu-Daudé
2018-01-31 16:43 ` Alistair Francis
2018-01-31 14:05 ` [Qemu-devel] [PATCH v2 0/6] SDHCI: convert legacy devices to the SDBus API (part 6) Philippe Mathieu-Daudé
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.