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 <[email protected]>
---
  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
  );

Reply via email to