Hannes Reinecke 2a3fe8
From: Akinobu Mita <akinobu.mita@gmail.com>
Hannes Reinecke 2a3fe8
Date: Fri, 15 Nov 2019 00:40:01 +0900
Hannes Reinecke 2a3fe8
Subject: [PATCH] nvme: hwmon: add quirk to avoid changing temperature
Hannes Reinecke 2a3fe8
Git-commit: 6c6aa2f26c6813af38d88718881c0307bb9a54c0
Hannes Reinecke 2a3fe8
Patch-mainline: v5.5-rc1
Hannes Reinecke 2a3fe8
References: bsc#1169045
Hannes Reinecke 2a3fe8
 threshold
Hannes Reinecke 2a3fe8
Hannes Reinecke 2a3fe8
This adds a new quirk NVME_QUIRK_NO_TEMP_THRESH_CHANGE to avoid changing
Hannes Reinecke 2a3fe8
the value of the temperature threshold feature for specific devices that
Hannes Reinecke 2a3fe8
show undesirable behavior.
Hannes Reinecke 2a3fe8
Hannes Reinecke 2a3fe8
Guenter reported:
Hannes Reinecke 2a3fe8
Hannes Reinecke 2a3fe8
"On my Intel NVME drive (SSDPEKKW512G7), writing any minimum limit on the
Hannes Reinecke 2a3fe8
Composite temperature sensor results in a temperature warning, and that
Hannes Reinecke 2a3fe8
warning is sticky until I reset the controller.
Hannes Reinecke 2a3fe8
Hannes Reinecke 2a3fe8
It doesn't seem to matter which temperature I write; writing -273000 has
Hannes Reinecke 2a3fe8
the same result."
Hannes Reinecke 2a3fe8
Hannes Reinecke 2a3fe8
The Intel NVMe has the latest firmware version installed, so this isn't
Hannes Reinecke 2a3fe8
a problem that was ever fixed.
Hannes Reinecke 2a3fe8
Hannes Reinecke 2a3fe8
Reported-by: Guenter Roeck <linux@roeck-us.net>
Hannes Reinecke 2a3fe8
Cc: Keith Busch <kbusch@kernel.org>
Hannes Reinecke 2a3fe8
Cc: Jens Axboe <axboe@fb.com>
Hannes Reinecke 2a3fe8
Cc: Christoph Hellwig <hch@lst.de>
Hannes Reinecke 2a3fe8
Cc: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke 2a3fe8
Cc: Jean Delvare <jdelvare@suse.com>
Hannes Reinecke 2a3fe8
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Hannes Reinecke 2a3fe8
Tested-by: Guenter Roeck <linux@roeck-us.net>
Hannes Reinecke 2a3fe8
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Hannes Reinecke 2a3fe8
Signed-off-by: Keith Busch <kbusch@kernel.org>
Hannes Reinecke 2a3fe8
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke 2a3fe8
---
Hannes Reinecke 2a3fe8
 drivers/nvme/host/hwmon.c | 6 +++++-
Hannes Reinecke 2a3fe8
 drivers/nvme/host/nvme.h  | 5 +++++
Hannes Reinecke 2a3fe8
 drivers/nvme/host/pci.c   | 3 ++-
Hannes Reinecke 2a3fe8
 3 files changed, 12 insertions(+), 2 deletions(-)
