[PATCH 3/5] ufs: Extend the ufs user interface

Raz Ben Yehuda raz.benyehuda at mobileye.com
Mon Jun 1 13:26:03 CEST 2026


Provide a user interface and help to ufs tool.
	query [lun] [idn]:
		(0h) Device desc
        	(7h) Geometry desc
		(8h) Power desc
		(2h) Unit desc
		(1h) Config desc

        set_lun [LUN] [parm]
                lu_enable
                boot_lun_id
                lu_write_protect
                memory_type
                data_reliability
                num_allocunits
                logical_block_size
                provisioning_type
                context_capabilities
                lu_num_write_booster_buffer_allocunits

	set_dev_desc [parm] [value]
		descriptor_idn, device, device_class
		device_sub_class, number_lu, boot_enable
		descr_access_en, init_power_mode, high_priority_lun
		secure_removal_type, initactive_icc_level
		queue_depth, write_booster_buffer_preserve_user_space_en
		write_booster_buffer_type, spec_version, manufacturer_id
		periodic_rtc_update, device_version, psa_max_data_size
		extended_ufs_features_support,
		num_shared_write_booster_buffer_allocunits
		write_booster_buffer_preserve_user_space_en

	set_cfg_desc [parm] [value]
		length, descriptor_idn, conf_desc_continue
		boot_enable, descr_access_en, initpower_mode
		high_priority_lun, secure_removal_type, init_active_icc_level
		periodic_rtc_update, reserved_HPB, rpmb_region_enable
		rpmb_region1_size, rpmb_region2_size, rpmb_region3_size
		write_booster_buffer_preserve_user_space_en
		write_booster_buffer_type
		num_shared_write_booster_buffer_allocunits

	flag [flag name]
		deviceinit, permanent_wpe, pwr_on_wpe, bkops_en, life_span_mode
		purge_enable, fphy_resource_removal, busy_rtc
		permanently_disable_fw_update, write_booster_en
		wb_buf_flush_en, wb_buf_flush_h8

Examples:

To create lun 4 please:
	use ufs set_lun 4 num_allocunits xxx to set size
	ufs commit
	scsi scan

To change some value in the configuration descriptor
	ufs set_cfg_desc num_shared_write_booster_buffer_allocunits 100000
	ufs set_cfg_desc write_booster_buffer_type 1
	ufs commit

Signed-off-by: Raz Ben Yehuda <raz.benyehuda at mobileye.com>
---
 cmd/ufs.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 86 insertions(+), 8 deletions(-)

diff --git a/cmd/ufs.c b/cmd/ufs.c
index 790dab50f18..bb0e2fd3a67 100644
--- a/cmd/ufs.c
+++ b/cmd/ufs.c
@@ -8,31 +8,109 @@
 #include <command.h>
 #include <ufs.h>
 #include <vsprintf.h>
-#include <linux/string.h>
 
 static int do_ufs(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
-	int dev, ret;
+	int dev;
 
 	if (argc >= 2) {
 		if (!strcmp(argv[1], "init")) {
 			if (argc == 3) {
 				dev = dectoul(argv[2], NULL);
-				ret = ufs_probe_dev(dev);
-				if (ret)
+				if (!ufs_probe_dev(dev))
 					return CMD_RET_FAILURE;
 			} else {
 				ufs_probe();
 			}
-
 			return CMD_RET_SUCCESS;
 		}
-	}
+#if IS_ENABLED(CONFIG_UFS_TOOL)
+		if (!strcmp(argv[1], "query")) {
+			int lun = -1;
+			int idn = -1;
+
+			if (argc <= 3) {
+				printf("usage: lun idn");
+				return CMD_RET_FAILURE;
+			}
+
+			lun  = dectoul(argv[2], NULL);
+			idn  = dectoul(argv[3], NULL);
+
+			return ufs_tool_query(lun, idn);
+		}
+
+		if (!strcmp(argv[1], "set_lun")) {
+			int lun;
+			u32 val;
+
+			if (argc <= 4) {
+				ufs_tool_help();
+				return CMD_RET_FAILURE;
+			}
+			lun  = dectoul(argv[2], NULL);
+			val  = dectoul(argv[4], NULL);
+			return ufs_tool_set_lun(lun, argv[3], val);
+		}
+		if (!strcmp(argv[1], "set_dev_desc")) {
+			const char *name;
+			u32 val;
 
-	return CMD_RET_USAGE;
+			if (argc <= 3) {
+				ufs_tool_help();
+				return CMD_RET_FAILURE;
+			}
+			name = argv[2];
+			val  = dectoul(argv[3], NULL);
+			return ufs_tool_set_device_desc(name, val);
+		}
+		if (!strcmp(argv[1], "set_cfg_desc")) {
+			const char *name;
+			u32 val;
+
+			if (argc <= 3) {
+				ufs_tool_help();
+				return CMD_RET_FAILURE;
+			}
+			name = argv[2];
+			val  = dectoul(argv[3], NULL);
+			return ufs_tool_set_config_desc(name, val);
+		}
+
+		if (!strcmp(argv[1], "flag")) {
+			if (argc == 2) {
+				printf("usage: flag [flag name]");
+				ufs_tool_help();
+				return CMD_RET_FAILURE;
+			}
+			return ufs_tool_query_flag(argv[2]);
+		}
+
+		if (!strcmp(argv[1], "commit"))
+			return ufs_tool_commit();
+
+		if (!strcmp(argv[1], "clearall"))
+			return ufs_tool_clearall();
+		if (!strcmp(argv[1], "luns")) {
+			ufs_tool_print_luns();
+			return 0;
+		}
+	}
+	ufs_tool_help();
+#endif
+	return CMD_RET_FAILURE;
 }
 
-U_BOOT_CMD(ufs, 3, 1, do_ufs,
+U_BOOT_CMD(ufs, 5, 1, do_ufs,
 	   "UFS sub-system",
 	   "init [dev] - init UFS subsystem\n"
+#if IS_ENABLED(CONFIG_UFS_TOOL)
+	   "query [LUN] [IDN]\n"
+	   "set_lun [LUN] [parm name] [value]\n"
+	   "set_cfg_des   [parm name] [value]\n"
+	   "set_dev_desc  [parm name] [value]\n"
+	   "luns - prints luns\n"
+	   "flag [flag name] Query Flags\n"
+	   "commit - writes luns configuration\n"
+#endif
 );
-- 
2.43.0



More information about the U-Boot mailing list