On 6/28/24 9:01 AM, Philippe Mathieu-Daudé wrote:
> All commands switching from TRANSFER state to (receiving)DATA
> do the same: receive stream of data from the DAT lines. Instead
> of duplicating the same code many times, introduce 2 helpers:
> - sd_cmd_to_receivingdata() on the I/O line setup the data to
> be received on the data[] buffer,
> - sd_generic_write_byte() on the DAT lines to push the data.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Thanks,
C.
> ---
> hw/sd/sd.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index cd308e9a89..690a3f275e 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1100,6 +1100,22 @@ static sd_rsp_type_t sd_cmd_unimplemented(SDState *sd, SDRequest req)
> return sd_illegal;
> }
>
> +/* Configure fields for following sd_generic_write_byte() calls */
> +__attribute__((unused))
> +static sd_rsp_type_t sd_cmd_to_receivingdata(SDState *sd, SDRequest req,
> + uint64_t start, size_t size)
> +{
> + if (sd->state != sd_transfer_state) {
> + return sd_invalid_state_for_cmd(sd, req);
> + }
> + sd->state = sd_receivingdata_state;
> + sd->data_start = start;
> + sd->data_offset = 0;
> + /* sd->data[] used as receive buffer */
> + sd->data_size = size ?: sizeof(sd->data);
> + return sd_r1;
> +}
> +
> /* Configure fields for following sd_generic_read_byte() calls */
> static sd_rsp_type_t sd_cmd_to_sendingdata(SDState *sd, SDRequest req,
> uint64_t start,
> @@ -1953,6 +1969,19 @@ send_response:
> return rsplen;
> }
>
> +/* Return true if buffer is consumed. Configured by sd_cmd_to_receivingdata() */
> +__attribute__((unused))
> +static bool sd_generic_write_byte(SDState *sd, uint8_t value)
> +{
> + sd->data[sd->data_offset] = value;
> +
> + if (++sd->data_offset >= sd->data_size) {
> + sd->state = sd_transfer_state;
> + return true;
> + }
> + return false;
> +}
> +
> /* Return true when buffer is consumed. Configured by sd_cmd_to_sendingdata() */
> static bool sd_generic_read_byte(SDState *sd, uint8_t *value)
> {