diff mbox series

[v3,2/2] scsi: ufs: Add temperature notification exception handling

Message ID 20210912131919.12962-3-avri.altman@wdc.com (mailing list archive)
State Superseded
Headers show
Series Add temperature notification support | expand

Commit Message

Avri Altman Sept. 12, 2021, 1:19 p.m. UTC
The device may notify the host of an extreme temperature by using the
exception event mechanism. The exception can be raised when the device’s
Tcase temperature is either too high or too low.

It is essentially up to the platform to decide what further actions need
to be taken. leave a placeholder for a designated vop for that.

Signed-off-by: Avri Altman <avri.altman@wdc.com>
---
 drivers/scsi/ufs/ufs-hwmon.c | 14 ++++++++++++++
 drivers/scsi/ufs/ufs.h       |  2 ++
 drivers/scsi/ufs/ufshcd.c    | 21 +++++++++++++++++++++
 drivers/scsi/ufs/ufshcd.h    |  2 ++
 4 files changed, 39 insertions(+)

Comments

kernel test robot Sept. 12, 2021, 3:43 p.m. UTC | #1
Hi Avri,

I love your patch! Yet something to improve:

[auto build test ERROR on mkp-scsi/for-next]
[also build test ERROR on scsi/for-next next-20210910]
[cannot apply to target/for-next v5.14]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Avri-Altman/Add-temperature-notification-support/20210912-212110
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
config: riscv-randconfig-r042-20210912 (attached as .config)
compiler: riscv64-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/2aa54f753f44e119f4629ae015fedb3e12cebac6
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Avri-Altman/Add-temperature-notification-support/20210912-212110
        git checkout 2aa54f753f44e119f4629ae015fedb3e12cebac6
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=riscv SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All error/warnings (new ones prefixed by >>):

   In file included from drivers/scsi/ufs/ufs-debugfs.c:7:
>> drivers/scsi/ufs/ufshcd.h:1070:6: warning: no previous prototype for 'ufs_hwmon_notify_event' [-Wmissing-prototypes]
    1070 | void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {}
         |      ^~~~~~~~~~~~~~~~~~~~~~
