On 12/5/26 08:21, Philippe Mathieu-Daudé wrote:
From: Christian Speich <[email protected]>

Paths that use sd_generic_write/read_data can now write/read multiple
bytes with one call.

Signed-off-by: Christian Speich <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Message-ID: <[email protected]>
Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
  hw/sd/sd.c | 62 ++++++++++++++++++++++++++++++------------------------
  1 file changed, 35 insertions(+), 27 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index c0b89735f69..b49b83b96e8 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1610,7 +1610,7 @@ static sd_rsp_type_t sd_cmd_optional(SDState *sd, 
SDRequest req)
      return sd_illegal;
  }
-/* Configure fields for following sd_generic_write_byte() calls */
+/* Configure fields for following sd_generic_write_data() calls */
  static sd_rsp_type_t sd_cmd_to_receivingdata(SDState *sd, SDRequest req,
                                               uint64_t start, size_t size)
  {
@@ -1625,7 +1625,7 @@ static sd_rsp_type_t sd_cmd_to_receivingdata(SDState *sd, 
SDRequest req,
      return sd_r1;
  }
-/* Configure fields for following sd_generic_read_byte() calls */
+/* Configure fields for following sd_generic_read_data() calls */
  static sd_rsp_type_t sd_cmd_to_sendingdata(SDState *sd, SDRequest req,
                                             uint64_t start,
                                             const void *data, size_t size)
@@ -2615,11 +2615,15 @@ send_response:
  }
/* Return true if buffer is consumed. Configured by sd_cmd_to_receivingdata() */
-static bool sd_generic_write_byte(SDState *sd, uint8_t value)
+static bool sd_generic_write_data(SDState *sd, const void *buf, size_t *len)
  {
-    sd->data[sd->data_offset] = value;
+    size_t to_write = MIN(sd->data_size - sd->data_offset, *len);
- if (++sd->data_offset >= sd->data_size) {
+    memcpy(sd->data, buf, to_write);

Always writing beginning of buffer.

+    sd->data_offset += to_write;
+    *len = to_write;
+
+    if (sd->data_offset >= sd->data_size) {
          sd->state = sd_transfer_state;
          return true;
      }
@@ -2627,11 +2631,15 @@ static bool sd_generic_write_byte(SDState *sd, uint8_t 
value)
  }
/* Return true when buffer is consumed. Configured by sd_cmd_to_sendingdata() */
-static bool sd_generic_read_byte(SDState *sd, uint8_t *value)
+static bool sd_generic_read_data(SDState *sd, void *buf, size_t *len)
  {
-    *value = sd->data[sd->data_offset];
+    size_t to_read = MIN(sd->data_size - sd->data_offset, *len);
- if (++sd->data_offset >= sd->data_size) {
+    memcpy(buf, sd->data, to_read);

Always reading beginning of buffer.

+    sd->data_offset += to_read;
+    *len = to_read;
+
+    if (sd->data_offset >= sd->data_size) {
          sd->state = sd_transfer_state;
          return true;
      }

Squashing:

-- >8 --
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index b49b83b96e8..11f6b91576a 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2619,7 +2619,7 @@ static bool sd_generic_write_data(SDState *sd, const void *buf, size_t *len)
 {
     size_t to_write = MIN(sd->data_size - sd->data_offset, *len);

-    memcpy(sd->data, buf, to_write);
+    memcpy(&sd->data[sd->data_offset], buf, to_write);
     sd->data_offset += to_write;
     *len = to_write;

@@ -2635,7 +2635,7 @@ static bool sd_generic_read_data(SDState *sd, void *buf, size_t *len)
 {
     size_t to_read = MIN(sd->data_size - sd->data_offset, *len);

-    memcpy(buf, sd->data, to_read);
+    memcpy(buf, &sd->data[sd->data_offset], to_read);
     sd->data_offset += to_read;
     *len = to_read;

---

Reply via email to