[PATCH 2/2] app/procinfo: add option to decode module EEPROM

Roman Khromenok roma55592 at yandex.ru
Sat Oct 10 08:55:42 CEST 2026


The --show-module-eeprom option only prints a hexdump of the
pluggable module EEPROM, which has to be decoded by hand against
the SFF specifications.

Add an optional "decode" value, --show-module-eeprom=decode,
to print the fields decoded by rte_eth_module_eeprom_parse(),
such as the vendor, the transceiver type and the digital
diagnostics, as the testpmd command "show port <port_id>
module_eeprom decode" does. Without the value, the hexdump
is printed as before.

Signed-off-by: Roman Khromenok <roma55592 at yandex.ru>
---
Tested on a stand with testpmd as the primary process and three
net_null ports, patched locally (not part of the series) so that
port 0 has no module and ports 1-2 return an SFF-8472 image:
before patch 1/2 only port 0 was shown, after it ports 1-2 are
dumped and decoded, and an invalid value is rejected.

 app/proc-info/main.c                   | 35 +++++++++++++++++++++++---
 doc/guides/rel_notes/release_26_11.rst |  3 ++-
 doc/guides/tools/proc_info.rst         |  9 ++++---
 3 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/app/proc-info/main.c b/app/proc-info/main.c
index d918a0a3c8..635e81c5ab 100644
--- a/app/proc-info/main.c
+++ b/app/proc-info/main.c
@@ -117,6 +117,8 @@ static uint32_t enable_shw_fw_version;
 static uint32_t enable_shw_rss_reta;
 /* Enable show module eeprom information. */
 static uint32_t enable_shw_module_eeprom;
+/* Decode module eeprom instead of a hexdump. */
+static uint32_t module_eeprom_decode;
 
 /* Enable dump Rx/Tx descriptor. */
 static uint32_t enable_shw_rx_desc_dump;
@@ -184,7 +186,8 @@ proc_info_usage(const char *prgname)
 		"  --version: to display DPDK version\n"
 		"  --firmware-version: to display ethdev firmware version\n"
 		"  --show-rss-reta: to display ports redirection table\n"
-		"  --show-module-eeprom: to display ports module eeprom information\n"
+		"  --show-module-eeprom[=decode]: to display ports module eeprom information, "
+			"as a hexdump or decoded\n"
 		"  --show-rx-descriptor queue_id:offset:num to display ports Rx descriptor information. "
 			"queue_id: A Rx queue identifier on this port. "
 			"offset: The offset of the descriptor starting from tail. "
@@ -445,7 +448,7 @@ proc_info_parse_args(int argc, char **argv)
 		{"version", 0, NULL, 0},
 		{"firmware-version", 0, NULL, 0},
 		{"show-rss-reta", 0, NULL, 0},
-		{"show-module-eeprom", 0, NULL, 0},
+		{"show-module-eeprom", optional_argument, NULL, 0},
 		{"show-rx-descriptor", required_argument, NULL, 1},
 		{"show-tx-descriptor", required_argument, NULL, 1},
 		{"show-edev-queue-xstats", required_argument, NULL, 0},
@@ -539,8 +542,17 @@ proc_info_parse_args(int argc, char **argv)
 					"show-rss-reta", MAX_LONG_OPT_SZ))
 				enable_shw_rss_reta = 1;
 			else if (!strncmp(long_option[option_index].name,
-					"show-module-eeprom", MAX_LONG_OPT_SZ))
+					"show-module-eeprom", MAX_LONG_OPT_SZ)) {
 				enable_shw_module_eeprom = 1;
+				if (optarg != NULL) {
+					if (strcmp(optarg, "decode") != 0) {
+						fprintf(stderr, "Invalid show-module-eeprom value: %s\n",
+							optarg);
+						return -1;
+					}
+					module_eeprom_decode = 1;
+				}
+			}
 			else if (!strncmp(long_option[option_index].name,
 					"edev-dump-xstats", MAX_LONG_OPT_SZ)) {
 				int ret = parse_eventdev_dump_xstats_params(optarg);
@@ -1850,6 +1862,13 @@ show_port_rss_reta_info(void)
 	}
 }
 
+static void
+module_eeprom_field_print(const char *name, const char *value,
+		__rte_unused void *arg)
+{
+	printf("\t%-41s : %s\n", name, value);
+}
+
 static void
 show_module_eeprom_info(void)
 {
@@ -1891,6 +1910,16 @@ show_module_eeprom_info(void)
 			continue;
 		}
 
+		if (module_eeprom_decode) {
+			ret = rte_eth_module_eeprom_parse(module_info.type,
+					eeprom_info.data, eeprom_info.length,
+					module_eeprom_field_print, NULL);
+			if (ret != 0)
+				fprintf(stderr, "Port %u module EEPROM decode error: %s\n",
+					i, strerror(-ret));
+			continue;
+		}
+
 		rte_hexdump(stdout, "hexdump", eeprom_info.data,
 			    eeprom_info.length);
 		printf("Finish -- Port: %u MODULE EEPROM length: %d bytes\n",
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 0bca0c2c89..51de3a490f 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -85,7 +85,8 @@ New Features
   or obtained from any other source with the same layout,
   such as the Linux ethtool ``ETHTOOL_GMODULEEEPROM`` ioctl.
   The testpmd command ``show port (port_id) module_eeprom decode``
-  uses it to display the decoded module EEPROM.
+  and the dpdk-proc-info option ``--show-module-eeprom=decode``
+  use it to display the decoded module EEPROM.
   The SFF-8636 decoder also reports the per-lane loss of signal,
   loss of lock and Tx fault flags.
   The SFF-8472 decoder also reports the Rx loss of signal and Tx fault state.
diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst
index 0a54f20f8c..36f8000408 100644
--- a/doc/guides/tools/proc_info.rst
+++ b/doc/guides/tools/proc_info.rst
@@ -21,7 +21,7 @@ The application has a number of command line options:
    --stats-reset | --xstats-reset] [ --show-port | --show-tm | --show-crypto |
    --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name |
    --show-port-private | --version | --firmware-version | --show-rss-reta |
-   --show-module-eeprom | --show-rx-descriptor queue_id:offset:num |
+   --show-module-eeprom[=decode] | --show-rx-descriptor queue_id:offset:num |
    --show-tx-descriptor queue_id:offset:num | --show-edev-queue-xstats=queue_num:evdev_id |
    --show-edev-port-xstats=port_num :evdev_id | --edev-dump-xstats=evdev_id |
    --edev-reset-xstats=evdev_id | --show-edev-device-xstats=evdev_id]
@@ -87,8 +87,11 @@ The firmware-version parameter displays ethdev firmware version.
 **--show-rss-reta**
 The show-rss-reta parameter displays ports rss redirection table.
 
-**--show-module-eeprom**
-The show-module-eeprom parameter displays ports module eeprom information.
+**--show-module-eeprom[=decode]**
+The show-module-eeprom parameter displays ports module eeprom information
+as a hexdump. With the decode value, the module eeprom is decoded
+according to the SFF specifications, for example the vendor,
+the transceiver type and the digital diagnostics.
 
 **--show-rx-descriptor queue_id:offset:num**
 The show-rx-descriptor parameter displays ports Rx descriptor information
-- 
2.47.3



More information about the dev mailing list