* [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays
@ 2024-06-27 16:38 Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 01/11] hw/sd/sdcard: Move sd_[a]cmd_name() methods to sd.c Philippe Mathieu-Daudé
` (10 more replies)
0 siblings, 11 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
Use the SDProto structure to handle command properties
such name, type, class and handler.
Add stubs for optional commands to ease tracing.
Based-on: <20240627163403.81220-1-philmd@linaro.org>
Full series for testing:
https://gitlab.com/philmd/qemu/-/tags/emmc-v4
Philippe Mathieu-Daudé (11):
hw/sd/sdcard: Move sd_[a]cmd_name() methods to sd.c
hw/sd/sdcard: Pass SDState as argument to sd_[a]cmd_name()
hw/sd/sdcard: Prepare SDProto to contain more fields
hw/sd/sdcard: Store command name in SDProto
hw/sd/sdcard: Store command type in SDProto
hw/sd/sdcard: Store command class in SDProto
hw/sd/sdcard: Remove SEND_DSR dead case (CMD4)
hw/sd/sdcard: Register generic optional handlers (CMD11 and CMD20)
hw/sd/sdcard: Register optional handlers from spec v6.00
hw/sd/sdcard: Register SDIO optional handlers
hw/sd/sdcard: Register Security Extension optional handlers
hw/sd/sdmmc-internal.h | 26 ------
include/hw/sd/sd.h | 5 +-
hw/sd/sd.c | 192 ++++++++++++++++++++++++++++++-----------
hw/sd/sdmmc-internal.c | 72 ----------------
hw/sd/meson.build | 2 +-
5 files changed, 144 insertions(+), 153 deletions(-)
delete mode 100644 hw/sd/sdmmc-internal.c
--
2.41.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 01/11] hw/sd/sdcard: Move sd_[a]cmd_name() methods to sd.c
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 02/11] hw/sd/sdcard: Pass SDState as argument to sd_[a]cmd_name() Philippe Mathieu-Daudé
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
Merge sdmmc-internal.c into sd.c by moving
sd_cmd_name() and sd_acmd_name() and updating
meson.build.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sdmmc-internal.h | 26 ---------------
hw/sd/sd.c | 62 ++++++++++++++++++++++++++++++++++++
hw/sd/sdmmc-internal.c | 72 ------------------------------------------
hw/sd/meson.build | 2 +-
4 files changed, 63 insertions(+), 99 deletions(-)
delete mode 100644 hw/sd/sdmmc-internal.c
diff --git a/hw/sd/sdmmc-internal.h b/hw/sd/sdmmc-internal.h
index 306ffa7f53..20d85aea6d 100644
--- a/hw/sd/sdmmc-internal.h
+++ b/hw/sd/sdmmc-internal.h
@@ -108,30 +108,4 @@
#define EXT_CSD_PART_CONFIG_EN_BOOT0 (0x1 << 3)
#define EXT_CSD_PART_CONFIG_EN_USER (0x7 << 3)
-#define SDMMC_CMD_MAX 64
-
-/**
- * sd_cmd_name:
- * @cmd: A SD "normal" command, up to SDMMC_CMD_MAX.
- *
- * Returns a human-readable name describing the command.
- * The return value is always a static string which does not need
- * to be freed after use.
- *
- * Returns: The command name of @cmd or "UNKNOWN_CMD".
- */
-const char *sd_cmd_name(uint8_t cmd);
-
-/**
- * sd_acmd_name:
- * @cmd: A SD "Application-Specific" command, up to SDMMC_CMD_MAX.
- *
- * Returns a human-readable name describing the application command.
- * The return value is always a static string which does not need
- * to be freed after use.
- *
- * Returns: The application command name of @cmd or "UNKNOWN_ACMD".
- */
-const char *sd_acmd_name(uint8_t cmd);
-
#endif
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index f9708064d0..93a4a4e1b4 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -88,6 +88,8 @@ enum SDCardStates {
sd_disconnect_state = 8,
};
+#define SDMMC_CMD_MAX 64
+
typedef sd_rsp_type_t (*sd_cmd_handler)(SDState *sd, SDRequest req);
typedef struct SDProto {
@@ -231,6 +233,66 @@ static const char *sd_response_name(sd_rsp_type_t rsp)
return response_name[rsp];
}
+static const char *sd_cmd_name(uint8_t cmd)
+{
+ static const char *cmd_abbrev[SDMMC_CMD_MAX] = {
+ [0] = "GO_IDLE_STATE", [1] = "SEND_OP_COND",
+ [2] = "ALL_SEND_CID", [3] = "SEND_RELATIVE_ADDR",
+ [4] = "SET_DSR", [5] = "IO_SEND_OP_COND",
+ [6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
+ [8] = "SEND_IF_COND", [9] = "SEND_CSD",
+ [10] = "SEND_CID", [11] = "VOLTAGE_SWITCH",
+ [12] = "STOP_TRANSMISSION", [13] = "SEND_STATUS",
+ [15] = "GO_INACTIVE_STATE",
+ [16] = "SET_BLOCKLEN", [17] = "READ_SINGLE_BLOCK",
+ [18] = "READ_MULTIPLE_BLOCK", [19] = "SEND_TUNING_BLOCK",
+ [20] = "SPEED_CLASS_CONTROL", [21] = "DPS_spec",
+ [23] = "SET_BLOCK_COUNT",
+ [24] = "WRITE_BLOCK", [25] = "WRITE_MULTIPLE_BLOCK",
+ [26] = "MANUF_RSVD", [27] = "PROGRAM_CSD",
+ [28] = "SET_WRITE_PROT", [29] = "CLR_WRITE_PROT",
+ [30] = "SEND_WRITE_PROT",
+ [32] = "ERASE_WR_BLK_START", [33] = "ERASE_WR_BLK_END",
+ [34] = "SW_FUNC_RSVD", [35] = "SW_FUNC_RSVD",
+ [36] = "SW_FUNC_RSVD", [37] = "SW_FUNC_RSVD",
+ [38] = "ERASE",
+ [40] = "DPS_spec",
+ [42] = "LOCK_UNLOCK", [43] = "Q_MANAGEMENT",
+ [44] = "Q_TASK_INFO_A", [45] = "Q_TASK_INFO_B",
+ [46] = "Q_RD_TASK", [47] = "Q_WR_TASK",
+ [48] = "READ_EXTR_SINGLE", [49] = "WRITE_EXTR_SINGLE",
+ [50] = "SW_FUNC_RSVD",
+ [52] = "IO_RW_DIRECT", [53] = "IO_RW_EXTENDED",
+ [54] = "SDIO_RSVD", [55] = "APP_CMD",
+ [56] = "GEN_CMD", [57] = "SW_FUNC_RSVD",
+ [58] = "READ_EXTR_MULTI", [59] = "WRITE_EXTR_MULTI",
+ [60] = "MANUF_RSVD", [61] = "MANUF_RSVD",
+ [62] = "MANUF_RSVD", [63] = "MANUF_RSVD",
+ };
+ return cmd_abbrev[cmd] ? cmd_abbrev[cmd] : "UNKNOWN_CMD";
+}
+
+static const char *sd_acmd_name(uint8_t cmd)
+{
+ static const char *acmd_abbrev[SDMMC_CMD_MAX] = {
+ [6] = "SET_BUS_WIDTH",
+ [13] = "SD_STATUS",
+ [14] = "DPS_spec", [15] = "DPS_spec",
+ [16] = "DPS_spec",
+ [18] = "SECU_spec",
+ [22] = "SEND_NUM_WR_BLOCKS", [23] = "SET_WR_BLK_ERASE_COUNT",
+ [41] = "SD_SEND_OP_COND",
+ [42] = "SET_CLR_CARD_DETECT",
+ [51] = "SEND_SCR",
+ [52] = "SECU_spec", [53] = "SECU_spec",
+ [54] = "SECU_spec",
+ [56] = "SECU_spec", [57] = "SECU_spec",
+ [58] = "SECU_spec", [59] = "SECU_spec",
+ };
+
+ return acmd_abbrev[cmd] ? acmd_abbrev[cmd] : "UNKNOWN_ACMD";
+}
+
static uint8_t sd_get_dat_lines(SDState *sd)
{
return sd->enable ? sd->dat_lines : 0;
diff --git a/hw/sd/sdmmc-internal.c b/hw/sd/sdmmc-internal.c
deleted file mode 100644
index c1d5508ae6..0000000000
--- a/hw/sd/sdmmc-internal.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * SD/MMC cards common helpers
- *
- * Copyright (c) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
-
-#include "qemu/osdep.h"
-#include "sdmmc-internal.h"
-
-const char *sd_cmd_name(uint8_t cmd)
-{
- static const char *cmd_abbrev[SDMMC_CMD_MAX] = {
- [0] = "GO_IDLE_STATE", [1] = "SEND_OP_COND",
- [2] = "ALL_SEND_CID", [3] = "SEND_RELATIVE_ADDR",
- [4] = "SET_DSR", [5] = "IO_SEND_OP_COND",
- [6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
- [8] = "SEND_IF_COND", [9] = "SEND_CSD",
- [10] = "SEND_CID", [11] = "VOLTAGE_SWITCH",
- [12] = "STOP_TRANSMISSION", [13] = "SEND_STATUS",
- [15] = "GO_INACTIVE_STATE",
- [16] = "SET_BLOCKLEN", [17] = "READ_SINGLE_BLOCK",
- [18] = "READ_MULTIPLE_BLOCK", [19] = "SEND_TUNING_BLOCK",
- [20] = "SPEED_CLASS_CONTROL", [21] = "DPS_spec",
- [23] = "SET_BLOCK_COUNT",
- [24] = "WRITE_BLOCK", [25] = "WRITE_MULTIPLE_BLOCK",
- [26] = "MANUF_RSVD", [27] = "PROGRAM_CSD",
- [28] = "SET_WRITE_PROT", [29] = "CLR_WRITE_PROT",
- [30] = "SEND_WRITE_PROT",
- [32] = "ERASE_WR_BLK_START", [33] = "ERASE_WR_BLK_END",
- [34] = "SW_FUNC_RSVD", [35] = "SW_FUNC_RSVD",
- [36] = "SW_FUNC_RSVD", [37] = "SW_FUNC_RSVD",
- [38] = "ERASE",
- [40] = "DPS_spec",
- [42] = "LOCK_UNLOCK", [43] = "Q_MANAGEMENT",
- [44] = "Q_TASK_INFO_A", [45] = "Q_TASK_INFO_B",
- [46] = "Q_RD_TASK", [47] = "Q_WR_TASK",
- [48] = "READ_EXTR_SINGLE", [49] = "WRITE_EXTR_SINGLE",
- [50] = "SW_FUNC_RSVD",
- [52] = "IO_RW_DIRECT", [53] = "IO_RW_EXTENDED",
- [54] = "SDIO_RSVD", [55] = "APP_CMD",
- [56] = "GEN_CMD", [57] = "SW_FUNC_RSVD",
- [58] = "READ_EXTR_MULTI", [59] = "WRITE_EXTR_MULTI",
- [60] = "MANUF_RSVD", [61] = "MANUF_RSVD",
- [62] = "MANUF_RSVD", [63] = "MANUF_RSVD",
- };
- return cmd_abbrev[cmd] ? cmd_abbrev[cmd] : "UNKNOWN_CMD";
-}
-
-const char *sd_acmd_name(uint8_t cmd)
-{
- static const char *acmd_abbrev[SDMMC_CMD_MAX] = {
- [6] = "SET_BUS_WIDTH",
- [13] = "SD_STATUS",
- [14] = "DPS_spec", [15] = "DPS_spec",
- [16] = "DPS_spec",
- [18] = "SECU_spec",
- [22] = "SEND_NUM_WR_BLOCKS", [23] = "SET_WR_BLK_ERASE_COUNT",
- [41] = "SD_SEND_OP_COND",
- [42] = "SET_CLR_CARD_DETECT",
- [51] = "SEND_SCR",
- [52] = "SECU_spec", [53] = "SECU_spec",
- [54] = "SECU_spec",
- [56] = "SECU_spec", [57] = "SECU_spec",
- [58] = "SECU_spec", [59] = "SECU_spec",
- };
-
- return acmd_abbrev[cmd] ? acmd_abbrev[cmd] : "UNKNOWN_ACMD";
-}
diff --git a/hw/sd/meson.build b/hw/sd/meson.build
index abfac9e461..bbb75af0c9 100644
--- a/hw/sd/meson.build
+++ b/hw/sd/meson.build
@@ -1,5 +1,5 @@
system_ss.add(when: 'CONFIG_PL181', if_true: files('pl181.c'))
-system_ss.add(when: 'CONFIG_SD', if_true: files('sd.c', 'core.c', 'sdmmc-internal.c'))
+system_ss.add(when: 'CONFIG_SD', if_true: files('sd.c', 'core.c'))
system_ss.add(when: 'CONFIG_SDHCI', if_true: files('sdhci.c'))
system_ss.add(when: 'CONFIG_SDHCI_PCI', if_true: files('sdhci-pci.c'))
system_ss.add(when: 'CONFIG_SSI_SD', if_true: files('ssi-sd.c'))
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 02/11] hw/sd/sdcard: Pass SDState as argument to sd_[a]cmd_name()
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 01/11] hw/sd/sdcard: Move sd_[a]cmd_name() methods to sd.c Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 03/11] hw/sd/sdcard: Prepare SDProto to contain more fields Philippe Mathieu-Daudé
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
In order to access SDState::SDProto from sd_[a]cmd_name(),
pass SDState as argument.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 93a4a4e1b4..f4bdd12b26 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -233,7 +233,7 @@ static const char *sd_response_name(sd_rsp_type_t rsp)
return response_name[rsp];
}
-static const char *sd_cmd_name(uint8_t cmd)
+static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
{
static const char *cmd_abbrev[SDMMC_CMD_MAX] = {
[0] = "GO_IDLE_STATE", [1] = "SEND_OP_COND",
@@ -272,7 +272,7 @@ static const char *sd_cmd_name(uint8_t cmd)
return cmd_abbrev[cmd] ? cmd_abbrev[cmd] : "UNKNOWN_CMD";
}
-static const char *sd_acmd_name(uint8_t cmd)
+static const char *sd_acmd_name(SDState *sd, uint8_t cmd)
{
static const char *acmd_abbrev[SDMMC_CMD_MAX] = {
[6] = "SET_BUS_WIDTH",
@@ -1281,7 +1281,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
uint64_t addr;
uint32_t data;
- sd->last_cmd_name = sd_cmd_name(req.cmd);
+ sd->last_cmd_name = sd_cmd_name(sd, req.cmd);
/* CMD55 precedes an ACMD, so we are not interested in tracing it.
* However there is no ACMD55, so we want to trace this particular case.
*/
@@ -1748,7 +1748,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)
{
- sd->last_cmd_name = sd_acmd_name(req.cmd);
+ sd->last_cmd_name = sd_acmd_name(sd, req.cmd);
trace_sdcard_app_command(sd->proto->name, sd->last_cmd_name,
req.cmd, req.arg, sd_state_name(sd->state));
sd->card_status |= APP_CMD;
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 03/11] hw/sd/sdcard: Prepare SDProto to contain more fields
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 01/11] hw/sd/sdcard: Move sd_[a]cmd_name() methods to sd.c Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 02/11] hw/sd/sdcard: Pass SDState as argument to sd_[a]cmd_name() Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 04/11] hw/sd/sdcard: Store command name in SDProto Philippe Mathieu-Daudé
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
Convert array of command handlers to array of structures.
The structure contains the command handler. No logical
change intended.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 29 +++++++++++++++--------------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index f4bdd12b26..558c39419d 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -94,8 +94,9 @@ 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];
+ struct {
+ sd_cmd_handler handler;
+ } cmd[SDMMC_CMD_MAX], acmd[SDMMC_CMD_MAX];
} SDProto;
struct SDState {
@@ -1305,8 +1306,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
return sd_illegal;
}
- if (sd->proto->cmd[req.cmd]) {
- return sd->proto->cmd[req.cmd](sd, req);
+ if (sd->proto->cmd[req.cmd].handler) {
+ return sd->proto->cmd[req.cmd].handler(sd, req);
}
switch (req.cmd) {
@@ -1753,8 +1754,8 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
req.cmd, req.arg, sd_state_name(sd->state));
sd->card_status |= APP_CMD;
- if (sd->proto->acmd[req.cmd]) {
- return sd->proto->acmd[req.cmd](sd, req);
+ if (sd->proto->acmd[req.cmd].handler) {
+ return sd->proto->acmd[req.cmd].handler(sd, req);
}
switch (req.cmd) {
@@ -2267,22 +2268,22 @@ void sd_enable(SDState *sd, bool enable)
static const SDProto sd_proto_spi = {
.name = "SPI",
.cmd = {
- [0] = sd_cmd_GO_IDLE_STATE,
- [1] = spi_cmd_SEND_OP_COND,
+ [0] = {sd_cmd_GO_IDLE_STATE},
+ [1] = {spi_cmd_SEND_OP_COND},
},
.acmd = {
- [41] = spi_cmd_SEND_OP_COND,
+ [41] = {spi_cmd_SEND_OP_COND},
},
};
static const SDProto sd_proto_sd = {
.name = "SD",
.cmd = {
- [0] = sd_cmd_GO_IDLE_STATE,
- [2] = sd_cmd_ALL_SEND_CID,
- [3] = sd_cmd_SEND_RELATIVE_ADDR,
- [19] = sd_cmd_SEND_TUNING_BLOCK,
- [23] = sd_cmd_SET_BLOCK_COUNT,
+ [0] = {sd_cmd_GO_IDLE_STATE},
+ [2] = {sd_cmd_ALL_SEND_CID},
+ [3] = {sd_cmd_SEND_RELATIVE_ADDR},
+ [19] = {sd_cmd_SEND_TUNING_BLOCK},
+ [23] = {sd_cmd_SET_BLOCK_COUNT},
},
};
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 04/11] hw/sd/sdcard: Store command name in SDProto
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
` (2 preceding siblings ...)
2024-06-27 16:38 ` [PATCH 03/11] hw/sd/sdcard: Prepare SDProto to contain more fields Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 05/11] hw/sd/sdcard: Store command type " Philippe Mathieu-Daudé
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
We already have a const array where command handlers
are listed. Store the command name there too.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 35 ++++++++++++++++++++++-------------
1 file changed, 22 insertions(+), 13 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 558c39419d..97fb3785ee 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -95,6 +95,7 @@ typedef sd_rsp_type_t (*sd_cmd_handler)(SDState *sd, SDRequest req);
typedef struct SDProto {
const char *name;
struct {
+ const char *name;
sd_cmd_handler handler;
} cmd[SDMMC_CMD_MAX], acmd[SDMMC_CMD_MAX];
} SDProto;
@@ -237,8 +238,6 @@ static const char *sd_response_name(sd_rsp_type_t rsp)
static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
{
static const char *cmd_abbrev[SDMMC_CMD_MAX] = {
- [0] = "GO_IDLE_STATE", [1] = "SEND_OP_COND",
- [2] = "ALL_SEND_CID", [3] = "SEND_RELATIVE_ADDR",
[4] = "SET_DSR", [5] = "IO_SEND_OP_COND",
[6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
[8] = "SEND_IF_COND", [9] = "SEND_CSD",
@@ -246,9 +245,8 @@ static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
[12] = "STOP_TRANSMISSION", [13] = "SEND_STATUS",
[15] = "GO_INACTIVE_STATE",
[16] = "SET_BLOCKLEN", [17] = "READ_SINGLE_BLOCK",
- [18] = "READ_MULTIPLE_BLOCK", [19] = "SEND_TUNING_BLOCK",
+ [18] = "READ_MULTIPLE_BLOCK",
[20] = "SPEED_CLASS_CONTROL", [21] = "DPS_spec",
- [23] = "SET_BLOCK_COUNT",
[24] = "WRITE_BLOCK", [25] = "WRITE_MULTIPLE_BLOCK",
[26] = "MANUF_RSVD", [27] = "PROGRAM_CSD",
[28] = "SET_WRITE_PROT", [29] = "CLR_WRITE_PROT",
@@ -270,6 +268,12 @@ static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
[60] = "MANUF_RSVD", [61] = "MANUF_RSVD",
[62] = "MANUF_RSVD", [63] = "MANUF_RSVD",
};
+ const SDProto *sdp = sd->proto;
+
+ if (sdp->cmd[cmd].handler) {
+ assert(!cmd_abbrev[cmd]);
+ return sdp->cmd[cmd].name;
+ }
return cmd_abbrev[cmd] ? cmd_abbrev[cmd] : "UNKNOWN_CMD";
}
@@ -282,7 +286,6 @@ static const char *sd_acmd_name(SDState *sd, uint8_t cmd)
[16] = "DPS_spec",
[18] = "SECU_spec",
[22] = "SEND_NUM_WR_BLOCKS", [23] = "SET_WR_BLK_ERASE_COUNT",
- [41] = "SD_SEND_OP_COND",
[42] = "SET_CLR_CARD_DETECT",
[51] = "SEND_SCR",
[52] = "SECU_spec", [53] = "SECU_spec",
@@ -290,6 +293,12 @@ static const char *sd_acmd_name(SDState *sd, uint8_t cmd)
[56] = "SECU_spec", [57] = "SECU_spec",
[58] = "SECU_spec", [59] = "SECU_spec",
};
+ const SDProto *sdp = sd->proto;
+
+ if (sdp->acmd[cmd].handler) {
+ assert(!acmd_abbrev[cmd]);
+ return sdp->acmd[cmd].name;
+ }
return acmd_abbrev[cmd] ? acmd_abbrev[cmd] : "UNKNOWN_ACMD";
}
@@ -2268,22 +2277,22 @@ void sd_enable(SDState *sd, bool enable)
static const SDProto sd_proto_spi = {
.name = "SPI",
.cmd = {
- [0] = {sd_cmd_GO_IDLE_STATE},
- [1] = {spi_cmd_SEND_OP_COND},
+ [0] = { "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
+ [1] = { "SEND_OP_COND", spi_cmd_SEND_OP_COND},
},
.acmd = {
- [41] = {spi_cmd_SEND_OP_COND},
+ [41] = { "SEND_OP_COND", spi_cmd_SEND_OP_COND},
},
};
static const SDProto sd_proto_sd = {
.name = "SD",
.cmd = {
- [0] = {sd_cmd_GO_IDLE_STATE},
- [2] = {sd_cmd_ALL_SEND_CID},
- [3] = {sd_cmd_SEND_RELATIVE_ADDR},
- [19] = {sd_cmd_SEND_TUNING_BLOCK},
- [23] = {sd_cmd_SET_BLOCK_COUNT},
+ [0] = { "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
+ [2] = { "ALL_SEND_CID", sd_cmd_ALL_SEND_CID},
+ [3] = { "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
+ [19] = { "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
+ [23] = { "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
},
};
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 05/11] hw/sd/sdcard: Store command type in SDProto
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
` (3 preceding siblings ...)
2024-06-27 16:38 ` [PATCH 04/11] hw/sd/sdcard: Store command name in SDProto Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 06/11] hw/sd/sdcard: Store command class " Philippe Mathieu-Daudé
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
Store the command type altogether with the command handler and name.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/hw/sd/sd.h | 5 +++--
hw/sd/sd.c | 44 ++++++++++++++++++++------------------------
2 files changed, 23 insertions(+), 26 deletions(-)
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 2c8748fb9b..29c76935a0 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -76,8 +76,9 @@ typedef enum {
} sd_uhs_mode_t;
typedef enum {
- sd_none = -1,
- sd_bc = 0, /* broadcast -- no response */
+ sd_none = 0,
+ sd_spi,
+ sd_bc, /* broadcast -- no response */
sd_bcr, /* broadcast with response */
sd_ac, /* addressed -- no data transfer */
sd_adtc, /* addressed with data transfer */
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 97fb3785ee..c4cc48926d 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -95,6 +95,7 @@ typedef sd_rsp_type_t (*sd_cmd_handler)(SDState *sd, SDRequest req);
typedef struct SDProto {
const char *name;
struct {
+ const sd_cmd_type_t type;
const char *name;
sd_cmd_handler handler;
} cmd[SDMMC_CMD_MAX], acmd[SDMMC_CMD_MAX];
@@ -351,20 +352,6 @@ static void sd_set_mode(SDState *sd)
}
}
-static const sd_cmd_type_t sd_cmd_type[SDMMC_CMD_MAX] = {
- sd_bc, sd_none, sd_bcr, sd_bcr, sd_none, sd_none, sd_none, sd_ac,
- sd_bcr, sd_ac, sd_ac, sd_adtc, sd_ac, sd_ac, sd_none, sd_ac,
- /* 16 */
- sd_ac, sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
- sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac, sd_ac, sd_adtc, sd_none,
- /* 32 */
- sd_ac, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
- sd_none, sd_none, sd_bc, sd_none, sd_none, sd_none, sd_none, sd_none,
- /* 48 */
- sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
- sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
-};
-
static const int sd_cmd_class[SDMMC_CMD_MAX] = {
0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0,
2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6,
@@ -571,10 +558,19 @@ static void sd_set_rca(SDState *sd, uint16_t value)
static uint16_t sd_req_get_rca(SDState *s, SDRequest req)
{
- if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc) {
+ switch (s->proto->cmd[req.cmd].type) {
+ case sd_none:
+ /* Called from legacy code not ported to SDProto array */
+ assert(!s->proto->cmd[req.cmd].handler);
+ /* fall-through */
+ case sd_ac:
+ case sd_adtc:
return req.arg >> 16;
+ case sd_spi:
+ g_assert_not_reached();
+ default:
+ return 0;
}
- return 0;
}
/* Card Status register */
@@ -2277,22 +2273,22 @@ void sd_enable(SDState *sd, bool enable)
static const SDProto sd_proto_spi = {
.name = "SPI",
.cmd = {
- [0] = { "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
- [1] = { "SEND_OP_COND", spi_cmd_SEND_OP_COND},
+ [0] = { sd_spi, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
+ [1] = { sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
},
.acmd = {
- [41] = { "SEND_OP_COND", spi_cmd_SEND_OP_COND},
+ [41] = { sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
},
};
static const SDProto sd_proto_sd = {
.name = "SD",
.cmd = {
- [0] = { "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
- [2] = { "ALL_SEND_CID", sd_cmd_ALL_SEND_CID},
- [3] = { "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
- [19] = { "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
- [23] = { "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
+ [0] = { sd_bc, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
+ [2] = { sd_bcr, "ALL_SEND_CID", sd_cmd_ALL_SEND_CID},
+ [3] = { sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
+ [19] = { sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
+ [23] = { sd_ac, "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
},
};
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 06/11] hw/sd/sdcard: Store command class in SDProto
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
` (4 preceding siblings ...)
2024-06-27 16:38 ` [PATCH 05/11] hw/sd/sdcard: Store command type " Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 07/11] hw/sd/sdcard: Remove SEND_DSR dead case (CMD4) Philippe Mathieu-Daudé
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
Store the command class altogether with the other command
fields (handler, name and type).
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 36 +++++++++++++++++++-----------------
1 file changed, 19 insertions(+), 17 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index c4cc48926d..a816493d37 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -95,6 +95,7 @@ typedef sd_rsp_type_t (*sd_cmd_handler)(SDState *sd, SDRequest req);
typedef struct SDProto {
const char *name;
struct {
+ const unsigned class;
const sd_cmd_type_t type;
const char *name;
sd_cmd_handler handler;
@@ -352,13 +353,6 @@ static void sd_set_mode(SDState *sd)
}
}
-static const int sd_cmd_class[SDMMC_CMD_MAX] = {
- 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6,
- 5, 5, 10, 10, 10, 10, 5, 9, 9, 9, 7, 7, 7, 7, 7, 7,
- 7, 7, 10, 7, 9, 9, 9, 8, 8, 10, 8, 8, 8, 8, 8, 8,
-};
-
static uint8_t sd_crc7(const void *message, size_t width)
{
int i, bit;
@@ -1306,7 +1300,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
sd->multi_blk_cnt = 0;
}
- if (sd_cmd_class[req.cmd] == 6 && FIELD_EX32(sd->ocr, OCR, CARD_CAPACITY)) {
+ if (sd->proto->cmd[req.cmd].class == 6 && FIELD_EX32(sd->ocr, OCR,
+ CARD_CAPACITY)) {
/* Only Standard Capacity cards support class 6 commands */
return sd_illegal;
}
@@ -1891,6 +1886,8 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
static bool cmd_valid_while_locked(SDState *sd, unsigned cmd)
{
+ unsigned cmd_class;
+
/* Valid commands in locked state:
* basic class (0)
* lock card class (7)
@@ -1905,7 +1902,12 @@ static bool cmd_valid_while_locked(SDState *sd, unsigned cmd)
if (cmd == 16 || cmd == 55) {
return true;
}
- return sd_cmd_class[cmd] == 0 || sd_cmd_class[cmd] == 7;
+ if (!sd->proto->cmd[cmd].handler) {
+ return false;
+ }
+ cmd_class = sd->proto->cmd[cmd].class;
+
+ return cmd_class == 0 || cmd_class == 7;
}
int sd_do_command(SDState *sd, SDRequest *req,
@@ -2273,22 +2275,22 @@ void sd_enable(SDState *sd, bool enable)
static const SDProto sd_proto_spi = {
.name = "SPI",
.cmd = {
- [0] = { sd_spi, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
- [1] = { sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
+ [0] = {0, sd_spi, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
+ [1] = {0, sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
},
.acmd = {
- [41] = { sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
+ [41] = {8, sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
},
};
static const SDProto sd_proto_sd = {
.name = "SD",
.cmd = {
- [0] = { sd_bc, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
- [2] = { sd_bcr, "ALL_SEND_CID", sd_cmd_ALL_SEND_CID},
- [3] = { sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
- [19] = { sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
- [23] = { sd_ac, "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
+ [0] = {0, sd_bc, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
+ [2] = {0, sd_bcr, "ALL_SEND_CID", sd_cmd_ALL_SEND_CID},
+ [3] = {0, sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
+ [19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
+ [23] = {2, sd_ac, "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
},
};
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 07/11] hw/sd/sdcard: Remove SEND_DSR dead case (CMD4)
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
` (5 preceding siblings ...)
2024-06-27 16:38 ` [PATCH 06/11] hw/sd/sdcard: Store command class " Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 08/11] hw/sd/sdcard: Register generic optional handlers (CMD11 and CMD20) Philippe Mathieu-Daudé
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
The CSD::CSR_IMP bit defines whether the Driver Stage
Register (DSR) is implemented or not. We do not set
this bit in CSD:
static void sd_set_csd(SDState *sd, uint64_t size)
{
...
if (size <= SDSC_MAX_CAPACITY) { /* Standard Capacity SD */
...
sd->csd[6] = 0xe0 | /* Partial block for read allowed */
((csize >> 10) & 0x03);
...
} else { /* SDHC */
...
sd->csd[6] = 0x00;
...
}
...
}
The sd_normal_command() switch case for the SEND_DSR
command do nothing and fallback to "illegal command".
Since the command is mandatory (although the register
isn't...) call the sd_cmd_unimplemented() handler.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 14 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index a816493d37..097cb0f2e2 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -240,7 +240,7 @@ static const char *sd_response_name(sd_rsp_type_t rsp)
static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
{
static const char *cmd_abbrev[SDMMC_CMD_MAX] = {
- [4] = "SET_DSR", [5] = "IO_SEND_OP_COND",
+ [5] = "IO_SEND_OP_COND",
[6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
[8] = "SEND_IF_COND", [9] = "SEND_CSD",
[10] = "SEND_CID", [11] = "VOLTAGE_SWITCH",
@@ -1153,7 +1153,6 @@ static sd_rsp_type_t sd_cmd_illegal(SDState *sd, SDRequest req)
}
/* Commands that are recognised but not yet implemented. */
-__attribute__((unused))
static sd_rsp_type_t sd_cmd_unimplemented(SDState *sd, SDRequest req)
{
qemu_log_mask(LOG_UNIMP, "%s: CMD%i not implemented\n",
@@ -1312,16 +1311,6 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
switch (req.cmd) {
/* Basic commands (Class 0 and Class 1) */
- case 4: /* CMD4: SEND_DSR */
- switch (sd->state) {
- case sd_standby_state:
- break;
-
- default:
- break;
- }
- break;
-
case 6: /* CMD6: SWITCH_FUNCTION */
if (sd->mode != sd_data_transfer_mode) {
return sd_invalid_mode_for_cmd(sd, req);
@@ -2289,6 +2278,7 @@ static const SDProto sd_proto_sd = {
[0] = {0, sd_bc, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
[2] = {0, sd_bcr, "ALL_SEND_CID", sd_cmd_ALL_SEND_CID},
[3] = {0, sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
+ [4] = {0, sd_bc, "SEND_DSR", sd_cmd_unimplemented},
[19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
[23] = {2, sd_ac, "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
},
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 08/11] hw/sd/sdcard: Register generic optional handlers (CMD11 and CMD20)
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
` (6 preceding siblings ...)
2024-06-27 16:38 ` [PATCH 07/11] hw/sd/sdcard: Remove SEND_DSR dead case (CMD4) Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 09/11] hw/sd/sdcard: Register optional handlers from spec v6.00 Philippe Mathieu-Daudé
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 097cb0f2e2..74aa38a442 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -243,12 +243,12 @@ static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
[5] = "IO_SEND_OP_COND",
[6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
[8] = "SEND_IF_COND", [9] = "SEND_CSD",
- [10] = "SEND_CID", [11] = "VOLTAGE_SWITCH",
+ [10] = "SEND_CID",
[12] = "STOP_TRANSMISSION", [13] = "SEND_STATUS",
[15] = "GO_INACTIVE_STATE",
[16] = "SET_BLOCKLEN", [17] = "READ_SINGLE_BLOCK",
[18] = "READ_MULTIPLE_BLOCK",
- [20] = "SPEED_CLASS_CONTROL", [21] = "DPS_spec",
+ [21] = "DPS_spec",
[24] = "WRITE_BLOCK", [25] = "WRITE_MULTIPLE_BLOCK",
[26] = "MANUF_RSVD", [27] = "PROGRAM_CSD",
[28] = "SET_WRITE_PROT", [29] = "CLR_WRITE_PROT",
@@ -1161,6 +1161,14 @@ static sd_rsp_type_t sd_cmd_unimplemented(SDState *sd, SDRequest req)
return sd_illegal;
}
+static sd_rsp_type_t sd_cmd_optional(SDState *sd, SDRequest req)
+{
+ qemu_log_mask(LOG_UNIMP, "%s: Optional CMD%i not implemented\n",
+ sd->proto->name, req.cmd);
+
+ return sd_illegal;
+}
+
/* Configure fields for following sd_generic_write_byte() calls */
static sd_rsp_type_t sd_cmd_to_receivingdata(SDState *sd, SDRequest req,
uint64_t start, size_t size)
@@ -2279,7 +2287,9 @@ static const SDProto sd_proto_sd = {
[2] = {0, sd_bcr, "ALL_SEND_CID", sd_cmd_ALL_SEND_CID},
[3] = {0, sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
[4] = {0, sd_bc, "SEND_DSR", sd_cmd_unimplemented},
+ [11] = {0, sd_ac, "VOLTAGE_SWITCH", sd_cmd_optional},
[19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
+ [20] = {2, sd_ac, "SPEED_CLASS_CONTROL", sd_cmd_optional},
[23] = {2, sd_ac, "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
},
};
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 09/11] hw/sd/sdcard: Register optional handlers from spec v6.00
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
` (7 preceding siblings ...)
2024-06-27 16:38 ` [PATCH 08/11] hw/sd/sdcard: Register generic optional handlers (CMD11 and CMD20) Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 10/11] hw/sd/sdcard: Register SDIO optional handlers Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 11/11] hw/sd/sdcard: Register Security Extension " Philippe Mathieu-Daudé
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 74aa38a442..406fadb3b4 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -258,15 +258,11 @@ static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
[36] = "SW_FUNC_RSVD", [37] = "SW_FUNC_RSVD",
[38] = "ERASE",
[40] = "DPS_spec",
- [42] = "LOCK_UNLOCK", [43] = "Q_MANAGEMENT",
- [44] = "Q_TASK_INFO_A", [45] = "Q_TASK_INFO_B",
- [46] = "Q_RD_TASK", [47] = "Q_WR_TASK",
- [48] = "READ_EXTR_SINGLE", [49] = "WRITE_EXTR_SINGLE",
+ [42] = "LOCK_UNLOCK",
[50] = "SW_FUNC_RSVD",
[52] = "IO_RW_DIRECT", [53] = "IO_RW_EXTENDED",
[54] = "SDIO_RSVD", [55] = "APP_CMD",
[56] = "GEN_CMD", [57] = "SW_FUNC_RSVD",
- [58] = "READ_EXTR_MULTI", [59] = "WRITE_EXTR_MULTI",
[60] = "MANUF_RSVD", [61] = "MANUF_RSVD",
[62] = "MANUF_RSVD", [63] = "MANUF_RSVD",
};
@@ -2291,6 +2287,15 @@ static const SDProto sd_proto_sd = {
[19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
[20] = {2, sd_ac, "SPEED_CLASS_CONTROL", sd_cmd_optional},
[23] = {2, sd_ac, "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
+ [43] = {1, sd_ac, "Q_MANAGEMENT", sd_cmd_optional},
+ [44] = {1, sd_ac, "Q_TASK_INFO_A", sd_cmd_optional},
+ [45] = {1, sd_ac, "Q_TASK_INFO_B", sd_cmd_optional},
+ [46] = {1, sd_adtc, "Q_RD_TASK", sd_cmd_optional},
+ [47] = {1, sd_adtc, "Q_WR_TASK", sd_cmd_optional},
+ [48] = {1, sd_adtc, "READ_EXTR_SINGLE", sd_cmd_optional},
+ [49] = {1, sd_adtc, "WRITE_EXTR_SINGLE", sd_cmd_optional},
+ [58] = {11, sd_adtc, "READ_EXTR_MULTI", sd_cmd_optional},
+ [59] = {11, sd_adtc, "WRITE_EXTR_MULTI", sd_cmd_optional},
},
};
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 10/11] hw/sd/sdcard: Register SDIO optional handlers
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
` (8 preceding siblings ...)
2024-06-27 16:38 ` [PATCH 09/11] hw/sd/sdcard: Register optional handlers from spec v6.00 Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 11/11] hw/sd/sdcard: Register Security Extension " Philippe Mathieu-Daudé
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
See "SD Input/Output Card Specification" v1.00.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 406fadb3b4..87bfd0fd56 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -240,7 +240,6 @@ static const char *sd_response_name(sd_rsp_type_t rsp)
static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
{
static const char *cmd_abbrev[SDMMC_CMD_MAX] = {
- [5] = "IO_SEND_OP_COND",
[6] = "SWITCH_FUNC", [7] = "SELECT/DESELECT_CARD",
[8] = "SEND_IF_COND", [9] = "SEND_CSD",
[10] = "SEND_CID",
@@ -260,7 +259,6 @@ static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
[40] = "DPS_spec",
[42] = "LOCK_UNLOCK",
[50] = "SW_FUNC_RSVD",
- [52] = "IO_RW_DIRECT", [53] = "IO_RW_EXTENDED",
[54] = "SDIO_RSVD", [55] = "APP_CMD",
[56] = "GEN_CMD", [57] = "SW_FUNC_RSVD",
[60] = "MANUF_RSVD", [61] = "MANUF_RSVD",
@@ -2270,6 +2268,9 @@ static const SDProto sd_proto_spi = {
.cmd = {
[0] = {0, sd_spi, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
[1] = {0, sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
+ [5] = {9, sd_spi, "IO_SEND_OP_COND", sd_cmd_optional},
+ [52] = {9, sd_spi, "IO_RW_DIRECT", sd_cmd_optional},
+ [53] = {9, sd_spi, "IO_RW_EXTENDED", sd_cmd_optional},
},
.acmd = {
[41] = {8, sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
@@ -2283,6 +2284,7 @@ static const SDProto sd_proto_sd = {
[2] = {0, sd_bcr, "ALL_SEND_CID", sd_cmd_ALL_SEND_CID},
[3] = {0, sd_bcr, "SEND_RELATIVE_ADDR", sd_cmd_SEND_RELATIVE_ADDR},
[4] = {0, sd_bc, "SEND_DSR", sd_cmd_unimplemented},
+ [5] = {9, sd_bc, "IO_SEND_OP_COND", sd_cmd_optional},
[11] = {0, sd_ac, "VOLTAGE_SWITCH", sd_cmd_optional},
[19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
[20] = {2, sd_ac, "SPEED_CLASS_CONTROL", sd_cmd_optional},
@@ -2294,6 +2296,8 @@ static const SDProto sd_proto_sd = {
[47] = {1, sd_adtc, "Q_WR_TASK", sd_cmd_optional},
[48] = {1, sd_adtc, "READ_EXTR_SINGLE", sd_cmd_optional},
[49] = {1, sd_adtc, "WRITE_EXTR_SINGLE", sd_cmd_optional},
+ [52] = {9, sd_bc, "IO_RW_DIRECT", sd_cmd_optional},
+ [53] = {9, sd_bc, "IO_RW_EXTENDED", sd_cmd_optional},
[58] = {11, sd_adtc, "READ_EXTR_MULTI", sd_cmd_optional},
[59] = {11, sd_adtc, "WRITE_EXTR_MULTI", sd_cmd_optional},
},
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 11/11] hw/sd/sdcard: Register Security Extension optional handlers
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
` (9 preceding siblings ...)
2024-06-27 16:38 ` [PATCH 10/11] hw/sd/sdcard: Register SDIO optional handlers Philippe Mathieu-Daudé
@ 2024-06-27 16:38 ` Philippe Mathieu-Daudé
10 siblings, 0 replies; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-27 16:38 UTC (permalink / raw)
To: qemu-devel
Cc: Joel Stanley, Cédric Le Goater, Francisco Iglesias,
qemu-block, Sai Pavan Boddu, Philippe Mathieu-Daudé,
Bin Meng, Luc Michel
See "Advanced Security SD Extension Specification" v2.00.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 87bfd0fd56..e4941cfdab 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -253,14 +253,11 @@ static const char *sd_cmd_name(SDState *sd, uint8_t cmd)
[28] = "SET_WRITE_PROT", [29] = "CLR_WRITE_PROT",
[30] = "SEND_WRITE_PROT",
[32] = "ERASE_WR_BLK_START", [33] = "ERASE_WR_BLK_END",
- [34] = "SW_FUNC_RSVD", [35] = "SW_FUNC_RSVD",
- [36] = "SW_FUNC_RSVD", [37] = "SW_FUNC_RSVD",
[38] = "ERASE",
[40] = "DPS_spec",
[42] = "LOCK_UNLOCK",
- [50] = "SW_FUNC_RSVD",
[54] = "SDIO_RSVD", [55] = "APP_CMD",
- [56] = "GEN_CMD", [57] = "SW_FUNC_RSVD",
+ [56] = "GEN_CMD",
[60] = "MANUF_RSVD", [61] = "MANUF_RSVD",
[62] = "MANUF_RSVD", [63] = "MANUF_RSVD",
};
@@ -2269,8 +2266,14 @@ static const SDProto sd_proto_spi = {
[0] = {0, sd_spi, "GO_IDLE_STATE", sd_cmd_GO_IDLE_STATE},
[1] = {0, sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
[5] = {9, sd_spi, "IO_SEND_OP_COND", sd_cmd_optional},
+ [34] = {10, sd_spi, "READ_SEC_CMD", sd_cmd_optional},
+ [35] = {10, sd_spi, "WRITE_SEC_CMD", sd_cmd_optional},
+ [36] = {10, sd_spi, "SEND_PSI", sd_cmd_optional},
+ [37] = {10, sd_spi, "CONTROL_ASSD_SYSTEM", sd_cmd_optional},
+ [50] = {10, sd_spi, "DIRECT_SECURE_READ", sd_cmd_optional},
[52] = {9, sd_spi, "IO_RW_DIRECT", sd_cmd_optional},
[53] = {9, sd_spi, "IO_RW_EXTENDED", sd_cmd_optional},
+ [57] = {10, sd_spi, "DIRECT_SECURE_WRITE", sd_cmd_optional},
},
.acmd = {
[41] = {8, sd_spi, "SEND_OP_COND", spi_cmd_SEND_OP_COND},
@@ -2289,6 +2292,10 @@ static const SDProto sd_proto_sd = {
[19] = {2, sd_adtc, "SEND_TUNING_BLOCK", sd_cmd_SEND_TUNING_BLOCK},
[20] = {2, sd_ac, "SPEED_CLASS_CONTROL", sd_cmd_optional},
[23] = {2, sd_ac, "SET_BLOCK_COUNT", sd_cmd_SET_BLOCK_COUNT},
+ [34] = {10, sd_adtc, "READ_SEC_CMD", sd_cmd_optional},
+ [35] = {10, sd_adtc, "WRITE_SEC_CMD", sd_cmd_optional},
+ [36] = {10, sd_adtc, "SEND_PSI", sd_cmd_optional},
+ [37] = {10, sd_ac, "CONTROL_ASSD_SYSTEM", sd_cmd_optional},
[43] = {1, sd_ac, "Q_MANAGEMENT", sd_cmd_optional},
[44] = {1, sd_ac, "Q_TASK_INFO_A", sd_cmd_optional},
[45] = {1, sd_ac, "Q_TASK_INFO_B", sd_cmd_optional},
@@ -2296,8 +2303,10 @@ static const SDProto sd_proto_sd = {
[47] = {1, sd_adtc, "Q_WR_TASK", sd_cmd_optional},
[48] = {1, sd_adtc, "READ_EXTR_SINGLE", sd_cmd_optional},
[49] = {1, sd_adtc, "WRITE_EXTR_SINGLE", sd_cmd_optional},
+ [50] = {10, sd_adtc, "DIRECT_SECURE_READ", sd_cmd_optional},
[52] = {9, sd_bc, "IO_RW_DIRECT", sd_cmd_optional},
[53] = {9, sd_bc, "IO_RW_EXTENDED", sd_cmd_optional},
+ [57] = {10, sd_adtc, "DIRECT_SECURE_WRITE", sd_cmd_optional},
[58] = {11, sd_adtc, "READ_EXTR_MULTI", sd_cmd_optional},
[59] = {11, sd_adtc, "WRITE_EXTR_MULTI", sd_cmd_optional},
},
--
2.41.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-06-27 16:41 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-27 16:38 [PATCH 00/11] hw/sd/sdcard: Consolidate SDProto::cmd[] arrays Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 01/11] hw/sd/sdcard: Move sd_[a]cmd_name() methods to sd.c Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 02/11] hw/sd/sdcard: Pass SDState as argument to sd_[a]cmd_name() Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 03/11] hw/sd/sdcard: Prepare SDProto to contain more fields Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 04/11] hw/sd/sdcard: Store command name in SDProto Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 05/11] hw/sd/sdcard: Store command type " Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 06/11] hw/sd/sdcard: Store command class " Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 07/11] hw/sd/sdcard: Remove SEND_DSR dead case (CMD4) Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 08/11] hw/sd/sdcard: Register generic optional handlers (CMD11 and CMD20) Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 09/11] hw/sd/sdcard: Register optional handlers from spec v6.00 Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 10/11] hw/sd/sdcard: Register SDIO optional handlers Philippe Mathieu-Daudé
2024-06-27 16:38 ` [PATCH 11/11] hw/sd/sdcard: Register Security Extension " Philippe Mathieu-Daudé
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).