Hey Phil,
On Tue, May 12, 2026 at 10:37:34PM +0200, Philippe Mathieu-Daudé wrote:
> 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.
Oh, good find! Thanks!
I see that only 3 of 7 patches from my series made it into this PULL, are there
any
problems with the others I can help with?
Greetings,
Christian
>
> > + 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;
>
> ---
>