* [PATCH v2 00/25] hw/sd: Rework models for eMMC support
@ 2022-05-30 19:37 Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 01/25] hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01 Philippe Mathieu-Daudé
` (26 more replies)
0 siblings, 27 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:37 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Rebase/respin of Cédric RFC:
https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
(sorry it took me so long guys...)
Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
I plan to queue patches 1-12 via sdmmc-next later this week.
Cédric, if you are happy with this series, it should be easy to rebase
your other patches on top and address the comments I left on the RFC :)
Regards,
Phil.
Cédric Le Goater (6):
hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler
hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler
hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler
hw/sd: Add sd_emmc_cmd_APP_CMD() handler
hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler
hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler
Joel Stanley (4):
hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler
hw/sd: Support boot area in emmc image
hw/sd: Subtract bootarea size from blk
hw/sd: Add boot config support
Philippe Mathieu-Daudé (13):
hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01
hw/sd: When card is in wrong state, log which state it is
hw/sd: When card is in wrong state, log which spec version is used
hw/sd: Move proto_name to SDProto structure
hw/sd: Introduce sd_cmd_handler type
hw/sd: Add sd_cmd_illegal() handler
hw/sd: Add sd_cmd_unimplemented() handler
hw/sd: Add sd_cmd_GO_IDLE_STATE() handler
hw/sd: Add sd_cmd_SEND_OP_CMD() handler
hw/sd: Add sd_cmd_ALL_SEND_CID() handler
hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler
hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler
hw/sd: Basis for eMMC support
Sai Pavan Boddu (2):
hw/sd: Add CMD21 tuning sequence
hw/sd: Add mmc switch function support
hw/sd/sd.c | 645 +++++++++++++++++++++++++++++++++--------
hw/sd/sdmmc-internal.c | 2 +-
hw/sd/sdmmc-internal.h | 97 +++++++
include/hw/sd/sd.h | 7 +
4 files changed, 627 insertions(+), 124 deletions(-)
--
2.36.1
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH v2 01/25] hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
@ 2022-05-30 19:37 ` Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 02/25] hw/sd: When card is in wrong state, log which state it is Philippe Mathieu-Daudé
` (25 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:37 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Bin Meng
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
CMD19 (SEND_TUNING_BLOCK) and CMD23 (SET_BLOCK_COUNT) were
added in the Physical Layer Simplified Specification v3.01.
When earlier spec version is requested, we should return ILLEGAL.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20220509141320.98374-1-philippe.mathieu.daude@gmail.com>
---
hw/sd/sd.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 8e6fa09151..7e3bb12b1a 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1263,7 +1263,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
- break;
+ goto bad_cmd;
}
if (sd->state == sd_transfer_state) {
sd->state = sd_sendingdata_state;
@@ -1274,7 +1274,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
case 23: /* CMD23: SET_BLOCK_COUNT */
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
- break;
+ goto bad_cmd;
}
switch (sd->state) {
case sd_transfer_state:
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 02/25] hw/sd: When card is in wrong state, log which state it is
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 01/25] hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01 Philippe Mathieu-Daudé
@ 2022-05-30 19:37 ` Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 03/25] hw/sd: When card is in wrong state, log which spec version is used Philippe Mathieu-Daudé
` (24 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:37 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Bin Meng
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
We report the card is in an inconsistent state, but don't precise
in which state it is. Add this information, as it is useful when
debugging problems.
Since we will reuse this code, extract as sd_invalid_state_for_cmd()
helper.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20210624142209.1193073-2-f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sd.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 7e3bb12b1a..b0e7a7e6d0 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -966,6 +966,14 @@ static bool address_in_range(SDState *sd, const char *desc,
return true;
}
+static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req)
+{
+ qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s\n",
+ req.cmd, sd_state_name(sd->state));
+
+ return sd_illegal;
+}
+
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
@@ -1534,9 +1542,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
return sd_illegal;
}
- qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s\n",
- req.cmd, sd_state_name(sd->state));
- return sd_illegal;
+ return sd_invalid_state_for_cmd(sd, req);
}
static sd_rsp_type_t sd_app_command(SDState *sd,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 03/25] hw/sd: When card is in wrong state, log which spec version is used
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 01/25] hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01 Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 02/25] hw/sd: When card is in wrong state, log which state it is Philippe Mathieu-Daudé
@ 2022-05-30 19:37 ` Philippe Mathieu-Daudé
2022-05-31 8:01 ` Cédric Le Goater
2022-05-30 19:37 ` [PATCH v2 04/25] hw/sd: Move proto_name to SDProto structure Philippe Mathieu-Daudé
` (23 subsequent siblings)
26 siblings, 1 reply; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:37 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Add the sd_version_str() helper.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index b0e7a7e6d0..b3e61b9f84 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -145,6 +145,19 @@ struct SDState {
static void sd_realize(DeviceState *dev, Error **errp);
+static const char *sd_version_str(enum SDPhySpecificationVersion version)
+{
+ static const char *sdphy_version[] = {
+ [SD_PHY_SPECv1_10_VERS] = "v1.10",
+ [SD_PHY_SPECv2_00_VERS] = "v2.00",
+ [SD_PHY_SPECv3_01_VERS] = "v3.01",
+ };
+ if (version >= ARRAY_SIZE(sdphy_version)) {
+ return "unsupported version";
+ }
+ return sdphy_version[version];
+}
+
static const char *sd_state_name(enum SDCardStates state)
{
static const char *state_name[] = {
@@ -968,8 +981,9 @@ static bool address_in_range(SDState *sd, const char *desc,
static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req)
{
- qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s\n",
- req.cmd, sd_state_name(sd->state));
+ qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s (spec %s)\n",
+ req.cmd, sd_state_name(sd->state),
+ sd_version_str(sd->spec_version));
return sd_illegal;
}
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 04/25] hw/sd: Move proto_name to SDProto structure
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (2 preceding siblings ...)
2022-05-30 19:37 ` [PATCH v2 03/25] hw/sd: When card is in wrong state, log which spec version is used Philippe Mathieu-Daudé
@ 2022-05-30 19:37 ` Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 05/25] hw/sd: Introduce sd_cmd_handler type Philippe Mathieu-Daudé
` (22 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:37 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Bin Meng
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Introduce a new structure to hold the bus protocol specific
fields: SDProto. The first field is the protocol name.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20210624142209.1193073-4-f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sd.c | 35 +++++++++++++++++++++++++++--------
include/hw/sd/sd.h | 2 ++
2 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index b3e61b9f84..953dbbd7ae 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -87,6 +87,10 @@ enum SDCardStates {
sd_disconnect_state,
};
+typedef struct SDProto {
+ const char *name;
+} SDProto;
+
struct SDState {
DeviceState parent_obj;
@@ -137,7 +141,6 @@ struct SDState {
qemu_irq readonly_cb;
qemu_irq inserted_cb;
QEMUTimer *ocr_power_timer;
- const char *proto_name;
bool enable;
uint8_t dat_lines;
bool cmd_line;
@@ -145,6 +148,13 @@ struct SDState {
static void sd_realize(DeviceState *dev, Error **errp);
+static const struct SDProto *sd_proto(SDState *sd)
+{
+ SDCardClass *sc = SD_CARD_GET_CLASS(sd);
+
+ return sc->proto;
+}
+
static const char *sd_version_str(enum SDPhySpecificationVersion version)
{
static const char *sdphy_version[] = {
@@ -981,8 +991,8 @@ static bool address_in_range(SDState *sd, const char *desc,
static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req)
{
- qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s (spec %s)\n",
- req.cmd, sd_state_name(sd->state),
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: CMD%i in a wrong state: %s (spec %s)\n",
+ sd_proto(sd)->name, req.cmd, sd_state_name(sd->state),
sd_version_str(sd->spec_version));
return sd_illegal;
@@ -997,7 +1007,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
* However there is no ACMD55, so we want to trace this particular case.
*/
if (req.cmd != 55 || sd->expecting_acmd) {
- trace_sdcard_normal_command(sd->proto_name,
+ trace_sdcard_normal_command(sd_proto(sd)->name,
sd_cmd_name(req.cmd), req.cmd,
req.arg, sd_state_name(sd->state));
}
@@ -1562,7 +1572,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
static sd_rsp_type_t sd_app_command(SDState *sd,
SDRequest req)
{
- trace_sdcard_app_command(sd->proto_name, sd_acmd_name(req.cmd),
+ trace_sdcard_app_command(sd_proto(sd)->name, sd_acmd_name(req.cmd),
req.cmd, req.arg, sd_state_name(sd->state));
sd->card_status |= APP_CMD;
switch (req.cmd) {
@@ -1856,7 +1866,7 @@ void sd_write_byte(SDState *sd, uint8_t value)
if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
return;
- trace_sdcard_write_data(sd->proto_name,
+ trace_sdcard_write_data(sd_proto(sd)->name,
sd_acmd_name(sd->current_cmd),
sd->current_cmd, value);
switch (sd->current_cmd) {
@@ -2012,7 +2022,7 @@ uint8_t sd_read_byte(SDState *sd)
io_len = (sd->ocr & (1 << 30)) ? 512 : sd->blk_len;
- trace_sdcard_read_data(sd->proto_name,
+ trace_sdcard_read_data(sd_proto(sd)->name,
sd_acmd_name(sd->current_cmd),
sd->current_cmd, io_len);
switch (sd->current_cmd) {
@@ -2131,6 +2141,14 @@ void sd_enable(SDState *sd, bool enable)
sd->enable = enable;
}
+static const SDProto sd_proto_spi = {
+ .name = "SPI",
+};
+
+static const SDProto sd_proto_sd = {
+ .name = "SD",
+};
+
static void sd_instance_init(Object *obj)
{
SDState *sd = SD_CARD(obj);
@@ -2149,9 +2167,10 @@ static void sd_instance_finalize(Object *obj)
static void sd_realize(DeviceState *dev, Error **errp)
{
SDState *sd = SD_CARD(dev);
+ SDCardClass *sc = SD_CARD_GET_CLASS(sd);
int ret;
- sd->proto_name = sd->spi ? "SPI" : "SD";
+ sc->proto = sd->spi ? &sd_proto_spi : &sd_proto_sd;
switch (sd->spec_version) {
case SD_PHY_SPECv1_10_VERS
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 47360ba4ee..0d94e1f346 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -124,6 +124,8 @@ struct SDCardClass {
void (*enable)(SDState *sd, bool enable);
bool (*get_inserted)(SDState *sd);
bool (*get_readonly)(SDState *sd);
+
+ const struct SDProto *proto;
};
#define TYPE_SD_BUS "sd-bus"
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 05/25] hw/sd: Introduce sd_cmd_handler type
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (3 preceding siblings ...)
2022-05-30 19:37 ` [PATCH v2 04/25] hw/sd: Move proto_name to SDProto structure Philippe Mathieu-Daudé
@ 2022-05-30 19:37 ` Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 06/25] hw/sd: Add sd_cmd_illegal() handler Philippe Mathieu-Daudé
` (21 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:37 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Bin Meng
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Add 2 command handler arrays in SDProto, for CMD and ACMD.
Have sd_normal_command() / sd_app_command() use these arrays:
if an command handler is registered, call it, otherwise fall
back to current code base.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20210624142209.1193073-5-f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sd.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 953dbbd7ae..ed63528615 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -87,8 +87,12 @@ enum SDCardStates {
sd_disconnect_state,
};
+typedef sd_rsp_type_t (*sd_cmd_handler)(SDState *sd, SDRequest req);
+
typedef struct SDProto {
const char *name;
+ sd_cmd_handler cmd[SDMMC_CMD_MAX];
+ sd_cmd_handler acmd[SDMMC_CMD_MAX];
} SDProto;
struct SDState {
@@ -1031,6 +1035,10 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
return sd_illegal;
}
+ if (sd_proto(sd)->cmd[req.cmd]) {
+ return sd_proto(sd)->cmd[req.cmd](sd, req);
+ }
+
switch (req.cmd) {
/* Basic commands (Class 0 and Class 1) */
case 0: /* CMD0: GO_IDLE_STATE */
@@ -1575,6 +1583,11 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
trace_sdcard_app_command(sd_proto(sd)->name, sd_acmd_name(req.cmd),
req.cmd, req.arg, sd_state_name(sd->state));
sd->card_status |= APP_CMD;
+
+ if (sd_proto(sd)->acmd[req.cmd]) {
+ return sd_proto(sd)->acmd[req.cmd](sd, req);
+ }
+
switch (req.cmd) {
case 6: /* ACMD6: SET_BUS_WIDTH */
if (sd->spi) {
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 06/25] hw/sd: Add sd_cmd_illegal() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (4 preceding siblings ...)
2022-05-30 19:37 ` [PATCH v2 05/25] hw/sd: Introduce sd_cmd_handler type Philippe Mathieu-Daudé
@ 2022-05-30 19:37 ` Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 07/25] hw/sd: Add sd_cmd_unimplemented() handler Philippe Mathieu-Daudé
` (20 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:37 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Bin Meng
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Log illegal commands as GUEST_ERROR.
Note: we are logging back the SDIO commands (CMD5, CMD52-54).
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20210624142209.1193073-6-f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sd.c | 62 +++++++++++++++++++++++-------------------------------
1 file changed, 26 insertions(+), 36 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index ed63528615..bda24bc042 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1002,6 +1002,15 @@ static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req)
return sd_illegal;
}
+static sd_rsp_type_t sd_cmd_illegal(SDState *sd, SDRequest req)
+{
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Unknown CMD%i for spec %s\n",
+ sd_proto(sd)->name, req.cmd,
+ sd_version_str(sd->spec_version));
+
+ return sd_illegal;
+}
+
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
@@ -1054,15 +1063,10 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
break;
case 1: /* CMD1: SEND_OP_CMD */
- if (!sd->spi)
- goto bad_cmd;
-
sd->state = sd_transfer_state;
return sd_r1;
case 2: /* CMD2: ALL_SEND_CID */
- if (sd->spi)
- goto bad_cmd;
switch (sd->state) {
case sd_ready_state:
sd->state = sd_identification_state;
@@ -1074,8 +1078,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
break;
case 3: /* CMD3: SEND_RELATIVE_ADDR */
- if (sd->spi)
- goto bad_cmd;
switch (sd->state) {
case sd_identification_state:
case sd_standby_state:
@@ -1089,8 +1091,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
break;
case 4: /* CMD4: SEND_DSR */
- if (sd->spi)
- goto bad_cmd;
switch (sd->state) {
case sd_standby_state:
break;
@@ -1100,9 +1100,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
}
break;
- case 5: /* CMD5: reserved for SDIO cards */
- return sd_illegal;
-
case 6: /* CMD6: SWITCH_FUNCTION */
switch (sd->mode) {
case sd_data_transfer_mode:
@@ -1118,8 +1115,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
break;
case 7: /* CMD7: SELECT/DESELECT_CARD */
- if (sd->spi)
- goto bad_cmd;
switch (sd->state) {
case sd_standby_state:
if (sd->rca != rca)
@@ -1249,8 +1244,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
break;
case 15: /* CMD15: GO_INACTIVE_STATE */
- if (sd->spi)
- goto bad_cmd;
switch (sd->mode) {
case sd_data_transfer_mode:
if (sd->rca != rca)
@@ -1303,7 +1296,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
- goto bad_cmd;
+ return sd_invalid_state_for_cmd(sd, req);
}
if (sd->state == sd_transfer_state) {
sd->state = sd_sendingdata_state;
@@ -1314,7 +1307,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
case 23: /* CMD23: SET_BLOCK_COUNT */
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
- goto bad_cmd;
+ return sd_invalid_state_for_cmd(sd, req);
}
switch (sd->state) {
case sd_transfer_state:
@@ -1357,8 +1350,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
break;
case 26: /* CMD26: PROGRAM_CID */
- if (sd->spi)
- goto bad_cmd;
switch (sd->state) {
case sd_transfer_state:
sd->state = sd_receivingdata_state;
@@ -1508,15 +1499,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
}
break;
- case 52 ... 54:
- /* CMD52, CMD53, CMD54: reserved for SDIO cards
- * (see the SDIO Simplified Specification V2.0)
- * Handle as illegal command but do not complain
- * on stderr, as some OSes may use these in their
- * probing for presence of an SDIO card.
- */
- return sd_illegal;
-
/* Application specific commands (Class 8) */
case 55: /* CMD55: APP_CMD */
switch (sd->state) {
@@ -1557,19 +1539,12 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
break;
case 58: /* CMD58: READ_OCR (SPI) */
- if (!sd->spi) {
- goto bad_cmd;
- }
return sd_r3;
case 59: /* CMD59: CRC_ON_OFF (SPI) */
- if (!sd->spi) {
- goto bad_cmd;
- }
return sd_r1;
default:
- bad_cmd:
qemu_log_mask(LOG_GUEST_ERROR, "SD: Unknown CMD%i\n", req.cmd);
return sd_illegal;
}
@@ -2156,10 +2131,25 @@ void sd_enable(SDState *sd, bool enable)
static const SDProto sd_proto_spi = {
.name = "SPI",
+ .cmd = {
+ [2 ... 4] = sd_cmd_illegal,
+ [5] = sd_cmd_illegal,
+ [7] = sd_cmd_illegal,
+ [15] = sd_cmd_illegal,
+ [26] = sd_cmd_illegal,
+ [52 ... 54] = sd_cmd_illegal,
+ },
};
static const SDProto sd_proto_sd = {
.name = "SD",
+ .cmd = {
+ [1] = sd_cmd_illegal,
+ [5] = sd_cmd_illegal,
+ [52 ... 54] = sd_cmd_illegal,
+ [58] = sd_cmd_illegal,
+ [59] = sd_cmd_illegal,
+ },
};
static void sd_instance_init(Object *obj)
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 07/25] hw/sd: Add sd_cmd_unimplemented() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (5 preceding siblings ...)
2022-05-30 19:37 ` [PATCH v2 06/25] hw/sd: Add sd_cmd_illegal() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:37 ` Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 08/25] hw/sd: Add sd_cmd_GO_IDLE_STATE() handler Philippe Mathieu-Daudé
` (19 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:37 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
[ clg: Fix redundant assignment of .cmd ]
Message-Id: <20210624142209.1193073-7-f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sd.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index bda24bc042..e018498b10 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1011,6 +1011,15 @@ static sd_rsp_type_t sd_cmd_illegal(SDState *sd, SDRequest req)
return sd_illegal;
}
+/* Commands that are recognised but not yet implemented. */
+static sd_rsp_type_t sd_cmd_unimplemented(SDState *sd, SDRequest req)
+{
+ qemu_log_mask(LOG_UNIMP, "%s: CMD%i not implemented\n",
+ sd_proto(sd)->name, req.cmd);
+
+ return sd_illegal;
+}
+
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
@@ -1565,9 +1574,6 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
switch (req.cmd) {
case 6: /* ACMD6: SET_BUS_WIDTH */
- if (sd->spi) {
- goto unimplemented_spi_cmd;
- }
switch (sd->state) {
case sd_transfer_state:
sd->sd_status[0] &= 0x3f;
@@ -1698,12 +1704,6 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
default:
/* Fall back to standard commands. */
return sd_normal_command(sd, req);
-
- unimplemented_spi_cmd:
- /* Commands that are recognised but not yet implemented in SPI mode. */
- qemu_log_mask(LOG_UNIMP, "SD: CMD%i not implemented in SPI mode\n",
- req.cmd);
- return sd_illegal;
}
qemu_log_mask(LOG_GUEST_ERROR, "SD: ACMD%i in a wrong state\n", req.cmd);
@@ -2139,6 +2139,9 @@ static const SDProto sd_proto_spi = {
[26] = sd_cmd_illegal,
[52 ... 54] = sd_cmd_illegal,
},
+ .acmd = {
+ [6] = sd_cmd_unimplemented,
+ },
};
static const SDProto sd_proto_sd = {
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 08/25] hw/sd: Add sd_cmd_GO_IDLE_STATE() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (6 preceding siblings ...)
2022-05-30 19:37 ` [PATCH v2 07/25] hw/sd: Add sd_cmd_unimplemented() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:37 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 09/25] hw/sd: Add sd_cmd_SEND_OP_CMD() handler Philippe Mathieu-Daudé
` (18 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:37 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Bin Meng
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20210624142209.1193073-8-f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sd.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index e018498b10..22405e8bb6 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1020,6 +1020,16 @@ static sd_rsp_type_t sd_cmd_unimplemented(SDState *sd, SDRequest req)
return sd_illegal;
}
+static sd_rsp_type_t sd_cmd_GO_IDLE_STATE(SDState *sd, SDRequest req)
+{
+ if (sd->state != sd_inactive_state) {
+ sd->state = sd_idle_state;
+ sd_reset(DEVICE(sd));
+ }
+
+ return sd->spi ? sd_r1 : sd_r0;
+}
+
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
@@ -1059,18 +1069,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
switch (req.cmd) {
/* Basic commands (Class 0 and Class 1) */
- case 0: /* CMD0: GO_IDLE_STATE */
- switch (sd->state) {
- case sd_inactive_state:
- return sd->spi ? sd_r1 : sd_r0;
-
- default:
- sd->state = sd_idle_state;
- sd_reset(DEVICE(sd));
- return sd->spi ? sd_r1 : sd_r0;
- }
- break;
-
case 1: /* CMD1: SEND_OP_CMD */
sd->state = sd_transfer_state;
return sd_r1;
@@ -2132,6 +2130,7 @@ void sd_enable(SDState *sd, bool enable)
static const SDProto sd_proto_spi = {
.name = "SPI",
.cmd = {
+ [0] = sd_cmd_GO_IDLE_STATE,
[2 ... 4] = sd_cmd_illegal,
[5] = sd_cmd_illegal,
[7] = sd_cmd_illegal,
@@ -2147,6 +2146,7 @@ static const SDProto sd_proto_spi = {
static const SDProto sd_proto_sd = {
.name = "SD",
.cmd = {
+ [0] = sd_cmd_GO_IDLE_STATE,
[1] = sd_cmd_illegal,
[5] = sd_cmd_illegal,
[52 ... 54] = sd_cmd_illegal,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 09/25] hw/sd: Add sd_cmd_SEND_OP_CMD() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (7 preceding siblings ...)
2022-05-30 19:37 ` [PATCH v2 08/25] hw/sd: Add sd_cmd_GO_IDLE_STATE() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 10/25] hw/sd: Add sd_cmd_ALL_SEND_CID() handler Philippe Mathieu-Daudé
` (17 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
[ clg: Update cmd_abbrev ]
Message-Id: <20210624142209.1193073-9-f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sd.c | 18 +++++++++---------
hw/sd/sdmmc-internal.c | 2 +-
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 22405e8bb6..ac81e1c667 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1030,6 +1030,13 @@ static sd_rsp_type_t sd_cmd_GO_IDLE_STATE(SDState *sd, SDRequest req)
return sd->spi ? sd_r1 : sd_r0;
}
+static sd_rsp_type_t sd_cmd_SEND_OP_CMD(SDState *sd, SDRequest req)
+{
+ sd->state = sd_transfer_state;
+
+ return sd_r1;
+}
+
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
@@ -1069,10 +1076,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
switch (req.cmd) {
/* Basic commands (Class 0 and Class 1) */
- case 1: /* CMD1: SEND_OP_CMD */
- sd->state = sd_transfer_state;
- return sd_r1;
-
case 2: /* CMD2: ALL_SEND_CID */
switch (sd->state) {
case sd_ready_state:
@@ -1622,11 +1625,6 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
break;
case 41: /* ACMD41: SD_APP_OP_COND */
- if (sd->spi) {
- /* SEND_OP_CMD */
- sd->state = sd_transfer_state;
- return sd_r1;
- }
if (sd->state != sd_idle_state) {
break;
}
@@ -2131,6 +2129,7 @@ static const SDProto sd_proto_spi = {
.name = "SPI",
.cmd = {
[0] = sd_cmd_GO_IDLE_STATE,
+ [1] = sd_cmd_SEND_OP_CMD,
[2 ... 4] = sd_cmd_illegal,
[5] = sd_cmd_illegal,
[7] = sd_cmd_illegal,
@@ -2140,6 +2139,7 @@ static const SDProto sd_proto_spi = {
},
.acmd = {
[6] = sd_cmd_unimplemented,
+ [41] = sd_cmd_SEND_OP_CMD,
},
};
diff --git a/hw/sd/sdmmc-internal.c b/hw/sd/sdmmc-internal.c
index 2053def3f1..8648a7808d 100644
--- a/hw/sd/sdmmc-internal.c
+++ b/hw/sd/sdmmc-internal.c
@@ -14,7 +14,7 @@
const char *sd_cmd_name(uint8_t cmd)
{
static const char *cmd_abbrev[SDMMC_CMD_MAX] = {
- [0] = "GO_IDLE_STATE",
+ [0] = "GO_IDLE_STATE", [1] = "SEND_OP_CMD",
[2] = "ALL_SEND_CID", [3] = "SEND_RELATIVE_ADDR",
[4] = "SET_DSR", [5] = "IO_SEND_OP_COND",
[6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 10/25] hw/sd: Add sd_cmd_ALL_SEND_CID() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (8 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 09/25] hw/sd: Add sd_cmd_SEND_OP_CMD() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 11/25] hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler Philippe Mathieu-Daudé
` (16 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Bin Meng
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20210624142209.1193073-10-f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sd.c | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index ac81e1c667..b56b8fea41 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1037,6 +1037,17 @@ static sd_rsp_type_t sd_cmd_SEND_OP_CMD(SDState *sd, SDRequest req)
return sd_r1;
}
+static sd_rsp_type_t sd_cmd_ALL_SEND_CID(SDState *sd, SDRequest req)
+{
+ if (sd->state != sd_ready_state) {
+ return sd_invalid_state_for_cmd(sd, req);
+ }
+
+ sd->state = sd_identification_state;
+
+ return sd_r2_i;
+}
+
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
@@ -1076,17 +1087,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
switch (req.cmd) {
/* Basic commands (Class 0 and Class 1) */
- case 2: /* CMD2: ALL_SEND_CID */
- switch (sd->state) {
- case sd_ready_state:
- sd->state = sd_identification_state;
- return sd_r2_i;
-
- default:
- break;
- }
- break;
-
case 3: /* CMD3: SEND_RELATIVE_ADDR */
switch (sd->state) {
case sd_identification_state:
@@ -2148,6 +2148,7 @@ static const SDProto sd_proto_sd = {
.cmd = {
[0] = sd_cmd_GO_IDLE_STATE,
[1] = sd_cmd_illegal,
+ [2] = sd_cmd_ALL_SEND_CID,
[5] = sd_cmd_illegal,
[52 ... 54] = sd_cmd_illegal,
[58] = sd_cmd_illegal,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 11/25] hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (9 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 10/25] hw/sd: Add sd_cmd_ALL_SEND_CID() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 12/25] hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler Philippe Mathieu-Daudé
` (15 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Bin Meng
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Message-Id: <20210624142209.1193073-11-f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
hw/sd/sd.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index b56b8fea41..2fe05c5a3d 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1048,6 +1048,20 @@ static sd_rsp_type_t sd_cmd_ALL_SEND_CID(SDState *sd, SDRequest req)
return sd_r2_i;
}
+static sd_rsp_type_t sd_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req)
+{
+ switch (sd->state) {
+ case sd_identification_state:
+ case sd_standby_state:
+ sd->state = sd_standby_state;
+ sd_set_rca(sd);
+ return sd_r6;
+
+ default:
+ return sd_invalid_state_for_cmd(sd, req);
+ }
+}
+
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
@@ -1087,19 +1101,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
switch (req.cmd) {
/* Basic commands (Class 0 and Class 1) */
- case 3: /* CMD3: SEND_RELATIVE_ADDR */
- switch (sd->state) {
- case sd_identification_state:
- case sd_standby_state:
- sd->state = sd_standby_state;
- sd_set_rca(sd);
- return sd_r6;
-
- default:
- break;
- }
- break;
-
case 4: /* CMD4: SEND_DSR */
switch (sd->state) {
case sd_standby_state:
@@ -2149,6 +2150,7 @@ static const SDProto sd_proto_sd = {
[0] = sd_cmd_GO_IDLE_STATE,
[1] = sd_cmd_illegal,
[2] = sd_cmd_ALL_SEND_CID,
+ [3] = sd_cmd_SEND_RELATIVE_ADDR,
[5] = sd_cmd_illegal,
[52 ... 54] = sd_cmd_illegal,
[58] = sd_cmd_illegal,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 12/25] hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (10 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 11/25] hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 13/25] hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler Philippe Mathieu-Daudé
` (14 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Joel Stanley <joel@jms.id.au>
Signed-off-by: Joel Stanley <joel@jms.id.au>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
[PMD: Rebased]
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 28 +++++++++++++++++-----------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 2fe05c5a3d..a9130155be 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1062,6 +1062,22 @@ static sd_rsp_type_t sd_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req)
}
}
+static sd_rsp_type_t sd_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req)
+{
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
+ return sd_cmd_illegal(sd, req);
+ }
+
+ if (sd->state != sd_transfer_state) {
+ return sd_invalid_state_for_cmd(sd, req);
+ }
+
+ sd->state = sd_sendingdata_state;
+ sd->data_offset = 0;
+
+ return sd_r1;
+}
+
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
@@ -1305,17 +1321,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
}
break;
- case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
- if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
- return sd_invalid_state_for_cmd(sd, req);
- }
- if (sd->state == sd_transfer_state) {
- sd->state = sd_sendingdata_state;
- sd->data_offset = 0;
- return sd_r1;
- }
- break;
-
case 23: /* CMD23: SET_BLOCK_COUNT */
if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
return sd_invalid_state_for_cmd(sd, req);
@@ -2152,6 +2157,7 @@ static const SDProto sd_proto_sd = {
[2] = sd_cmd_ALL_SEND_CID,
[3] = sd_cmd_SEND_RELATIVE_ADDR,
[5] = sd_cmd_illegal,
+ [19] = sd_cmd_SEND_TUNING_BLOCK,
[52 ... 54] = sd_cmd_illegal,
[58] = sd_cmd_illegal,
[59] = sd_cmd_illegal,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 13/25] hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (11 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 12/25] hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-31 8:02 ` Cédric Le Goater
2022-05-30 19:38 ` [PATCH v2 14/25] hw/sd: Basis for eMMC support Philippe Mathieu-Daudé
` (13 subsequent siblings)
26 siblings, 1 reply; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 30 ++++++++++++++++--------------
1 file changed, 16 insertions(+), 14 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index a9130155be..b2f16dbb73 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1078,6 +1078,21 @@ static sd_rsp_type_t sd_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req)
return sd_r1;
}
+static sd_rsp_type_t sd_cmd_SET_BLOCK_COUNT(SDState *sd, SDRequest req)
+{
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
+ return sd_cmd_illegal(sd, req);
+ }
+
+ if (sd->state != sd_transfer_state) {
+ return sd_invalid_state_for_cmd(sd, req);
+ }
+
+ sd->multi_blk_cnt = req.arg;
+
+ return sd_r1;
+}
+
static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
@@ -1321,20 +1336,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
}
break;
- case 23: /* CMD23: SET_BLOCK_COUNT */
- if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
- return sd_invalid_state_for_cmd(sd, req);
- }
- switch (sd->state) {
- case sd_transfer_state:
- sd->multi_blk_cnt = req.arg;
- return sd_r1;
-
- default:
- break;
- }
- break;
-
/* Block write commands (Class 4) */
case 24: /* CMD24: WRITE_SINGLE_BLOCK */
case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
@@ -2158,6 +2159,7 @@ static const SDProto sd_proto_sd = {
[3] = sd_cmd_SEND_RELATIVE_ADDR,
[5] = sd_cmd_illegal,
[19] = sd_cmd_SEND_TUNING_BLOCK,
+ [23] = sd_cmd_SET_BLOCK_COUNT,
[52 ... 54] = sd_cmd_illegal,
[58] = sd_cmd_illegal,
[59] = sd_cmd_illegal,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 14/25] hw/sd: Basis for eMMC support
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (12 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 13/25] hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-31 7:54 ` Philippe Mathieu-Daudé via
` (2 more replies)
2022-05-30 19:38 ` [PATCH v2 15/25] hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler Philippe Mathieu-Daudé
` (12 subsequent siblings)
26 siblings, 3 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
The initial eMMC support from Vincent Palatin was largely reworked to
match the current SD framework.
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
TODO: Do not inherit TYPE_SD_CARD, duplicate sd_class_init()
---
hw/sd/sd.c | 42 ++++++++++++++++++++++++++++++++++++++++++
include/hw/sd/sd.h | 3 +++
2 files changed, 45 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index b2f16dbb73..8b178aa261 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2166,6 +2166,19 @@ static const SDProto sd_proto_sd = {
},
};
+static const SDProto sd_proto_emmc = {
+ .name = "eMMC",
+ .cmd = {
+ [0] = sd_cmd_GO_IDLE_STATE,
+ [5] = sd_cmd_illegal,
+ [19] = sd_cmd_SEND_TUNING_BLOCK,
+ [41] = sd_cmd_illegal,
+ [52 ... 54] = sd_cmd_illegal,
+ [58] = sd_cmd_illegal,
+ [59] = sd_cmd_illegal,
+ },
+};
+
static void sd_instance_init(Object *obj)
{
SDState *sd = SD_CARD(obj);
@@ -2284,9 +2297,38 @@ static const TypeInfo sd_info = {
.instance_finalize = sd_instance_finalize,
};
+static void emmc_realize(DeviceState *dev, Error **errp)
+{
+ SDState *sd = SD_CARD(dev);
+
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
+ error_setg(errp, "Minimum spec for eMMC is v3.01");
+ return;
+ }
+
+ sd_realize(dev, errp);
+}
+
+static void emmc_class_init(ObjectClass *klass, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+ SDCardClass *sc = SD_CARD_CLASS(klass);
+
+ dc->desc = "eMMC";
+ dc->realize = emmc_realize;
+ sc->proto = &sd_proto_emmc;
+}
+
+static const TypeInfo emmc_info = {
+ .name = TYPE_EMMC,
+ .parent = TYPE_SD_CARD,
+ .class_init = emmc_class_init,
+ };
+
static void sd_register_types(void)
{
type_register_static(&sd_info);
+ type_register_static(&emmc_info);
}
type_init(sd_register_types)
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 0d94e1f346..e52436b7a5 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -93,6 +93,9 @@ typedef struct {
#define TYPE_SD_CARD "sd-card"
OBJECT_DECLARE_TYPE(SDState, SDCardClass, SD_CARD)
+#define TYPE_EMMC "emmc"
+DECLARE_INSTANCE_CHECKER(SDState, EMMC, TYPE_EMMC)
+
struct SDCardClass {
/*< private >*/
DeviceClass parent_class;
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 15/25] hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (13 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 14/25] hw/sd: Basis for eMMC support Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 16/25] hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler Philippe Mathieu-Daudé
` (11 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 8b178aa261..538231dbab 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2166,10 +2166,17 @@ static const SDProto sd_proto_sd = {
},
};
+static sd_rsp_type_t sd_emmc_cmd_SEND_OP_CMD(SDState *sd, SDRequest req)
+{
+ sd->state = sd_ready_state;
+ return sd_r3;
+}
+
static const SDProto sd_proto_emmc = {
.name = "eMMC",
.cmd = {
[0] = sd_cmd_GO_IDLE_STATE,
+ [1] = sd_emmc_cmd_SEND_OP_CMD,
[5] = sd_cmd_illegal,
[19] = sd_cmd_SEND_TUNING_BLOCK,
[41] = sd_cmd_illegal,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 16/25] hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (14 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 15/25] hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 17/25] hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler Philippe Mathieu-Daudé
` (10 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 538231dbab..5e315f171c 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2172,11 +2172,23 @@ static sd_rsp_type_t sd_emmc_cmd_SEND_OP_CMD(SDState *sd, SDRequest req)
return sd_r3;
}
+static sd_rsp_type_t sd_emmc_cmd_ALL_SEND_CID(SDState *sd, SDRequest req)
+{
+ if (sd->state != sd_ready_state && sd->state != sd_idle_state) {
+ return sd_invalid_state_for_cmd(sd, req);
+ }
+
+ sd->state = sd_identification_state;
+
+ return sd_r2_i;
+}
+
static const SDProto sd_proto_emmc = {
.name = "eMMC",
.cmd = {
[0] = sd_cmd_GO_IDLE_STATE,
[1] = sd_emmc_cmd_SEND_OP_CMD,
+ [2] = sd_emmc_cmd_ALL_SEND_CID,
[5] = sd_cmd_illegal,
[19] = sd_cmd_SEND_TUNING_BLOCK,
[41] = sd_cmd_illegal,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 17/25] hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (15 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 16/25] hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 18/25] hw/sd: Add sd_emmc_cmd_APP_CMD() handler Philippe Mathieu-Daudé
` (9 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 5e315f171c..100fe191a7 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1048,6 +1048,25 @@ static sd_rsp_type_t sd_cmd_ALL_SEND_CID(SDState *sd, SDRequest req)
return sd_r2_i;
}
+static void sd_emmc_set_rca(SDState *sd, uint16_t value)
+{
+ sd->rca = value;
+}
+
+static sd_rsp_type_t sd_emmc_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req)
+{
+ switch (sd->state) {
+ case sd_identification_state:
+ case sd_standby_state:
+ sd->state = sd_standby_state;
+ sd_emmc_set_rca(sd, req.arg >> 16);
+ return sd_r1;
+
+ default:
+ return sd_invalid_state_for_cmd(sd, req);
+ }
+}
+
static sd_rsp_type_t sd_cmd_SEND_RELATIVE_ADDR(SDState *sd, SDRequest req)
{
switch (sd->state) {
@@ -2189,6 +2208,7 @@ static const SDProto sd_proto_emmc = {
[0] = sd_cmd_GO_IDLE_STATE,
[1] = sd_emmc_cmd_SEND_OP_CMD,
[2] = sd_emmc_cmd_ALL_SEND_CID,
+ [3] = sd_emmc_cmd_SEND_RELATIVE_ADDR,
[5] = sd_cmd_illegal,
[19] = sd_cmd_SEND_TUNING_BLOCK,
[41] = sd_cmd_illegal,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 18/25] hw/sd: Add sd_emmc_cmd_APP_CMD() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (16 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 17/25] hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 19/25] hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler Philippe Mathieu-Daudé
` (8 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 100fe191a7..90da24ad2d 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2202,6 +2202,11 @@ static sd_rsp_type_t sd_emmc_cmd_ALL_SEND_CID(SDState *sd, SDRequest req)
return sd_r2_i;
}
+static sd_rsp_type_t sd_emmc_cmd_APP_CMD(SDState *sd, SDRequest req)
+{
+ return sd_r0;
+}
+
static const SDProto sd_proto_emmc = {
.name = "eMMC",
.cmd = {
@@ -2213,6 +2218,7 @@ static const SDProto sd_proto_emmc = {
[19] = sd_cmd_SEND_TUNING_BLOCK,
[41] = sd_cmd_illegal,
[52 ... 54] = sd_cmd_illegal,
+ [55] = sd_emmc_cmd_APP_CMD,
[58] = sd_cmd_illegal,
[59] = sd_cmd_illegal,
},
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 19/25] hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (17 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 18/25] hw/sd: Add sd_emmc_cmd_APP_CMD() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 20/25] hw/sd: Add CMD21 tuning sequence Philippe Mathieu-Daudé
` (7 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 90da24ad2d..d38ee5094d 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2207,6 +2207,17 @@ static sd_rsp_type_t sd_emmc_cmd_APP_CMD(SDState *sd, SDRequest req)
return sd_r0;
}
+static sd_rsp_type_t sd_emmc_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req)
+{
+ if (sd->state != sd_transfer_state) {
+ sd_invalid_state_for_cmd(sd, req);
+ }
+
+ sd->state = sd_sendingdata_state;
+ sd->data_offset = 0;
+ return sd_r1;
+}
+
static const SDProto sd_proto_emmc = {
.name = "eMMC",
.cmd = {
@@ -2216,6 +2227,7 @@ static const SDProto sd_proto_emmc = {
[3] = sd_emmc_cmd_SEND_RELATIVE_ADDR,
[5] = sd_cmd_illegal,
[19] = sd_cmd_SEND_TUNING_BLOCK,
+ [21] = sd_emmc_cmd_SEND_TUNING_BLOCK,
[41] = sd_cmd_illegal,
[52 ... 54] = sd_cmd_illegal,
[55] = sd_emmc_cmd_APP_CMD,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 20/25] hw/sd: Add CMD21 tuning sequence
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (18 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 19/25] hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 21/25] hw/sd: Add mmc switch function support Philippe Mathieu-Daudé
` (6 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Edgar E . Iglesias
From: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
MMC cards support different tuning sequence for entering HS200 mode.
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
[ clg: - ported on QEMU 7.0 ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index d38ee5094d..672af1e839 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2012,6 +2012,30 @@ static const uint8_t sd_tuning_block_pattern[SD_TUNING_BLOCK_SIZE] = {
0xbb, 0xff, 0xf7, 0xff, 0xf7, 0x7f, 0x7b, 0xde,
};
+#define EXCSD_BUS_WIDTH_OFFSET 183
+#define BUS_WIDTH_8_MASK 0x4
+#define BUS_WIDTH_4_MASK 0x2
+#define MMC_TUNING_BLOCK_SIZE 128
+
+static const uint8_t mmc_tuning_block_pattern[128] = {
+ 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc, 0xcc,
+ 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff, 0xff,
+ 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff,
+ 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xdd,
+ 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xbb,
+ 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff,
+ 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee, 0xff,
+ 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc,
+ 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff,
+ 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee,
+ 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd,
+ 0xdd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff,
+ 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff,
+ 0xff, 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee,
+};
+
uint8_t sd_read_byte(SDState *sd)
{
/* TODO: Append CRCs */
@@ -2098,6 +2122,21 @@ uint8_t sd_read_byte(SDState *sd)
ret = sd_tuning_block_pattern[sd->data_offset++];
break;
+ case 21: /* CMD21: SEND_TUNING_BLOCK (MMC) */
+ if (sd->data_offset >= MMC_TUNING_BLOCK_SIZE - 1) {
+ sd->state = sd_transfer_state;
+ }
+ if (sd->ext_csd[EXCSD_BUS_WIDTH_OFFSET] & BUS_WIDTH_8_MASK) {
+ ret = mmc_tuning_block_pattern[sd->data_offset++];
+ } else {
+ /* Return LSB Nibbles of two byte from the 8bit tuning block
+ * for 4bit mode
+ */
+ ret = mmc_tuning_block_pattern[sd->data_offset++] & 0x0F;
+ ret |= (mmc_tuning_block_pattern[sd->data_offset++] & 0x0F) << 4;
+ }
+ break;
+
case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */
ret = sd->data[sd->data_offset ++];
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 21/25] hw/sd: Add mmc switch function support
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (19 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 20/25] hw/sd: Add CMD21 tuning sequence Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 22/25] hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler Philippe Mathieu-Daudé
` (5 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu, Edgar E . Iglesias
From: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
switch operation in mmc cards, updated the ext_csd register to
request changes in card operations. Here we implement similar
sequence but requests are mostly dummy and make no change.
Implement SWITCH_ERROR if the write operation offset goes beyond length
of ext_csd.
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
[ clg: - ported on SDProto framework ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 672af1e839..907d4f5760 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -476,6 +476,7 @@ static void sd_set_rca(SDState *sd)
FIELD(CSR, AKE_SEQ_ERROR, 3, 1)
FIELD(CSR, APP_CMD, 5, 1)
FIELD(CSR, FX_EVENT, 6, 1)
+FIELD(CSR, SWITCH_ERROR, 7, 1)
FIELD(CSR, READY_FOR_DATA, 8, 1)
FIELD(CSR, CURRENT_STATE, 9, 4)
FIELD(CSR, ERASE_RESET, 13, 1)
@@ -873,6 +874,43 @@ static uint32_t sd_wpbits(SDState *sd, uint64_t addr)
return ret;
}
+enum {
+ MMC_CMD6_ACCESS_COMMAND_SET = 0,
+ MMC_CMD6_ACCESS_SET_BITS,
+ MMC_CMD6_ACCESS_CLEAR_BITS,
+ MMC_CMD6_ACCESS_WRITE_BYTE,
+};
+
+static void mmc_function_switch(SDState *sd, uint32_t arg)
+{
+ uint32_t access = extract32(arg, 24, 2);
+ uint32_t index = extract32(arg, 16, 8);
+ uint32_t value = extract32(arg, 8, 8);
+ uint8_t b = sd->ext_csd[index];
+
+ switch (access) {
+ case MMC_CMD6_ACCESS_COMMAND_SET:
+ qemu_log_mask(LOG_UNIMP, "MMC Command set switching not supported\n");
+ return;
+ case MMC_CMD6_ACCESS_SET_BITS:
+ b |= value;
+ break;
+ case MMC_CMD6_ACCESS_CLEAR_BITS:
+ b &= ~value;
+ break;
+ case MMC_CMD6_ACCESS_WRITE_BYTE:
+ b = value;
+ break;
+ }
+
+ if (index >= 192) {
+ sd->card_status |= R_CSR_SWITCH_ERROR_MASK;
+ return;
+ }
+
+ sd->ext_csd[index] = b;
+}
+
static void sd_function_switch(SDState *sd, uint32_t arg)
{
int i, mode, new_func;
@@ -2257,6 +2295,19 @@ static sd_rsp_type_t sd_emmc_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req)
return sd_r1;
}
+static sd_rsp_type_t sd_emmc_cmd_SWITCH_FUNCTION(SDState *sd, SDRequest req)
+{
+ switch (sd->state) {
+ case sd_transfer_state:
+ sd->state = sd_programming_state;
+ mmc_function_switch(sd, req.arg);
+ sd->state = sd_transfer_state;
+ return sd_r1b;
+ default:
+ return sd_invalid_state_for_cmd(sd, req);
+ }
+}
+
static const SDProto sd_proto_emmc = {
.name = "eMMC",
.cmd = {
@@ -2265,6 +2316,7 @@ static const SDProto sd_proto_emmc = {
[2] = sd_emmc_cmd_ALL_SEND_CID,
[3] = sd_emmc_cmd_SEND_RELATIVE_ADDR,
[5] = sd_cmd_illegal,
+ [6] = sd_emmc_cmd_SWITCH_FUNCTION,
[19] = sd_cmd_SEND_TUNING_BLOCK,
[21] = sd_emmc_cmd_SEND_TUNING_BLOCK,
[41] = sd_cmd_illegal,
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 22/25] hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (20 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 21/25] hw/sd: Add mmc switch function support Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-31 8:48 ` Cédric Le Goater
2022-05-30 19:38 ` [PATCH v2 23/25] hw/sd: Support boot area in emmc image Philippe Mathieu-Daudé
` (4 subsequent siblings)
26 siblings, 1 reply; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Cédric Le Goater <clg@kaod.org>
The parameters mimick a real 4GB eMMC, but it can be set to various
sizes. Initially from Vincent Palatin <vpalatin@chromium.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
[PMD: Remove CMD8 (SEND_EXT_CSD) case in sd_read_byte()]
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 101 ++++++++++++++++++++++++++++++++++++++++-
hw/sd/sdmmc-internal.h | 97 +++++++++++++++++++++++++++++++++++++++
include/hw/sd/sd.h | 1 +
3 files changed, 198 insertions(+), 1 deletion(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 907d4f5760..6722003cda 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -142,6 +142,7 @@ struct SDState {
uint64_t data_start;
uint32_t data_offset;
uint8_t data[512];
+ uint8_t ext_csd[512];
qemu_irq readonly_cb;
qemu_irq inserted_cb;
QEMUTimer *ocr_power_timer;
@@ -408,8 +409,85 @@ static const uint8_t sd_csd_rw_mask[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
};
+static void mmc_set_ext_csd(SDState *sd, uint64_t size)
+{
+ uint32_t sectcount = size >> HWBLOCK_SHIFT;
+
+ memset(sd->ext_csd, 0, sizeof(sd->ext_csd));
+
+ sd->ext_csd[EXT_CSD_S_CMD_SET] = 0x1; /* supported command sets */
+ sd->ext_csd[EXT_CSD_HPI_FEATURES] = 0x3; /* HPI features */
+ sd->ext_csd[EXT_CSD_BKOPS_SUPPORT] = 0x1; /* Background operations */
+ sd->ext_csd[241] = 0xA; /* 1st initialization time after partitioning */
+ sd->ext_csd[EXT_CSD_TRIM_MULT] = 0x1; /* Trim multiplier */
+ sd->ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] = 0x15; /* Secure feature */
+ sd->ext_csd[EXT_CSD_SEC_ERASE_MULT] = 0x96; /* Secure erase support */
+ sd->ext_csd[EXT_CSD_SEC_TRIM_MULT] = 0x96; /* Secure TRIM multiplier */
+ sd->ext_csd[EXT_CSD_BOOT_INFO] = 0x7; /* Boot information */
+ sd->ext_csd[EXT_CSD_BOOT_MULT] = 0x8; /* Boot partition size. 128KB unit */
+ sd->ext_csd[EXT_CSD_ACC_SIZE] = 0x6; /* Access size */
+ sd->ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] = 0x4; /* HC Erase unit size */
+ sd->ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] = 0x1; /* HC erase timeout */
+ sd->ext_csd[EXT_CSD_REL_WR_SEC_C] = 0x1; /* Reliable write sector count */
+ sd->ext_csd[EXT_CSD_HC_WP_GRP_SIZE] = 0x4; /* HC write protect group size */
+ sd->ext_csd[EXT_CSD_S_C_VCC] = 0x8; /* Sleep current VCC */
+ sd->ext_csd[EXT_CSD_S_C_VCCQ] = 0x7; /* Sleep current VCCQ */
+ sd->ext_csd[EXT_CSD_S_A_TIMEOUT] = 0x11; /* Sleep/Awake timeout */
+ sd->ext_csd[215] = (sectcount >> 24) & 0xff; /* Sector count */
+ sd->ext_csd[214] = (sectcount >> 16) & 0xff; /* ... */
+ sd->ext_csd[213] = (sectcount >> 8) & 0xff; /* ... */
+ sd->ext_csd[EXT_CSD_SEC_CNT] = (sectcount & 0xff); /* ... */
+ sd->ext_csd[210] = 0xa; /* Min write perf for 8bit@52Mhz */
+ sd->ext_csd[209] = 0xa; /* Min read perf for 8bit@52Mhz */
+ sd->ext_csd[208] = 0xa; /* Min write perf for 4bit@52Mhz */
+ sd->ext_csd[207] = 0xa; /* Min read perf for 4bit@52Mhz */
+ sd->ext_csd[206] = 0xa; /* Min write perf for 4bit@26Mhz */
+ sd->ext_csd[205] = 0xa; /* Min read perf for 4bit@26Mhz */
+ sd->ext_csd[EXT_CSD_PART_SWITCH_TIME] = 0x1;
+ sd->ext_csd[EXT_CSD_OUT_OF_INTERRUPT_TIME] = 0x1;
+ sd->ext_csd[EXT_CSD_CARD_TYPE] = 0x7;
+ sd->ext_csd[EXT_CSD_STRUCTURE] = 0x2;
+ sd->ext_csd[EXT_CSD_REV] = 0x5;
+ sd->ext_csd[EXT_CSD_RPMB_MULT] = 0x1; /* RPMB size */
+ sd->ext_csd[EXT_CSD_PARTITION_SUPPORT] = 0x3;
+ sd->ext_csd[159] = 0x00; /* Max enhanced area size */
+ sd->ext_csd[158] = 0x00; /* ... */
+ sd->ext_csd[157] = 0xEC; /* ... */
+}
+
+static void sd_emmc_set_csd(SDState *sd, uint64_t size)
+{
+ sd->csd[0] = 0xd0;
+ sd->csd[1] = 0x0f;
+ sd->csd[2] = 0x00;
+ sd->csd[3] = 0x32;
+ sd->csd[4] = 0x0f;
+ if (size <= 2 * GiB) {
+ /* use 1k blocks */
+ uint32_t csize1k = (size >> (CMULT_SHIFT + 10)) - 1;
+ sd->csd[5] = 0x5a;
+ sd->csd[6] = 0x80 | ((csize1k >> 10) & 0xf);
+ sd->csd[7] = (csize1k >> 2) & 0xff;
+ } else { /* >= 2GB : size stored in ext CSD, block addressing */
+ sd->csd[5] = 0x59;
+ sd->csd[6] = 0x8f;
+ sd->csd[7] = 0xff;
+ sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_CAPACITY, 1);
+ }
+ sd->csd[8] = 0xff;
+ sd->csd[9] = 0xff;
+ sd->csd[10] = 0xf7;
+ sd->csd[11] = 0xfe;
+ sd->csd[12] = 0x49;
+ sd->csd[13] = 0x10;
+ sd->csd[14] = 0x00;
+ sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
+ mmc_set_ext_csd(sd, size);
+}
+
static void sd_set_csd(SDState *sd, uint64_t size)
{
+ SDCardClass *sc = SD_CARD_GET_CLASS(sd);
int hwblock_shift = HWBLOCK_SHIFT;
uint32_t csize;
uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
@@ -421,7 +499,9 @@ static void sd_set_csd(SDState *sd, uint64_t size)
}
csize = (size >> (CMULT_SHIFT + hwblock_shift)) - 1;
- if (size <= SDSC_MAX_CAPACITY) { /* Standard Capacity SD */
+ if (sc->set_csd) {
+ sc->set_csd(sd, size);
+ } else if (size <= SDSC_MAX_CAPACITY) { /* Standard Capacity SD */
sd->csd[0] = 0x00; /* CSD structure */
sd->csd[1] = 0x26; /* Data read access-time-1 */
sd->csd[2] = 0x00; /* Data read access-time-2 */
@@ -2279,6 +2359,23 @@ static sd_rsp_type_t sd_emmc_cmd_ALL_SEND_CID(SDState *sd, SDRequest req)
return sd_r2_i;
}
+static sd_rsp_type_t sd_emmc_cmd_SEND_EXT_CSD(SDState *sd, SDRequest req)
+{
+ uint64_t addr = (sd->ocr & (1 << 30)) ? (uint64_t) req.arg << 9 : req.arg;
+
+ switch (sd->state) {
+ case sd_transfer_state:
+ /* MMC : Sends the EXT_CSD register as a Block of data */
+ sd->state = sd_sendingdata_state;
+ memcpy(sd->data, sd->ext_csd, sizeof(sd->ext_csd));
+ sd->data_start = addr;
+ sd->data_offset = 0;
+ return sd_r1;
+ default:
+ return sd_invalid_state_for_cmd(sd, req);
+ }
+}
+
static sd_rsp_type_t sd_emmc_cmd_APP_CMD(SDState *sd, SDRequest req)
{
return sd_r0;
@@ -2317,6 +2414,7 @@ static const SDProto sd_proto_emmc = {
[3] = sd_emmc_cmd_SEND_RELATIVE_ADDR,
[5] = sd_cmd_illegal,
[6] = sd_emmc_cmd_SWITCH_FUNCTION,
+ [8] = sd_emmc_cmd_SEND_EXT_CSD,
[19] = sd_cmd_SEND_TUNING_BLOCK,
[21] = sd_emmc_cmd_SEND_TUNING_BLOCK,
[41] = sd_cmd_illegal,
@@ -2465,6 +2563,7 @@ static void emmc_class_init(ObjectClass *klass, void *data)
dc->desc = "eMMC";
dc->realize = emmc_realize;
sc->proto = &sd_proto_emmc;
+ sc->set_csd = sd_emmc_set_csd;
}
static const TypeInfo emmc_info = {
diff --git a/hw/sd/sdmmc-internal.h b/hw/sd/sdmmc-internal.h
index d8bf17d204..2b98f117cd 100644
--- a/hw/sd/sdmmc-internal.h
+++ b/hw/sd/sdmmc-internal.h
@@ -37,4 +37,101 @@ const char *sd_cmd_name(uint8_t cmd);
*/
const char *sd_acmd_name(uint8_t cmd);
+/*
+ * EXT_CSD fields
+ */
+
+#define EXT_CSD_CMDQ_MODE_EN 15 /* R/W */
+#define EXT_CSD_FLUSH_CACHE 32 /* W */
+#define EXT_CSD_CACHE_CTRL 33 /* R/W */
+#define EXT_CSD_POWER_OFF_NOTIFICATION 34 /* R/W */
+#define EXT_CSD_PACKED_FAILURE_INDEX 35 /* RO */
+#define EXT_CSD_PACKED_CMD_STATUS 36 /* RO */
+#define EXT_CSD_EXP_EVENTS_STATUS 54 /* RO, 2 bytes */
+#define EXT_CSD_EXP_EVENTS_CTRL 56 /* R/W, 2 bytes */
+#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */
+#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
+#define EXT_CSD_PARTITION_SETTING_COMPLETED 155 /* R/W */
+#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
+#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
+#define EXT_CSD_HPI_MGMT 161 /* R/W */
+#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */
+#define EXT_CSD_BKOPS_EN 163 /* R/W */
+#define EXT_CSD_BKOPS_START 164 /* W */
+#define EXT_CSD_SANITIZE_START 165 /* W */
+#define EXT_CSD_WR_REL_PARAM 166 /* RO */
+#define EXT_CSD_RPMB_MULT 168 /* RO */
+#define EXT_CSD_FW_CONFIG 169 /* R/W */
+#define EXT_CSD_BOOT_WP 173 /* R/W */
+#define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */
+#define EXT_CSD_PART_CONFIG 179 /* R/W */
+#define EXT_CSD_ERASED_MEM_CONT 181 /* RO */
+#define EXT_CSD_BUS_WIDTH 183 /* R/W */
+#define EXT_CSD_STROBE_SUPPORT 184 /* RO */
+#define EXT_CSD_HS_TIMING 185 /* R/W */
+#define EXT_CSD_POWER_CLASS 187 /* R/W */
+#define EXT_CSD_REV 192 /* RO */
+#define EXT_CSD_STRUCTURE 194 /* RO */
+#define EXT_CSD_CARD_TYPE 196 /* RO */
+#define EXT_CSD_DRIVER_STRENGTH 197 /* RO */
+#define EXT_CSD_OUT_OF_INTERRUPT_TIME 198 /* RO */
+#define EXT_CSD_PART_SWITCH_TIME 199 /* RO */
+#define EXT_CSD_PWR_CL_52_195 200 /* RO */
+#define EXT_CSD_PWR_CL_26_195 201 /* RO */
+#define EXT_CSD_PWR_CL_52_360 202 /* RO */
+#define EXT_CSD_PWR_CL_26_360 203 /* RO */
+#define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */
+#define EXT_CSD_S_A_TIMEOUT 217 /* RO */
+#define EXT_CSD_S_C_VCCQ 219 /* RO */
+#define EXT_CSD_S_C_VCC 220 /* RO */
+#define EXT_CSD_REL_WR_SEC_C 222 /* RO */
+#define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */
+#define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */
+#define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
+#define EXT_CSD_ACC_SIZE 225 /* RO */
+#define EXT_CSD_BOOT_MULT 226 /* RO */
+#define EXT_CSD_BOOT_INFO 228 /* RO */
+#define EXT_CSD_SEC_TRIM_MULT 229 /* RO */
+#define EXT_CSD_SEC_ERASE_MULT 230 /* RO */
+#define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */
+#define EXT_CSD_TRIM_MULT 232 /* RO */
+#define EXT_CSD_PWR_CL_200_195 236 /* RO */
+#define EXT_CSD_PWR_CL_200_360 237 /* RO */
+#define EXT_CSD_PWR_CL_DDR_52_195 238 /* RO */
+#define EXT_CSD_PWR_CL_DDR_52_360 239 /* RO */
+#define EXT_CSD_BKOPS_STATUS 246 /* RO */
+#define EXT_CSD_POWER_OFF_LONG_TIME 247 /* RO */
+#define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
+#define EXT_CSD_CACHE_SIZE 249 /* RO, 4 bytes */
+#define EXT_CSD_PWR_CL_DDR_200_360 253 /* RO */
+#define EXT_CSD_FIRMWARE_VERSION 254 /* RO, 8 bytes */
+#define EXT_CSD_PRE_EOL_INFO 267 /* RO */
+#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A 268 /* RO */
+#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B 269 /* RO */
+#define EXT_CSD_CMDQ_DEPTH 307 /* RO */
+#define EXT_CSD_CMDQ_SUPPORT 308 /* RO */
+#define EXT_CSD_SUPPORTED_MODE 493 /* RO */
+#define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */
+#define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */
+#define EXT_CSD_MAX_PACKED_WRITES 500 /* RO */
+#define EXT_CSD_MAX_PACKED_READS 501 /* RO */
+#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
+#define EXT_CSD_HPI_FEATURES 503 /* RO */
+#define EXT_CSD_S_CMD_SET 504 /* RO */
+
+/*
+ * EXT_CSD field definitions
+ */
+
+#define EXT_CSD_WR_REL_PARAM_EN (1 << 2)
+#define EXT_CSD_WR_REL_PARAM_EN_RPMB_REL_WR (1 << 4)
+
+#define EXT_CSD_PART_CONFIG_ACC_MASK (0x7)
+#define EXT_CSD_PART_CONFIG_ACC_DEFAULT (0x0)
+#define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1)
+
+#define EXT_CSD_PART_CONFIG_EN_MASK (0x7 << 3)
+#define EXT_CSD_PART_CONFIG_EN_BOOT0 (0x1 << 3)
+#define EXT_CSD_PART_CONFIG_EN_USER (0x7 << 3)
+
#endif
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index e52436b7a5..8a0f2e75da 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -129,6 +129,7 @@ struct SDCardClass {
bool (*get_readonly)(SDState *sd);
const struct SDProto *proto;
+ void (*set_csd)(SDState *sd, uint64_t size);
};
#define TYPE_SD_BUS "sd-bus"
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 23/25] hw/sd: Support boot area in emmc image
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (21 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 22/25] hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 24/25] hw/sd: Subtract bootarea size from blk Philippe Mathieu-Daudé
` (3 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Joel Stanley <joel@jms.id.au>
This assumes a specially constructued image:
dd if=/dev/zero of=mmc-bootarea.img count=2 bs=1M
dd if=u-boot-spl.bin of=mmc-bootarea.img conv=notrunc
dd if=u-boot.bin of=mmc-bootarea.img conv=notrunc count=64 bs=1K
cat mmc-bootarea.img obmc-phosphor-image.wic > mmc.img
truncate --size 16GB mmc.img
truncate --size 128MB mmc-bootarea.img
For now this still requires a mtd image to load the SPL:
qemu-system-arm -M tacoma-bmc -nographic \
-global driver=sd-card,property=emmc,value=true \
-drive file=mmc.img,if=sd,index=2 \
-drive file=mmc-bootarea.img,if=mtd,format=raw
Signed-off-by: Joel Stanley <joel@jms.id.au>
[clg: - definition renames
- Introduced bootpart_offset
- Introduced sd_boot_capacity_bytes() helper (Philippe) ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 39 +++++++++++++++++++++++++++++++++++++++
include/hw/sd/sd.h | 1 +
2 files changed, 40 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 6722003cda..05e77f128f 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -659,6 +659,12 @@ static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
return addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
}
+
+static unsigned sd_boot_capacity_bytes(SDState *sd)
+{
+ return sd->ext_csd[EXT_CSD_BOOT_MULT] << 17;
+}
+
static void sd_reset(DeviceState *dev)
{
SDState *sd = SD_CARD(dev);
@@ -857,9 +863,40 @@ void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
qemu_set_irq(insert, sd->blk ? blk_is_inserted(sd->blk) : 0);
}
+/*
+ * This requires a disk image that has two boot partitions inserted at the
+ * beginning of it. The size of the boot partitions are configured in the
+ * ext_csd structure, which is hardcoded in qemu. They are currently set to
+ * 1MB each.
+ */
+static uint32_t sd_emmc_bootpart_offset(SDState *sd)
+{
+ unsigned int access = sd->ext_csd[EXT_CSD_PART_CONFIG] &
+ EXT_CSD_PART_CONFIG_ACC_MASK;
+ unsigned int boot_capacity = sd_boot_capacity_bytes(sd);
+
+ switch (access) {
+ case EXT_CSD_PART_CONFIG_ACC_DEFAULT:
+ return boot_capacity * 2;
+ case EXT_CSD_PART_CONFIG_ACC_BOOT0:
+ return 0;
+ case EXT_CSD_PART_CONFIG_ACC_BOOT0 + 1:
+ return boot_capacity * 1;
+ default:
+ g_assert_not_reached();
+ }
+}
+
+static uint32_t sd_bootpart_offset(SDState *sd)
+{
+ SDCardClass *sc = SD_CARD_GET_CLASS(sd);
+ return sc->bootpart_offset ? sc->bootpart_offset(sd) : 0;
+}
+
static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
{
trace_sdcard_read_block(addr, len);
+ addr += sd_bootpart_offset(sd);
if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
fprintf(stderr, "sd_blk_read: read error on host side\n");
}
@@ -868,6 +905,7 @@ static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
{
trace_sdcard_write_block(addr, len);
+ addr += sd_bootpart_offset(sd);
if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
fprintf(stderr, "sd_blk_write: write error on host side\n");
}
@@ -2564,6 +2602,7 @@ static void emmc_class_init(ObjectClass *klass, void *data)
dc->realize = emmc_realize;
sc->proto = &sd_proto_emmc;
sc->set_csd = sd_emmc_set_csd;
+ sc->bootpart_offset = sd_emmc_bootpart_offset;
}
static const TypeInfo emmc_info = {
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 8a0f2e75da..36d3cba08e 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -130,6 +130,7 @@ struct SDCardClass {
const struct SDProto *proto;
void (*set_csd)(SDState *sd, uint64_t size);
+ uint32_t (*bootpart_offset)(SDState *sd);
};
#define TYPE_SD_BUS "sd-bus"
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 24/25] hw/sd: Subtract bootarea size from blk
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (22 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 23/25] hw/sd: Support boot area in emmc image Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 25/25] hw/sd: Add boot config support Philippe Mathieu-Daudé
` (2 subsequent siblings)
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Joel Stanley <joel@jms.id.au>
The userdata size is derived from the file the user passes on the
command line, but we must take into account the boot areas.
Signed-off-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 05e77f128f..26ddf3e92d 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -668,6 +668,7 @@ static unsigned sd_boot_capacity_bytes(SDState *sd)
static void sd_reset(DeviceState *dev)
{
SDState *sd = SD_CARD(dev);
+ SDCardClass *sc = SD_CARD_GET_CLASS(sd);
uint64_t size;
uint64_t sect;
@@ -679,6 +680,10 @@ static void sd_reset(DeviceState *dev)
}
size = sect << 9;
+ if (sc->bootpart_offset) {
+ size -= sd_boot_capacity_bytes(sd) * 2;
+ }
+
sect = sd_addr_to_wpnum(size) + 1;
sd->state = sd_idle_state;
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH v2 25/25] hw/sd: Add boot config support
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (23 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 24/25] hw/sd: Subtract bootarea size from blk Philippe Mathieu-Daudé
@ 2022-05-30 19:38 ` Philippe Mathieu-Daudé
2022-05-31 6:31 ` [PATCH v2 00/25] hw/sd: Rework models for eMMC support Cédric Le Goater
2022-05-31 9:19 ` Cédric Le Goater
26 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-05-30 19:38 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Philippe Mathieu-Daudé, Sai Pavan Boddu
From: Joel Stanley <joel@jms.id.au>
Introduced "boot-config" property to set CSD 179, the boot config
register.
With this correctly set we can use the enable bit to detect if partition
support is enabled.
Signed-off-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 26ddf3e92d..da909ec59f 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -116,6 +116,7 @@ struct SDState {
uint8_t spec_version;
BlockBackend *blk;
bool spi;
+ uint8_t boot_config;
/* Runtime changeables */
@@ -453,6 +454,8 @@ static void mmc_set_ext_csd(SDState *sd, uint64_t size)
sd->ext_csd[159] = 0x00; /* Max enhanced area size */
sd->ext_csd[158] = 0x00; /* ... */
sd->ext_csd[157] = 0xEC; /* ... */
+
+ sd->ext_csd[EXT_CSD_PART_CONFIG] = sd->boot_config;
}
static void sd_emmc_set_csd(SDState *sd, uint64_t size)
@@ -878,8 +881,14 @@ static uint32_t sd_emmc_bootpart_offset(SDState *sd)
{
unsigned int access = sd->ext_csd[EXT_CSD_PART_CONFIG] &
EXT_CSD_PART_CONFIG_ACC_MASK;
+ unsigned int enable = sd->ext_csd[EXT_CSD_PART_CONFIG] &
+ EXT_CSD_PART_CONFIG_EN_MASK;
unsigned int boot_capacity = sd_boot_capacity_bytes(sd);
+ if (!enable) {
+ return 0;
+ }
+
switch (access) {
case EXT_CSD_PART_CONFIG_ACC_DEFAULT:
return boot_capacity * 2;
@@ -2548,6 +2557,7 @@ static Property sd_properties[] = {
* board to ensure that ssi transfers only occur when the chip select
* is asserted. */
DEFINE_PROP_BOOL("spi", SDState, spi, false),
+ DEFINE_PROP_UINT8("boot-config", SDState, boot_config, 0x0),
DEFINE_PROP_END_OF_LIST()
};
--
2.36.1
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH v2 00/25] hw/sd: Rework models for eMMC support
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (24 preceding siblings ...)
2022-05-30 19:38 ` [PATCH v2 25/25] hw/sd: Add boot config support Philippe Mathieu-Daudé
@ 2022-05-31 6:31 ` Cédric Le Goater
2022-05-31 7:56 ` Philippe Mathieu-Daudé via
2022-05-31 9:19 ` Cédric Le Goater
26 siblings, 1 reply; 38+ messages in thread
From: Cédric Le Goater @ 2022-05-31 6:31 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Philippe Mathieu-Daudé,
Sai Pavan Boddu
On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
> Rebase/respin of Cédric RFC:
> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
> (sorry it took me so long guys...)
>
> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
>
> I plan to queue patches 1-12 via sdmmc-next later this week.
>
> Cédric, if you are happy with this series, it should be easy to rebase
> your other patches on top and address the comments I left on the RFC :)
Sure. I will for the first patches to be merged and I might introduce
a base class.
Thanks,
C.
>
> Regards,
>
> Phil.
>
> Cédric Le Goater (6):
> hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler
> hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler
> hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler
> hw/sd: Add sd_emmc_cmd_APP_CMD() handler
> hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler
> hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler
>
> Joel Stanley (4):
> hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler
> hw/sd: Support boot area in emmc image
> hw/sd: Subtract bootarea size from blk
> hw/sd: Add boot config support
>
> Philippe Mathieu-Daudé (13):
> hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01
> hw/sd: When card is in wrong state, log which state it is
> hw/sd: When card is in wrong state, log which spec version is used
> hw/sd: Move proto_name to SDProto structure
> hw/sd: Introduce sd_cmd_handler type
> hw/sd: Add sd_cmd_illegal() handler
> hw/sd: Add sd_cmd_unimplemented() handler
> hw/sd: Add sd_cmd_GO_IDLE_STATE() handler
> hw/sd: Add sd_cmd_SEND_OP_CMD() handler
> hw/sd: Add sd_cmd_ALL_SEND_CID() handler
> hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler
> hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler
> hw/sd: Basis for eMMC support
>
> Sai Pavan Boddu (2):
> hw/sd: Add CMD21 tuning sequence
> hw/sd: Add mmc switch function support
>
> hw/sd/sd.c | 645 +++++++++++++++++++++++++++++++++--------
> hw/sd/sdmmc-internal.c | 2 +-
> hw/sd/sdmmc-internal.h | 97 +++++++
> include/hw/sd/sd.h | 7 +
> 4 files changed, 627 insertions(+), 124 deletions(-)
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 14/25] hw/sd: Basis for eMMC support
2022-05-30 19:38 ` [PATCH v2 14/25] hw/sd: Basis for eMMC support Philippe Mathieu-Daudé
@ 2022-05-31 7:54 ` Philippe Mathieu-Daudé via
2022-05-31 8:50 ` Cédric Le Goater
2022-05-31 9:05 ` Cédric Le Goater
2 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé via @ 2022-05-31 7:54 UTC (permalink / raw)
To: qemu-devel
Cc: Cédric Le Goater, Bin Meng, qemu-block, Joel Stanley,
Sai Pavan Boddu
On 30/5/22 21:38, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
I missed something during the cherry-pick, this should be:
From: Cédric Le Goater <clg@kaod.org>
> The initial eMMC support from Vincent Palatin was largely reworked to
> match the current SD framework.
>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> TODO: Do not inherit TYPE_SD_CARD, duplicate sd_class_init()
> ---
> hw/sd/sd.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> include/hw/sd/sd.h | 3 +++
> 2 files changed, 45 insertions(+)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index b2f16dbb73..8b178aa261 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -2166,6 +2166,19 @@ static const SDProto sd_proto_sd = {
> },
> };
>
> +static const SDProto sd_proto_emmc = {
> + .name = "eMMC",
> + .cmd = {
> + [0] = sd_cmd_GO_IDLE_STATE,
> + [5] = sd_cmd_illegal,
> + [19] = sd_cmd_SEND_TUNING_BLOCK,
> + [41] = sd_cmd_illegal,
> + [52 ... 54] = sd_cmd_illegal,
> + [58] = sd_cmd_illegal,
> + [59] = sd_cmd_illegal,
> + },
> +};
> +
> static void sd_instance_init(Object *obj)
> {
> SDState *sd = SD_CARD(obj);
> @@ -2284,9 +2297,38 @@ static const TypeInfo sd_info = {
> .instance_finalize = sd_instance_finalize,
> };
>
> +static void emmc_realize(DeviceState *dev, Error **errp)
> +{
> + SDState *sd = SD_CARD(dev);
> +
> + if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
> + error_setg(errp, "Minimum spec for eMMC is v3.01");
> + return;
> + }
> +
> + sd_realize(dev, errp);
> +}
> +
> +static void emmc_class_init(ObjectClass *klass, void *data)
> +{
> + DeviceClass *dc = DEVICE_CLASS(klass);
> + SDCardClass *sc = SD_CARD_CLASS(klass);
> +
> + dc->desc = "eMMC";
> + dc->realize = emmc_realize;
> + sc->proto = &sd_proto_emmc;
> +}
> +
> +static const TypeInfo emmc_info = {
> + .name = TYPE_EMMC,
> + .parent = TYPE_SD_CARD,
> + .class_init = emmc_class_init,
> + };
> +
> static void sd_register_types(void)
> {
> type_register_static(&sd_info);
> + type_register_static(&emmc_info);
> }
>
> type_init(sd_register_types)
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index 0d94e1f346..e52436b7a5 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -93,6 +93,9 @@ typedef struct {
> #define TYPE_SD_CARD "sd-card"
> OBJECT_DECLARE_TYPE(SDState, SDCardClass, SD_CARD)
>
> +#define TYPE_EMMC "emmc"
> +DECLARE_INSTANCE_CHECKER(SDState, EMMC, TYPE_EMMC)
> +
> struct SDCardClass {
> /*< private >*/
> DeviceClass parent_class;
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 00/25] hw/sd: Rework models for eMMC support
2022-05-31 6:31 ` [PATCH v2 00/25] hw/sd: Rework models for eMMC support Cédric Le Goater
@ 2022-05-31 7:56 ` Philippe Mathieu-Daudé via
2022-05-31 7:58 ` Philippe Mathieu-Daudé via
0 siblings, 1 reply; 38+ messages in thread
From: Philippe Mathieu-Daudé via @ 2022-05-31 7:56 UTC (permalink / raw)
To: Cédric Le Goater, qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Sai Pavan Boddu
On 31/5/22 08:31, Cédric Le Goater wrote:
> On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>
>> Rebase/respin of Cédric RFC:
>> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
>> (sorry it took me so long guys...)
>>
>> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
>>
>> I plan to queue patches 1-12 via sdmmc-next later this week.
>>
>> Cédric, if you are happy with this series, it should be easy to rebase
>> your other patches on top and address the comments I left on the RFC :)
>
> Sure. I will for the first patches to be merged and I might introduce
> a base class.
Then consider patches 1-13 queued.
> Thanks,
>
> C.
>
>>
>> Regards,
>>
>> Phil.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 00/25] hw/sd: Rework models for eMMC support
2022-05-31 7:56 ` Philippe Mathieu-Daudé via
@ 2022-05-31 7:58 ` Philippe Mathieu-Daudé via
0 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé via @ 2022-05-31 7:58 UTC (permalink / raw)
To: Cédric Le Goater, qemu-devel@nongnu.org Developers
Cc: Bin Meng, open list:Block layer core, Joel Stanley,
Sai Pavan Boddu
On Tue, May 31, 2022 at 9:56 AM Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> On 31/5/22 08:31, Cédric Le Goater wrote:
> > On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
> >> I plan to queue patches 1-12 via sdmmc-next later this week.
> >>
> >> Cédric, if you are happy with this series, it should be easy to rebase
> >> your other patches on top and address the comments I left on the RFC :)
> >
> > Sure. I will for the first patches to be merged and I might introduce
> > a base class.
>
> Then consider patches 1-13 queued.
Oops too fast, new patches 3 & 13 are not reviewed.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 03/25] hw/sd: When card is in wrong state, log which spec version is used
2022-05-30 19:37 ` [PATCH v2 03/25] hw/sd: When card is in wrong state, log which spec version is used Philippe Mathieu-Daudé
@ 2022-05-31 8:01 ` Cédric Le Goater
0 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2022-05-31 8:01 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Philippe Mathieu-Daudé,
Sai Pavan Boddu
On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
> Add the sd_version_str() helper.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---
> hw/sd/sd.c | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index b0e7a7e6d0..b3e61b9f84 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -145,6 +145,19 @@ struct SDState {
>
> static void sd_realize(DeviceState *dev, Error **errp);
>
> +static const char *sd_version_str(enum SDPhySpecificationVersion version)
> +{
> + static const char *sdphy_version[] = {
> + [SD_PHY_SPECv1_10_VERS] = "v1.10",
> + [SD_PHY_SPECv2_00_VERS] = "v2.00",
> + [SD_PHY_SPECv3_01_VERS] = "v3.01",
> + };
> + if (version >= ARRAY_SIZE(sdphy_version)) {
> + return "unsupported version";
> + }
> + return sdphy_version[version];
> +}
> +
> static const char *sd_state_name(enum SDCardStates state)
> {
> static const char *state_name[] = {
> @@ -968,8 +981,9 @@ static bool address_in_range(SDState *sd, const char *desc,
>
> static sd_rsp_type_t sd_invalid_state_for_cmd(SDState *sd, SDRequest req)
> {
> - qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s\n",
> - req.cmd, sd_state_name(sd->state));
> + qemu_log_mask(LOG_GUEST_ERROR, "SD: CMD%i in a wrong state: %s (spec %s)\n",
> + req.cmd, sd_state_name(sd->state),
> + sd_version_str(sd->spec_version));
>
> return sd_illegal;
> }
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 13/25] hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler
2022-05-30 19:38 ` [PATCH v2 13/25] hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler Philippe Mathieu-Daudé
@ 2022-05-31 8:02 ` Cédric Le Goater
0 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2022-05-31 8:02 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Philippe Mathieu-Daudé,
Sai Pavan Boddu
On 5/30/22 21:38, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---
> hw/sd/sd.c | 30 ++++++++++++++++--------------
> 1 file changed, 16 insertions(+), 14 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index a9130155be..b2f16dbb73 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -1078,6 +1078,21 @@ static sd_rsp_type_t sd_cmd_SEND_TUNING_BLOCK(SDState *sd, SDRequest req)
> return sd_r1;
> }
>
> +static sd_rsp_type_t sd_cmd_SET_BLOCK_COUNT(SDState *sd, SDRequest req)
> +{
> + if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
> + return sd_cmd_illegal(sd, req);
> + }
> +
> + if (sd->state != sd_transfer_state) {
> + return sd_invalid_state_for_cmd(sd, req);
> + }
> +
> + sd->multi_blk_cnt = req.arg;
> +
> + return sd_r1;
> +}
> +
> static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
> {
> uint32_t rca = 0x0000;
> @@ -1321,20 +1336,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
> }
> break;
>
> - case 23: /* CMD23: SET_BLOCK_COUNT */
> - if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
> - return sd_invalid_state_for_cmd(sd, req);
> - }
> - switch (sd->state) {
> - case sd_transfer_state:
> - sd->multi_blk_cnt = req.arg;
> - return sd_r1;
> -
> - default:
> - break;
> - }
> - break;
> -
> /* Block write commands (Class 4) */
> case 24: /* CMD24: WRITE_SINGLE_BLOCK */
> case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
> @@ -2158,6 +2159,7 @@ static const SDProto sd_proto_sd = {
> [3] = sd_cmd_SEND_RELATIVE_ADDR,
> [5] = sd_cmd_illegal,
> [19] = sd_cmd_SEND_TUNING_BLOCK,
> + [23] = sd_cmd_SET_BLOCK_COUNT,
> [52 ... 54] = sd_cmd_illegal,
> [58] = sd_cmd_illegal,
> [59] = sd_cmd_illegal,
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 22/25] hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler
2022-05-30 19:38 ` [PATCH v2 22/25] hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler Philippe Mathieu-Daudé
@ 2022-05-31 8:48 ` Cédric Le Goater
0 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2022-05-31 8:48 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Philippe Mathieu-Daudé,
Sai Pavan Boddu
On 5/30/22 21:38, Philippe Mathieu-Daudé wrote:
> From: Cédric Le Goater <clg@kaod.org>
>
> The parameters mimick a real 4GB eMMC, but it can be set to various
> sizes. Initially from Vincent Palatin <vpalatin@chromium.org>
>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> [PMD: Remove CMD8 (SEND_EXT_CSD) case in sd_read_byte()]
AFAICT and from the tests, this is still needed.
C.
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> hw/sd/sd.c | 101 ++++++++++++++++++++++++++++++++++++++++-
> hw/sd/sdmmc-internal.h | 97 +++++++++++++++++++++++++++++++++++++++
> include/hw/sd/sd.h | 1 +
> 3 files changed, 198 insertions(+), 1 deletion(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index 907d4f5760..6722003cda 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -142,6 +142,7 @@ struct SDState {
> uint64_t data_start;
> uint32_t data_offset;
> uint8_t data[512];
> + uint8_t ext_csd[512];
> qemu_irq readonly_cb;
> qemu_irq inserted_cb;
> QEMUTimer *ocr_power_timer;
> @@ -408,8 +409,85 @@ static const uint8_t sd_csd_rw_mask[16] = {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
> };
>
> +static void mmc_set_ext_csd(SDState *sd, uint64_t size)
> +{
> + uint32_t sectcount = size >> HWBLOCK_SHIFT;
> +
> + memset(sd->ext_csd, 0, sizeof(sd->ext_csd));
> +
> + sd->ext_csd[EXT_CSD_S_CMD_SET] = 0x1; /* supported command sets */
> + sd->ext_csd[EXT_CSD_HPI_FEATURES] = 0x3; /* HPI features */
> + sd->ext_csd[EXT_CSD_BKOPS_SUPPORT] = 0x1; /* Background operations */
> + sd->ext_csd[241] = 0xA; /* 1st initialization time after partitioning */
> + sd->ext_csd[EXT_CSD_TRIM_MULT] = 0x1; /* Trim multiplier */
> + sd->ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] = 0x15; /* Secure feature */
> + sd->ext_csd[EXT_CSD_SEC_ERASE_MULT] = 0x96; /* Secure erase support */
> + sd->ext_csd[EXT_CSD_SEC_TRIM_MULT] = 0x96; /* Secure TRIM multiplier */
> + sd->ext_csd[EXT_CSD_BOOT_INFO] = 0x7; /* Boot information */
> + sd->ext_csd[EXT_CSD_BOOT_MULT] = 0x8; /* Boot partition size. 128KB unit */
> + sd->ext_csd[EXT_CSD_ACC_SIZE] = 0x6; /* Access size */
> + sd->ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] = 0x4; /* HC Erase unit size */
> + sd->ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] = 0x1; /* HC erase timeout */
> + sd->ext_csd[EXT_CSD_REL_WR_SEC_C] = 0x1; /* Reliable write sector count */
> + sd->ext_csd[EXT_CSD_HC_WP_GRP_SIZE] = 0x4; /* HC write protect group size */
> + sd->ext_csd[EXT_CSD_S_C_VCC] = 0x8; /* Sleep current VCC */
> + sd->ext_csd[EXT_CSD_S_C_VCCQ] = 0x7; /* Sleep current VCCQ */
> + sd->ext_csd[EXT_CSD_S_A_TIMEOUT] = 0x11; /* Sleep/Awake timeout */
> + sd->ext_csd[215] = (sectcount >> 24) & 0xff; /* Sector count */
> + sd->ext_csd[214] = (sectcount >> 16) & 0xff; /* ... */
> + sd->ext_csd[213] = (sectcount >> 8) & 0xff; /* ... */
> + sd->ext_csd[EXT_CSD_SEC_CNT] = (sectcount & 0xff); /* ... */
> + sd->ext_csd[210] = 0xa; /* Min write perf for 8bit@52Mhz */
> + sd->ext_csd[209] = 0xa; /* Min read perf for 8bit@52Mhz */
> + sd->ext_csd[208] = 0xa; /* Min write perf for 4bit@52Mhz */
> + sd->ext_csd[207] = 0xa; /* Min read perf for 4bit@52Mhz */
> + sd->ext_csd[206] = 0xa; /* Min write perf for 4bit@26Mhz */
> + sd->ext_csd[205] = 0xa; /* Min read perf for 4bit@26Mhz */
> + sd->ext_csd[EXT_CSD_PART_SWITCH_TIME] = 0x1;
> + sd->ext_csd[EXT_CSD_OUT_OF_INTERRUPT_TIME] = 0x1;
> + sd->ext_csd[EXT_CSD_CARD_TYPE] = 0x7;
> + sd->ext_csd[EXT_CSD_STRUCTURE] = 0x2;
> + sd->ext_csd[EXT_CSD_REV] = 0x5;
> + sd->ext_csd[EXT_CSD_RPMB_MULT] = 0x1; /* RPMB size */
> + sd->ext_csd[EXT_CSD_PARTITION_SUPPORT] = 0x3;
> + sd->ext_csd[159] = 0x00; /* Max enhanced area size */
> + sd->ext_csd[158] = 0x00; /* ... */
> + sd->ext_csd[157] = 0xEC; /* ... */
> +}
> +
> +static void sd_emmc_set_csd(SDState *sd, uint64_t size)
> +{
> + sd->csd[0] = 0xd0;
> + sd->csd[1] = 0x0f;
> + sd->csd[2] = 0x00;
> + sd->csd[3] = 0x32;
> + sd->csd[4] = 0x0f;
> + if (size <= 2 * GiB) {
> + /* use 1k blocks */
> + uint32_t csize1k = (size >> (CMULT_SHIFT + 10)) - 1;
> + sd->csd[5] = 0x5a;
> + sd->csd[6] = 0x80 | ((csize1k >> 10) & 0xf);
> + sd->csd[7] = (csize1k >> 2) & 0xff;
> + } else { /* >= 2GB : size stored in ext CSD, block addressing */
> + sd->csd[5] = 0x59;
> + sd->csd[6] = 0x8f;
> + sd->csd[7] = 0xff;
> + sd->ocr = FIELD_DP32(sd->ocr, OCR, CARD_CAPACITY, 1);
> + }
> + sd->csd[8] = 0xff;
> + sd->csd[9] = 0xff;
> + sd->csd[10] = 0xf7;
> + sd->csd[11] = 0xfe;
> + sd->csd[12] = 0x49;
> + sd->csd[13] = 0x10;
> + sd->csd[14] = 0x00;
> + sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
> + mmc_set_ext_csd(sd, size);
> +}
> +
> static void sd_set_csd(SDState *sd, uint64_t size)
> {
> + SDCardClass *sc = SD_CARD_GET_CLASS(sd);
> int hwblock_shift = HWBLOCK_SHIFT;
> uint32_t csize;
> uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
> @@ -421,7 +499,9 @@ static void sd_set_csd(SDState *sd, uint64_t size)
> }
> csize = (size >> (CMULT_SHIFT + hwblock_shift)) - 1;
>
> - if (size <= SDSC_MAX_CAPACITY) { /* Standard Capacity SD */
> + if (sc->set_csd) {
> + sc->set_csd(sd, size);
> + } else if (size <= SDSC_MAX_CAPACITY) { /* Standard Capacity SD */
> sd->csd[0] = 0x00; /* CSD structure */
> sd->csd[1] = 0x26; /* Data read access-time-1 */
> sd->csd[2] = 0x00; /* Data read access-time-2 */
> @@ -2279,6 +2359,23 @@ static sd_rsp_type_t sd_emmc_cmd_ALL_SEND_CID(SDState *sd, SDRequest req)
> return sd_r2_i;
> }
>
> +static sd_rsp_type_t sd_emmc_cmd_SEND_EXT_CSD(SDState *sd, SDRequest req)
> +{
> + uint64_t addr = (sd->ocr & (1 << 30)) ? (uint64_t) req.arg << 9 : req.arg;
> +
> + switch (sd->state) {
> + case sd_transfer_state:
> + /* MMC : Sends the EXT_CSD register as a Block of data */
> + sd->state = sd_sendingdata_state;
> + memcpy(sd->data, sd->ext_csd, sizeof(sd->ext_csd));
> + sd->data_start = addr;
> + sd->data_offset = 0;
> + return sd_r1;
> + default:
> + return sd_invalid_state_for_cmd(sd, req);
> + }
> +}
> +
> static sd_rsp_type_t sd_emmc_cmd_APP_CMD(SDState *sd, SDRequest req)
> {
> return sd_r0;
> @@ -2317,6 +2414,7 @@ static const SDProto sd_proto_emmc = {
> [3] = sd_emmc_cmd_SEND_RELATIVE_ADDR,
> [5] = sd_cmd_illegal,
> [6] = sd_emmc_cmd_SWITCH_FUNCTION,
> + [8] = sd_emmc_cmd_SEND_EXT_CSD,
> [19] = sd_cmd_SEND_TUNING_BLOCK,
> [21] = sd_emmc_cmd_SEND_TUNING_BLOCK,
> [41] = sd_cmd_illegal,
> @@ -2465,6 +2563,7 @@ static void emmc_class_init(ObjectClass *klass, void *data)
> dc->desc = "eMMC";
> dc->realize = emmc_realize;
> sc->proto = &sd_proto_emmc;
> + sc->set_csd = sd_emmc_set_csd;
> }
>
> static const TypeInfo emmc_info = {
> diff --git a/hw/sd/sdmmc-internal.h b/hw/sd/sdmmc-internal.h
> index d8bf17d204..2b98f117cd 100644
> --- a/hw/sd/sdmmc-internal.h
> +++ b/hw/sd/sdmmc-internal.h
> @@ -37,4 +37,101 @@ const char *sd_cmd_name(uint8_t cmd);
> */
> const char *sd_acmd_name(uint8_t cmd);
>
> +/*
> + * EXT_CSD fields
> + */
> +
> +#define EXT_CSD_CMDQ_MODE_EN 15 /* R/W */
> +#define EXT_CSD_FLUSH_CACHE 32 /* W */
> +#define EXT_CSD_CACHE_CTRL 33 /* R/W */
> +#define EXT_CSD_POWER_OFF_NOTIFICATION 34 /* R/W */
> +#define EXT_CSD_PACKED_FAILURE_INDEX 35 /* RO */
> +#define EXT_CSD_PACKED_CMD_STATUS 36 /* RO */
> +#define EXT_CSD_EXP_EVENTS_STATUS 54 /* RO, 2 bytes */
> +#define EXT_CSD_EXP_EVENTS_CTRL 56 /* R/W, 2 bytes */
> +#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */
> +#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
> +#define EXT_CSD_PARTITION_SETTING_COMPLETED 155 /* R/W */
> +#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
> +#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
> +#define EXT_CSD_HPI_MGMT 161 /* R/W */
> +#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */
> +#define EXT_CSD_BKOPS_EN 163 /* R/W */
> +#define EXT_CSD_BKOPS_START 164 /* W */
> +#define EXT_CSD_SANITIZE_START 165 /* W */
> +#define EXT_CSD_WR_REL_PARAM 166 /* RO */
> +#define EXT_CSD_RPMB_MULT 168 /* RO */
> +#define EXT_CSD_FW_CONFIG 169 /* R/W */
> +#define EXT_CSD_BOOT_WP 173 /* R/W */
> +#define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */
> +#define EXT_CSD_PART_CONFIG 179 /* R/W */
> +#define EXT_CSD_ERASED_MEM_CONT 181 /* RO */
> +#define EXT_CSD_BUS_WIDTH 183 /* R/W */
> +#define EXT_CSD_STROBE_SUPPORT 184 /* RO */
> +#define EXT_CSD_HS_TIMING 185 /* R/W */
> +#define EXT_CSD_POWER_CLASS 187 /* R/W */
> +#define EXT_CSD_REV 192 /* RO */
> +#define EXT_CSD_STRUCTURE 194 /* RO */
> +#define EXT_CSD_CARD_TYPE 196 /* RO */
> +#define EXT_CSD_DRIVER_STRENGTH 197 /* RO */
> +#define EXT_CSD_OUT_OF_INTERRUPT_TIME 198 /* RO */
> +#define EXT_CSD_PART_SWITCH_TIME 199 /* RO */
> +#define EXT_CSD_PWR_CL_52_195 200 /* RO */
> +#define EXT_CSD_PWR_CL_26_195 201 /* RO */
> +#define EXT_CSD_PWR_CL_52_360 202 /* RO */
> +#define EXT_CSD_PWR_CL_26_360 203 /* RO */
> +#define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */
> +#define EXT_CSD_S_A_TIMEOUT 217 /* RO */
> +#define EXT_CSD_S_C_VCCQ 219 /* RO */
> +#define EXT_CSD_S_C_VCC 220 /* RO */
> +#define EXT_CSD_REL_WR_SEC_C 222 /* RO */
> +#define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */
> +#define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */
> +#define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
> +#define EXT_CSD_ACC_SIZE 225 /* RO */
> +#define EXT_CSD_BOOT_MULT 226 /* RO */
> +#define EXT_CSD_BOOT_INFO 228 /* RO */
> +#define EXT_CSD_SEC_TRIM_MULT 229 /* RO */
> +#define EXT_CSD_SEC_ERASE_MULT 230 /* RO */
> +#define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */
> +#define EXT_CSD_TRIM_MULT 232 /* RO */
> +#define EXT_CSD_PWR_CL_200_195 236 /* RO */
> +#define EXT_CSD_PWR_CL_200_360 237 /* RO */
> +#define EXT_CSD_PWR_CL_DDR_52_195 238 /* RO */
> +#define EXT_CSD_PWR_CL_DDR_52_360 239 /* RO */
> +#define EXT_CSD_BKOPS_STATUS 246 /* RO */
> +#define EXT_CSD_POWER_OFF_LONG_TIME 247 /* RO */
> +#define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
> +#define EXT_CSD_CACHE_SIZE 249 /* RO, 4 bytes */
> +#define EXT_CSD_PWR_CL_DDR_200_360 253 /* RO */
> +#define EXT_CSD_FIRMWARE_VERSION 254 /* RO, 8 bytes */
> +#define EXT_CSD_PRE_EOL_INFO 267 /* RO */
> +#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A 268 /* RO */
> +#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B 269 /* RO */
> +#define EXT_CSD_CMDQ_DEPTH 307 /* RO */
> +#define EXT_CSD_CMDQ_SUPPORT 308 /* RO */
> +#define EXT_CSD_SUPPORTED_MODE 493 /* RO */
> +#define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */
> +#define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */
> +#define EXT_CSD_MAX_PACKED_WRITES 500 /* RO */
> +#define EXT_CSD_MAX_PACKED_READS 501 /* RO */
> +#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
> +#define EXT_CSD_HPI_FEATURES 503 /* RO */
> +#define EXT_CSD_S_CMD_SET 504 /* RO */
> +
> +/*
> + * EXT_CSD field definitions
> + */
> +
> +#define EXT_CSD_WR_REL_PARAM_EN (1 << 2)
> +#define EXT_CSD_WR_REL_PARAM_EN_RPMB_REL_WR (1 << 4)
> +
> +#define EXT_CSD_PART_CONFIG_ACC_MASK (0x7)
> +#define EXT_CSD_PART_CONFIG_ACC_DEFAULT (0x0)
> +#define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1)
> +
> +#define EXT_CSD_PART_CONFIG_EN_MASK (0x7 << 3)
> +#define EXT_CSD_PART_CONFIG_EN_BOOT0 (0x1 << 3)
> +#define EXT_CSD_PART_CONFIG_EN_USER (0x7 << 3)
> +
> #endif
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index e52436b7a5..8a0f2e75da 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -129,6 +129,7 @@ struct SDCardClass {
> bool (*get_readonly)(SDState *sd);
>
> const struct SDProto *proto;
> + void (*set_csd)(SDState *sd, uint64_t size);
> };
>
> #define TYPE_SD_BUS "sd-bus"
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 14/25] hw/sd: Basis for eMMC support
2022-05-30 19:38 ` [PATCH v2 14/25] hw/sd: Basis for eMMC support Philippe Mathieu-Daudé
2022-05-31 7:54 ` Philippe Mathieu-Daudé via
@ 2022-05-31 8:50 ` Cédric Le Goater
2022-05-31 9:05 ` Cédric Le Goater
2 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2022-05-31 8:50 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Philippe Mathieu-Daudé,
Sai Pavan Boddu
On 5/30/22 21:38, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
> The initial eMMC support from Vincent Palatin was largely reworked to
> match the current SD framework.
>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> TODO: Do not inherit TYPE_SD_CARD, duplicate sd_class_init()
> ---
> hw/sd/sd.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> include/hw/sd/sd.h | 3 +++
> 2 files changed, 45 insertions(+)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index b2f16dbb73..8b178aa261 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -2166,6 +2166,19 @@ static const SDProto sd_proto_sd = {
> },
> };
>
> +static const SDProto sd_proto_emmc = {
> + .name = "eMMC",
> + .cmd = {
> + [0] = sd_cmd_GO_IDLE_STATE,
> + [5] = sd_cmd_illegal,
> + [19] = sd_cmd_SEND_TUNING_BLOCK,
> + [41] = sd_cmd_illegal,
> + [52 ... 54] = sd_cmd_illegal,
> + [58] = sd_cmd_illegal,
> + [59] = sd_cmd_illegal,
> + },
> +};
> +
> static void sd_instance_init(Object *obj)
> {
> SDState *sd = SD_CARD(obj);
> @@ -2284,9 +2297,38 @@ static const TypeInfo sd_info = {
> .instance_finalize = sd_instance_finalize,
> };
>
> +static void emmc_realize(DeviceState *dev, Error **errp)
> +{
> + SDState *sd = SD_CARD(dev);
> +
> + if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
> + error_setg(errp, "Minimum spec for eMMC is v3.01");
> + return;
> + }
> +
> + sd_realize(dev, errp);
sd_realize overwrites sc->proto. We should not write to the class anyway.
C.
> +}
> +
> +static void emmc_class_init(ObjectClass *klass, void *data)
> +{
> + DeviceClass *dc = DEVICE_CLASS(klass);
> + SDCardClass *sc = SD_CARD_CLASS(klass);
> +
> + dc->desc = "eMMC";
> + dc->realize = emmc_realize;
> + sc->proto = &sd_proto_emmc;
> +}
> +
> +static const TypeInfo emmc_info = {
> + .name = TYPE_EMMC,
> + .parent = TYPE_SD_CARD,
> + .class_init = emmc_class_init,
> + };
> +
> static void sd_register_types(void)
> {
> type_register_static(&sd_info);
> + type_register_static(&emmc_info);
> }
>
> type_init(sd_register_types)
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index 0d94e1f346..e52436b7a5 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -93,6 +93,9 @@ typedef struct {
> #define TYPE_SD_CARD "sd-card"
> OBJECT_DECLARE_TYPE(SDState, SDCardClass, SD_CARD)
>
> +#define TYPE_EMMC "emmc"
> +DECLARE_INSTANCE_CHECKER(SDState, EMMC, TYPE_EMMC)
> +
> struct SDCardClass {
> /*< private >*/
> DeviceClass parent_class;
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 14/25] hw/sd: Basis for eMMC support
2022-05-30 19:38 ` [PATCH v2 14/25] hw/sd: Basis for eMMC support Philippe Mathieu-Daudé
2022-05-31 7:54 ` Philippe Mathieu-Daudé via
2022-05-31 8:50 ` Cédric Le Goater
@ 2022-05-31 9:05 ` Cédric Le Goater
2 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2022-05-31 9:05 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Philippe Mathieu-Daudé,
Sai Pavan Boddu
On 5/30/22 21:38, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
> The initial eMMC support from Vincent Palatin was largely reworked to
> match the current SD framework.
>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> TODO: Do not inherit TYPE_SD_CARD, duplicate sd_class_init()
> ---
> hw/sd/sd.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> include/hw/sd/sd.h | 3 +++
> 2 files changed, 45 insertions(+)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index b2f16dbb73..8b178aa261 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -2166,6 +2166,19 @@ static const SDProto sd_proto_sd = {
> },
> };
>
> +static const SDProto sd_proto_emmc = {
> + .name = "eMMC",
> + .cmd = {
> + [0] = sd_cmd_GO_IDLE_STATE,
> + [5] = sd_cmd_illegal,
And this needed an extra :
+ [23] = sd_cmd_SET_BLOCK_COUNT,
Thanks,
C.
> + [19] = sd_cmd_SEND_TUNING_BLOCK,
> + [41] = sd_cmd_illegal,
> + [52 ... 54] = sd_cmd_illegal,
> + [58] = sd_cmd_illegal,
> + [59] = sd_cmd_illegal,
> + },
> +};
> +
> static void sd_instance_init(Object *obj)
> {
> SDState *sd = SD_CARD(obj);
> @@ -2284,9 +2297,38 @@ static const TypeInfo sd_info = {
> .instance_finalize = sd_instance_finalize,
> };
>
> +static void emmc_realize(DeviceState *dev, Error **errp)
> +{
> + SDState *sd = SD_CARD(dev);
> +
> + if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
> + error_setg(errp, "Minimum spec for eMMC is v3.01");
> + return;
> + }
> +
> + sd_realize(dev, errp);
> +}
> +
> +static void emmc_class_init(ObjectClass *klass, void *data)
> +{
> + DeviceClass *dc = DEVICE_CLASS(klass);
> + SDCardClass *sc = SD_CARD_CLASS(klass);
> +
> + dc->desc = "eMMC";
> + dc->realize = emmc_realize;
> + sc->proto = &sd_proto_emmc;
> +}
> +
> +static const TypeInfo emmc_info = {
> + .name = TYPE_EMMC,
> + .parent = TYPE_SD_CARD,
> + .class_init = emmc_class_init,
> + };
> +
> static void sd_register_types(void)
> {
> type_register_static(&sd_info);
> + type_register_static(&emmc_info);
> }
>
> type_init(sd_register_types)
> diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
> index 0d94e1f346..e52436b7a5 100644
> --- a/include/hw/sd/sd.h
> +++ b/include/hw/sd/sd.h
> @@ -93,6 +93,9 @@ typedef struct {
> #define TYPE_SD_CARD "sd-card"
> OBJECT_DECLARE_TYPE(SDState, SDCardClass, SD_CARD)
>
> +#define TYPE_EMMC "emmc"
> +DECLARE_INSTANCE_CHECKER(SDState, EMMC, TYPE_EMMC)
> +
> struct SDCardClass {
> /*< private >*/
> DeviceClass parent_class;
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 00/25] hw/sd: Rework models for eMMC support
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
` (25 preceding siblings ...)
2022-05-31 6:31 ` [PATCH v2 00/25] hw/sd: Rework models for eMMC support Cédric Le Goater
@ 2022-05-31 9:19 ` Cédric Le Goater
2022-05-31 19:07 ` Philippe Mathieu-Daudé via
26 siblings, 1 reply; 38+ messages in thread
From: Cédric Le Goater @ 2022-05-31 9:19 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Philippe Mathieu-Daudé,
Sai Pavan Boddu
On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
> Rebase/respin of Cédric RFC:
> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
> (sorry it took me so long guys...)
>
> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
>
> I plan to queue patches 1-12 via sdmmc-next later this week.
>
> Cédric, if you are happy with this series, it should be easy to rebase
> your other patches on top and address the comments I left on the RFC :)
I pushed an update on :
https://github.com/legoater/qemu/commits/aspeed-7.1
Here is an image :
https://www.kaod.org/qemu/aspeed/mmc-p10bmc.qcow2
run with :
qemu-system-arm -M rainier-bmc -net nic -net user -drive file=./mmc-p10bmc.qcow2,format=qcow2,if=sd,id=sd0,index=2 -nographic -nodefaults -snapshot -serial mon:stdio
Thanks,
C.
> Regards,
>
> Phil.
>
> Cédric Le Goater (6):
> hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler
> hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler
> hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler
> hw/sd: Add sd_emmc_cmd_APP_CMD() handler
> hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler
> hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler
>
> Joel Stanley (4):
> hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler
> hw/sd: Support boot area in emmc image
> hw/sd: Subtract bootarea size from blk
> hw/sd: Add boot config support
>
> Philippe Mathieu-Daudé (13):
> hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01
> hw/sd: When card is in wrong state, log which state it is
> hw/sd: When card is in wrong state, log which spec version is used
> hw/sd: Move proto_name to SDProto structure
> hw/sd: Introduce sd_cmd_handler type
> hw/sd: Add sd_cmd_illegal() handler
> hw/sd: Add sd_cmd_unimplemented() handler
> hw/sd: Add sd_cmd_GO_IDLE_STATE() handler
> hw/sd: Add sd_cmd_SEND_OP_CMD() handler
> hw/sd: Add sd_cmd_ALL_SEND_CID() handler
> hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler
> hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler
> hw/sd: Basis for eMMC support
>
> Sai Pavan Boddu (2):
> hw/sd: Add CMD21 tuning sequence
> hw/sd: Add mmc switch function support
>
> hw/sd/sd.c | 645 +++++++++++++++++++++++++++++++++--------
> hw/sd/sdmmc-internal.c | 2 +-
> hw/sd/sdmmc-internal.h | 97 +++++++
> include/hw/sd/sd.h | 7 +
> 4 files changed, 627 insertions(+), 124 deletions(-)
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 00/25] hw/sd: Rework models for eMMC support
2022-05-31 9:19 ` Cédric Le Goater
@ 2022-05-31 19:07 ` Philippe Mathieu-Daudé via
2022-06-01 5:50 ` Cédric Le Goater
0 siblings, 1 reply; 38+ messages in thread
From: Philippe Mathieu-Daudé via @ 2022-05-31 19:07 UTC (permalink / raw)
To: Cédric Le Goater, Philippe Mathieu-Daudé, qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Sai Pavan Boddu
On 31/5/22 11:19, Cédric Le Goater wrote:
> On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>
>> Rebase/respin of Cédric RFC:
>> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
>> (sorry it took me so long guys...)
>>
>> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
>>
>> I plan to queue patches 1-12 via sdmmc-next later this week.
>>
>> Cédric, if you are happy with this series, it should be easy to rebase
>> your other patches on top and address the comments I left on the RFC :)
>
> I pushed an update on :
>
> https://github.com/legoater/qemu/commits/aspeed-7.1
>
> Here is an image :
>
> https://www.kaod.org/qemu/aspeed/mmc-p10bmc.qcow2
>
> run with :
>
> qemu-system-arm -M rainier-bmc -net nic -net user -drive
> file=./mmc-p10bmc.qcow2,format=qcow2,if=sd,id=sd0,index=2 -nographic
> -nodefaults -snapshot -serial mon:stdio
Useful, thanks.
I see in hw/arm/aspeed_ast2600.c:
/* Init sd card slot class here so that they're under the correct
parent */
for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
object_initialize_child(obj, "sd-controller.sdhci[*]",
&s->sdhci.slots[i], TYPE_SYSBUS_SDHCI);
}
object_initialize_child(obj, "emmc-controller.sdhci",
&s->emmc.slots[0],
TYPE_SYSBUS_SDHCI);
/* eMMC Boot Controller stub */
create_unimplemented_device("aspeed.emmc-boot-controller",
sc->memmap[ASPEED_DEV_EMMC_BC],
0x1000);
/* eMMC */
if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
return;
}
sysbus_mmio_map(SYS_BUS_DEVICE(&s->emmc), 0,
sc->memmap[ASPEED_DEV_EMMC]);
sysbus_connect_irq(SYS_BUS_DEVICE(&s->emmc), 0,
aspeed_soc_get_irq(s, ASPEED_DEV_EMMC));
Where is 'emmc-controller.sdhci' realized?
In aspeed_sdhci_realize() you set sd-spec-version" = 2, is that OK
with eMMC?
What expects the real hw?
Thanks,
Phil.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH v2 00/25] hw/sd: Rework models for eMMC support
2022-05-31 19:07 ` Philippe Mathieu-Daudé via
@ 2022-06-01 5:50 ` Cédric Le Goater
0 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2022-06-01 5:50 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, Philippe Mathieu-Daudé,
qemu-devel
Cc: Bin Meng, qemu-block, Joel Stanley, Sai Pavan Boddu
On 5/31/22 21:07, Philippe Mathieu-Daudé wrote:
> On 31/5/22 11:19, Cédric Le Goater wrote:
>> On 5/30/22 21:37, Philippe Mathieu-Daudé wrote:
>>> From: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>>
>>> Rebase/respin of Cédric RFC:
>>> https://lore.kernel.org/qemu-devel/20220318132824.1134400-1-clg@kaod.org/
>>> (sorry it took me so long guys...)
>>>
>>> Pushed at https://gitlab.com/philmd/qemu/-/commits/emmc-v2
>>>
>>> I plan to queue patches 1-12 via sdmmc-next later this week.
>>>
>>> Cédric, if you are happy with this series, it should be easy to rebase
>>> your other patches on top and address the comments I left on the RFC :)
>>
>> I pushed an update on :
>>
>> https://github.com/legoater/qemu/commits/aspeed-7.1
>>
>> Here is an image :
>>
>> https://www.kaod.org/qemu/aspeed/mmc-p10bmc.qcow2
>>
>> run with :
>>
>> qemu-system-arm -M rainier-bmc -net nic -net user -drive file=./mmc-p10bmc.qcow2,format=qcow2,if=sd,id=sd0,index=2 -nographic -nodefaults -snapshot -serial mon:stdio
>
> Useful, thanks.
>
> I see in hw/arm/aspeed_ast2600.c:
>
> /* Init sd card slot class here so that they're under the correct parent */
> for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
> object_initialize_child(obj, "sd-controller.sdhci[*]",
> &s->sdhci.slots[i], TYPE_SYSBUS_SDHCI);
> }
>
> object_initialize_child(obj, "emmc-controller.sdhci", &s->emmc.slots[0],
> TYPE_SYSBUS_SDHCI);
>
> /* eMMC Boot Controller stub */
> create_unimplemented_device("aspeed.emmc-boot-controller",
> sc->memmap[ASPEED_DEV_EMMC_BC],
> 0x1000);
>
> /* eMMC */
> if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
> return;
> }
> sysbus_mmio_map(SYS_BUS_DEVICE(&s->emmc), 0, sc->memmap[ASPEED_DEV_EMMC]);
> sysbus_connect_irq(SYS_BUS_DEVICE(&s->emmc), 0,
> aspeed_soc_get_irq(s, ASPEED_DEV_EMMC));
>
> Where is 'emmc-controller.sdhci' realized?
the slots are realized in aspeed_sdhci_realize(). It's not very
symmetric and the names are confusing.
I think that one of the problems is that the instance_init routine
of TYPE_ASPEED_SDHCI object doesn't know on how much slots
object_initialize_child() should be called since it depends on
its flavor : SD/eMMC.
> In aspeed_sdhci_realize() you set sd-spec-version" = 2, is that OK
> with eMMC?
ah yes. it boots anyhow.
> What expects the real hw?
ast2400 ast2500 ast2600
SDHC card v2.0/v3.0 v2.0/v3.0 v2.0/v3.0
SDIO Host v2.0 v2.0 v2.0
SD slots 2 2 2
eMMC x v4.51 v5.1
eMMC slots x 1 1
on the ast2500, the SDIO and eMMC logics are combined in one controller
but since it is not used, QEMU does not model the eMMC part.
Thanks,
C.
^ permalink raw reply [flat|nested] 38+ messages in thread
end of thread, other threads:[~2022-06-01 5:55 UTC | newest]
Thread overview: 38+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 01/25] hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01 Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 02/25] hw/sd: When card is in wrong state, log which state it is Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 03/25] hw/sd: When card is in wrong state, log which spec version is used Philippe Mathieu-Daudé
2022-05-31 8:01 ` Cédric Le Goater
2022-05-30 19:37 ` [PATCH v2 04/25] hw/sd: Move proto_name to SDProto structure Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 05/25] hw/sd: Introduce sd_cmd_handler type Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 06/25] hw/sd: Add sd_cmd_illegal() handler Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 07/25] hw/sd: Add sd_cmd_unimplemented() handler Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 08/25] hw/sd: Add sd_cmd_GO_IDLE_STATE() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 09/25] hw/sd: Add sd_cmd_SEND_OP_CMD() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 10/25] hw/sd: Add sd_cmd_ALL_SEND_CID() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 11/25] hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 12/25] hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 13/25] hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler Philippe Mathieu-Daudé
2022-05-31 8:02 ` Cédric Le Goater
2022-05-30 19:38 ` [PATCH v2 14/25] hw/sd: Basis for eMMC support Philippe Mathieu-Daudé
2022-05-31 7:54 ` Philippe Mathieu-Daudé via
2022-05-31 8:50 ` Cédric Le Goater
2022-05-31 9:05 ` Cédric Le Goater
2022-05-30 19:38 ` [PATCH v2 15/25] hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 16/25] hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 17/25] hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 18/25] hw/sd: Add sd_emmc_cmd_APP_CMD() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 19/25] hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 20/25] hw/sd: Add CMD21 tuning sequence Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 21/25] hw/sd: Add mmc switch function support Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 22/25] hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler Philippe Mathieu-Daudé
2022-05-31 8:48 ` Cédric Le Goater
2022-05-30 19:38 ` [PATCH v2 23/25] hw/sd: Support boot area in emmc image Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 24/25] hw/sd: Subtract bootarea size from blk Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 25/25] hw/sd: Add boot config support Philippe Mathieu-Daudé
2022-05-31 6:31 ` [PATCH v2 00/25] hw/sd: Rework models for eMMC support Cédric Le Goater
2022-05-31 7:56 ` Philippe Mathieu-Daudé via
2022-05-31 7:58 ` Philippe Mathieu-Daudé via
2022-05-31 9:19 ` Cédric Le Goater
2022-05-31 19:07 ` Philippe Mathieu-Daudé via
2022-06-01 5:50 ` Cédric Le Goater
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).