[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 05/25] sdcard: display command name when tracing
From: |
Philippe Mathieu-Daudé |
Subject: |
[Qemu-devel] [PATCH v2 05/25] sdcard: display command name when tracing CMD/ACMD |
Date: |
Wed, 3 Jan 2018 18:24:16 -0300 |
Signed-off-by: Philippe Mathieu-Daudé <address@hidden>
---
hw/sd/sd.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++---
hw/sd/trace-events | 4 +--
2 files changed, 73 insertions(+), 6 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 489d13681d..7bb5c6fb5e 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -133,6 +133,7 @@ struct SDState {
QEMUTimer *ocr_power_timer;
bool enable;
+ const char *proto_name;
};
static const char *sd_state_name(enum SDCardStates state)
@@ -154,6 +155,66 @@ static const char *sd_state_name(enum SDCardStates state)
return state_name[state];
}
+static const char *sd_cmd_abbreviation(uint8_t cmd)
+{
+ static const char *cmd_abbrev[SDCARD_CMD_MAX] = {
+ [0] = "GO_IDLE_STATE",
+ [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", /* FIXME */
+ [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_abbreviation(uint8_t cmd)
+{
+ static const char *acmd_abbrev[SDCARD_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 void sd_set_mode(SDState *sd)
{
switch (sd->state) {
@@ -781,13 +842,16 @@ static void sd_lock_command(SDState *sd)
sd->card_status &= ~CARD_IS_LOCKED;
}
-static sd_rsp_type_t sd_normal_command(SDState *sd,
- SDRequest req)
+static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
{
uint32_t rca = 0x0000;
uint64_t addr = (sd->ocr & (1 << 30)) ? (uint64_t) req.arg << 9 : req.arg;
- trace_sdcard_normal_command(req.cmd, req.arg, sd_state_name(sd->state));
+ if (req.cmd != 55 || sd->expecting_acmd) {
+ trace_sdcard_normal_command(sd->proto_name,
+ sd_cmd_abbreviation(req.cmd), req.cmd,
+ req.arg, sd_state_name(sd->state));
+ }
/* Not interpreting this as an app command */
sd->card_status &= ~APP_CMD;
@@ -1355,7 +1419,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
static sd_rsp_type_t sd_app_command(SDState *sd,
SDRequest req)
{
- trace_sdcard_app_command(req.cmd, req.arg);
+ trace_sdcard_app_command(sd->proto_name, sd_acmd_abbreviation(req.cmd),
+ req.cmd, req.arg, sd_state_name(sd->state));
sd->card_status |= APP_CMD;
switch (req.cmd) {
case 6: /* ACMD6: SET_BUS_WIDTH */
@@ -1935,6 +2000,8 @@ static void sd_realize(DeviceState *dev, Error **errp)
SDState *sd = SD_CARD(dev);
int ret;
+ sd->proto_name = sd->spi ? "SPI" : "SD";
+
if (sd->blk && blk_is_read_only(sd->blk)) {
error_setg(errp, "Cannot use read-only drive as SD card");
return;
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
index 727d6fd904..25ab339f97 100644
--- a/hw/sd/trace-events
+++ b/hw/sd/trace-events
@@ -16,8 +16,8 @@ sdhci_write_dataport(uint16_t data_count) "write buffer
filled with %u bytes of
sdhci_led(bool state) "LED: %u"
# hw/sd/sd.c
-sdcard_normal_command(uint8_t cmd, uint32_t arg, const char *state) "CMD%d arg
0x%08x (state %s)"
-sdcard_app_command(uint8_t acmd, uint32_t arg) "ACMD%d arg 0x%08x"
+sdcard_normal_command(const char *proto, const char *cmd_desc, uint8_t cmd,
uint32_t arg, const char *state) "%s %20s/ CMD%02d arg 0x%08x (state %s)"
+sdcard_app_command(const char *proto, const char *acmd_desc, uint8_t acmd,
uint32_t arg, const char *state) "%s %23s/ACMD%02d arg 0x%08x (state %s)"
sdcard_reset(void) ""
sdcard_inserted(bool readonly) "read_only: %d"
sdcard_ejected(void) ""
--
2.15.1
- [Qemu-devel] [PATCH v2 00/25] SDCard: housekeeping, improve SPI, introduce new Specs, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 01/25] sdcard: reorder SDState struct members, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 02/25] sdcard: replace DPRINTF() by trace events, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 03/25] sdcard: add more trace events, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 04/25] sdcard: define SDCARD_CMD_MAX instead of using the magic '64', Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 05/25] sdcard: display command name when tracing CMD/ACMD,
Philippe Mathieu-Daudé <=
- [Qemu-devel] [PATCH v2 06/25] sdcard: let cmd_valid_while_locked() returns a bool, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 07/25] sdcard: rename sd_set_$REG() functions called once as sd_reset_$REG(), Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 08/25] sdcard: use the registerfields API to access the OCR register, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 09/25] sdcard: use G_BYTE from cutils, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 10/25] sdcard: remove unreachable code, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 13/25] sdcard: let function handling response codes returns the response size, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 12/25] sdcard: use a 16-bit integer for the 16-bit RCA register, Philippe Mathieu-Daudé, 2018/01/03
- [Qemu-devel] [PATCH v2 14/25] sdcard: add missing command CMD55, Philippe Mathieu-Daudé, 2018/01/03