* [PATCH 1/1] mmc-utils: lsmmc: Accept /dev/ and /sys/block/ paths for cid/csd/scr read
@ 2026-05-12 17:10 Torstein Eide
0 siblings, 0 replies; only message in thread
From: Torstein Eide @ 2026-05-12 17:10 UTC (permalink / raw)
To: linux-mmc; +Cc: Torstein EIde
From: Torstein EIde <torsteine+linux@gmail.com>
Commands like 'cid read' previously required a raw sysfs device path
such as /sys/bus/mmc/devices/mmc0:0001/. Most users know their block
device as /dev/mmcblk0 or /sys/block/mmcblk0.
Add resolve_dev_path() which follows /sys/class/block/<dev>/device via
realpath() to reach the canonical sysfs device directory. Paths that
start with /dev/ or /sys/block/ are resolved automatically in
do_read_reg() before processing, and the resolved sysfs path is printed
so the caller can see which device was matched.
---
docs/HOWTO.rst | 53 +++++++++++++++++++++++++++++++++++++++++---------
lsmmc.c | 38 ++++++++++++++++++++++++++++++++++++
2 files changed, 82 insertions(+), 9 deletions(-)
diff --git a/docs/HOWTO.rst b/docs/HOWTO.rst
index 7a27a50..02edea4 100644
--- a/docs/HOWTO.rst
+++ b/docs/HOWTO.rst
@@ -35,19 +35,54 @@ Running mmc-utils
Set user area write protection.
``csd read [-h] [-v] [-b bus_type] [-r register] <device path>``
- Print CSD data from <device path>. The device path should specify the csd sysfs file directory.
- if [bus_type] is passed (mmc or sd) the [register] content must be passed as well, and no need for device path.
- it is useful for cases we are getting the register value without having the actual platform.
+ Print CSD data from <device path>. The device path may be one of the following:
+ - sysfs device directory (/sys/devices/platform/fe310000.mmc/mmc_host/mmc0/mmc0:0001)
+ - device node (/dev/mmcblkN)
+ - sysfs block device entry (/sys/block/mmcblkN)
+ /dev/ and /sys/block/ paths are resolved to the sysfs device
+ directory automatically and the resolved path is printed.
+ If [-b bus_type] is passed (mmc or sd) the [-r register] content must
+ be passed as well, and no device path is required. Useful when the
+ register value is known without access to the actual hardware.
+
+ Example::
+
+ $ mmc csd read /dev/mmcblk0
+ sysfs: /sys/devices/platform/fe310000.mmc/mmc_host/mmc0/mmc0:0001
+ CSD Register: 00000000...
``cid read <device path>``
- Print CID data from <device path>. The device path should specify the cid sysfs file directory.
- if [bus_type] is passed (mmc or sd) the [register] content must be passed as well, and no need for device path.
- it is useful for cases we are getting the register value without having the actual platform.
+ Print CID data from <device path>. The device path may be a one of the following:
+ - sysfs device directory (/sys/devices/platform/fe310000.mmc/mmc_host/mmc0/mmc0:0001)
+ - device node (/dev/mmcblkN)
+ - sysfs block device entry (/sys/block/mmcblkN)
+ /dev/ and /sys/block/ paths are resolved to the sysfs device
+ directory automatically and the resolved path is printed.
+ If [-b bus_type] is passed (mmc or sd) the [-r register] content must
+ be passed as well, and no device path is required. Useful when the
+ register value is known without access to the actual hardware.
+
+ Example::
+
+ $ mmc cid read /dev/mmcblk0
+ sysfs: /sys/devices/platform/fe310000.mmc/mmc_host/mmc0/mmc0:0001
+ Manufacturer ID: 0x15
+ OEM ID: 0x0100
+ Product name: MAG4FA
+ Product revision: 1.0
+ Serial number: 0x1a2b3c4d
+ Manufacturing date: 01/2021
``scr read <device path>``
- Print SCR data from <device path>. The device path should specify the scr sysfs file directory.
- if [bus_type] is passed (mmc or sd) the [register] content must be passed as well, and no need for device path.
- it is useful for cases we are getting the register value without having the actual platform.
+ Print SCR data from <device path>. The device path may be a one of the following:
+ - sysfs device directory (/sys/devices/platform/fe310000.mmc/mmc_host/mmc0/mmc0:0001)
+ - device node (/dev/mmcblkN)
+ - sysfs block device entry (/sys/block/mmcblkN)
+ /dev/ and /sys/block/ paths are resolved to the sysfs device
+ directory automatically and the resolved path is printed.
+ If [-b bus_type] is passed (mmc or sd) the [-r register] content must
+ be passed as well, and no device path is required. Useful when the
+ register value is known without access to the actual hardware.
+
+ Example::
+
+ $ mmc scr read /dev/mmcblk1
+ sysfs: /sys/devices/platform/fe320000.mmc/mmc_host/mmc1/mmc1:aaaa
+ SCR Register: 0235800000000000
``ffu <image name> <device> [chunk-bytes]``
Default mode. Run Field Firmware Update with `<image name>` on `<device>`. `[chunk-bytes]` is optional and defaults to its max - 512k. Should be in decimal bytes and sector aligned.
diff --git a/lsmmc.c b/lsmmc.c
index 225c753..e33d636 100644
--- a/lsmmc.c
+++ b/lsmmc.c
@@ -226,6 +226,32 @@ static const char *get_manufacturer(struct config *config, unsigned int manid)
return NULL;
}
+static char *resolve_dev_path(const char *path)
+{
+ const char *devname = strrchr(path, '/');
+ char syspath[PATH_MAX];
+ char *resolved;
+
+ devname = devname ? devname + 1 : path;
+ if (*devname == '\0')
+ return NULL;
+
+ if (snprintf(syspath, sizeof(syspath), "/sys/class/block/%s/device",
+ devname) >= PATH_MAX)
+ return NULL;
+
+ resolved = malloc(PATH_MAX);
+ if (!resolved)
+ return NULL;
+
+ if (realpath(syspath, resolved) == NULL) {
+ fprintf(stderr, "Cannot resolve '%s': %s\n", path, strerror(errno));
+ free(resolved);
+ return NULL;
+ }
+ return resolved;
+}
+
/* MMC/SD file parsing functions */
static char *read_file(char *name)
{
@@ -2149,6 +2175,18 @@ static int do_read_reg(int argc, char **argv, enum REG_TYPE reg)
if (ret)
return ret;
+ if (cfg.dir &&
+ (strncmp(cfg.dir, "/dev/", 5) == 0 ||
+ strncmp(cfg.dir, "/sys/block/", 11) == 0)) {
+ char *sysfs = resolve_dev_path(cfg.dir);
+
+ if (!sysfs)
+ return -1;
+ free(cfg.dir);
+ cfg.dir = sysfs;
+ printf("sysfs: %s\n", cfg.dir);
+ }
+
if (cfg.dir) {
ret = process_dir(&cfg, reg);
free(cfg.dir);
--
2.53.0
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-05-12 17:11 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-12 17:10 [PATCH 1/1] mmc-utils: lsmmc: Accept /dev/ and /sys/block/ paths for cid/csd/scr read Torstein Eide
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.