[PATCH 1/2] scsi: ufs: hwmon: Prepare for more hwmon notifications

From: Avri Altman
Date: Mon Feb 03 2025 - 10:30:54 EST


This commit updates the UFS hwmon driver to prepare for handling more
hardware monitoring notifications. Specifically, it changes the type of
the `mask` parameter from `u8` to `u16` to accommodate additional
notification types.

While at it, the Kconfig entry for `CONFIG_SCSI_UFS_HWMON` has been
updated to better reflect its purpose. The description has been changed
from "UFS Temperature Notification" to "UFS Hardware Monitoring" to
indicate that the driver now supports a broader range of hardware
monitoring notifications beyond just temperature.

Signed-off-by: Avri Altman <avri.altman@xxxxxxx>
---
drivers/ufs/core/Kconfig | 2 +-
drivers/ufs/core/ufs-hwmon.c | 8 ++++----
drivers/ufs/core/ufshcd-priv.h | 8 ++++----
drivers/ufs/core/ufshcd.c | 16 +++++++++++-----
4 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/drivers/ufs/core/Kconfig b/drivers/ufs/core/Kconfig
index 817208ee64ec..dd3b79ac79be 100644
--- a/drivers/ufs/core/Kconfig
+++ b/drivers/ufs/core/Kconfig
@@ -43,7 +43,7 @@ config SCSI_UFS_FAULT_INJECTION
to test the UFS error handler and abort handler.

config SCSI_UFS_HWMON
- bool "UFS Temperature Notification"
+ bool "UFS Hardware Monitoring"
depends on SCSI_UFSHCD=HWMON || HWMON=y
help
This provides support for UFS hardware monitoring. If enabled,
diff --git a/drivers/ufs/core/ufs-hwmon.c b/drivers/ufs/core/ufs-hwmon.c
index 34194064367f..db28f456b923 100644
--- a/drivers/ufs/core/ufs-hwmon.c
+++ b/drivers/ufs/core/ufs-hwmon.c
@@ -12,10 +12,10 @@

struct ufs_hwmon_data {
struct ufs_hba *hba;
- u8 mask;
+ u16 mask;
};

-static int ufs_read_temp_enable(struct ufs_hba *hba, u8 mask, long *val)
+static int ufs_read_temp_enable(struct ufs_hba *hba, u16 mask, long *val)
{
u32 ee_mask;
int err;
@@ -163,7 +163,7 @@ static const struct hwmon_chip_info ufs_hwmon_hba_info = {
.info = ufs_hwmon_info,
};

-void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask)
+void ufs_hwmon_probe(struct ufs_hba *hba, u16 mask)
{
struct device *dev = hba->dev;
struct ufs_hwmon_data *data;
@@ -199,7 +199,7 @@ void ufs_hwmon_remove(struct ufs_hba *hba)
kfree(data);
}

-void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask)
+void ufs_hwmon_notify_event(struct ufs_hba *hba, u16 ee_mask)
{
if (!hba->hwmon_device)
return;
diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index 786f20ef2238..279c3e8d1b21 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -33,13 +33,13 @@ static inline bool ufshcd_is_wb_buf_flush_allowed(struct ufs_hba *hba)
}

#ifdef CONFIG_SCSI_UFS_HWMON
-void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask);
+void ufs_hwmon_probe(struct ufs_hba *hba, u16 mask);
void ufs_hwmon_remove(struct ufs_hba *hba);
-void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask);
+void ufs_hwmon_notify_event(struct ufs_hba *hba, u16 ee_mask);
#else
-static inline void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask) {}
+static inline void ufs_hwmon_probe(struct ufs_hba *hba, u16 mask) {}
static inline void ufs_hwmon_remove(struct ufs_hba *hba) {}
-static inline void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {}
+static inline void ufs_hwmon_notify_event(struct ufs_hba *hba, u16 ee_mask) {}
#endif

int ufshcd_query_descriptor_retry(struct ufs_hba *hba,
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index f6c38cf10382..9fbaf74b0fef 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -8074,11 +8074,10 @@ static void ufshcd_wb_probe(struct ufs_hba *hba, const u8 *desc_buf)
hba->caps &= ~UFSHCD_CAP_WB_EN;
}

-static void ufshcd_temp_notif_probe(struct ufs_hba *hba, const u8 *desc_buf)
+static void ufshcd_temp_notif_probe(struct ufs_hba *hba, const u8 *desc_buf, u16 *mask)
{
struct ufs_dev_info *dev_info = &hba->dev_info;
u32 ext_ufs_feature;
- u8 mask = 0;

if (!(hba->caps & UFSHCD_CAP_TEMP_NOTIF) || dev_info->wspecversion < 0x300)
return;
@@ -8086,10 +8085,17 @@ static void ufshcd_temp_notif_probe(struct ufs_hba *hba, const u8 *desc_buf)
ext_ufs_feature = get_unaligned_be32(desc_buf + DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP);

if (ext_ufs_feature & UFS_DEV_LOW_TEMP_NOTIF)
- mask |= MASK_EE_TOO_LOW_TEMP;
+ *mask |= MASK_EE_TOO_LOW_TEMP;

if (ext_ufs_feature & UFS_DEV_HIGH_TEMP_NOTIF)
- mask |= MASK_EE_TOO_HIGH_TEMP;
+ *mask |= MASK_EE_TOO_HIGH_TEMP;
+}
+
+static void ufshcd_hwmon_probe(struct ufs_hba *hba, const u8 *desc_buf)
+{
+ u16 mask = 0;
+
+ ufshcd_temp_notif_probe(hba, desc_buf, &mask);

if (mask) {
ufshcd_enable_ee(hba, mask);
@@ -8288,7 +8294,7 @@ static int ufs_get_device_desc(struct ufs_hba *hba)

ufshcd_wb_probe(hba, desc_buf);

- ufshcd_temp_notif_probe(hba, desc_buf);
+ ufshcd_hwmon_probe(hba, desc_buf);

ufs_init_rtc(hba, desc_buf);

--
2.25.1