mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 18:23:57 -06:00
SD/MMC patches queue
- Deprecate SD spec v1.10 - Improve tracing - Fix endianness on DAT lines - Introduce helpers for commands transmitting data on the DAT lines - Convert most commands to new helpers - Register various optional commands - Add command {name, type, class} fields to SDProto structure -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmaDtrEACgkQ4+MsLN6t wN7wABAAjjo+8ZYTxyh+P5oPvv4ec0SLFyTzOyDlzl/8rif9l54UP1kvBGtDYBaF hdHM/BguTQVdomObCrjmcXLmb/+ZnQ23x8Bn8rm1mqjXmV8UvuZ9KReAhQeEgBNN rtWClQqgtuBAbhh2uh0zNmwPhzCavSostd5nQtJXvUfCZUIyTmUBqUNFCZc+RkGy q6kUDzlgrH7uLzVMU5M6QvmOT1LbmWGQAdV+zWXBKXEBgysxzmm6bC7wRCoN+wPQ 9OtdHEZsxEDaIJFK7YcDu0lCOsGFzu62d8N7TA/v4nIWaxrppm4FK7kxgmsO15uY jEq3p2PbDj6UVYrqGpuw4qMcJ0Cs6dkGEfCw9eqwYyhAPd/Y+s/NBAgc6BieZWj6 D32goEWykLorxu9sPGgR9qNWo7gbHanMo4ps3v4++D8Qtb3CpANXDIC5H1WR9azH tdiepDx0nW9bSo/hE32bL70TA8noqUCsrr1yIN7eydpJ2ZTa2ywMfIifLnowoOD2 mPQ/QvUsAwJdjGXsz21loQdycOsuBmqZ4bKU45ez3bxKdq1LFC4q6xsVPeS0UVFy 6dSj2Bi44Y+Ub/UoNij2/6WzuIfNtSKXrs47et2v2SFjuPJt0g34cv3mLCz6CQQZ 2WFk42vyGSZ9gmWmt+G64nksQlifVWnGQP6jub9ThQ5rxqzFTU0= =vqY+ -----END PGP SIGNATURE----- Merge tag 'sdmmc-20240702' of https://github.com/philmd/qemu into staging SD/MMC patches queue - Deprecate SD spec v1.10 - Improve tracing - Fix endianness on DAT lines - Introduce helpers for commands transmitting data on the DAT lines - Convert most commands to new helpers - Register various optional commands - Add command {name, type, class} fields to SDProto structure # -----BEGIN PGP SIGNATURE----- # # iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmaDtrEACgkQ4+MsLN6t # wN7wABAAjjo+8ZYTxyh+P5oPvv4ec0SLFyTzOyDlzl/8rif9l54UP1kvBGtDYBaF # hdHM/BguTQVdomObCrjmcXLmb/+ZnQ23x8Bn8rm1mqjXmV8UvuZ9KReAhQeEgBNN # rtWClQqgtuBAbhh2uh0zNmwPhzCavSostd5nQtJXvUfCZUIyTmUBqUNFCZc+RkGy # q6kUDzlgrH7uLzVMU5M6QvmOT1LbmWGQAdV+zWXBKXEBgysxzmm6bC7wRCoN+wPQ # 9OtdHEZsxEDaIJFK7YcDu0lCOsGFzu62d8N7TA/v4nIWaxrppm4FK7kxgmsO15uY # jEq3p2PbDj6UVYrqGpuw4qMcJ0Cs6dkGEfCw9eqwYyhAPd/Y+s/NBAgc6BieZWj6 # D32goEWykLorxu9sPGgR9qNWo7gbHanMo4ps3v4++D8Qtb3CpANXDIC5H1WR9azH # tdiepDx0nW9bSo/hE32bL70TA8noqUCsrr1yIN7eydpJ2ZTa2ywMfIifLnowoOD2 # mPQ/QvUsAwJdjGXsz21loQdycOsuBmqZ4bKU45ez3bxKdq1LFC4q6xsVPeS0UVFy # 6dSj2Bi44Y+Ub/UoNij2/6WzuIfNtSKXrs47et2v2SFjuPJt0g34cv3mLCz6CQQZ # 2WFk42vyGSZ9gmWmt+G64nksQlifVWnGQP6jub9ThQ5rxqzFTU0= # =vqY+ # -----END PGP SIGNATURE----- # gpg: Signature made Tue 02 Jul 2024 01:13:37 AM PDT # gpg: using RSA key FAABE75E12917221DCFD6BB2E3E32C2CDEADC0DE # gpg: Good signature from "Philippe Mathieu-Daudé (F4BUG) <f4bug@amsat.org>" [full] * tag 'sdmmc-20240702' of https://github.com/philmd/qemu: (67 commits) hw/sd/sdcard: Add sd_acmd_SEND_SCR handler (ACMD51) hw/sd/sdcard: Add sd_acmd_SET_CLR_CARD_DETECT handler (ACMD42) hw/sd/sdcard: Add sd_acmd_SD_APP_OP_COND handler (ACMD41) hw/sd/sdcard: Add sd_acmd_SET_WR_BLK_ERASE_COUNT handler (ACMD23) hw/sd/sdcard: Add sd_acmd_SEND_NUM_WR_BLOCKS handler (ACMD22) hw/sd/sdcard: Add sd_acmd_SD_STATUS handler (ACMD13) hw/sd/sdcard: Add sd_acmd_SET_BUS_WIDTH handler (ACMD6) hw/sd/sdcard: Add spi_cmd_CRC_ON_OFF handler (CMD59) hw/sd/sdcard: Add spi_cmd_READ_OCR handler (CMD58) hw/sd/sdcard: Add sd_cmd_APP_CMD handler (CMD55) hw/sd/sdcard: Add sd_cmd_LOCK_UNLOCK handler (CMD42) hw/sd/sdcard: Add sd_cmd_ERASE handler (CMD38) hw/sd/sdcard: Add sd_cmd_ERASE_WR_BLK_START/END handlers (CMD32 & CMD33) hw/sd/sdcard: Add sd_cmd_SEND_WRITE_PROT handler (CMD30) hw/sd/sdcard: Add sd_cmd_SET/CLR_WRITE_PROT handler (CMD28 & CMD29) hw/sd/sdcard: Add sd_cmd_PROGRAM_CSD handler (CMD27) hw/sd/sdcard: Add sd_cmd_WRITE_SINGLE_BLOCK handler (CMD24) hw/sd/sdcard: Add sd_cmd_READ_SINGLE_BLOCK handler (CMD17) hw/sd/sdcard: Add sd_cmd_SET_BLOCKLEN handler (CMD16) hw/sd/sdcard: Add sd_cmd_GO_INACTIVE_STATE handler (CMD15) ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
6746482d12
7 changed files with 940 additions and 736 deletions
|
@ -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'))
|
||||
|
|
1462
hw/sd/sd.c
1462
hw/sd/sd.c
File diff suppressed because it is too large
Load diff
|
@ -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";
|
||||
}
|
|
@ -11,30 +11,112 @@
|
|||
#ifndef SDMMC_INTERNAL_H
|
||||
#define SDMMC_INTERNAL_H
|
||||
|
||||
#define SDMMC_CMD_MAX 64
|
||||
|
||||
/**
|
||||
* sd_cmd_name:
|
||||
* @cmd: A SD "normal" command, up to SDMMC_CMD_MAX.
|
||||
/*
|
||||
* EXT_CSD Modes segment
|
||||
*
|
||||
* 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".
|
||||
* Define the configuration the Device is working in.
|
||||
* These modes can be changed by the host by means of the SWITCH command.
|
||||
*/
|
||||
const char *sd_cmd_name(uint8_t cmd);
|
||||
|
||||
/**
|
||||
* sd_acmd_name:
|
||||
* @cmd: A SD "Application-Specific" command, up to SDMMC_CMD_MAX.
|
||||
#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_CLASS_6_CTRL 59
|
||||
#define EXT_CSD_INI_TIMEOUT_EMU 60
|
||||
#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */
|
||||
#define EXT_CSD_USE_NATIVE_SECTOR 62
|
||||
#define EXT_CSD_NATIVE_SECTOR_SIZE 63
|
||||
#define EXT_CSD_VENDOR_SPECIFIC_FIELD 64 /* 64 bytes */
|
||||
#define EXT_CSD_PROGRAM_CID_CSD_DDR_SUPPORT 130
|
||||
#define EXT_CSD_PERIODIC_WAKEUP 131
|
||||
#define EXT_CSD_TCASE_SUPPORT 132
|
||||
#define EXT_CSD_SEC_BAD_BLK_MGMNT 134
|
||||
#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_MAX_ENH_SIZE_MULT 157 /* RO, 3 bytes */
|
||||
#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_WR_REL_SET 167
|
||||
#define EXT_CSD_RPMB_MULT 168 /* RO */
|
||||
#define EXT_CSD_FW_CONFIG 169 /* R/W */
|
||||
#define EXT_CSD_USER_WP 171
|
||||
#define EXT_CSD_BOOT_WP 173 /* R/W */
|
||||
#define EXT_CSD_BOOT_WP_STATUS 174
|
||||
#define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */
|
||||
#define EXT_CSD_BOOT_BUS_CONDITIONS 177
|
||||
#define EXT_CSD_BOOT_CONFIG_PROT 178
|
||||
#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_CMD_SET_REV 189
|
||||
#define EXT_CSD_CMD_SET 191
|
||||
/*
|
||||
* EXT_CSD Properties segment
|
||||
*
|
||||
* 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".
|
||||
* Define the Device capabilities, cannot be modified by the host.
|
||||
*/
|
||||
const char *sd_acmd_name(uint8_t cmd);
|
||||
#define EXT_CSD_REV 192
|
||||
#define EXT_CSD_STRUCTURE 194
|
||||
#define EXT_CSD_CARD_TYPE 196
|
||||
#define EXT_CSD_DRIVER_STRENGTH 197
|
||||
#define EXT_CSD_OUT_OF_INTERRUPT_TIME 198
|
||||
#define EXT_CSD_PART_SWITCH_TIME 199
|
||||
#define EXT_CSD_PWR_CL_52_195 200
|
||||
#define EXT_CSD_PWR_CL_26_195 201
|
||||
#define EXT_CSD_PWR_CL_52_360 202
|
||||
#define EXT_CSD_PWR_CL_26_360 203
|
||||
#define EXT_CSD_SEC_CNT 212 /* 4 bytes */
|
||||
#define EXT_CSD_S_A_TIMEOUT 217
|
||||
#define EXT_CSD_S_C_VCCQ 219
|
||||
#define EXT_CSD_S_C_VCC 220
|
||||
#define EXT_CSD_REL_WR_SEC_C 222
|
||||
#define EXT_CSD_HC_WP_GRP_SIZE 221
|
||||
#define EXT_CSD_ERASE_TIMEOUT_MULT 223
|
||||
#define EXT_CSD_HC_ERASE_GRP_SIZE 224
|
||||
#define EXT_CSD_ACC_SIZE 225
|
||||
#define EXT_CSD_BOOT_MULT 226
|
||||
#define EXT_CSD_BOOT_INFO 228
|
||||
#define EXT_CSD_SEC_FEATURE_SUPPORT 231
|
||||
#define EXT_CSD_TRIM_MULT 232
|
||||
#define EXT_CSD_INI_TIMEOUT_PA 241
|
||||
#define EXT_CSD_BKOPS_STATUS 246
|
||||
#define EXT_CSD_POWER_OFF_LONG_TIME 247
|
||||
#define EXT_CSD_GENERIC_CMD6_TIME 248
|
||||
#define EXT_CSD_CACHE_SIZE 249 /* 4 bytes */
|
||||
#define EXT_CSD_EXT_SUPPORT 494
|
||||
#define EXT_CSD_LARGE_UNIT_SIZE_M1 495
|
||||
#define EXT_CSD_CONTEXT_CAPABILITIES 496
|
||||
#define EXT_CSD_TAG_RES_SIZE 497
|
||||
#define EXT_CSD_TAG_UNIT_SIZE 498
|
||||
#define EXT_CSD_DATA_TAG_SUPPORT 499
|
||||
#define EXT_CSD_MAX_PACKED_WRITES 500
|
||||
#define EXT_CSD_MAX_PACKED_READS 501
|
||||
#define EXT_CSD_BKOPS_SUPPORT 502
|
||||
#define EXT_CSD_HPI_FEATURES 503
|
||||
#define EXT_CSD_S_CMD_SET 504
|
||||
|
||||
#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
|
||||
|
|
|
@ -50,10 +50,11 @@ sdcard_ejected(void) ""
|
|||
sdcard_erase(uint32_t first, uint32_t last) "addr first 0x%" PRIx32" last 0x%" PRIx32
|
||||
sdcard_lock(void) ""
|
||||
sdcard_unlock(void) ""
|
||||
sdcard_req_addr(uint32_t req_arg, uint64_t addr) "req 0x%" PRIx32 " addr 0x%" PRIx64
|
||||
sdcard_read_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
|
||||
sdcard_write_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
|
||||
sdcard_write_data(const char *proto, const char *cmd_desc, uint8_t cmd, uint8_t value) "%s %20s/ CMD%02d value 0x%02x"
|
||||
sdcard_read_data(const char *proto, const char *cmd_desc, uint8_t cmd, uint32_t length) "%s %20s/ CMD%02d len %" PRIu32
|
||||
sdcard_write_data(const char *proto, const char *cmd_desc, uint8_t cmd, uint32_t offset, uint8_t value) "%s %20s/ CMD%02d ofs %"PRIu32" value 0x%02x"
|
||||
sdcard_read_data(const char *proto, const char *cmd_desc, uint8_t cmd, uint32_t offset, uint32_t length) "%s %20s/ CMD%02d ofs %"PRIu32" len %" PRIu32
|
||||
sdcard_set_voltage(uint16_t millivolts) "%u mV"
|
||||
|
||||
# pxa2xx_mmci.c
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue