Message ID | 20240628070216.92609-48-philmd@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/sd/sdcard: Add eMMC support | expand |
On 6/28/24 9:01 AM, Philippe Mathieu-Daudé wrote: > From: Philippe Mathieu-Daudé <f4bug@amsat.org> > > Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > 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, 17 insertions(+), 12 deletions(-) > > diff --git a/hw/sd/sd.c b/hw/sd/sd.c > index e4941cfdab..61c9aff2fb 100644 > --- a/hw/sd/sd.c > +++ b/hw/sd/sd.c > @@ -240,7 +240,7 @@ static const char *sd_response_name(sd_rsp_type_t rsp) > static const char *sd_cmd_name(SDState *sd, uint8_t cmd) > { > static const char *cmd_abbrev[SDMMC_CMD_MAX] = { > - [6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD", > + [7] = "SELECT/DESELECT_CARD", > [8] = "SEND_IF_COND", [9] = "SEND_CSD", > [10] = "SEND_CID", > [12] = "STOP_TRANSMISSION", [13] = "SEND_STATUS", > @@ -1244,6 +1244,20 @@ static sd_rsp_type_t sd_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req) > } > } > > +/* CMD6 */ > +static sd_rsp_type_t sd_cmd_SWITCH_FUNCTION(SDState *sd, SDRequest req) > +{ > + if (sd->mode != sd_data_transfer_mode) { > + return sd_invalid_mode_for_cmd(sd, req); > + } > + if (sd->state != sd_transfer_state) { > + return sd_invalid_state_for_cmd(sd, req); > + } > + > + sd_function_switch(sd, req.arg); > + return sd_cmd_to_sendingdata(sd, req, 0, NULL, 64); > +} > + > /* CMD19 */ > static sd_rsp_type_t sd_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req) > { > @@ -1310,17 +1324,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) > > switch (req.cmd) { > /* Basic commands (Class 0 and Class 1) */ > - case 6: /* CMD6: SWITCH_FUNCTION */ > - if (sd->mode != sd_data_transfer_mode) { > - return sd_invalid_mode_for_cmd(sd, req); > - } > - if (sd->state != sd_transfer_state) { > - return sd_invalid_state_for_cmd(sd, req); > - } > - > - sd_function_switch(sd, req.arg); > - return sd_cmd_to_sendingdata(sd, req, 0, NULL, 64); > - > case 7: /* CMD7: SELECT/DESELECT_CARD */ > rca = sd_req_get_rca(sd, req); > switch (sd->state) { > @@ -2266,6 +2269,7 @@ static const SDProto sd_proto_spi = { > [0] = {0, sd_spi, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE}, > [1] = {0, sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND}, > [5] = {9, sd_spi, "IO_SEND_OP_COND", sd_cmd_optional}, > + [6] = {10, sd_spi, "SWITCH_FUNCTION", sd_cmd_SWITCH_FUNCTION}, > [34] = {10, sd_spi, "READ_SEC_CMD", sd_cmd_optional}, > [35] = {10, sd_spi, "WRITE_SEC_CMD", sd_cmd_optional}, > [36] = {10, sd_spi, "SEND_PSI", sd_cmd_optional}, > @@ -2288,6 +2292,7 @@ static const SDProto sd_proto_sd = { > [3] = {0, sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR}, > [4] = {0, sd_bc, "SEND_DSR", sd_cmd_unimplemented}, > [5] = {9, sd_bc, "IO_SEND_OP_COND", sd_cmd_optional}, > + [6] = {10, sd_adtc, "SWITCH_FUNCTION", sd_cmd_SWITCH_FUNCTION}, > [11] = {0, sd_ac, "VOLTAGE_SWITCH", sd_cmd_optional}, > [19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK}, > [20] = {2, sd_ac, "SPEED_CLASS_CONTROL", sd_cmd_optional},
diff --git a/hw/sd/sd.c b/hw/sd/sd.c index e4941cfdab..61c9aff2fb 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -240,7 +240,7 @@ static const char *sd_response_name(sd_rsp_type_t rsp) static const char *sd_cmd_name(SDState *sd, uint8_t cmd) { static const char *cmd_abbrev[SDMMC_CMD_MAX] = { - [6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD", + [7] = "SELECT/DESELECT_CARD", [8] = "SEND_IF_COND", [9] = "SEND_CSD", [10] = "SEND_CID", [12] = "STOP_TRANSMISSION", [13] = "SEND_STATUS", @@ -1244,6 +1244,20 @@ static sd_rsp_type_t sd_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req) } } +/* CMD6 */ +static sd_rsp_type_t sd_cmd_SWITCH_FUNCTION(SDState *sd, SDRequest req) +{ + if (sd->mode != sd_data_transfer_mode) { + return sd_invalid_mode_for_cmd(sd, req); + } + if (sd->state != sd_transfer_state) { + return sd_invalid_state_for_cmd(sd, req); + } + + sd_function_switch(sd, req.arg); + return sd_cmd_to_sendingdata(sd, req, 0, NULL, 64); +} + /* CMD19 */ static sd_rsp_type_t sd_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req) { @@ -1310,17 +1324,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req) switch (req.cmd) { /* Basic commands (Class 0 and Class 1) */ - case 6: /* CMD6: SWITCH_FUNCTION */ - if (sd->mode != sd_data_transfer_mode) { - return sd_invalid_mode_for_cmd(sd, req); - } - if (sd->state != sd_transfer_state) { - return sd_invalid_state_for_cmd(sd, req); - } - - sd_function_switch(sd, req.arg); - return sd_cmd_to_sendingdata(sd, req, 0, NULL, 64); - case 7: /* CMD7: SELECT/DESELECT_CARD */ rca = sd_req_get_rca(sd, req); switch (sd->state) { @@ -2266,6 +2269,7 @@ static const SDProto sd_proto_spi = { [0] = {0, sd_spi, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE}, [1] = {0, sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND}, [5] = {9, sd_spi, "IO_SEND_OP_COND", sd_cmd_optional}, + [6] = {10, sd_spi, "SWITCH_FUNCTION", sd_cmd_SWITCH_FUNCTION}, [34] = {10, sd_spi, "READ_SEC_CMD", sd_cmd_optional}, [35] = {10, sd_spi, "WRITE_SEC_CMD", sd_cmd_optional}, [36] = {10, sd_spi, "SEND_PSI", sd_cmd_optional}, @@ -2288,6 +2292,7 @@ static const SDProto sd_proto_sd = { [3] = {0, sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR}, [4] = {0, sd_bc, "SEND_DSR", sd_cmd_unimplemented}, [5] = {9, sd_bc, "IO_SEND_OP_COND", sd_cmd_optional}, + [6] = {10, sd_adtc, "SWITCH_FUNCTION", sd_cmd_SWITCH_FUNCTION}, [11] = {0, sd_ac, "VOLTAGE_SWITCH", sd_cmd_optional}, [19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK}, [20] = {2, sd_ac, "SPEED_CLASS_CONTROL", sd_cmd_optional},