* [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers @ 2023-10-10 12:47 ` Marek Vasut 2023-10-31 6:08 ` Jaehoon Chung 2023-10-31 8:26 ` Lothar Waßmann 0 siblings, 2 replies; 6+ messages in thread From: Marek Vasut @ 2023-10-10 12:47 UTC (permalink / raw) To: u-boot Cc: Marek Vasut, Abdellatif El Khlifi, Heinrich Schuchardt, Ilias Apalodimas, Jaehoon Chung, Ramon Fried, Roger Knecht, Sean Edmond, Simon Glass, Tobias Waldekranz Add extension to the 'mmc' command to read out the card registers. Currently, only the eMMC OCR/CID/CSD/EXTCSD/RCA/DSR register are supported. A register value can either be displayed or read into an environment variable. Signed-off-by: Marek Vasut <marex@denx.de> --- Cc: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org> Cc: Jaehoon Chung <jh80.chung@samsung.com> Cc: Ramon Fried <rfried.dev@gmail.com> Cc: Roger Knecht <rknecht@pm.me> Cc: Sean Edmond <seanedmond@microsoft.com> Cc: Simon Glass <sjg@chromium.org> Cc: Tobias Waldekranz <tobias@waldekranz.com> --- V2: - Update documentation --- cmd/Kconfig | 8 ++++ cmd/mmc.c | 96 +++++++++++++++++++++++++++++++++++++++++++ doc/usage/cmd/mmc.rst | 26 ++++++++++++ 3 files changed, 130 insertions(+) diff --git a/cmd/Kconfig b/cmd/Kconfig index 6470b138d2f..dcd99757a1e 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1307,6 +1307,14 @@ config CMD_BKOPS_ENABLE on a eMMC device. The feature is optionally available on eMMC devices conforming to standard >= 4.41. +config CMD_MMC_REG + bool "Enable support for reading card registers in the mmc command" + depends on CMD_MMC + default n + help + Enable the commands for reading card registers. This is useful + mostly for debugging or extracting details from the card. + config CMD_MMC_RPMB bool "Enable support for RPMB in the mmc command" depends on SUPPORT_EMMC_RPMB diff --git a/cmd/mmc.c b/cmd/mmc.c index c6bd81cebbc..c29f44b7a18 100644 --- a/cmd/mmc.c +++ b/cmd/mmc.c @@ -1110,6 +1110,93 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag, return CMD_RET_SUCCESS; } +#if CONFIG_IS_ENABLED(CMD_MMC_REG) +static int do_mmc_reg(struct cmd_tbl *cmdtp, int flag, + int argc, char *const argv[]) +{ + ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN); + struct mmc *mmc; + int i, ret; + u32 off; + + if (argc < 3 || argc > 5) + return CMD_RET_USAGE; + + mmc = find_mmc_device(curr_device); + if (!mmc) { + printf("no mmc device at slot %x\n", curr_device); + return CMD_RET_FAILURE; + } + + if (IS_SD(mmc)) { + printf("SD registers are not supported\n"); + return CMD_RET_FAILURE; + } + + off = simple_strtoul(argv[3], NULL, 10); + if (!strcmp(argv[2], "cid")) { + if (off > 3) + return CMD_RET_USAGE; + printf("CID[%i]: 0x%08x\n", off, mmc->cid[off]); + if (argv[4]) + env_set_hex(argv[4], mmc->cid[off]); + return CMD_RET_SUCCESS; + } + if (!strcmp(argv[2], "csd")) { + if (off > 3) + return CMD_RET_USAGE; + printf("CSD[%i]: 0x%08x\n", off, mmc->csd[off]); + if (argv[4]) + env_set_hex(argv[4], mmc->csd[off]); + return CMD_RET_SUCCESS; + } + if (!strcmp(argv[2], "dsr")) { + printf("DSR: 0x%08x\n", mmc->dsr); + if (argv[4]) + env_set_hex(argv[4], mmc->dsr); + return CMD_RET_SUCCESS; + } + if (!strcmp(argv[2], "ocr")) { + printf("OCR: 0x%08x\n", mmc->ocr); + if (argv[4]) + env_set_hex(argv[4], mmc->ocr); + return CMD_RET_SUCCESS; + } + if (!strcmp(argv[2], "rca")) { + printf("RCA: 0x%08x\n", mmc->rca); + if (argv[4]) + env_set_hex(argv[4], mmc->rca); + return CMD_RET_SUCCESS; + } + if (!strcmp(argv[2], "extcsd") && + mmc->version >= MMC_VERSION_4_41) { + ret = mmc_send_ext_csd(mmc, ext_csd); + if (ret) + return ret; + if (!strcmp(argv[3], "all")) { + /* Dump the entire register */ + printf("EXT_CSD:"); + for (i = 0; i < MMC_MAX_BLOCK_LEN; i++) { + if (!(i % 10)) + printf("\n%03i: ", i); + printf(" %02x", ext_csd[i]); + } + printf("\n"); + return CMD_RET_SUCCESS; + } + off = simple_strtoul(argv[3], NULL, 10); + if (off > 512) + return CMD_RET_USAGE; + printf("EXT_CSD[%i]: 0x%02x\n", off, ext_csd[off]); + if (argv[4]) + env_set_hex(argv[4], ext_csd[off]); + return CMD_RET_SUCCESS; + } + + return CMD_RET_FAILURE; +} +#endif + static struct cmd_tbl cmd_mmc[] = { U_BOOT_CMD_MKENT(info, 1, 0, do_mmcinfo, "", ""), U_BOOT_CMD_MKENT(read, 4, 1, do_mmc_read, "", ""), @@ -1142,6 +1229,9 @@ static struct cmd_tbl cmd_mmc[] = { U_BOOT_CMD_MKENT(bkops-enable, 2, 0, do_mmc_bkops_enable, "", ""), U_BOOT_CMD_MKENT(bkops, 4, 0, do_mmc_bkops, "", ""), #endif +#if CONFIG_IS_ENABLED(CMD_MMC_REG) + U_BOOT_CMD_MKENT(reg, 5, 0, do_mmc_reg, "", ""), +#endif }; static int do_mmcops(struct cmd_tbl *cmdtp, int flag, int argc, @@ -1229,6 +1319,12 @@ U_BOOT_CMD( " WARNING: This is a write-once setting.\n" "mmc bkops <dev> [auto|manual] [enable|disable]\n" " - configure background operations handshake on device\n" +#endif +#if CONFIG_IS_ENABLED(CMD_MMC_REG) + "mmc reg read <reg> <offset> [env] - read card register <reg> offset <offset>\n" + " (optionally into [env] variable)\n" + " - reg: cid/csd/dsr/ocr/rca/extcsd\n" + " - offset: for cid/csd [0..3], for extcsd [0..511,all]\n" #endif ); diff --git a/doc/usage/cmd/mmc.rst b/doc/usage/cmd/mmc.rst index 71a0303109c..c0924ba5769 100644 --- a/doc/usage/cmd/mmc.rst +++ b/doc/usage/cmd/mmc.rst @@ -21,6 +21,7 @@ Synopsis mmc bootpart-resize <dev> <dev part size MB> <RPMB part size MB> mmc partconf <dev> [[varname] | [<boot_ack> <boot_partition> <partition_access>]] mmc rst-function <dev> <value> + mmc reg read <reg> <offset> [env] Description ----------- @@ -183,6 +184,31 @@ The 'mmc rst-function' command changes the RST_n_FUNCTION field. 0x3 Reserved +The 'mmc reg read <reg> <offset> [env]' reads eMMC card register and +either print it to standard output, or store the value in environment +variable. + +<reg> with +optional offset <offset> into the register array, and print it to +standard output or store it into environment variable [env]. + + reg + cid + The Device IDentification (CID) register. Uses offset. + csd + The Device-Specific Data (CSD) register. Uses offset. + dsr + The driver stage register (DSR). + ocr + The operation conditions register (OCR). + rca + The relative Device address (RCA) register. + extcsd + The Extended CSD register. Uses offset. + offset + For 'cid'/'csd' 128 bit registers '[0..3]' in 32-bit increments. For 'extcsd' 512 bit register '[0..512,all]' in 8-bit increments, or 'all' to read the entire register. + env + Optional environment variable into which 32-bit value read from register should be stored. Examples -------- -- 2.40.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers 2023-10-10 12:47 ` [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers Marek Vasut @ 2023-10-31 6:08 ` Jaehoon Chung 2023-10-31 6:29 ` Jaehoon Chung 2023-10-31 8:26 ` Lothar Waßmann 1 sibling, 1 reply; 6+ messages in thread From: Jaehoon Chung @ 2023-10-31 6:08 UTC (permalink / raw) To: Marek Vasut, u-boot Cc: Abdellatif El Khlifi, Heinrich Schuchardt, Ilias Apalodimas, Ramon Fried, Roger Knecht, Sean Edmond, Simon Glass, Tobias Waldekranz Hi Marek, On 10/10/23 21:47, Marek Vasut wrote: > Add extension to the 'mmc' command to read out the card registers. > Currently, only the eMMC OCR/CID/CSD/EXTCSD/RCA/DSR register are > supported. A register value can either be displayed or read into > an environment variable. > > Signed-off-by: Marek Vasut <marex@denx.de> > --- > Cc: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> > Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> > Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org> > Cc: Jaehoon Chung <jh80.chung@samsung.com> > Cc: Ramon Fried <rfried.dev@gmail.com> > Cc: Roger Knecht <rknecht@pm.me> > Cc: Sean Edmond <seanedmond@microsoft.com> > Cc: Simon Glass <sjg@chromium.org> > Cc: Tobias Waldekranz <tobias@waldekranz.com> Looks good to me. I have tested with your patch on my target. mmc reg read cid all CID[0]: 0x15010042 => mmc reg read extcsd all EXT_CSD: 000: 00 00 00 00 00 00 00 00 00 00 010: 00 00 00 00 00 00 39 00 00 00 ..[snip].. Tested-by: Jaehoon Chung <jh80.chung@samsung.com> Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com> Best Regards, Jaehoon Chung > --- > V2: - Update documentation > --- > cmd/Kconfig | 8 ++++ > cmd/mmc.c | 96 +++++++++++++++++++++++++++++++++++++++++++ > doc/usage/cmd/mmc.rst | 26 ++++++++++++ > 3 files changed, 130 insertions(+) > > diff --git a/cmd/Kconfig b/cmd/Kconfig > index 6470b138d2f..dcd99757a1e 100644 > --- a/cmd/Kconfig > +++ b/cmd/Kconfig > @@ -1307,6 +1307,14 @@ config CMD_BKOPS_ENABLE > on a eMMC device. The feature is optionally available on eMMC devices > conforming to standard >= 4.41. > > +config CMD_MMC_REG > + bool "Enable support for reading card registers in the mmc command" > + depends on CMD_MMC > + default n > + help > + Enable the commands for reading card registers. This is useful > + mostly for debugging or extracting details from the card. > + > config CMD_MMC_RPMB > bool "Enable support for RPMB in the mmc command" > depends on SUPPORT_EMMC_RPMB > diff --git a/cmd/mmc.c b/cmd/mmc.c > index c6bd81cebbc..c29f44b7a18 100644 > --- a/cmd/mmc.c > +++ b/cmd/mmc.c > @@ -1110,6 +1110,93 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag, > return CMD_RET_SUCCESS; > } > > +#if CONFIG_IS_ENABLED(CMD_MMC_REG) > +static int do_mmc_reg(struct cmd_tbl *cmdtp, int flag, > + int argc, char *const argv[]) > +{ > + ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN); > + struct mmc *mmc; > + int i, ret; > + u32 off; > + > + if (argc < 3 || argc > 5) > + return CMD_RET_USAGE; > + > + mmc = find_mmc_device(curr_device); > + if (!mmc) { > + printf("no mmc device at slot %x\n", curr_device); > + return CMD_RET_FAILURE; > + } > + > + if (IS_SD(mmc)) { > + printf("SD registers are not supported\n"); > + return CMD_RET_FAILURE; > + } > + > + off = simple_strtoul(argv[3], NULL, 10); > + if (!strcmp(argv[2], "cid")) { > + if (off > 3) > + return CMD_RET_USAGE; > + printf("CID[%i]: 0x%08x\n", off, mmc->cid[off]); > + if (argv[4]) > + env_set_hex(argv[4], mmc->cid[off]); > + return CMD_RET_SUCCESS; > + } > + if (!strcmp(argv[2], "csd")) { > + if (off > 3) > + return CMD_RET_USAGE; > + printf("CSD[%i]: 0x%08x\n", off, mmc->csd[off]); > + if (argv[4]) > + env_set_hex(argv[4], mmc->csd[off]); > + return CMD_RET_SUCCESS; > + } > + if (!strcmp(argv[2], "dsr")) { > + printf("DSR: 0x%08x\n", mmc->dsr); > + if (argv[4]) > + env_set_hex(argv[4], mmc->dsr); > + return CMD_RET_SUCCESS; > + } > + if (!strcmp(argv[2], "ocr")) { > + printf("OCR: 0x%08x\n", mmc->ocr); > + if (argv[4]) > + env_set_hex(argv[4], mmc->ocr); > + return CMD_RET_SUCCESS; > + } > + if (!strcmp(argv[2], "rca")) { > + printf("RCA: 0x%08x\n", mmc->rca); > + if (argv[4]) > + env_set_hex(argv[4], mmc->rca); > + return CMD_RET_SUCCESS; > + } > + if (!strcmp(argv[2], "extcsd") && > + mmc->version >= MMC_VERSION_4_41) { > + ret = mmc_send_ext_csd(mmc, ext_csd); > + if (ret) > + return ret; > + if (!strcmp(argv[3], "all")) { > + /* Dump the entire register */ > + printf("EXT_CSD:"); > + for (i = 0; i < MMC_MAX_BLOCK_LEN; i++) { > + if (!(i % 10)) > + printf("\n%03i: ", i); > + printf(" %02x", ext_csd[i]); > + } > + printf("\n"); > + return CMD_RET_SUCCESS; > + } > + off = simple_strtoul(argv[3], NULL, 10); > + if (off > 512) > + return CMD_RET_USAGE; > + printf("EXT_CSD[%i]: 0x%02x\n", off, ext_csd[off]); > + if (argv[4]) > + env_set_hex(argv[4], ext_csd[off]); > + return CMD_RET_SUCCESS; > + } > + > + return CMD_RET_FAILURE; > +} > +#endif > + > static struct cmd_tbl cmd_mmc[] = { > U_BOOT_CMD_MKENT(info, 1, 0, do_mmcinfo, "", ""), > U_BOOT_CMD_MKENT(read, 4, 1, do_mmc_read, "", ""), > @@ -1142,6 +1229,9 @@ static struct cmd_tbl cmd_mmc[] = { > U_BOOT_CMD_MKENT(bkops-enable, 2, 0, do_mmc_bkops_enable, "", ""), > U_BOOT_CMD_MKENT(bkops, 4, 0, do_mmc_bkops, "", ""), > #endif > +#if CONFIG_IS_ENABLED(CMD_MMC_REG) > + U_BOOT_CMD_MKENT(reg, 5, 0, do_mmc_reg, "", ""), > +#endif > }; > > static int do_mmcops(struct cmd_tbl *cmdtp, int flag, int argc, > @@ -1229,6 +1319,12 @@ U_BOOT_CMD( > " WARNING: This is a write-once setting.\n" > "mmc bkops <dev> [auto|manual] [enable|disable]\n" > " - configure background operations handshake on device\n" > +#endif > +#if CONFIG_IS_ENABLED(CMD_MMC_REG) > + "mmc reg read <reg> <offset> [env] - read card register <reg> offset <offset>\n" > + " (optionally into [env] variable)\n" > + " - reg: cid/csd/dsr/ocr/rca/extcsd\n" > + " - offset: for cid/csd [0..3], for extcsd [0..511,all]\n" > #endif > ); > > diff --git a/doc/usage/cmd/mmc.rst b/doc/usage/cmd/mmc.rst > index 71a0303109c..c0924ba5769 100644 > --- a/doc/usage/cmd/mmc.rst > +++ b/doc/usage/cmd/mmc.rst > @@ -21,6 +21,7 @@ Synopsis > mmc bootpart-resize <dev> <dev part size MB> <RPMB part size MB> > mmc partconf <dev> [[varname] | [<boot_ack> <boot_partition> <partition_access>]] > mmc rst-function <dev> <value> > + mmc reg read <reg> <offset> [env] > > Description > ----------- > @@ -183,6 +184,31 @@ The 'mmc rst-function' command changes the RST_n_FUNCTION field. > 0x3 > Reserved > > +The 'mmc reg read <reg> <offset> [env]' reads eMMC card register and > +either print it to standard output, or store the value in environment > +variable. > + > +<reg> with > +optional offset <offset> into the register array, and print it to > +standard output or store it into environment variable [env]. > + > + reg > + cid > + The Device IDentification (CID) register. Uses offset. > + csd > + The Device-Specific Data (CSD) register. Uses offset. > + dsr > + The driver stage register (DSR). > + ocr > + The operation conditions register (OCR). > + rca > + The relative Device address (RCA) register. > + extcsd > + The Extended CSD register. Uses offset. > + offset > + For 'cid'/'csd' 128 bit registers '[0..3]' in 32-bit increments. For 'extcsd' 512 bit register '[0..512,all]' in 8-bit increments, or 'all' to read the entire register. > + env > + Optional environment variable into which 32-bit value read from register should be stored. > > Examples > -------- ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers 2023-10-31 6:08 ` Jaehoon Chung @ 2023-10-31 6:29 ` Jaehoon Chung 2023-10-31 7:52 ` Marek Vasut 0 siblings, 1 reply; 6+ messages in thread From: Jaehoon Chung @ 2023-10-31 6:29 UTC (permalink / raw) To: 'Marek Vasut', u-boot Cc: 'Abdellatif El Khlifi', 'Heinrich Schuchardt', 'Ilias Apalodimas', 'Ramon Fried', 'Roger Knecht', 'Sean Edmond', 'Simon Glass', 'Tobias Waldekranz' Hi, > -----Original Message----- > From: U-Boot <u-boot-bounces@lists.denx.de> On Behalf Of Jaehoon Chung > Sent: Tuesday, October 31, 2023 3:08 PM > To: Marek Vasut <marex@denx.de>; u-boot@lists.denx.de > Cc: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>; Heinrich Schuchardt <xypron.glpk@gmx.de>; > Ilias Apalodimas <ilias.apalodimas@linaro.org>; Ramon Fried <rfried.dev@gmail.com>; Roger Knecht > <rknecht@pm.me>; Sean Edmond <seanedmond@microsoft.com>; Simon Glass <sjg@chromium.org>; Tobias > Waldekranz <tobias@waldekranz.com> > Subject: Re: [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers > > Hi Marek, > > On 10/10/23 21:47, Marek Vasut wrote: > > Add extension to the 'mmc' command to read out the card registers. > > Currently, only the eMMC OCR/CID/CSD/EXTCSD/RCA/DSR register are > > supported. A register value can either be displayed or read into > > an environment variable. > > > > Signed-off-by: Marek Vasut <marex@denx.de> > > --- > > Cc: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> > > Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> > > Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org> > > Cc: Jaehoon Chung <jh80.chung@samsung.com> > > Cc: Ramon Fried <rfried.dev@gmail.com> > > Cc: Roger Knecht <rknecht@pm.me> > > Cc: Sean Edmond <seanedmond@microsoft.com> > > Cc: Simon Glass <sjg@chromium.org> > > Cc: Tobias Waldekranz <tobias@waldekranz.com> > > Looks good to me. I have tested with your patch on my target. > > mmc reg read cid all > CID[0]: 0x15010042 > => mmc reg read extcsd all > EXT_CSD: > 000: 00 00 00 00 00 00 00 00 00 00 > 010: 00 00 00 00 00 00 39 00 00 00 > ..[snip].. > > Tested-by: Jaehoon Chung <jh80.chung@samsung.com> > Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com> > > Best Regards, > Jaehoon Chung > > > --- > > V2: - Update documentation > > --- > > cmd/Kconfig | 8 ++++ > > cmd/mmc.c | 96 +++++++++++++++++++++++++++++++++++++++++++ > > doc/usage/cmd/mmc.rst | 26 ++++++++++++ > > 3 files changed, 130 insertions(+) > > > > diff --git a/cmd/Kconfig b/cmd/Kconfig > > index 6470b138d2f..dcd99757a1e 100644 > > --- a/cmd/Kconfig > > +++ b/cmd/Kconfig > > @@ -1307,6 +1307,14 @@ config CMD_BKOPS_ENABLE > > on a eMMC device. The feature is optionally available on eMMC devices > > conforming to standard >= 4.41. > > > > +config CMD_MMC_REG > > + bool "Enable support for reading card registers in the mmc command" > > + depends on CMD_MMC > > + default n > > + help > > + Enable the commands for reading card registers. This is useful > > + mostly for debugging or extracting details from the card. > > + > > config CMD_MMC_RPMB > > bool "Enable support for RPMB in the mmc command" > > depends on SUPPORT_EMMC_RPMB > > diff --git a/cmd/mmc.c b/cmd/mmc.c > > index c6bd81cebbc..c29f44b7a18 100644 > > --- a/cmd/mmc.c > > +++ b/cmd/mmc.c > > @@ -1110,6 +1110,93 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag, > > return CMD_RET_SUCCESS; > > } > > > > +#if CONFIG_IS_ENABLED(CMD_MMC_REG) > > +static int do_mmc_reg(struct cmd_tbl *cmdtp, int flag, > > + int argc, char *const argv[]) > > +{ > > + ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN); > > + struct mmc *mmc; > > + int i, ret; > > + u32 off; > > + > > + if (argc < 3 || argc > 5) > > + return CMD_RET_USAGE; > > + > > + mmc = find_mmc_device(curr_device); > > + if (!mmc) { > > + printf("no mmc device at slot %x\n", curr_device); > > + return CMD_RET_FAILURE; > > + } > > + > > + if (IS_SD(mmc)) { > > + printf("SD registers are not supported\n"); > > + return CMD_RET_FAILURE; > > + } > > + > > + off = simple_strtoul(argv[3], NULL, 10); > > + if (!strcmp(argv[2], "cid")) { > > + if (off > 3) > > + return CMD_RET_USAGE; > > + printf("CID[%i]: 0x%08x\n", off, mmc->cid[off]); > > + if (argv[4]) > > + env_set_hex(argv[4], mmc->cid[off]); > > + return CMD_RET_SUCCESS; > > + } > > + if (!strcmp(argv[2], "csd")) { > > + if (off > 3) > > + return CMD_RET_USAGE; > > + printf("CSD[%i]: 0x%08x\n", off, mmc->csd[off]); > > + if (argv[4]) > > + env_set_hex(argv[4], mmc->csd[off]); > > + return CMD_RET_SUCCESS; > > + } > > + if (!strcmp(argv[2], "dsr")) { > > + printf("DSR: 0x%08x\n", mmc->dsr); > > + if (argv[4]) > > + env_set_hex(argv[4], mmc->dsr); > > + return CMD_RET_SUCCESS; > > + } > > + if (!strcmp(argv[2], "ocr")) { > > + printf("OCR: 0x%08x\n", mmc->ocr); > > + if (argv[4]) > > + env_set_hex(argv[4], mmc->ocr); > > + return CMD_RET_SUCCESS; > > + } > > + if (!strcmp(argv[2], "rca")) { > > + printf("RCA: 0x%08x\n", mmc->rca); > > + if (argv[4]) > > + env_set_hex(argv[4], mmc->rca); > > + return CMD_RET_SUCCESS; > > + } > > + if (!strcmp(argv[2], "extcsd") && > > + mmc->version >= MMC_VERSION_4_41) { > > + ret = mmc_send_ext_csd(mmc, ext_csd); > > + if (ret) > > + return ret; > > + if (!strcmp(argv[3], "all")) { > > + /* Dump the entire register */ > > + printf("EXT_CSD:"); > > + for (i = 0; i < MMC_MAX_BLOCK_LEN; i++) { > > + if (!(i % 10)) > > + printf("\n%03i: ", i); > > + printf(" %02x", ext_csd[i]); > > + } > > + printf("\n"); > > + return CMD_RET_SUCCESS; > > + } > > + off = simple_strtoul(argv[3], NULL, 10); > > + if (off > 512) > > + return CMD_RET_USAGE; > > + printf("EXT_CSD[%i]: 0x%02x\n", off, ext_csd[off]); > > + if (argv[4]) > > + env_set_hex(argv[4], ext_csd[off]); > > + return CMD_RET_SUCCESS; > > + } > > + > > + return CMD_RET_FAILURE; > > +} > > +#endif > > + > > static struct cmd_tbl cmd_mmc[] = { > > U_BOOT_CMD_MKENT(info, 1, 0, do_mmcinfo, "", ""), > > U_BOOT_CMD_MKENT(read, 4, 1, do_mmc_read, "", ""), > > @@ -1142,6 +1229,9 @@ static struct cmd_tbl cmd_mmc[] = { > > U_BOOT_CMD_MKENT(bkops-enable, 2, 0, do_mmc_bkops_enable, "", ""), > > U_BOOT_CMD_MKENT(bkops, 4, 0, do_mmc_bkops, "", ""), > > #endif > > +#if CONFIG_IS_ENABLED(CMD_MMC_REG) > > + U_BOOT_CMD_MKENT(reg, 5, 0, do_mmc_reg, "", ""), > > +#endif > > }; > > > > static int do_mmcops(struct cmd_tbl *cmdtp, int flag, int argc, > > @@ -1229,6 +1319,12 @@ U_BOOT_CMD( > > " WARNING: This is a write-once setting.\n" > > "mmc bkops <dev> [auto|manual] [enable|disable]\n" > > " - configure background operations handshake on device\n" > > +#endif > > +#if CONFIG_IS_ENABLED(CMD_MMC_REG) > > + "mmc reg read <reg> <offset> [env] - read card register <reg> offset <offset>\n" > > + " (optionally into [env] variable)\n" > > + " - reg: cid/csd/dsr/ocr/rca/extcsd\n" > > + " - offset: for cid/csd [0..3], for extcsd [0..511,all]\n" Is there any reason to add "all" option for cid/csd? Best Regards, Jaehoon Chung > > #endif > > ); > > > > diff --git a/doc/usage/cmd/mmc.rst b/doc/usage/cmd/mmc.rst > > index 71a0303109c..c0924ba5769 100644 > > --- a/doc/usage/cmd/mmc.rst > > +++ b/doc/usage/cmd/mmc.rst > > @@ -21,6 +21,7 @@ Synopsis > > mmc bootpart-resize <dev> <dev part size MB> <RPMB part size MB> > > mmc partconf <dev> [[varname] | [<boot_ack> <boot_partition> <partition_access>]] > > mmc rst-function <dev> <value> > > + mmc reg read <reg> <offset> [env] > > > > Description > > ----------- > > @@ -183,6 +184,31 @@ The 'mmc rst-function' command changes the RST_n_FUNCTION field. > > 0x3 > > Reserved > > > > +The 'mmc reg read <reg> <offset> [env]' reads eMMC card register and > > +either print it to standard output, or store the value in environment > > +variable. > > + > > +<reg> with > > +optional offset <offset> into the register array, and print it to > > +standard output or store it into environment variable [env]. > > + > > + reg > > + cid > > + The Device IDentification (CID) register. Uses offset. > > + csd > > + The Device-Specific Data (CSD) register. Uses offset. > > + dsr > > + The driver stage register (DSR). > > + ocr > > + The operation conditions register (OCR). > > + rca > > + The relative Device address (RCA) register. > > + extcsd > > + The Extended CSD register. Uses offset. > > + offset > > + For 'cid'/'csd' 128 bit registers '[0..3]' in 32-bit increments. For 'extcsd' 512 bit > register '[0..512,all]' in 8-bit increments, or 'all' to read the entire register. > > + env > > + Optional environment variable into which 32-bit value read from register should be stored. > > > > Examples > > -------- ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers 2023-10-31 6:29 ` Jaehoon Chung @ 2023-10-31 7:52 ` Marek Vasut 0 siblings, 0 replies; 6+ messages in thread From: Marek Vasut @ 2023-10-31 7:52 UTC (permalink / raw) To: Jaehoon Chung, u-boot Cc: 'Abdellatif El Khlifi', 'Heinrich Schuchardt', 'Ilias Apalodimas', 'Ramon Fried', 'Roger Knecht', 'Sean Edmond', 'Simon Glass', 'Tobias Waldekranz' On 10/31/23 07:29, Jaehoon Chung wrote: > Hi, > >> -----Original Message----- >> From: U-Boot <u-boot-bounces@lists.denx.de> On Behalf Of Jaehoon Chung >> Sent: Tuesday, October 31, 2023 3:08 PM >> To: Marek Vasut <marex@denx.de>; u-boot@lists.denx.de >> Cc: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>; Heinrich Schuchardt <xypron.glpk@gmx.de>; >> Ilias Apalodimas <ilias.apalodimas@linaro.org>; Ramon Fried <rfried.dev@gmail.com>; Roger Knecht >> <rknecht@pm.me>; Sean Edmond <seanedmond@microsoft.com>; Simon Glass <sjg@chromium.org>; Tobias >> Waldekranz <tobias@waldekranz.com> >> Subject: Re: [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers >> >> Hi Marek, >> >> On 10/10/23 21:47, Marek Vasut wrote: >>> Add extension to the 'mmc' command to read out the card registers. >>> Currently, only the eMMC OCR/CID/CSD/EXTCSD/RCA/DSR register are >>> supported. A register value can either be displayed or read into >>> an environment variable. >>> >>> Signed-off-by: Marek Vasut <marex@denx.de> >>> --- >>> Cc: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> >>> Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> >>> Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org> >>> Cc: Jaehoon Chung <jh80.chung@samsung.com> >>> Cc: Ramon Fried <rfried.dev@gmail.com> >>> Cc: Roger Knecht <rknecht@pm.me> >>> Cc: Sean Edmond <seanedmond@microsoft.com> >>> Cc: Simon Glass <sjg@chromium.org> >>> Cc: Tobias Waldekranz <tobias@waldekranz.com> >> >> Looks good to me. I have tested with your patch on my target. >> >> mmc reg read cid all >> CID[0]: 0x15010042 >> => mmc reg read extcsd all >> EXT_CSD: >> 000: 00 00 00 00 00 00 00 00 00 00 >> 010: 00 00 00 00 00 00 39 00 00 00 >> ..[snip].. >> >> Tested-by: Jaehoon Chung <jh80.chung@samsung.com> >> Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com> >> >> Best Regards, >> Jaehoon Chung >> >>> --- >>> V2: - Update documentation >>> --- >>> cmd/Kconfig | 8 ++++ >>> cmd/mmc.c | 96 +++++++++++++++++++++++++++++++++++++++++++ >>> doc/usage/cmd/mmc.rst | 26 ++++++++++++ >>> 3 files changed, 130 insertions(+) >>> >>> diff --git a/cmd/Kconfig b/cmd/Kconfig >>> index 6470b138d2f..dcd99757a1e 100644 >>> --- a/cmd/Kconfig >>> +++ b/cmd/Kconfig >>> @@ -1307,6 +1307,14 @@ config CMD_BKOPS_ENABLE >>> on a eMMC device. The feature is optionally available on eMMC devices >>> conforming to standard >= 4.41. >>> >>> +config CMD_MMC_REG >>> + bool "Enable support for reading card registers in the mmc command" >>> + depends on CMD_MMC >>> + default n >>> + help >>> + Enable the commands for reading card registers. This is useful >>> + mostly for debugging or extracting details from the card. >>> + >>> config CMD_MMC_RPMB >>> bool "Enable support for RPMB in the mmc command" >>> depends on SUPPORT_EMMC_RPMB >>> diff --git a/cmd/mmc.c b/cmd/mmc.c >>> index c6bd81cebbc..c29f44b7a18 100644 >>> --- a/cmd/mmc.c >>> +++ b/cmd/mmc.c >>> @@ -1110,6 +1110,93 @@ static int do_mmc_boot_wp(struct cmd_tbl *cmdtp, int flag, >>> return CMD_RET_SUCCESS; >>> } >>> >>> +#if CONFIG_IS_ENABLED(CMD_MMC_REG) >>> +static int do_mmc_reg(struct cmd_tbl *cmdtp, int flag, >>> + int argc, char *const argv[]) >>> +{ >>> + ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN); >>> + struct mmc *mmc; >>> + int i, ret; >>> + u32 off; >>> + >>> + if (argc < 3 || argc > 5) >>> + return CMD_RET_USAGE; >>> + >>> + mmc = find_mmc_device(curr_device); >>> + if (!mmc) { >>> + printf("no mmc device at slot %x\n", curr_device); >>> + return CMD_RET_FAILURE; >>> + } >>> + >>> + if (IS_SD(mmc)) { >>> + printf("SD registers are not supported\n"); >>> + return CMD_RET_FAILURE; >>> + } >>> + >>> + off = simple_strtoul(argv[3], NULL, 10); >>> + if (!strcmp(argv[2], "cid")) { >>> + if (off > 3) >>> + return CMD_RET_USAGE; >>> + printf("CID[%i]: 0x%08x\n", off, mmc->cid[off]); >>> + if (argv[4]) >>> + env_set_hex(argv[4], mmc->cid[off]); >>> + return CMD_RET_SUCCESS; >>> + } >>> + if (!strcmp(argv[2], "csd")) { >>> + if (off > 3) >>> + return CMD_RET_USAGE; >>> + printf("CSD[%i]: 0x%08x\n", off, mmc->csd[off]); >>> + if (argv[4]) >>> + env_set_hex(argv[4], mmc->csd[off]); >>> + return CMD_RET_SUCCESS; >>> + } >>> + if (!strcmp(argv[2], "dsr")) { >>> + printf("DSR: 0x%08x\n", mmc->dsr); >>> + if (argv[4]) >>> + env_set_hex(argv[4], mmc->dsr); >>> + return CMD_RET_SUCCESS; >>> + } >>> + if (!strcmp(argv[2], "ocr")) { >>> + printf("OCR: 0x%08x\n", mmc->ocr); >>> + if (argv[4]) >>> + env_set_hex(argv[4], mmc->ocr); >>> + return CMD_RET_SUCCESS; >>> + } >>> + if (!strcmp(argv[2], "rca")) { >>> + printf("RCA: 0x%08x\n", mmc->rca); >>> + if (argv[4]) >>> + env_set_hex(argv[4], mmc->rca); >>> + return CMD_RET_SUCCESS; >>> + } >>> + if (!strcmp(argv[2], "extcsd") && >>> + mmc->version >= MMC_VERSION_4_41) { >>> + ret = mmc_send_ext_csd(mmc, ext_csd); >>> + if (ret) >>> + return ret; >>> + if (!strcmp(argv[3], "all")) { >>> + /* Dump the entire register */ >>> + printf("EXT_CSD:"); >>> + for (i = 0; i < MMC_MAX_BLOCK_LEN; i++) { >>> + if (!(i % 10)) >>> + printf("\n%03i: ", i); >>> + printf(" %02x", ext_csd[i]); >>> + } >>> + printf("\n"); >>> + return CMD_RET_SUCCESS; >>> + } >>> + off = simple_strtoul(argv[3], NULL, 10); >>> + if (off > 512) >>> + return CMD_RET_USAGE; >>> + printf("EXT_CSD[%i]: 0x%02x\n", off, ext_csd[off]); >>> + if (argv[4]) >>> + env_set_hex(argv[4], ext_csd[off]); >>> + return CMD_RET_SUCCESS; >>> + } >>> + >>> + return CMD_RET_FAILURE; >>> +} >>> +#endif >>> + >>> static struct cmd_tbl cmd_mmc[] = { >>> U_BOOT_CMD_MKENT(info, 1, 0, do_mmcinfo, "", ""), >>> U_BOOT_CMD_MKENT(read, 4, 1, do_mmc_read, "", ""), >>> @@ -1142,6 +1229,9 @@ static struct cmd_tbl cmd_mmc[] = { >>> U_BOOT_CMD_MKENT(bkops-enable, 2, 0, do_mmc_bkops_enable, "", ""), >>> U_BOOT_CMD_MKENT(bkops, 4, 0, do_mmc_bkops, "", ""), >>> #endif >>> +#if CONFIG_IS_ENABLED(CMD_MMC_REG) >>> + U_BOOT_CMD_MKENT(reg, 5, 0, do_mmc_reg, "", ""), >>> +#endif >>> }; >>> >>> static int do_mmcops(struct cmd_tbl *cmdtp, int flag, int argc, >>> @@ -1229,6 +1319,12 @@ U_BOOT_CMD( >>> " WARNING: This is a write-once setting.\n" >>> "mmc bkops <dev> [auto|manual] [enable|disable]\n" >>> " - configure background operations handshake on device\n" >>> +#endif >>> +#if CONFIG_IS_ENABLED(CMD_MMC_REG) >>> + "mmc reg read <reg> <offset> [env] - read card register <reg> offset <offset>\n" >>> + " (optionally into [env] variable)\n" >>> + " - reg: cid/csd/dsr/ocr/rca/extcsd\n" >>> + " - offset: for cid/csd [0..3], for extcsd [0..511,all]\n" > > Is there any reason to add "all" option for cid/csd? CID/CSD are simple and the "all" loop can be easily implemented on command line even without setexpr. With extcsd I often want to get the whole dump for debug purposes and it is not so easy for the whole block, hence the 'all' . ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers 2023-10-10 12:47 ` [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers Marek Vasut 2023-10-31 6:08 ` Jaehoon Chung @ 2023-10-31 8:26 ` Lothar Waßmann 2023-10-31 11:33 ` Marek Vasut 1 sibling, 1 reply; 6+ messages in thread From: Lothar Waßmann @ 2023-10-31 8:26 UTC (permalink / raw) To: Marek Vasut Cc: u-boot, Abdellatif El Khlifi, Heinrich Schuchardt, Ilias Apalodimas, Jaehoon Chung, Ramon Fried, Roger Knecht, Sean Edmond, Simon Glass, Tobias Waldekranz Hi, On Tue, 10 Oct 2023 14:47:28 +0200 Marek Vasut wrote: > Add extension to the 'mmc' command to read out the card registers. > Currently, only the eMMC OCR/CID/CSD/EXTCSD/RCA/DSR register are > supported. A register value can either be displayed or read into > an environment variable. > > Signed-off-by: Marek Vasut <marex@denx.de> > --- > Cc: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> > Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> > Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org> > Cc: Jaehoon Chung <jh80.chung@samsung.com> > Cc: Ramon Fried <rfried.dev@gmail.com> > Cc: Roger Knecht <rknecht@pm.me> > Cc: Sean Edmond <seanedmond@microsoft.com> > Cc: Simon Glass <sjg@chromium.org> > Cc: Tobias Waldekranz <tobias@waldekranz.com> > --- > V2: - Update documentation > --- > cmd/Kconfig | 8 ++++ > cmd/mmc.c | 96 +++++++++++++++++++++++++++++++++++++++++++ > doc/usage/cmd/mmc.rst | 26 ++++++++++++ > 3 files changed, 130 insertions(+) > [...] > + if (!strcmp(argv[2], "ocr")) { > + printf("OCR: 0x%08x\n", mmc->ocr); > + if (argv[4]) > + env_set_hex(argv[4], mmc->ocr); > + return CMD_RET_SUCCESS; > + } > + if (!strcmp(argv[2], "rca")) { > + printf("RCA: 0x%08x\n", mmc->rca); > + if (argv[4]) > + env_set_hex(argv[4], mmc->rca); > + return CMD_RET_SUCCESS; > + } > + if (!strcmp(argv[2], "extcsd") && > + mmc->version >= MMC_VERSION_4_41) { > + ret = mmc_send_ext_csd(mmc, ext_csd); > + if (ret) > + return ret; return CMD_RET_FAILURE; Lothar Waßmann ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers 2023-10-31 8:26 ` Lothar Waßmann @ 2023-10-31 11:33 ` Marek Vasut 0 siblings, 0 replies; 6+ messages in thread From: Marek Vasut @ 2023-10-31 11:33 UTC (permalink / raw) To: Lothar Waßmann Cc: u-boot, Abdellatif El Khlifi, Heinrich Schuchardt, Ilias Apalodimas, Jaehoon Chung, Ramon Fried, Roger Knecht, Sean Edmond, Simon Glass, Tobias Waldekranz On 10/31/23 09:26, Lothar Waßmann wrote: > Hi, > > On Tue, 10 Oct 2023 14:47:28 +0200 Marek Vasut wrote: >> Add extension to the 'mmc' command to read out the card registers. >> Currently, only the eMMC OCR/CID/CSD/EXTCSD/RCA/DSR register are >> supported. A register value can either be displayed or read into >> an environment variable. >> >> Signed-off-by: Marek Vasut <marex@denx.de> >> --- >> Cc: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> >> Cc: Heinrich Schuchardt <xypron.glpk@gmx.de> >> Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org> >> Cc: Jaehoon Chung <jh80.chung@samsung.com> >> Cc: Ramon Fried <rfried.dev@gmail.com> >> Cc: Roger Knecht <rknecht@pm.me> >> Cc: Sean Edmond <seanedmond@microsoft.com> >> Cc: Simon Glass <sjg@chromium.org> >> Cc: Tobias Waldekranz <tobias@waldekranz.com> >> --- >> V2: - Update documentation >> --- >> cmd/Kconfig | 8 ++++ >> cmd/mmc.c | 96 +++++++++++++++++++++++++++++++++++++++++++ >> doc/usage/cmd/mmc.rst | 26 ++++++++++++ >> 3 files changed, 130 insertions(+) >> > [...] >> + if (!strcmp(argv[2], "ocr")) { >> + printf("OCR: 0x%08x\n", mmc->ocr); >> + if (argv[4]) >> + env_set_hex(argv[4], mmc->ocr); >> + return CMD_RET_SUCCESS; >> + } >> + if (!strcmp(argv[2], "rca")) { >> + printf("RCA: 0x%08x\n", mmc->rca); >> + if (argv[4]) >> + env_set_hex(argv[4], mmc->rca); >> + return CMD_RET_SUCCESS; >> + } >> + if (!strcmp(argv[2], "extcsd") && >> + mmc->version >= MMC_VERSION_4_41) { >> + ret = mmc_send_ext_csd(mmc, ext_csd); >> + if (ret) >> + return ret; > return CMD_RET_FAILURE; > Fixed in V3, thanks . ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-10-31 11:33 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20231031060824epcas1p4948c3250847cbc5ffd3cb739c9020fbd@epcas1p4.samsung.com>
2023-10-10 12:47 ` [PATCH v2] cmd: mmc: Add mmc reg read command for reading card registers Marek Vasut
2023-10-31 6:08 ` Jaehoon Chung
2023-10-31 6:29 ` Jaehoon Chung
2023-10-31 7:52 ` Marek Vasut
2023-10-31 8:26 ` Lothar Waßmann
2023-10-31 11:33 ` Marek Vasut
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.