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;
> 
> ---
> 

Reply via email to