Hannes Reinecke 2a3fe8
Hannes Reinecke 2a3fe8
diff --git a/drivers/nvme/host/hwmon.c b/drivers/nvme/host/hwmon.c
Hannes Reinecke 2a3fe8
index 97a84b4b45db..a5af21f5d370 100644
Hannes Reinecke 2a3fe8
--- a/drivers/nvme/host/hwmon.c
Hannes Reinecke 2a3fe8
+++ b/drivers/nvme/host/hwmon.c
Hannes Reinecke 2a3fe8
@@ -170,8 +170,12 @@ static umode_t nvme_hwmon_is_visible(const void *_data,
Hannes Reinecke 2a3fe8
 	case hwmon_temp_max:
Hannes Reinecke 2a3fe8
 	case hwmon_temp_min:
Hannes Reinecke 2a3fe8
 		if ((!channel && data->ctrl->wctemp) ||
Hannes Reinecke 2a3fe8
-		    (channel && data->log.temp_sensor[channel - 1]))
Hannes Reinecke 2a3fe8
+		    (channel && data->log.temp_sensor[channel - 1])) {
Hannes Reinecke 2a3fe8
+			if (data->ctrl->quirks &
Hannes Reinecke 2a3fe8
+			    NVME_QUIRK_NO_TEMP_THRESH_CHANGE)
Hannes Reinecke 2a3fe8
+				return 0444;
Hannes Reinecke 2a3fe8
 			return 0644;
Hannes Reinecke 2a3fe8
+		}
Hannes Reinecke 2a3fe8
 		break;
Hannes Reinecke 2a3fe8
 	case hwmon_temp_alarm:
Hannes Reinecke 2a3fe8
 		if (!channel)
Hannes Reinecke 2a3fe8
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
Hannes Reinecke 2a3fe8
index 258534a7bb6c..34ac79c5e309 100644
Hannes Reinecke 2a3fe8
--- a/drivers/nvme/host/nvme.h
Hannes Reinecke 2a3fe8
+++ b/drivers/nvme/host/nvme.h
Hannes Reinecke 2a3fe8
@@ -114,6 +114,11 @@ enum nvme_quirks {
Hannes Reinecke 2a3fe8
 	 * Prevent tag overlap between queues
Hannes Reinecke 2a3fe8
 	 */
Hannes Reinecke 2a3fe8
 	NVME_QUIRK_SHARED_TAGS                  = (1 << 13),
Hannes Reinecke 2a3fe8
+
Hannes Reinecke 2a3fe8
+	/*
Hannes Reinecke 2a3fe8
+	 * Don't change the value of the temperature threshold feature
Hannes Reinecke 2a3fe8
+	 */
Hannes Reinecke 2a3fe8
+	NVME_QUIRK_NO_TEMP_THRESH_CHANGE	= (1 << 14),
Hannes Reinecke 2a3fe8
 };
Hannes Reinecke 2a3fe8
 
Hannes Reinecke 2a3fe8
 /*
Hannes Reinecke 2a3fe8
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
Hannes Reinecke 2a3fe8
index 1b1b0db45567..c40a672e5047 100644
Hannes Reinecke 2a3fe8
--- a/drivers/nvme/host/pci.c
Hannes Reinecke 2a3fe8
+++ b/drivers/nvme/host/pci.c
Hannes Reinecke 2a3fe8
@@ -3065,7 +3065,8 @@ static const struct pci_device_id nvme_id_table[] = {
Hannes Reinecke 2a3fe8
 				NVME_QUIRK_DEALLOCATE_ZEROES, },
Hannes Reinecke 2a3fe8
 	{ PCI_VDEVICE(INTEL, 0xf1a5),	/* Intel 600P/P3100 */
Hannes Reinecke 2a3fe8
 		.driver_data = NVME_QUIRK_NO_DEEPEST_PS |
Hannes Reinecke 2a3fe8
-				NVME_QUIRK_MEDIUM_PRIO_SQ },
Hannes Reinecke 2a3fe8
+				NVME_QUIRK_MEDIUM_PRIO_SQ |
Hannes Reinecke 2a3fe8
+				NVME_QUIRK_NO_TEMP_THRESH_CHANGE },
Hannes Reinecke 2a3fe8
 	{ PCI_VDEVICE(INTEL, 0xf1a6),	/* Intel 760p/Pro 7600p */
Hannes Reinecke 2a3fe8
 		.driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, },
Hannes Reinecke 2a3fe8
 	{ PCI_VDEVICE(INTEL, 0x5845),	/* Qemu emulated controller */
Hannes Reinecke 2a3fe8
-- 
Hannes Reinecke 2a3fe8
2.16.4
Hannes Reinecke 2a3fe8