--
   riscv64-linux-ld: drivers/scsi/ufs/ufs-sysfs.o: in function `ufs_hwmon_notify_event':
>> ufs-sysfs.c:(.text+0xca00): multiple definition of `ufs_hwmon_notify_event'; drivers/scsi/ufs/ufshcd.o:ufshcd.c:(.text+0xb8c0): first defined here
   riscv64-linux-ld: drivers/scsi/ufs/ufs-debugfs.o: in function `ufs_hwmon_notify_event':
   ufs-debugfs.c:(.text+0x440): multiple definition of `ufs_hwmon_notify_event'; drivers/scsi/ufs/ufshcd.o:ufshcd.c:(.text+0xb8c0): first defined here
   riscv64-linux-ld: drivers/scsi/ufs/ufshcd-crypto.o: in function `ufs_hwmon_notify_event':
   ufshcd-crypto.c:(.text+0x580): multiple definition of `ufs_hwmon_notify_event'; drivers/scsi/ufs/ufshcd.o:ufshcd.c:(.text+0xb8c0): first defined here
   riscv64-linux-ld: drivers/scsi/ufs/ufshpb.o: in function `ufs_hwmon_notify_event':
   ufshpb.c:(.text+0x5240): multiple definition of `ufs_hwmon_notify_event'; drivers/scsi/ufs/ufshcd.o:ufshcd.c:(.text+0xb8c0): first defined here

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Guenter Roeck Sept. 12, 2021, 3:55 p.m. UTC | #2
On 9/12/21 6:19 AM, Avri Altman wrote:
> The device may notify the host of an extreme temperature by using the
> exception event mechanism. The exception can be raised when the device’s
> Tcase temperature is either too high or too low.
> 
> It is essentially up to the platform to decide what further actions need
> to be taken. leave a placeholder for a designated vop for that.
> 
> Signed-off-by: Avri Altman <avri.altman@wdc.com>
> ---
>   drivers/scsi/ufs/ufs-hwmon.c | 14 ++++++++++++++
>   drivers/scsi/ufs/ufs.h       |  2 ++
>   drivers/scsi/ufs/ufshcd.c    | 21 +++++++++++++++++++++
>   drivers/scsi/ufs/ufshcd.h    |  2 ++
>   4 files changed, 39 insertions(+)
> 
> diff --git a/drivers/scsi/ufs/ufs-hwmon.c b/drivers/scsi/ufs/ufs-hwmon.c
> index a50e83f645f4..b466b4649c21 100644
> --- a/drivers/scsi/ufs/ufs-hwmon.c
> +++ b/drivers/scsi/ufs/ufs-hwmon.c
> @@ -177,3 +177,17 @@ void ufs_hwmon_remove(struct ufs_hba *hba)
>   	hba->hwmon_device = NULL;
>   	kfree(data);
>   }
> +
> +void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask)
> +{
> +	if (!hba->hwmon_device)
> +		return;
> +
> +	if (ee_mask & MASK_EE_TOO_HIGH_TEMP)
> +		hwmon_notify_event(hba->hwmon_device, hwmon_temp,
> +				   hwmon_temp_max_alarm, 0);
> +
> +	if (ee_mask & MASK_EE_TOO_LOW_TEMP)
> +		hwmon_notify_event(hba->hwmon_device, hwmon_temp,
> +				   hwmon_temp_min_alarm, 0);
> +}
> diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h
> index 171b27be7b1d..d9bc048c2a71 100644
> --- a/drivers/scsi/ufs/ufs.h
> +++ b/drivers/scsi/ufs/ufs.h
> @@ -377,6 +377,8 @@ enum {
>   	MASK_EE_PERFORMANCE_THROTTLING	= BIT(6),
>   };
>   
> +#define MASK_EE_URGENT_TEMP (MASK_EE_TOO_HIGH_TEMP | MASK_EE_TOO_LOW_TEMP)
> +
>   /* Background operation status */
>   enum bkops_status {
>   	BKOPS_STATUS_NO_OP               = 0x0,
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index 90c2e9677435..3f4c7124b74b 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -5642,6 +5642,24 @@ static void ufshcd_bkops_exception_event_handler(struct ufs_hba *hba)
>   				__func__, err);
>   }
>   
> +static void ufshcd_temp_exception_event_handler(struct ufs_hba *hba, u16 status)
> +{
> +	u32 value;
> +
> +	if (ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_READ_ATTR,
> +				QUERY_ATTR_IDN_CASE_ROUGH_TEMP, 0, 0, &value))
> +		return;
> +
> +	dev_info(hba->dev, "exception Tcase %d\n", value - 80);
> +
> +	ufs_hwmon_notify_event(hba, status & MASK_EE_URGENT_TEMP);
> +
> +	/*
> +	 * A placeholder for the platform vendors to add whatever additional
> +	 * steps required
> +	 */
> +}
> +
>   static int __ufshcd_wb_toggle(struct ufs_hba *hba, bool set, enum flag_idn idn)
>   {
>   	u8 index;
> @@ -5821,6 +5839,9 @@ static void ufshcd_exception_event_handler(struct work_struct *work)
>   	if (status & hba->ee_drv_mask & MASK_EE_URGENT_BKOPS)
>   		ufshcd_bkops_exception_event_handler(hba);
>   
> +	if (status & hba->ee_drv_mask & MASK_EE_URGENT_TEMP)
> +		ufshcd_temp_exception_event_handler(hba, status);
> +
>   	ufs_debugfs_exception_event(hba, status);
>   out:
>   	ufshcd_scsi_unblock_requests(hba);
> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
> index 798a408d71e5..e6abce9a8b00 100644
> --- a/drivers/scsi/ufs/ufshcd.h
> +++ b/drivers/scsi/ufs/ufshcd.h
> @@ -1063,9 +1063,11 @@ static inline u8 ufshcd_wb_get_query_index(struct ufs_hba *hba)
>   #ifdef CONFIG_SCSI_UFS_HWMON
>   void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask);
>   void ufs_hwmon_remove(struct ufs_hba *hba);
> +void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask);
>   #else
>   static inline void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask) {}
>   static inline void ufs_hwmon_remove(struct ufs_hba *hba) {}
> +void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {}

static

>   #endif
>   
>   #ifdef CONFIG_PM
>
kernel test robot Sept. 12, 2021, 4:33 p.m. UTC | #3
Hi Avri,

I love your patch! Yet something to improve:

