* [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping
@ 2017-12-13 20:44 Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [RFC PATCH 01/11] util/cutils: add qemu_hexbuf_strdup(), yet another hexdump() Philippe Mathieu-Daudé
` (10 more replies)
0 siblings, 11 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Marc-André Lureau, Igor Mammedov,
Eduardo Habkost
Cc: Philippe Mathieu-Daudé, qemu-devel, qemu-arm,
Peter Crosthwaite, Sai Pavan Boddu
Hi,
This series also refactor the SDBus codebase to ease further development/series.
- 1: we add another hexbuf_strdup() helper, hoping someone will come with a
clever way to do the same :)
- 2,4,5: add a sdbus_create_bus(master) and sdbus_create_slave(bus) to use
instead of the current qbus_create_inplace(),
- 3: we add some trace events which will result useful later,
- 6-10: we use the TYPE_INTERFACE to enforce a stricter QOM, this also allow us
to remove duplicate types,
- 11: we let the Xilinx Zynq machine set the "sd-bus-name" property, so now a
slave SDCard can be now hot-plugged in the second bus.
In a later series we will update the PL181 and BCM2835 devices, having them
implement the TYPE_SD_BUS_MASTER_INTERFACE.
Regards,
Phil.
Based-on: 20171213195852.30439-15-f4bug@amsat.org
(SDHCI housekeeping)
Philippe Mathieu-Daudé (11):
util/cutils: add qemu_hexbuf_strdup(), yet another hexdump()
bcm2835_peripherals: move GPIO 'sdbus' property link from init() ->
realize()
sdbus: add trace events
sdbus: add sdbus_create_bus() to replace qbus_create_inplace()
sdbus: add sdbus_create_slave()
sdbus: rename SDCardClass -> SDSlaveClass
sdbus: add a SD_BUS_SLAVE interface
sdbus: add a SD_BUS_MASTER interface
sdhci: implement the SD_BUS_MASTER interface
hw/sd/pxa2xx: implement the SD_BUS_MASTER interface
hw/arm/xilinx_zynq: use sdbus_create_slave() to name the different SD
busses
include/hw/sd/sd.h | 3 ++
include/hw/sd/sdhci.h | 3 +-
include/qemu/cutils.h | 3 ++
hw/sd/sd-internal.h | 14 ++++++---
hw/arm/bcm2835_peripherals.c | 9 +++---
hw/arm/xilinx_zynq.c | 9 ++++--
hw/sd/core.c | 74 +++++++++++++++++++++++++++++++++++++-------
hw/sd/pxa2xx_mmci.c | 36 +++++++--------------
hw/sd/sd.c | 8 +++--
hw/sd/sdhci.c | 66 +++++++++++++++++----------------------
util/hexdump.c | 19 ++++++++++++
hw/sd/trace-events | 6 ++++
12 files changed, 162 insertions(+), 88 deletions(-)
--
2.15.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC PATCH 01/11] util/cutils: add qemu_hexbuf_strdup(), yet another hexdump()
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 02/11] bcm2835_peripherals: move GPIO 'sdbus' property link from init() -> realize() Philippe Mathieu-Daudé
` (9 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Isaac Lozano, Thomas Huth,
Markus Armbruster, Marc-André Lureau, Eduardo Habkost
Cc: Philippe Mathieu-Daudé, qemu-devel
This will be helpful for tracing() API.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
"yet", so probably duplicating a better way to do it :|
include/qemu/cutils.h | 3 +++
util/hexdump.c | 19 +++++++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h
index f0878eaafa..2966cd5d64 100644
--- a/include/qemu/cutils.h
+++ b/include/qemu/cutils.h
@@ -164,4 +164,7 @@ bool test_buffer_is_zero_next_accel(void);
int uleb128_encode_small(uint8_t *out, uint32_t n);
int uleb128_decode_small(const uint8_t *in, uint32_t *n);
+char *qemu_hexbuf_strdup(const void *buf, size_t size,
+ const char *str_hdr, const char *desc_if_empty);
+
#endif
diff --git a/util/hexdump.c b/util/hexdump.c
index f879ff0ad6..cabf33b2b8 100644
--- a/util/hexdump.c
+++ b/util/hexdump.c
@@ -15,6 +15,7 @@
#include "qemu/osdep.h"
#include "qemu-common.h"
+#include "qemu/cutils.h"
void qemu_hexdump(const char *buf, FILE *fp, const char *prefix, size_t size)
{
@@ -47,3 +48,21 @@ void qemu_hexdump(const char *buf, FILE *fp, const char *prefix, size_t size)
fprintf(fp, "\n");
}
}
+
+char *qemu_hexbuf_strdup(const void *buf, size_t size,
+ const char *str_hdr, const char *desc_if_empty)
+{
+ const uint8_t *u8 = (uint8_t *)buf;
+ GString *s;
+ int i;
+
+ if (!size) {
+ return g_strdup(desc_if_empty ? desc_if_empty : "");
+ }
+ s = g_string_new(str_hdr ? : "");
+ for (i = 0; i < size; i++) {
+ g_string_append_printf(s, "%02x ", u8[i]);
+ }
+
+ return g_string_free(s, FALSE);
+}
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 02/11] bcm2835_peripherals: move GPIO 'sdbus' property link from init() -> realize()
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [RFC PATCH 01/11] util/cutils: add qemu_hexbuf_strdup(), yet another hexdump() Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-15 0:58 ` Alistair Francis
2017-12-13 20:44 ` [Qemu-devel] [PATCH 03/11] sdbus: add trace events Philippe Mathieu-Daudé
` (8 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps
Cc: Philippe Mathieu-Daudé, qemu-devel, qemu-arm,
Peter Crosthwaite, Sai Pavan Boddu
We can then use dynamic sdbus creation (from realized HCI devices).
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/bcm2835_peripherals.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 12e0dd11af..7f30f19c4c 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -112,11 +112,6 @@ static void bcm2835_peripherals_init(Object *obj)
object_initialize(&s->gpio, sizeof(s->gpio), TYPE_BCM2835_GPIO);
object_property_add_child(obj, "gpio", OBJECT(&s->gpio), NULL);
qdev_set_parent_bus(DEVICE(&s->gpio), sysbus_get_default());
-
- object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhci",
- OBJECT(&s->sdhci.sdbus), &error_abort);
- object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhost",
- OBJECT(&s->sdhost.sdbus), &error_abort);
}
static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
@@ -314,6 +309,10 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
}
/* GPIO */
+ object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhci",
+ OBJECT(&s->sdhci.sdbus), &error_abort);
+ object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhost",
+ OBJECT(&s->sdhost.sdbus), &error_abort);
object_property_set_bool(OBJECT(&s->gpio), true, "realized", &err);
if (err) {
error_propagate(errp, err);
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 03/11] sdbus: add trace events
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [RFC PATCH 01/11] util/cutils: add qemu_hexbuf_strdup(), yet another hexdump() Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 02/11] bcm2835_peripherals: move GPIO 'sdbus' property link from init() -> realize() Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 04/11] sdbus: add sdbus_create_bus() to replace qbus_create_inplace() Philippe Mathieu-Daudé
` (7 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps
Cc: Philippe Mathieu-Daudé, qemu-devel, Peter Crosthwaite,
Sai Pavan Boddu
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/core.c | 25 +++++++++++++++++++++----
hw/sd/trace-events | 6 ++++++
2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/hw/sd/core.c b/hw/sd/core.c
index bd9350d21c..eda595973b 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -21,7 +21,14 @@
#include "qemu/osdep.h"
#include "hw/sd/sd.h"
+#include "qemu/cutils.h"
#include "sd-internal.h"
+#include "trace.h"
+
+static inline const char *sdbus_name(SDBus *sdbus)
+{
+ return sdbus->qbus.name;
+}
static SDState *get_card(SDBus *sdbus)
{
@@ -37,20 +44,28 @@ static SDState *get_card(SDBus *sdbus)
int sdbus_do_command(SDBus *sdbus, SDRequest *req, uint8_t *response)
{
SDState *card = get_card(sdbus);
+ int sz = 0;
+ char *hexbuf;
+ trace_sdbus_command(sdbus_name(sdbus), req->cmd, req->arg, req->crc);
if (card) {
SDCardClass *sc = SD_CARD_GET_CLASS(card);
- return sc->do_command(card, req, response);
+ sz = sc->do_command(card, req, response);
+ hexbuf = qemu_hexbuf_strdup(response, sz, NULL, "resp: ");
+ trace_sdbus_command_response(sdbus_name(sdbus),
+ req->cmd, req->arg, hexbuf);
+ g_free(hexbuf);
}
- return 0;
+ return sz;
}
void sdbus_write_data(SDBus *sdbus, uint8_t value)
{
SDState *card = get_card(sdbus);
+ trace_sdbus_write(sdbus_name(sdbus), value);
if (card) {
SDCardClass *sc = SD_CARD_GET_CLASS(card);
@@ -61,14 +76,16 @@ void sdbus_write_data(SDBus *sdbus, uint8_t value)
uint8_t sdbus_read_data(SDBus *sdbus)
{
SDState *card = get_card(sdbus);
+ uint8_t value = 0;
if (card) {
SDCardClass *sc = SD_CARD_GET_CLASS(card);
- return sc->read_data(card);
+ value = sc->read_data(card);
}
+ trace_sdbus_read(sdbus_name(sdbus), value);
- return 0;
+ return value;
}
bool sdbus_data_ready(SDBus *sdbus)
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
index 11f8fa4fc1..6b1dc7380f 100644
--- a/hw/sd/trace-events
+++ b/hw/sd/trace-events
@@ -1,5 +1,11 @@
# See docs/devel/tracing.txt for syntax documentation.
+# hw/sd/core.c
+sdbus_command(const char *bus_name, uint8_t cmd, uint32_t arg, uint8_t crc) "@%s CMD%02d arg 0x%08x crc 0x%02x"
+sdbus_command_response(const char *bus_name, uint8_t cmd, uint32_t arg, const char *hexdump) "@%s CMD%02d arg 0x%08x %s"
+sdbus_read(const char *bus_name, uint8_t value) "@%s value 0x%02x"
+sdbus_write(const char *bus_name, uint8_t value) "@%s value 0x%02x"
+
# hw/sd/sdhci.c
sdhci_set_inserted(const char *level) "card state changed: %s"
sdhci_send_command(uint8_t cmd, uint32_t arg) "sending CMD%02u ARG[0x%08x]"
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 04/11] sdbus: add sdbus_create_bus() to replace qbus_create_inplace()
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
` (2 preceding siblings ...)
2017-12-13 20:44 ` [Qemu-devel] [PATCH 03/11] sdbus: add trace events Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-15 1:02 ` Alistair Francis
2017-12-13 20:44 ` [Qemu-devel] [PATCH 05/11] sdbus: add sdbus_create_slave() Philippe Mathieu-Daudé
` (6 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps
Cc: Philippe Mathieu-Daudé, qemu-devel, Peter Crosthwaite,
Sai Pavan Boddu, open list:ARM
A "bus-name" property can be use to change the default SDHCI "sd-bus" name.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
include/hw/sd/sd.h | 1 +
include/hw/sd/sdhci.h | 3 ++-
hw/arm/bcm2835_peripherals.c | 2 +-
hw/sd/core.c | 5 +++++
hw/sd/sdhci.c | 36 ++++++++++++++++++++----------------
5 files changed, 29 insertions(+), 18 deletions(-)
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index f6994e61f2..dc9d697c12 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -51,6 +51,7 @@ struct SDBus {
};
/* Functions to be used by qdevified callers */
+SDBus *sdbus_create_bus(DeviceState *parent, const char *name);
int sdbus_do_command(SDBus *sd, SDRequest *req, uint8_t *response);
void sdbus_write_data(SDBus *sd, uint8_t value);
uint8_t sdbus_read_data(SDBus *sd);
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index e6644e6e7d..579e0ea644 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -39,7 +39,8 @@ typedef struct SDHCIState {
};
/*< public >*/
- SDBus sdbus;
+ char *bus_name;
+ SDBus *sdbus;
MemoryRegion iomem;
MemoryRegion *dma_mr;
AddressSpace dma_as;
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 7f30f19c4c..60a0eec4d1 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -310,7 +310,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
/* GPIO */
object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhci",
- OBJECT(&s->sdhci.sdbus), &error_abort);
+ OBJECT(s->sdhci.sdbus), &error_abort);
object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhost",
OBJECT(&s->sdhost.sdbus), &error_abort);
object_property_set_bool(OBJECT(&s->gpio), true, "realized", &err);
diff --git a/hw/sd/core.c b/hw/sd/core.c
index eda595973b..021a8d7258 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -187,3 +187,8 @@ static void sd_bus_register_types(void)
}
type_init(sd_bus_register_types)
+
+SDBus *sdbus_create_bus(DeviceState *parent, const char *name)
+{
+ return SD_BUS(qbus_create(TYPE_SD_BUS, parent, name));
+}
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 5f8064c59b..40596f6ebe 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -186,8 +186,8 @@ static void sdhci_reset(SDHCIState *s)
memset(&s->sdmasysad, 0, (uintptr_t)&s->capareg - (uintptr_t)&s->sdmasysad);
/* Reset other state based on current card insertion/readonly status */
- sdhci_set_inserted(dev, sdbus_get_inserted(&s->sdbus));
- sdhci_set_readonly(dev, sdbus_get_readonly(&s->sdbus));
+ sdhci_set_inserted(dev, sdbus_get_inserted(s->sdbus));
+ sdhci_set_readonly(dev, sdbus_get_readonly(s->sdbus));
s->data_count = 0;
s->stopped_state = sdhc_not_stopped;
@@ -223,7 +223,7 @@ static void sdhci_send_command(SDHCIState *s)
request.arg = s->argument;
trace_sdhci_send_command(request.cmd, request.arg);
- rlen = sdbus_do_command(&s->sdbus, &request, response);
+ rlen = sdbus_do_command(s->sdbus, &request, response);
if (s->cmdreg & SDHC_CMD_RESPONSE) {
if (rlen == 4) {
@@ -278,7 +278,7 @@ static void sdhci_end_transfer(SDHCIState *s)
request.cmd = 0x0C;
request.arg = 0;
trace_sdhci_end_transfer(request.cmd, request.arg);
- sdbus_do_command(&s->sdbus, &request, response);
+ sdbus_do_command(s->sdbus, &request, response);
/* Auto CMD12 response goes to the upper Response register */
s->rspreg[3] = (response[0] << 24) | (response[1] << 16) |
(response[2] << 8) | response[3];
@@ -310,7 +310,7 @@ static void sdhci_read_block_from_card(SDHCIState *s)
}
for (index = 0; index < (s->blksize & 0x0fff); index++) {
- s->fifo_buffer[index] = sdbus_read_data(&s->sdbus);
+ s->fifo_buffer[index] = sdbus_read_data(s->sdbus);
}
/* New data now available for READ through Buffer Port Register */
@@ -402,7 +402,7 @@ static void sdhci_write_block_to_card(SDHCIState *s)
}
for (index = 0; index < (s->blksize & 0x0fff); index++) {
- sdbus_write_data(&s->sdbus, s->fifo_buffer[index]);
+ sdbus_write_data(s->sdbus, s->fifo_buffer[index]);
}
/* Next data can be written through BUFFER DATORT register */
@@ -488,7 +488,7 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
while (s->blkcnt) {
if (s->data_count == 0) {
for (n = 0; n < block_size; n++) {
- s->fifo_buffer[n] = sdbus_read_data(&s->sdbus);
+ s->fifo_buffer[n] = sdbus_read_data(s->sdbus);
}
}
begin = s->data_count;
@@ -529,7 +529,7 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
s->sdmasysad += s->data_count - begin;
if (s->data_count == block_size) {
for (n = 0; n < block_size; n++) {
- sdbus_write_data(&s->sdbus, s->fifo_buffer[n]);
+ sdbus_write_data(s->sdbus, s->fifo_buffer[n]);
}
s->data_count = 0;
if (s->trnmod & SDHC_TRNS_BLK_CNT_EN) {
@@ -560,7 +560,7 @@ static void sdhci_sdma_transfer_single_block(SDHCIState *s)
if (s->trnmod & SDHC_TRNS_READ) {
for (n = 0; n < datacnt; n++) {
- s->fifo_buffer[n] = sdbus_read_data(&s->sdbus);
+ s->fifo_buffer[n] = sdbus_read_data(s->sdbus);
}
dma_memory_write(&address_space_memory, s->sdmasysad, s->fifo_buffer,
datacnt);
@@ -568,7 +568,7 @@ static void sdhci_sdma_transfer_single_block(SDHCIState *s)
dma_memory_read(&address_space_memory, s->sdmasysad, s->fifo_buffer,
datacnt);
for (n = 0; n < datacnt; n++) {
- sdbus_write_data(&s->sdbus, s->fifo_buffer[n]);
+ sdbus_write_data(s->sdbus, s->fifo_buffer[n]);
}
}
s->blkcnt--;
@@ -659,7 +659,7 @@ static void sdhci_do_adma(SDHCIState *s)
while (length) {
if (s->data_count == 0) {
for (n = 0; n < block_size; n++) {
- s->fifo_buffer[n] = sdbus_read_data(&s->sdbus);
+ s->fifo_buffer[n] = sdbus_read_data(s->sdbus);
}
}
begin = s->data_count;
@@ -700,7 +700,7 @@ static void sdhci_do_adma(SDHCIState *s)
dscr.addr += s->data_count - begin;
if (s->data_count == block_size) {
for (n = 0; n < block_size; n++) {
- sdbus_write_data(&s->sdbus, s->fifo_buffer[n]);
+ sdbus_write_data(s->sdbus, s->fifo_buffer[n]);
}
s->data_count = 0;
if (s->trnmod & SDHC_TRNS_BLK_CNT_EN) {
@@ -807,7 +807,7 @@ static void sdhci_data_transfer(void *opaque)
break;
}
} else {
- if ((s->trnmod & SDHC_TRNS_READ) && sdbus_data_ready(&s->sdbus)) {
+ if ((s->trnmod & SDHC_TRNS_READ) && sdbus_data_ready(s->sdbus)) {
s->prnsts |= SDHC_DOING_READ | SDHC_DATA_INHIBIT |
SDHC_DAT_LINE_ACTIVE;
sdhci_read_block_from_card(s);
@@ -1156,15 +1156,14 @@ static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
static void sdhci_initfn(SDHCIState *s)
{
- qbus_create_inplace(&s->sdbus, sizeof(s->sdbus),
- TYPE_SDHCI_BUS, DEVICE(s), "sd-bus");
-
s->insert_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_raise_insertion_irq, s);
s->transfer_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_data_transfer, s);
}
static void sdhci_realizefn(SDHCIState *s, Error **errp)
{
+ const char *name = s->bus_name ? s->bus_name : "sd-bus";
+
sdhci_init_capareg(s, errp);
s->buf_maxsz = sdhci_get_fifolen(s);
@@ -1177,10 +1176,14 @@ static void sdhci_realizefn(SDHCIState *s, Error **errp)
address_space_init(&s->dma_as,
s->dma_mr ? s->dma_mr : get_system_memory(),
"sdhci-dma");
+
+ s->sdbus = sdbus_create_bus(DEVICE(s), name);
}
static void sdhci_unrealizefn(SDHCIState *s, Error **errp)
{
+ g_free(s->sdbus);
+
if (s->dma_mr) {
address_space_destroy(&s->dma_as);
object_unparent(OBJECT(&s->dma_mr));
@@ -1269,6 +1272,7 @@ static Property sdhci_properties[] = {
false),
DEFINE_PROP_LINK("dma-memory", SDHCIState, dma_mr,
TYPE_MEMORY_REGION, MemoryRegion *),
+ DEFINE_PROP_STRING("sd-bus-name", SDHCIState, bus_name),
DEFINE_PROP_END_OF_LIST(),
};
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 05/11] sdbus: add sdbus_create_slave()
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
` (3 preceding siblings ...)
2017-12-13 20:44 ` [Qemu-devel] [PATCH 04/11] sdbus: add sdbus_create_bus() to replace qbus_create_inplace() Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-15 1:03 ` Alistair Francis
2017-12-13 20:44 ` [Qemu-devel] [PATCH 06/11] sdbus: rename SDCardClass -> SDSlaveClass Philippe Mathieu-Daudé
` (5 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps
Cc: Philippe Mathieu-Daudé, qemu-devel, Peter Crosthwaite,
Sai Pavan Boddu
The slave qdev is created connected to the parent SDBus.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
include/hw/sd/sd.h | 2 ++
hw/sd/core.c | 14 ++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index dc9d697c12..d402231724 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -52,6 +52,8 @@ struct SDBus {
/* Functions to be used by qdevified callers */
SDBus *sdbus_create_bus(DeviceState *parent, const char *name);
+DeviceState *sdbus_create_slave(SDBus *bus, const char *name);
+DeviceState *sdbus_create_slave_no_init(SDBus *bus, const char *name);
int sdbus_do_command(SDBus *sd, SDRequest *req, uint8_t *response);
void sdbus_write_data(SDBus *sd, uint8_t value);
uint8_t sdbus_read_data(SDBus *sd);
diff --git a/hw/sd/core.c b/hw/sd/core.c
index 021a8d7258..fc9ccfedb2 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -188,6 +188,20 @@ static void sd_bus_register_types(void)
type_init(sd_bus_register_types)
+DeviceState *sdbus_create_slave_no_init(SDBus *bus, const char *name)
+{
+ assert(bus);
+ return qdev_create(BUS(bus), name);
+}
+
+DeviceState *sdbus_create_slave(SDBus *bus, const char *name)
+{
+ DeviceState *dev = sdbus_create_slave_no_init(bus, name);
+
+ qdev_init_nofail(dev);
+ return dev;
+}
+
SDBus *sdbus_create_bus(DeviceState *parent, const char *name)
{
return SD_BUS(qbus_create(TYPE_SD_BUS, parent, name));
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 06/11] sdbus: rename SDCardClass -> SDSlaveClass
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
` (4 preceding siblings ...)
2017-12-13 20:44 ` [Qemu-devel] [PATCH 05/11] sdbus: add sdbus_create_slave() Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-15 1:04 ` Alistair Francis
2017-12-13 20:44 ` [Qemu-devel] [PATCH 07/11] sdbus: add a SD_BUS_SLAVE interface Philippe Mathieu-Daudé
` (4 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps
Cc: Philippe Mathieu-Daudé, qemu-devel, Peter Crosthwaite,
Sai Pavan Boddu
By default a SD bus connect SD cards, however it may accept other SD devices
like a SDIO device. The current class is not restricted to a SD "Card" device.
To better reflect this is a SD bus slave, simply rename it.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd-internal.h | 10 +++++-----
hw/sd/core.c | 16 ++++++++--------
hw/sd/sd.c | 4 ++--
3 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/hw/sd/sd-internal.h b/hw/sd/sd-internal.h
index afd5dbf194..85a747ea64 100644
--- a/hw/sd/sd-internal.h
+++ b/hw/sd/sd-internal.h
@@ -66,10 +66,10 @@ typedef enum {
typedef struct SDState SDState;
-#define SD_CARD_CLASS(klass) \
- OBJECT_CLASS_CHECK(SDCardClass, (klass), TYPE_SD_CARD)
-#define SD_CARD_GET_CLASS(obj) \
- OBJECT_GET_CLASS(SDCardClass, (obj), TYPE_SD_CARD)
+#define SDBUS_SLAVE_CLASS(klass) \
+ OBJECT_CLASS_CHECK(SDSlaveClass, (klass), TYPE_SD_CARD)
+#define SDBUS_SLAVE_GET_CLASS(obj) \
+ OBJECT_GET_CLASS(SDSlaveClass, (obj), TYPE_SD_CARD)
typedef struct {
/*< private >*/
@@ -83,7 +83,7 @@ typedef struct {
void (*enable)(SDState *sd, bool enable);
bool (*get_inserted)(SDState *sd);
bool (*get_readonly)(SDState *sd);
-} SDCardClass;
+} SDSlaveClass;
#define SD_BUS_CLASS(klass) OBJECT_CLASS_CHECK(SDBusClass, (klass), TYPE_SD_BUS)
#define SD_BUS_GET_CLASS(obj) OBJECT_GET_CLASS(SDBusClass, (obj), TYPE_SD_BUS)
diff --git a/hw/sd/core.c b/hw/sd/core.c
index fc9ccfedb2..cd5b531cfa 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -49,7 +49,7 @@ int sdbus_do_command(SDBus *sdbus, SDRequest *req, uint8_t *response)
trace_sdbus_command(sdbus_name(sdbus), req->cmd, req->arg, req->crc);
if (card) {
- SDCardClass *sc = SD_CARD_GET_CLASS(card);
+ SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
sz = sc->do_command(card, req, response);
hexbuf = qemu_hexbuf_strdup(response, sz, NULL, "resp: ");
@@ -67,7 +67,7 @@ void sdbus_write_data(SDBus *sdbus, uint8_t value)
trace_sdbus_write(sdbus_name(sdbus), value);
if (card) {
- SDCardClass *sc = SD_CARD_GET_CLASS(card);
+ SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
sc->write_data(card, value);
}
@@ -79,7 +79,7 @@ uint8_t sdbus_read_data(SDBus *sdbus)
uint8_t value = 0;
if (card) {
- SDCardClass *sc = SD_CARD_GET_CLASS(card);
+ SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
value = sc->read_data(card);
}
@@ -93,7 +93,7 @@ bool sdbus_data_ready(SDBus *sdbus)
SDState *card = get_card(sdbus);
if (card) {
- SDCardClass *sc = SD_CARD_GET_CLASS(card);
+ SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
return sc->data_ready(card);
}
@@ -106,7 +106,7 @@ bool sdbus_get_inserted(SDBus *sdbus)
SDState *card = get_card(sdbus);
if (card) {
- SDCardClass *sc = SD_CARD_GET_CLASS(card);
+ SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
return sc->get_inserted(card);
}
@@ -119,7 +119,7 @@ bool sdbus_get_readonly(SDBus *sdbus)
SDState *card = get_card(sdbus);
if (card) {
- SDCardClass *sc = SD_CARD_GET_CLASS(card);
+ SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
return sc->get_readonly(card);
}
@@ -150,7 +150,7 @@ void sdbus_set_readonly(SDBus *sdbus, bool readonly)
void sdbus_reparent_card(SDBus *from, SDBus *to)
{
SDState *card = get_card(from);
- SDCardClass *sc;
+ SDSlaveClass *sc;
bool readonly;
/* We directly reparent the card object rather than implementing this
@@ -165,7 +165,7 @@ void sdbus_reparent_card(SDBus *from, SDBus *to)
return;
}
- sc = SD_CARD_GET_CLASS(card);
+ sc = SDBUS_SLAVE_GET_CLASS(card);
readonly = sc->get_readonly(card);
sdbus_set_inserted(from, false);
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 9b7dee2ec4..97046df5c3 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1917,7 +1917,7 @@ static Property sd_properties[] = {
static void sd_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
- SDCardClass *sc = SD_CARD_CLASS(klass);
+ SDSlaveClass *sc = SDBUS_SLAVE_CLASS(klass);
dc->realize = sd_realize;
dc->props = sd_properties;
@@ -1938,7 +1938,7 @@ static const TypeInfo sd_info = {
.name = TYPE_SD_CARD,
.parent = TYPE_DEVICE,
.instance_size = sizeof(SDState),
- .class_size = sizeof(SDCardClass),
+ .class_size = sizeof(SDSlaveClass),
.class_init = sd_class_init,
.instance_init = sd_instance_init,
.instance_finalize = sd_instance_finalize,
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 07/11] sdbus: add a SD_BUS_SLAVE interface
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
` (5 preceding siblings ...)
2017-12-13 20:44 ` [Qemu-devel] [PATCH 06/11] sdbus: rename SDCardClass -> SDSlaveClass Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-20 17:31 ` Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 08/11] sdbus: add a SD_BUS_MASTER interface Philippe Mathieu-Daudé
` (3 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Marc-André Lureau, Igor Mammedov,
Eduardo Habkost
Cc: Philippe Mathieu-Daudé, qemu-devel, Peter Crosthwaite,
Sai Pavan Boddu
Devices implementing this interface can be (hot-)plugged to a SD bus.
The sdcard device is currently the unique implementation.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd-internal.h | 5 +++--
hw/sd/core.c | 7 +++++++
hw/sd/sd.c | 4 ++++
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/hw/sd/sd-internal.h b/hw/sd/sd-internal.h
index 85a747ea64..4576d2f8a8 100644
--- a/hw/sd/sd-internal.h
+++ b/hw/sd/sd-internal.h
@@ -66,10 +66,11 @@ typedef enum {
typedef struct SDState SDState;
+#define TYPE_SD_BUS_SLAVE_INTERFACE "sd-bus-slave"
#define SDBUS_SLAVE_CLASS(klass) \
- OBJECT_CLASS_CHECK(SDSlaveClass, (klass), TYPE_SD_CARD)
+ OBJECT_CLASS_CHECK(SDSlaveClass, (klass), TYPE_SD_BUS_SLAVE_INTERFACE)
#define SDBUS_SLAVE_GET_CLASS(obj) \
- OBJECT_GET_CLASS(SDSlaveClass, (obj), TYPE_SD_CARD)
+ OBJECT_GET_CLASS(SDSlaveClass, (obj), TYPE_SD_BUS_SLAVE_INTERFACE)
typedef struct {
/*< private >*/
diff --git a/hw/sd/core.c b/hw/sd/core.c
index cd5b531cfa..dc1571befc 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -181,9 +181,16 @@ static const TypeInfo sd_bus_info = {
.class_size = sizeof(SDBusClass),
};
+static const TypeInfo sd_slave_info = {
+ .name = TYPE_SD_BUS_SLAVE_INTERFACE,
+ .parent = TYPE_INTERFACE,
+ .class_size = sizeof(SDBusClass),
+};
+
static void sd_bus_register_types(void)
{
type_register_static(&sd_bus_info);
+ type_register_static(&sd_slave_info);
}
type_init(sd_bus_register_types)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 97046df5c3..8e12b07ee4 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1942,6 +1942,10 @@ static const TypeInfo sd_info = {
.class_init = sd_class_init,
.instance_init = sd_instance_init,
.instance_finalize = sd_instance_finalize,
+ .interfaces = (InterfaceInfo[]) {
+ { TYPE_SD_BUS_SLAVE_INTERFACE },
+ { },
+ },
};
static void sd_register_types(void)
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 08/11] sdbus: add a SD_BUS_MASTER interface
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
` (6 preceding siblings ...)
2017-12-13 20:44 ` [Qemu-devel] [PATCH 07/11] sdbus: add a SD_BUS_SLAVE interface Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 09/11] sdhci: implement the " Philippe Mathieu-Daudé
` (2 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Marc-André Lureau, Igor Mammedov,
Eduardo Habkost
Cc: Philippe Mathieu-Daudé, qemu-devel, Peter Crosthwaite,
Sai Pavan Boddu
Now than we have clearly separated the SD slave devices, let continue adding
the SD master interface, this will simplify the design.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd-internal.h | 3 +++
hw/sd/core.c | 7 +++++++
2 files changed, 10 insertions(+)
diff --git a/hw/sd/sd-internal.h b/hw/sd/sd-internal.h
index 4576d2f8a8..7f446b4e81 100644
--- a/hw/sd/sd-internal.h
+++ b/hw/sd/sd-internal.h
@@ -88,6 +88,9 @@ typedef struct {
#define SD_BUS_CLASS(klass) OBJECT_CLASS_CHECK(SDBusClass, (klass), TYPE_SD_BUS)
#define SD_BUS_GET_CLASS(obj) OBJECT_GET_CLASS(SDBusClass, (obj), TYPE_SD_BUS)
+#define TYPE_SD_BUS_MASTER_INTERFACE "sd-bus-master"
+#define SDBUS_MASTER_CLASS(klass) \
+ OBJECT_CLASS_CHECK(SDBusClass, (klass), TYPE_SD_BUS_MASTER_INTERFACE)
typedef struct {
/*< private >*/
diff --git a/hw/sd/core.c b/hw/sd/core.c
index dc1571befc..da3a7e0efa 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -181,6 +181,12 @@ static const TypeInfo sd_bus_info = {
.class_size = sizeof(SDBusClass),
};
+static const TypeInfo sd_master_info = {
+ .name = TYPE_SD_BUS_MASTER_INTERFACE,
+ .parent = TYPE_INTERFACE,
+ .class_size = sizeof(SDBusClass),
+};
+
static const TypeInfo sd_slave_info = {
.name = TYPE_SD_BUS_SLAVE_INTERFACE,
.parent = TYPE_INTERFACE,
@@ -190,6 +196,7 @@ static const TypeInfo sd_slave_info = {
static void sd_bus_register_types(void)
{
type_register_static(&sd_bus_info);
+ type_register_static(&sd_master_info);
type_register_static(&sd_slave_info);
}
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 09/11] sdhci: implement the SD_BUS_MASTER interface
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
` (7 preceding siblings ...)
2017-12-13 20:44 ` [Qemu-devel] [PATCH 08/11] sdbus: add a SD_BUS_MASTER interface Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 10/11] hw/sd/pxa2xx: " Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 11/11] hw/arm/xilinx_zynq: use sdbus_create_slave() to name the different SD busses Philippe Mathieu-Daudé
10 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Marc-André Lureau, Igor Mammedov,
Eduardo Habkost
Cc: Philippe Mathieu-Daudé, qemu-devel, Peter Crosthwaite,
Sai Pavan Boddu
The SDHCI is a SD master, let it implement the SD_BUS_MASTER interface,
this even allow remove the SDHCI_BUS type.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sdhci.c | 30 +++++++++---------------------
1 file changed, 9 insertions(+), 21 deletions(-)
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 40596f6ebe..d8188fdc2a 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -35,9 +35,6 @@
#include "qemu/log.h"
#include "trace.h"
-#define TYPE_SDHCI_BUS "sdhci-bus"
-#define SDHCI_BUS(obj) OBJECT_CHECK(SDBus, (obj), TYPE_SDHCI_BUS)
-
/* Default SD/MMC host controller features information, which will be
* presented in CAPABILITIES register of generic SD host controller at reset.
* If not stated otherwise:
@@ -1279,11 +1276,15 @@ static Property sdhci_properties[] = {
static void sdhci_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
+ SDBusClass *sbc = SDBUS_MASTER_CLASS(klass);
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
dc->vmsd = &sdhci_vmstate;
dc->props = sdhci_properties;
dc->reset = sdhci_poweron_reset;
+
+ sbc->set_inserted = sdhci_set_inserted;
+ sbc->set_readonly = sdhci_set_readonly;
}
/* --- qdev PCI --- */
@@ -1328,6 +1329,7 @@ static const TypeInfo sdhci_pci_info = {
.instance_size = sizeof(SDHCIState),
.class_init = sdhci_pci_class_init,
.interfaces = (InterfaceInfo[]) {
+ { TYPE_SD_BUS_MASTER_INTERFACE },
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
{ },
},
@@ -1383,30 +1385,16 @@ static const TypeInfo sdhci_sysbus_info = {
.instance_init = sdhci_sysbus_init,
.instance_finalize = sdhci_sysbus_finalize,
.class_init = sdhci_sysbus_class_init,
-};
-
-/* --- qdev bus master --- */
-
-static void sdhci_bus_class_init(ObjectClass *klass, void *data)
-{
- SDBusClass *sbc = SD_BUS_CLASS(klass);
-
- sbc->set_inserted = sdhci_set_inserted;
- sbc->set_readonly = sdhci_set_readonly;
-}
-
-static const TypeInfo sdhci_bus_info = {
- .name = TYPE_SDHCI_BUS,
- .parent = TYPE_SD_BUS,
- .instance_size = sizeof(SDBus),
- .class_init = sdhci_bus_class_init,
+ .interfaces = (InterfaceInfo[]) {
+ { TYPE_SD_BUS_MASTER_INTERFACE },
+ { },
+ },
};
static void sdhci_register_types(void)
{
type_register_static(&sdhci_pci_info);
type_register_static(&sdhci_sysbus_info);
- type_register_static(&sdhci_bus_info);
}
type_init(sdhci_register_types)
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 10/11] hw/sd/pxa2xx: implement the SD_BUS_MASTER interface
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
` (8 preceding siblings ...)
2017-12-13 20:44 ` [Qemu-devel] [PATCH 09/11] sdhci: implement the " Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 11/11] hw/arm/xilinx_zynq: use sdbus_create_slave() to name the different SD busses Philippe Mathieu-Daudé
10 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Marc-André Lureau, Igor Mammedov,
Eduardo Habkost
Cc: Philippe Mathieu-Daudé, qemu-devel, qemu-arm,
Peter Crosthwaite, Sai Pavan Boddu, Andrzej Zaborowski
This MMC Interface is a SD bus master.
Replace qbus_create_inplace() by sdbus_create_bus(),
remove the PXA2XX_MMCI_BUS type.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/pxa2xx_mmci.c | 36 ++++++++++++------------------------
1 file changed, 12 insertions(+), 24 deletions(-)
diff --git a/hw/sd/pxa2xx_mmci.c b/hw/sd/pxa2xx_mmci.c
index f34951e1d1..da5f302f3c 100644
--- a/hw/sd/pxa2xx_mmci.c
+++ b/hw/sd/pxa2xx_mmci.c
@@ -24,9 +24,6 @@
#define TYPE_PXA2XX_MMCI "pxa2xx-mmci"
#define PXA2XX_MMCI(obj) OBJECT_CHECK(PXA2xxMMCIState, (obj), TYPE_PXA2XX_MMCI)
-#define TYPE_PXA2XX_MMCI_BUS "pxa2xx-mmci-bus"
-#define PXA2XX_MMCI_BUS(obj) OBJECT_CHECK(SDBus, (obj), TYPE_PXA2XX_MMCI_BUS)
-
struct PXA2xxMMCIState {
SysBusDevice parent_obj;
@@ -38,7 +35,7 @@ struct PXA2xxMMCIState {
qemu_irq readonly;
BlockBackend *blk;
- SDBus sdbus;
+ SDBus *sdbus;
uint32_t status;
uint32_t clkrt;
@@ -183,7 +180,7 @@ static void pxa2xx_mmci_fifo_update(PXA2xxMMCIState *s)
if (s->cmdat & CMDAT_WR_RD) {
while (s->bytesleft && s->tx_len) {
- sdbus_write_data(&s->sdbus, s->tx_fifo[s->tx_start++]);
+ sdbus_write_data(s->sdbus, s->tx_fifo[s->tx_start++]);
s->tx_start &= 0x1f;
s->tx_len --;
s->bytesleft --;
@@ -193,7 +190,7 @@ static void pxa2xx_mmci_fifo_update(PXA2xxMMCIState *s)
} else
while (s->bytesleft && s->rx_len < 32) {
s->rx_fifo[(s->rx_start + (s->rx_len ++)) & 0x1f] =
- sdbus_read_data(&s->sdbus);
+ sdbus_read_data(s->sdbus);
s->bytesleft --;
s->intreq |= INT_RXFIFO_REQ;
}
@@ -227,7 +224,7 @@ static void pxa2xx_mmci_wakequeues(PXA2xxMMCIState *s)
request.arg = s->arg;
request.crc = 0; /* FIXME */
- rsplen = sdbus_do_command(&s->sdbus, &request, response);
+ rsplen = sdbus_do_command(s->sdbus, &request, response);
s->intreq |= INT_END_CMD;
memset(s->resp_fifo, 0, sizeof(s->resp_fifo));
@@ -509,8 +506,8 @@ void pxa2xx_mmci_handlers(PXA2xxMMCIState *s, qemu_irq readonly,
s->readonly = readonly;
s->inserted = coverswitch;
- pxa2xx_mmci_set_inserted(dev, sdbus_get_inserted(&s->sdbus));
- pxa2xx_mmci_set_readonly(dev, sdbus_get_readonly(&s->sdbus));
+ pxa2xx_mmci_set_inserted(dev, sdbus_get_inserted(s->sdbus));
+ pxa2xx_mmci_set_readonly(dev, sdbus_get_readonly(s->sdbus));
}
static void pxa2xx_mmci_reset(DeviceState *d)
@@ -555,21 +552,16 @@ static void pxa2xx_mmci_instance_init(Object *obj)
qdev_init_gpio_out_named(dev, &s->rx_dma, "rx-dma", 1);
qdev_init_gpio_out_named(dev, &s->tx_dma, "tx-dma", 1);
- qbus_create_inplace(&s->sdbus, sizeof(s->sdbus),
- TYPE_PXA2XX_MMCI_BUS, DEVICE(obj), "sd-bus");
+ s->sdbus = sdbus_create_bus(dev, "sd-bus");
}
static void pxa2xx_mmci_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
+ SDBusClass *sbc = SDBUS_MASTER_CLASS(klass);
dc->vmsd = &vmstate_pxa2xx_mmci;
dc->reset = pxa2xx_mmci_reset;
-}
-
-static void pxa2xx_mmci_bus_class_init(ObjectClass *klass, void *data)
-{
- SDBusClass *sbc = SD_BUS_CLASS(klass);
sbc->set_inserted = pxa2xx_mmci_set_inserted;
sbc->set_readonly = pxa2xx_mmci_set_readonly;
@@ -581,19 +573,15 @@ static const TypeInfo pxa2xx_mmci_info = {
.instance_size = sizeof(PXA2xxMMCIState),
.instance_init = pxa2xx_mmci_instance_init,
.class_init = pxa2xx_mmci_class_init,
-};
-
-static const TypeInfo pxa2xx_mmci_bus_info = {
- .name = TYPE_PXA2XX_MMCI_BUS,
- .parent = TYPE_SD_BUS,
- .instance_size = sizeof(SDBus),
- .class_init = pxa2xx_mmci_bus_class_init,
+ .interfaces = (InterfaceInfo[]) {
+ { TYPE_SD_BUS_MASTER_INTERFACE },
+ { },
+ },
};
static void pxa2xx_mmci_register_types(void)
{
type_register_static(&pxa2xx_mmci_info);
- type_register_static(&pxa2xx_mmci_bus_info);
}
type_init(pxa2xx_mmci_register_types)
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH 11/11] hw/arm/xilinx_zynq: use sdbus_create_slave() to name the different SD busses
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
` (9 preceding siblings ...)
2017-12-13 20:44 ` [Qemu-devel] [PATCH 10/11] hw/sd/pxa2xx: " Philippe Mathieu-Daudé
@ 2017-12-13 20:44 ` Philippe Mathieu-Daudé
10 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-13 20:44 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps
Cc: Philippe Mathieu-Daudé, qemu-devel, qemu-arm,
Peter Crosthwaite, Sai Pavan Boddu, Edgar E. Iglesias
Using the "bus-name" property we can now address any bus.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/xilinx_zynq.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 1836a4ed45..9275ae6daf 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -167,6 +167,7 @@ static void zynq_init(MachineState *machine)
MemoryRegion *ocm_ram = g_new(MemoryRegion, 1);
DeviceState *dev, *carddev;
SysBusDevice *busdev;
+ SDBus *sdbus;
DriveInfo *di;
BlockBackend *blk;
qemu_irq pic[64];
@@ -248,24 +249,28 @@ static void zynq_init(MachineState *machine)
gem_init(&nd_table[1], 0xE000C000, pic[77-IRQ_OFFSET]);
dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
+ qdev_prop_set_string(dev, "sd-bus-name", "sd.0");
qdev_init_nofail(dev);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0xE0100000);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[56-IRQ_OFFSET]);
di = drive_get_next(IF_SD);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
- carddev = qdev_create(qdev_get_child_bus(dev, "sd-bus"), TYPE_SD_CARD);
+ sdbus = (SDBus *)qdev_get_child_bus(dev, "sd.0");
+ carddev = sdbus_create_slave_no_init(sdbus, TYPE_SD_CARD);
qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
dev = qdev_create(NULL, TYPE_SYSBUS_SDHCI);
+ qdev_prop_set_string(dev, "sd-bus-name", "sd.1");
qdev_init_nofail(dev);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0xE0101000);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[79-IRQ_OFFSET]);
di = drive_get_next(IF_SD);
blk = di ? blk_by_legacy_dinfo(di) : NULL;
- carddev = qdev_create(qdev_get_child_bus(dev, "sd-bus"), TYPE_SD_CARD);
+ sdbus = (SDBus *)qdev_get_child_bus(dev, "sd.1");
+ carddev = sdbus_create_slave_no_init(sdbus, TYPE_SD_CARD);
qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
--
2.15.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH 02/11] bcm2835_peripherals: move GPIO 'sdbus' property link from init() -> realize()
2017-12-13 20:44 ` [Qemu-devel] [PATCH 02/11] bcm2835_peripherals: move GPIO 'sdbus' property link from init() -> realize() Philippe Mathieu-Daudé
@ 2017-12-15 0:58 ` Alistair Francis
0 siblings, 0 replies; 17+ messages in thread
From: Alistair Francis @ 2017-12-15 0:58 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Sai Pavan Boddu, Peter Crosthwaite, qemu-arm,
qemu-devel@nongnu.org Developers
On Wed, Dec 13, 2017 at 12:44 PM, Philippe Mathieu-Daudé
<f4bug@amsat.org> wrote:
> We can then use dynamic sdbus creation (from realized HCI devices).
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Acked-by: Alistair Francis <alistair.francis@xilinx.com>
Alistair
> ---
> hw/arm/bcm2835_peripherals.c | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
> index 12e0dd11af..7f30f19c4c 100644
> --- a/hw/arm/bcm2835_peripherals.c
> +++ b/hw/arm/bcm2835_peripherals.c
> @@ -112,11 +112,6 @@ static void bcm2835_peripherals_init(Object *obj)
> object_initialize(&s->gpio, sizeof(s->gpio), TYPE_BCM2835_GPIO);
> object_property_add_child(obj, "gpio", OBJECT(&s->gpio), NULL);
> qdev_set_parent_bus(DEVICE(&s->gpio), sysbus_get_default());
> -
> - object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhci",
> - OBJECT(&s->sdhci.sdbus), &error_abort);
> - object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhost",
> - OBJECT(&s->sdhost.sdbus), &error_abort);
> }
>
> static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
> @@ -314,6 +309,10 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
> }
>
> /* GPIO */
> + object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhci",
> + OBJECT(&s->sdhci.sdbus), &error_abort);
> + object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhost",
> + OBJECT(&s->sdhost.sdbus), &error_abort);
> object_property_set_bool(OBJECT(&s->gpio), true, "realized", &err);
> if (err) {
> error_propagate(errp, err);
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH 04/11] sdbus: add sdbus_create_bus() to replace qbus_create_inplace()
2017-12-13 20:44 ` [Qemu-devel] [PATCH 04/11] sdbus: add sdbus_create_bus() to replace qbus_create_inplace() Philippe Mathieu-Daudé
@ 2017-12-15 1:02 ` Alistair Francis
0 siblings, 0 replies; 17+ messages in thread
From: Alistair Francis @ 2017-12-15 1:02 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Sai Pavan Boddu, Peter Crosthwaite,
open list:ARM, qemu-devel@nongnu.org Developers
On Wed, Dec 13, 2017 at 12:44 PM, Philippe Mathieu-Daudé
<f4bug@amsat.org> wrote:
> A "bus-name" property can be use to change the default SDHCI "sd-bus" name.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> include/hw/sd/sd.h | 1 +
> include/hw/sd/sdhci.h | 3 ++-
> hw/arm/bcm2835_peripherals.c | 2 +-
> hw/sd/core.c | 5 +++++
> hw/sd/sdhci.c | 36 ++++++++++++++++++++----------------
> 5 files changed, 29 insertions(+), 18 deletions(-)
>
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index f6994e61f2..dc9d697c12 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -51,6 +51,7 @@ struct SDBus {
> };
>
> /* Functions to be used by qdevified callers */
> +SDBus *sdbus_create_bus(DeviceState *parent, const char *name);
> int sdbus_do_command(SDBus *sd, SDRequest *req, uint8_t *response);
> void sdbus_write_data(SDBus *sd, uint8_t value);
> uint8_t sdbus_read_data(SDBus *sd);
> diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
> index e6644e6e7d..579e0ea644 100644
> --- a/include/hw/sd/sdhci.h
> +++ b/include/hw/sd/sdhci.h
> @@ -39,7 +39,8 @@ typedef struct SDHCIState {
> };
>
> /*< public >*/
> - SDBus sdbus;
> + char *bus_name;
> + SDBus *sdbus;
> MemoryRegion iomem;
> MemoryRegion *dma_mr;
> AddressSpace dma_as;
> diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
> index 7f30f19c4c..60a0eec4d1 100644
> --- a/hw/arm/bcm2835_peripherals.c
> +++ b/hw/arm/bcm2835_peripherals.c
> @@ -310,7 +310,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>
> /* GPIO */
> object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhci",
> - OBJECT(&s->sdhci.sdbus), &error_abort);
> + OBJECT(s->sdhci.sdbus), &error_abort);
> object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhost",
> OBJECT(&s->sdhost.sdbus), &error_abort);
> object_property_set_bool(OBJECT(&s->gpio), true, "realized", &err);
> diff --git a/hw/sd/core.c b/hw/sd/core.c
> index eda595973b..021a8d7258 100644
> --- a/hw/sd/core.c
> +++ b/hw/sd/core.c
> @@ -187,3 +187,8 @@ static void sd_bus_register_types(void)
> }
>
> type_init(sd_bus_register_types)
> +
> +SDBus *sdbus_create_bus(DeviceState *parent, const char *name)
> +{
> + return SD_BUS(qbus_create(TYPE_SD_BUS, parent, name));
> +}
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index 5f8064c59b..40596f6ebe 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -186,8 +186,8 @@ static void sdhci_reset(SDHCIState *s)
> memset(&s->sdmasysad, 0, (uintptr_t)&s->capareg - (uintptr_t)&s->sdmasysad);
>
> /* Reset other state based on current card insertion/readonly status */
> - sdhci_set_inserted(dev, sdbus_get_inserted(&s->sdbus));
> - sdhci_set_readonly(dev, sdbus_get_readonly(&s->sdbus));
> + sdhci_set_inserted(dev, sdbus_get_inserted(s->sdbus));
> + sdhci_set_readonly(dev, sdbus_get_readonly(s->sdbus));
>
> s->data_count = 0;
> s->stopped_state = sdhc_not_stopped;
> @@ -223,7 +223,7 @@ static void sdhci_send_command(SDHCIState *s)
> request.arg = s->argument;
>
> trace_sdhci_send_command(request.cmd, request.arg);
> - rlen = sdbus_do_command(&s->sdbus, &request, response);
> + rlen = sdbus_do_command(s->sdbus, &request, response);
>
> if (s->cmdreg & SDHC_CMD_RESPONSE) {
> if (rlen == 4) {
> @@ -278,7 +278,7 @@ static void sdhci_end_transfer(SDHCIState *s)
> request.cmd = 0x0C;
> request.arg = 0;
> trace_sdhci_end_transfer(request.cmd, request.arg);
> - sdbus_do_command(&s->sdbus, &request, response);
> + sdbus_do_command(s->sdbus, &request, response);
> /* Auto CMD12 response goes to the upper Response register */
> s->rspreg[3] = (response[0] << 24) | (response[1] << 16) |
> (response[2] << 8) | response[3];
> @@ -310,7 +310,7 @@ static void sdhci_read_block_from_card(SDHCIState *s)
> }
>
> for (index = 0; index < (s->blksize & 0x0fff); index++) {
> - s->fifo_buffer[index] = sdbus_read_data(&s->sdbus);
> + s->fifo_buffer[index] = sdbus_read_data(s->sdbus);
> }
>
> /* New data now available for READ through Buffer Port Register */
> @@ -402,7 +402,7 @@ static void sdhci_write_block_to_card(SDHCIState *s)
> }
>
> for (index = 0; index < (s->blksize & 0x0fff); index++) {
> - sdbus_write_data(&s->sdbus, s->fifo_buffer[index]);
> + sdbus_write_data(s->sdbus, s->fifo_buffer[index]);
> }
>
> /* Next data can be written through BUFFER DATORT register */
> @@ -488,7 +488,7 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
> while (s->blkcnt) {
> if (s->data_count == 0) {
> for (n = 0; n < block_size; n++) {
> - s->fifo_buffer[n] = sdbus_read_data(&s->sdbus);
> + s->fifo_buffer[n] = sdbus_read_data(s->sdbus);
> }
> }
> begin = s->data_count;
> @@ -529,7 +529,7 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
> s->sdmasysad += s->data_count - begin;
> if (s->data_count == block_size) {
> for (n = 0; n < block_size; n++) {
> - sdbus_write_data(&s->sdbus, s->fifo_buffer[n]);
> + sdbus_write_data(s->sdbus, s->fifo_buffer[n]);
> }
> s->data_count = 0;
> if (s->trnmod & SDHC_TRNS_BLK_CNT_EN) {
> @@ -560,7 +560,7 @@ static void sdhci_sdma_transfer_single_block(SDHCIState *s)
>
> if (s->trnmod & SDHC_TRNS_READ) {
> for (n = 0; n < datacnt; n++) {
> - s->fifo_buffer[n] = sdbus_read_data(&s->sdbus);
> + s->fifo_buffer[n] = sdbus_read_data(s->sdbus);
> }
> dma_memory_write(&address_space_memory, s->sdmasysad, s->fifo_buffer,
> datacnt);
> @@ -568,7 +568,7 @@ static void sdhci_sdma_transfer_single_block(SDHCIState *s)
> dma_memory_read(&address_space_memory, s->sdmasysad, s->fifo_buffer,
> datacnt);
> for (n = 0; n < datacnt; n++) {
> - sdbus_write_data(&s->sdbus, s->fifo_buffer[n]);
> + sdbus_write_data(s->sdbus, s->fifo_buffer[n]);
> }
> }
> s->blkcnt--;
> @@ -659,7 +659,7 @@ static void sdhci_do_adma(SDHCIState *s)
> while (length) {
> if (s->data_count == 0) {
> for (n = 0; n < block_size; n++) {
> - s->fifo_buffer[n] = sdbus_read_data(&s->sdbus);
> + s->fifo_buffer[n] = sdbus_read_data(s->sdbus);
> }
> }
> begin = s->data_count;
> @@ -700,7 +700,7 @@ static void sdhci_do_adma(SDHCIState *s)
> dscr.addr += s->data_count - begin;
> if (s->data_count == block_size) {
> for (n = 0; n < block_size; n++) {
> - sdbus_write_data(&s->sdbus, s->fifo_buffer[n]);
> + sdbus_write_data(s->sdbus, s->fifo_buffer[n]);
> }
> s->data_count = 0;
> if (s->trnmod & SDHC_TRNS_BLK_CNT_EN) {
> @@ -807,7 +807,7 @@ static void sdhci_data_transfer(void *opaque)
> break;
> }
> } else {
> - if ((s->trnmod & SDHC_TRNS_READ) && sdbus_data_ready(&s->sdbus)) {
> + if ((s->trnmod & SDHC_TRNS_READ) && sdbus_data_ready(s->sdbus)) {
> s->prnsts |= SDHC_DOING_READ | SDHC_DATA_INHIBIT |
> SDHC_DAT_LINE_ACTIVE;
> sdhci_read_block_from_card(s);
> @@ -1156,15 +1156,14 @@ static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
>
> static void sdhci_initfn(SDHCIState *s)
> {
> - qbus_create_inplace(&s->sdbus, sizeof(s->sdbus),
> - TYPE_SDHCI_BUS, DEVICE(s), "sd-bus");
Isn't "sd-bus" here the name? Can't you just move this line to realize
and pass the string in there?
Alistair
> -
> s->insert_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_raise_insertion_irq, s);
> s->transfer_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_data_transfer, s);
> }
>
> static void sdhci_realizefn(SDHCIState *s, Error **errp)
> {
> + const char *name = s->bus_name ? s->bus_name : "sd-bus";
> +
> sdhci_init_capareg(s, errp);
>
> s->buf_maxsz = sdhci_get_fifolen(s);
> @@ -1177,10 +1176,14 @@ static void sdhci_realizefn(SDHCIState *s, Error **errp)
> address_space_init(&s->dma_as,
> s->dma_mr ? s->dma_mr : get_system_memory(),
> "sdhci-dma");
> +
> + s->sdbus = sdbus_create_bus(DEVICE(s), name);
> }
>
> static void sdhci_unrealizefn(SDHCIState *s, Error **errp)
> {
> + g_free(s->sdbus);
> +
> if (s->dma_mr) {
> address_space_destroy(&s->dma_as);
> object_unparent(OBJECT(&s->dma_mr));
> @@ -1269,6 +1272,7 @@ static Property sdhci_properties[] = {
> false),
> DEFINE_PROP_LINK("dma-memory", SDHCIState, dma_mr,
> TYPE_MEMORY_REGION, MemoryRegion *),
> + DEFINE_PROP_STRING("sd-bus-name", SDHCIState, bus_name),
> DEFINE_PROP_END_OF_LIST(),
> };
>
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH 05/11] sdbus: add sdbus_create_slave()
2017-12-13 20:44 ` [Qemu-devel] [PATCH 05/11] sdbus: add sdbus_create_slave() Philippe Mathieu-Daudé
@ 2017-12-15 1:03 ` Alistair Francis
0 siblings, 0 replies; 17+ messages in thread
From: Alistair Francis @ 2017-12-15 1:03 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Sai Pavan Boddu, Peter Crosthwaite,
qemu-devel@nongnu.org Developers
On Wed, Dec 13, 2017 at 12:44 PM, Philippe Mathieu-Daudé
<f4bug@amsat.org> wrote:
> The slave qdev is created connected to the parent SDBus.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> include/hw/sd/sd.h | 2 ++
> hw/sd/core.c | 14 ++++++++++++++
> 2 files changed, 16 insertions(+)
>
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index dc9d697c12..d402231724 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -52,6 +52,8 @@ struct SDBus {
>
> /* Functions to be used by qdevified callers */
> SDBus *sdbus_create_bus(DeviceState *parent, const char *name);
> +DeviceState *sdbus_create_slave(SDBus *bus, const char *name);
> +DeviceState *sdbus_create_slave_no_init(SDBus *bus, const char *name);
> int sdbus_do_command(SDBus *sd, SDRequest *req, uint8_t *response);
> void sdbus_write_data(SDBus *sd, uint8_t value);
> uint8_t sdbus_read_data(SDBus *sd);
> diff --git a/hw/sd/core.c b/hw/sd/core.c
> index 021a8d7258..fc9ccfedb2 100644
> --- a/hw/sd/core.c
> +++ b/hw/sd/core.c
> @@ -188,6 +188,20 @@ static void sd_bus_register_types(void)
>
> type_init(sd_bus_register_types)
>
> +DeviceState *sdbus_create_slave_no_init(SDBus *bus, const char *name)
> +{
> + assert(bus);
> + return qdev_create(BUS(bus), name);
> +}
> +
> +DeviceState *sdbus_create_slave(SDBus *bus, const char *name)
> +{
> + DeviceState *dev = sdbus_create_slave_no_init(bus, name);
> +
> + qdev_init_nofail(dev);
> + return dev;
> +}
This looks un-QOM which I thought we are trying to get away from.
Alistair
> +
> SDBus *sdbus_create_bus(DeviceState *parent, const char *name)
> {
> return SD_BUS(qbus_create(TYPE_SD_BUS, parent, name));
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH 06/11] sdbus: rename SDCardClass -> SDSlaveClass
2017-12-13 20:44 ` [Qemu-devel] [PATCH 06/11] sdbus: rename SDCardClass -> SDSlaveClass Philippe Mathieu-Daudé
@ 2017-12-15 1:04 ` Alistair Francis
0 siblings, 0 replies; 17+ messages in thread
From: Alistair Francis @ 2017-12-15 1:04 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Sai Pavan Boddu, Peter Crosthwaite,
qemu-devel@nongnu.org Developers
On Wed, Dec 13, 2017 at 12:44 PM, Philippe Mathieu-Daudé
<f4bug@amsat.org> wrote:
> By default a SD bus connect SD cards, however it may accept other SD devices
> like a SDIO device. The current class is not restricted to a SD "Card" device.
> To better reflect this is a SD bus slave, simply rename it.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Acked-by: Alistair Francis <alistair.francis@xilinx.com>
Alistair
> ---
> hw/sd/sd-internal.h | 10 +++++-----
> hw/sd/core.c | 16 ++++++++--------
> hw/sd/sd.c | 4 ++--
> 3 files changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/hw/sd/sd-internal.h b/hw/sd/sd-internal.h
> index afd5dbf194..85a747ea64 100644
> --- a/hw/sd/sd-internal.h
> +++ b/hw/sd/sd-internal.h
> @@ -66,10 +66,10 @@ typedef enum {
>
> typedef struct SDState SDState;
>
> -#define SD_CARD_CLASS(klass) \
> - OBJECT_CLASS_CHECK(SDCardClass, (klass), TYPE_SD_CARD)
> -#define SD_CARD_GET_CLASS(obj) \
> - OBJECT_GET_CLASS(SDCardClass, (obj), TYPE_SD_CARD)
> +#define SDBUS_SLAVE_CLASS(klass) \
> + OBJECT_CLASS_CHECK(SDSlaveClass, (klass), TYPE_SD_CARD)
> +#define SDBUS_SLAVE_GET_CLASS(obj) \
> + OBJECT_GET_CLASS(SDSlaveClass, (obj), TYPE_SD_CARD)
>
> typedef struct {
> /*< private >*/
> @@ -83,7 +83,7 @@ typedef struct {
> void (*enable)(SDState *sd, bool enable);
> bool (*get_inserted)(SDState *sd);
> bool (*get_readonly)(SDState *sd);
> -} SDCardClass;
> +} SDSlaveClass;
>
> #define SD_BUS_CLASS(klass) OBJECT_CLASS_CHECK(SDBusClass, (klass), TYPE_SD_BUS)
> #define SD_BUS_GET_CLASS(obj) OBJECT_GET_CLASS(SDBusClass, (obj), TYPE_SD_BUS)
> diff --git a/hw/sd/core.c b/hw/sd/core.c
> index fc9ccfedb2..cd5b531cfa 100644
> --- a/hw/sd/core.c
> +++ b/hw/sd/core.c
> @@ -49,7 +49,7 @@ int sdbus_do_command(SDBus *sdbus, SDRequest *req, uint8_t *response)
>
> trace_sdbus_command(sdbus_name(sdbus), req->cmd, req->arg, req->crc);
> if (card) {
> - SDCardClass *sc = SD_CARD_GET_CLASS(card);
> + SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
>
> sz = sc->do_command(card, req, response);
> hexbuf = qemu_hexbuf_strdup(response, sz, NULL, "resp: ");
> @@ -67,7 +67,7 @@ void sdbus_write_data(SDBus *sdbus, uint8_t value)
>
> trace_sdbus_write(sdbus_name(sdbus), value);
> if (card) {
> - SDCardClass *sc = SD_CARD_GET_CLASS(card);
> + SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
>
> sc->write_data(card, value);
> }
> @@ -79,7 +79,7 @@ uint8_t sdbus_read_data(SDBus *sdbus)
> uint8_t value = 0;
>
> if (card) {
> - SDCardClass *sc = SD_CARD_GET_CLASS(card);
> + SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
>
> value = sc->read_data(card);
> }
> @@ -93,7 +93,7 @@ bool sdbus_data_ready(SDBus *sdbus)
> SDState *card = get_card(sdbus);
>
> if (card) {
> - SDCardClass *sc = SD_CARD_GET_CLASS(card);
> + SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
>
> return sc->data_ready(card);
> }
> @@ -106,7 +106,7 @@ bool sdbus_get_inserted(SDBus *sdbus)
> SDState *card = get_card(sdbus);
>
> if (card) {
> - SDCardClass *sc = SD_CARD_GET_CLASS(card);
> + SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
>
> return sc->get_inserted(card);
> }
> @@ -119,7 +119,7 @@ bool sdbus_get_readonly(SDBus *sdbus)
> SDState *card = get_card(sdbus);
>
> if (card) {
> - SDCardClass *sc = SD_CARD_GET_CLASS(card);
> + SDSlaveClass *sc = SDBUS_SLAVE_GET_CLASS(card);
>
> return sc->get_readonly(card);
> }
> @@ -150,7 +150,7 @@ void sdbus_set_readonly(SDBus *sdbus, bool readonly)
> void sdbus_reparent_card(SDBus *from, SDBus *to)
> {
> SDState *card = get_card(from);
> - SDCardClass *sc;
> + SDSlaveClass *sc;
> bool readonly;
>
> /* We directly reparent the card object rather than implementing this
> @@ -165,7 +165,7 @@ void sdbus_reparent_card(SDBus *from, SDBus *to)
> return;
> }
>
> - sc = SD_CARD_GET_CLASS(card);
> + sc = SDBUS_SLAVE_GET_CLASS(card);
> readonly = sc->get_readonly(card);
>
> sdbus_set_inserted(from, false);
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 9b7dee2ec4..97046df5c3 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1917,7 +1917,7 @@ static Property sd_properties[] = {
> static void sd_class_init(ObjectClass *klass, void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
> - SDCardClass *sc = SD_CARD_CLASS(klass);
> + SDSlaveClass *sc = SDBUS_SLAVE_CLASS(klass);
>
> dc->realize = sd_realize;
> dc->props = sd_properties;
> @@ -1938,7 +1938,7 @@ static const TypeInfo sd_info = {
> .name = TYPE_SD_CARD,
> .parent = TYPE_DEVICE,
> .instance_size = sizeof(SDState),
> - .class_size = sizeof(SDCardClass),
> + .class_size = sizeof(SDSlaveClass),
> .class_init = sd_class_init,
> .instance_init = sd_instance_init,
> .instance_finalize = sd_instance_finalize,
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [PATCH 07/11] sdbus: add a SD_BUS_SLAVE interface
2017-12-13 20:44 ` [Qemu-devel] [PATCH 07/11] sdbus: add a SD_BUS_SLAVE interface Philippe Mathieu-Daudé
@ 2017-12-20 17:31 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-12-20 17:31 UTC (permalink / raw)
To: Alistair Francis, Edgar E . Iglesias, Prasad J Pandit,
Peter Maydell, Andrew Baumann, Andrey Smirnov, Andrey Yurovsky,
Clement Deschamps, Marc-André Lureau, Igor Mammedov,
Eduardo Habkost
Cc: Philippe Mathieu-Daudé, qemu-devel@nongnu.org Developers,
Peter Crosthwaite, Sai Pavan Boddu
On Wed, Dec 13, 2017 at 5:44 PM, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Devices implementing this interface can be (hot-)plugged to a SD bus.
>
> The sdcard device is currently the unique implementation.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> hw/sd/sd-internal.h | 5 +++--
> hw/sd/core.c | 7 +++++++
> hw/sd/sd.c | 4 ++++
> 3 files changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/hw/sd/sd-internal.h b/hw/sd/sd-internal.h
> index 85a747ea64..4576d2f8a8 100644
> --- a/hw/sd/sd-internal.h
> +++ b/hw/sd/sd-internal.h
> @@ -66,10 +66,11 @@ typedef enum {
>
> typedef struct SDState SDState;
>
> +#define TYPE_SD_BUS_SLAVE_INTERFACE "sd-bus-slave"
> #define SDBUS_SLAVE_CLASS(klass) \
> - OBJECT_CLASS_CHECK(SDSlaveClass, (klass), TYPE_SD_CARD)
> + OBJECT_CLASS_CHECK(SDSlaveClass, (klass), TYPE_SD_BUS_SLAVE_INTERFACE)
> #define SDBUS_SLAVE_GET_CLASS(obj) \
> - OBJECT_GET_CLASS(SDSlaveClass, (obj), TYPE_SD_CARD)
> + OBJECT_GET_CLASS(SDSlaveClass, (obj), TYPE_SD_BUS_SLAVE_INTERFACE)
>
> typedef struct {
> /*< private >*/
> diff --git a/hw/sd/core.c b/hw/sd/core.c
> index cd5b531cfa..dc1571befc 100644
> --- a/hw/sd/core.c
> +++ b/hw/sd/core.c
> @@ -181,9 +181,16 @@ static const TypeInfo sd_bus_info = {
> .class_size = sizeof(SDBusClass),
> };
>
> +static const TypeInfo sd_slave_info = {
> + .name = TYPE_SD_BUS_SLAVE_INTERFACE,
> + .parent = TYPE_INTERFACE,
> + .class_size = sizeof(SDBusClass),
I used the wrong class! the fixed patch will have:
.class_size = sizeof(SDSlaveClass),
> +};
> +
> static void sd_bus_register_types(void)
> {
> type_register_static(&sd_bus_info);
> + type_register_static(&sd_slave_info);
> }
>
> type_init(sd_bus_register_types)
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 97046df5c3..8e12b07ee4 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1942,6 +1942,10 @@ static const TypeInfo sd_info = {
> .class_init = sd_class_init,
> .instance_init = sd_instance_init,
> .instance_finalize = sd_instance_finalize,
> + .interfaces = (InterfaceInfo[]) {
> + { TYPE_SD_BUS_SLAVE_INTERFACE },
> + { },
> + },
> };
>
> static void sd_register_types(void)
> --
> 2.15.1
>
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2017-12-20 17:31 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-12-13 20:44 [Qemu-devel] [PATCH 00/11] QOM'ify SDBus, housekeeping Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [RFC PATCH 01/11] util/cutils: add qemu_hexbuf_strdup(), yet another hexdump() Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 02/11] bcm2835_peripherals: move GPIO 'sdbus' property link from init() -> realize() Philippe Mathieu-Daudé
2017-12-15 0:58 ` Alistair Francis
2017-12-13 20:44 ` [Qemu-devel] [PATCH 03/11] sdbus: add trace events Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 04/11] sdbus: add sdbus_create_bus() to replace qbus_create_inplace() Philippe Mathieu-Daudé
2017-12-15 1:02 ` Alistair Francis
2017-12-13 20:44 ` [Qemu-devel] [PATCH 05/11] sdbus: add sdbus_create_slave() Philippe Mathieu-Daudé
2017-12-15 1:03 ` Alistair Francis
2017-12-13 20:44 ` [Qemu-devel] [PATCH 06/11] sdbus: rename SDCardClass -> SDSlaveClass Philippe Mathieu-Daudé
2017-12-15 1:04 ` Alistair Francis
2017-12-13 20:44 ` [Qemu-devel] [PATCH 07/11] sdbus: add a SD_BUS_SLAVE interface Philippe Mathieu-Daudé
2017-12-20 17:31 ` Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 08/11] sdbus: add a SD_BUS_MASTER interface Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 09/11] sdhci: implement the " Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 10/11] hw/sd/pxa2xx: " Philippe Mathieu-Daudé
2017-12-13 20:44 ` [Qemu-devel] [PATCH 11/11] hw/arm/xilinx_zynq: use sdbus_create_slave() to name the different SD busses Philippe Mathieu-Daudé
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).