From: Petr Hodina <[email protected]>

Dump the key UFS device properties (manufacturer, model, fw revision,
spec version, negotiated gear/lane/power, and the applied device quirks)
at the end of ufs_start().

Signed-off-by: Petr Hodina <[email protected]>
---
 drivers/ufs/ufs-uclass.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/drivers/ufs/ufs-uclass.c b/drivers/ufs/ufs-uclass.c
index 7dfba3ac1ac..3cc4fd6bde3 100644
--- a/drivers/ufs/ufs-uclass.c
+++ b/drivers/ufs/ufs-uclass.c
@@ -2218,6 +2218,58 @@ static void ufshcd_def_desc_sizes(struct ufs_hba *hba)
        hba->desc_size.hlth_desc = QUERY_DESC_HEALTH_DEF_SIZE;
 }
 
+/* Map a JEDEC UFS manufacturer id to a human-readable vendor name */
+static const char *ufshcd_vendor_name(u16 mid)
+{
+       switch (mid) {
+       case UFS_VENDOR_TOSHIBA:        return "Toshiba/Kioxia";
+       case UFS_VENDOR_SAMSUNG:        return "Samsung";
+       case UFS_VENDOR_SKHYNIX:        return "SK Hynix";
+       case UFS_VENDOR_MICRON:         return "Micron";
+       case UFS_VENDOR_WDC:            return "Western Digital";
+       default:                        return NULL;
+       }
+}
+
+static void ufshcd_rtrim(char *s)
+{
+       size_t n = strlen(s);
+
+       while (n && s[n - 1] == ' ')
+               s[--n] = '\0';
+}
+
+static void ufshcd_print_dev_info(struct ufs_hba *hba,
+                                 struct ufs_dev_desc *card)
+{
+       const char *vendor = ufshcd_vendor_name(card->wmanufacturerid);
+
+       ufshcd_rtrim(card->model);
+       ufshcd_rtrim(card->revision);
+
+       printf("UFS Device Information (%s)\n", hba->dev->name);
+       if (vendor)
+               printf("  Manufacturer:    %s (0x%04x)\n", vendor,
+                      card->wmanufacturerid);
+       else
+               printf("  Manufacturer ID: 0x%04x\n", card->wmanufacturerid);
+       printf("  Model:           %s\n",
+              card->model[0] ? card->model : "(unset)");
+       printf("  Revision:        %s\n",
+              card->revision[0] ? card->revision : "(unset)");
+       printf("  Spec Version:    0x%04x\n", card->wspecversion);
+       printf("  Gear  - RX: %u, TX: %u\n",
+              hba->pwr_info.gear_rx, hba->pwr_info.gear_tx);
+       printf("  Lane  - RX: %u, TX: %u\n",
+              hba->pwr_info.lane_rx, hba->pwr_info.lane_tx);
+       printf("  Power - RX: %u, TX: %u, HS rate: %u\n",
+              hba->pwr_info.pwr_rx, hba->pwr_info.pwr_tx,
+              hba->pwr_info.hs_rate);
+       printf("  Device Quirks:   0x%08x\n", hba->dev_quirks);
+       printf("  NO_PURGE Quirk:  %s\n",
+              (hba->dev_quirks & UFS_DEVICE_QUIRK_NO_PURGE) ? "Yes" : "No");
+}
+
 static int ufs_start(struct ufs_hba *hba)
 {
        struct ufs_dev_desc card = {0};
@@ -2268,6 +2320,8 @@ static int ufs_start(struct ufs_hba *hba)
                ufshcd_print_pwr_info(hba);
        }
 
+       ufshcd_print_dev_info(hba, &card);
+
        return 0;
 }
 

-- 
2.55.0


Reply via email to