Hi,
On 10/4/26 21:22, Petr Hodina via B4 Relay wrote:
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().
Can you add a Kconfig config to enable this ?
Thanks,
Neil
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;
}