[auto build test ERROR on mkp-scsi/for-next]
[also build test ERROR on scsi/for-next next-20210910]
[cannot apply to v5.14]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Avri-Altman/Add-temperature-notification-support/20210912-212110
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
config: x86_64-randconfig-a001-20210912 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 261cbe98c38f8c1ee1a482fe76511110e790f58a)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/2aa54f753f44e119f4629ae015fedb3e12cebac6
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Avri-Altman/Add-temperature-notification-support/20210912-212110
        git checkout 2aa54f753f44e119f4629ae015fedb3e12cebac6
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/scsi/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All error/warnings (new ones prefixed by >>):

   In file included from drivers/scsi/ufs/ufshcd.c:22:
>> drivers/scsi/ufs/ufshcd.h:1070:6: warning: no previous prototype for function 'ufs_hwmon_notify_event' [-Wmissing-prototypes]
   void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {}
        ^
   drivers/scsi/ufs/ufshcd.h:1070:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {}
   ^
   static 
   1 warning generated.
--
>> ld.lld: error: duplicate symbol: ufs_hwmon_notify_event
   >>> defined at ufshcd.h:1070 (drivers/scsi/ufs/ufshcd.h:1070)
   >>> drivers/scsi/ufs/ufshcd.o:(ufs_hwmon_notify_event)
   >>> defined at ufshcd.h:1070 (drivers/scsi/ufs/ufshcd.h:1070)
   >>> drivers/scsi/ufs/ufs-sysfs.o:(.text+0x0)
--
>> ld.lld: error: duplicate symbol: ufs_hwmon_notify_event
   >>> defined at ufshcd.h:1070 (drivers/scsi/ufs/ufshcd.h:1070)
   >>> drivers/scsi/ufs/ufshcd.o:(ufs_hwmon_notify_event)
   >>> defined at ufshcd.h:1070 (drivers/scsi/ufs/ufshcd.h:1070)
   >>> drivers/scsi/ufs/ufs-debugfs.o:(.text+0x0)

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
kernel test robot Sept. 12, 2021, 4:50 p.m. UTC | #4
Hi Avri,

I love your patch! Yet something to improve:

[auto build test ERROR on mkp-scsi/for-next]
[also build test ERROR on scsi/for-next next-20210910]
[cannot apply to v5.14]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Avri-Altman/Add-temperature-notification-support/20210912-212110
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
config: x86_64-kexec (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://github.com/0day-ci/linux/commit/2aa54f753f44e119f4629ae015fedb3e12cebac6
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Avri-Altman/Add-temperature-notification-support/20210912-212110
        git checkout 2aa54f753f44e119f4629ae015fedb3e12cebac6
        # save the attached .config to linux build tree
        make W=1 ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   ld: drivers/scsi/ufs/ufs-sysfs.o: in function `ufs_hwmon_notify_event':
>> drivers/scsi/ufs/ufshcd.h:1070: multiple definition of `ufs_hwmon_notify_event'; drivers/scsi/ufs/ufshcd.o:drivers/scsi/ufs/ufshcd.h:1070: first defined here
   ld: drivers/scsi/ufs/ufs-debugfs.o: in function `ufs_hwmon_notify_event':
>> drivers/scsi/ufs/ufshcd.h:1070: multiple definition of `ufs_hwmon_notify_event'; drivers/scsi/ufs/ufshcd.o:drivers/scsi/ufs/ufshcd.h:1070: first defined here


vim +1070 drivers/scsi/ufs/ufshcd.h

  1062	
  1063	#ifdef CONFIG_SCSI_UFS_HWMON
  1064	void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask);
  1065	void ufs_hwmon_remove(struct ufs_hba *hba);
  1066	void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask);
  1067	#else
  1068	static inline void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask) {}
  1069	static inline void ufs_hwmon_remove(struct ufs_hba *hba) {}
> 1070	void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {}
  1071	#endif
  1072	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Avri Altman Sept. 13, 2021, 6:09 a.m. UTC | #5
> > diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
> > index 798a408d71e5..e6abce9a8b00 100644
> > --- a/drivers/scsi/ufs/ufshcd.h
> > +++ b/drivers/scsi/ufs/ufshcd.h
> > @@ -1063,9 +1063,11 @@ static inline u8
> ufshcd_wb_get_query_index(struct ufs_hba *hba)
> >   #ifdef CONFIG_SCSI_UFS_HWMON
> >   void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask);
> >   void ufs_hwmon_remove(struct ufs_hba *hba);
> > +void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask);
> >   #else
> >   static inline void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask) {}
> >   static inline void ufs_hwmon_remove(struct ufs_hba *hba) {}
> > +void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {}
> 
> static
Done.

> 
> >   #endif
> >
> >   #ifdef CONFIG_PM
> >
diff mbox series

Patch

diff --git a/drivers/scsi/ufs/ufs-hwmon.c b/drivers/scsi/ufs/ufs-hwmon.c
index a50e83f645f4..b466b4649c21 100644
--- a/drivers/scsi/ufs/ufs-hwmon.c
+++ b/drivers/scsi/ufs/ufs-hwmon.c
@@ -177,3 +177,17 @@  void ufs_hwmon_remove(struct ufs_hba *hba)
 	hba->hwmon_device = NULL;
 	kfree(data);
 }
+
+void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask)
+{
+	if (!hba->hwmon_device)
+		return;
+
+	if (ee_mask & MASK_EE_TOO_HIGH_TEMP)
+		hwmon_notify_event(hba->hwmon_device, hwmon_temp,
+				   hwmon_temp_max_alarm, 0);
+
+	if (ee_mask & MASK_EE_TOO_LOW_TEMP)
+		hwmon_notify_event(hba->hwmon_device, hwmon_temp,
+				   hwmon_temp_min_alarm, 0);
+}
diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h
index 171b27be7b1d..d9bc048c2a71 100644
--- a/drivers/scsi/ufs/ufs.h
+++ b/drivers/scsi/ufs/ufs.h
@@ -377,6 +377,8 @@  enum {
 	MASK_EE_PERFORMANCE_THROTTLING	= BIT(6),
 };
 
+#define MASK_EE_URGENT_TEMP (MASK_EE_TOO_HIGH_TEMP | MASK_EE_TOO_LOW_TEMP)
+
 /* Background operation status */
 enum bkops_status {
 	BKOPS_STATUS_NO_OP               = 0x0,
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 90c2e9677435..3f4c7124b74b 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -5642,6 +5642,24 @@  static void ufshcd_bkops_exception_event_handler(struct ufs_hba *hba)
 				__func__, err);
 }
 
+static void ufshcd_temp_exception_event_handler(struct ufs_hba *hba, u16 status)
+{
+	u32 value;
+
+	if (ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_READ_ATTR,
+				QUERY_ATTR_IDN_CASE_ROUGH_TEMP, 0, 0, &value))
+		return;
+
+	dev_info(hba->dev, "exception Tcase %d\n", value - 80);
+
+	ufs_hwmon_notify_event(hba, status & MASK_EE_URGENT_TEMP);
+
+	/*
+	 * A placeholder for the platform vendors to add whatever additional
+	 * steps required
+	 */
+}
+
 static int __ufshcd_wb_toggle(struct ufs_hba *hba, bool set, enum flag_idn idn)
 {
 	u8 index;
@@ -5821,6 +5839,9 @@  static void ufshcd_exception_event_handler(struct work_struct *work)
 	if (status & hba->ee_drv_mask & MASK_EE_URGENT_BKOPS)
 		ufshcd_bkops_exception_event_handler(hba);
 
+	if (status & hba->ee_drv_mask & MASK_EE_URGENT_TEMP)
+		ufshcd_temp_exception_event_handler(hba, status);
+
 	ufs_debugfs_exception_event(hba, status);
 out:
 	ufshcd_scsi_unblock_requests(hba);
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 798a408d71e5..e6abce9a8b00 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -1063,9 +1063,11 @@  static inline u8 ufshcd_wb_get_query_index(struct ufs_hba *hba)
 #ifdef CONFIG_SCSI_UFS_HWMON
 void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask);
 void ufs_hwmon_remove(struct ufs_hba *hba);
+void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask);
 #else
 static inline void ufs_hwmon_probe(struct ufs_hba *hba, u8 mask) {}
 static inline void ufs_hwmon_remove(struct ufs_hba *hba) {}
+void ufs_hwmon_notify_event(struct ufs_hba *hba, u8 ee_mask) {}
 #endif
 
 #ifdef CONFIG_PM