qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [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).