[PATCH 3/5] ufs: Extend the ufs user interface
Neil Armstrong
neil.armstrong at linaro.org
Mon Jun 1 15:55:33 CEST 2026
On 6/1/26 13:26, Raz Ben Yehuda wrote:
> 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>
Why ?
>
> 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;
Why ?
> } 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();
Make the UFS device selectable everywhere, and return the ufs_tool_print_luns error
> + 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
> );
More information about the U-Boot
mailing list