* [PATCH v2 2/2] platform/x86: dell-ddv: Fix temperature scaling
2023-02-18 11:53 [PATCH v2 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume Armin Wolf
@ 2023-02-18 11:53 ` Armin Wolf
2023-03-01 12:19 ` Hans de Goede
2023-02-28 13:21 ` [PATCH v2 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume Armin Wolf
2023-03-01 12:15 ` Hans de Goede
2 siblings, 1 reply; 5+ messages in thread
From: Armin Wolf @ 2023-02-18 11:53 UTC (permalink / raw)
To: hdegoede, markgross
Cc: jdelvare, linux, platform-driver-x86, linux-hwmon, linux-kernel
After using the built-in UEFI hardware diagnostics to compare
the measured battery temperature, i noticed that the temperature
is actually expressed in tenth degree kelvin, similar to the
SBS-Data standard. For example, a value of 2992 is displayed as
26 degrees celsius.
Fix the scaling so that the correct values are being displayed.
Tested on a Dell Inspiron 3505.
Fixes: a77272c16041 ("platform/x86: dell: Add new dell-wmi-ddv driver")
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
---
Changes in v2:
- Avoid unnecessary rounding
---
drivers/platform/x86/dell/dell-wmi-ddv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c
index eff4e9649faf..2750dee99c3e 100644
--- a/drivers/platform/x86/dell/dell-wmi-ddv.c
+++ b/drivers/platform/x86/dell/dell-wmi-ddv.c
@@ -17,7 +17,6 @@
#include <linux/kernel.h>
#include <linux/hwmon.h>
#include <linux/kstrtox.h>
-#include <linux/math.h>
#include <linux/math64.h>
#include <linux/module.h>
#include <linux/mutex.h>
@@ -665,7 +664,8 @@ static ssize_t temp_show(struct device *dev, struct device_attribute *attr, char
if (ret < 0)
return ret;
- return sysfs_emit(buf, "%d\n", DIV_ROUND_CLOSEST(value, 10));
+ /* Use 2731 instead of 2731.5 to avoid unnecessary rounding */
+ return sysfs_emit(buf, "%d\n", value - 2731);
}
static ssize_t eppid_show(struct device *dev, struct device_attribute *attr, char *buf)
--
2.30.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] platform/x86: dell-ddv: Fix temperature scaling
2023-02-18 11:53 ` [PATCH v2 2/2] platform/x86: dell-ddv: Fix temperature scaling Armin Wolf
@ 2023-03-01 12:19 ` Hans de Goede
0 siblings, 0 replies; 5+ messages in thread
From: Hans de Goede @ 2023-03-01 12:19 UTC (permalink / raw)
To: Armin Wolf, markgross
Cc: jdelvare, linux, platform-driver-x86, linux-hwmon, linux-kernel
Hi,
On 2/18/23 12:53, Armin Wolf wrote:
> After using the built-in UEFI hardware diagnostics to compare
> the measured battery temperature, i noticed that the temperature
> is actually expressed in tenth degree kelvin, similar to the
> SBS-Data standard. For example, a value of 2992 is displayed as
> 26 degrees celsius.
> Fix the scaling so that the correct values are being displayed.
>
> Tested on a Dell Inspiron 3505.
>
> Fixes: a77272c16041 ("platform/x86: dell: Add new dell-wmi-ddv driver")
> Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Thanks, I've applied this patch to my review-hans branch:
https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans
I'll rebase that branch once 6.3-rc1 is out and then push the rebased
patch to the fixes branch and include it in my next 6.3 fixes pull-req
to Linus.
Regards,
Hans
> ---
> Changes in v2:
> - Avoid unnecessary rounding
> ---
> drivers/platform/x86/dell/dell-wmi-ddv.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c
> index eff4e9649faf..2750dee99c3e 100644
> --- a/drivers/platform/x86/dell/dell-wmi-ddv.c
> +++ b/drivers/platform/x86/dell/dell-wmi-ddv.c
> @@ -17,7 +17,6 @@
> #include <linux/kernel.h>
> #include <linux/hwmon.h>
> #include <linux/kstrtox.h>
> -#include <linux/math.h>
> #include <linux/math64.h>
> #include <linux/module.h>
> #include <linux/mutex.h>
> @@ -665,7 +664,8 @@ static ssize_t temp_show(struct device *dev, struct device_attribute *attr, char
> if (ret < 0)
> return ret;
>
> - return sysfs_emit(buf, "%d\n", DIV_ROUND_CLOSEST(value, 10));
> + /* Use 2731 instead of 2731.5 to avoid unnecessary rounding */
> + return sysfs_emit(buf, "%d\n", value - 2731);
> }
>
> static ssize_t eppid_show(struct device *dev, struct device_attribute *attr, char *buf)
> --
> 2.30.2
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume
2023-02-18 11:53 [PATCH v2 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume Armin Wolf
2023-02-18 11:53 ` [PATCH v2 2/2] platform/x86: dell-ddv: Fix temperature scaling Armin Wolf
@ 2023-02-28 13:21 ` Armin Wolf
2023-03-01 12:15 ` Hans de Goede
2 siblings, 0 replies; 5+ messages in thread
From: Armin Wolf @ 2023-02-28 13:21 UTC (permalink / raw)
To: hdegoede, markgross
Cc: jdelvare, linux, platform-driver-x86, linux-hwmon, linux-kernel
Am 18.02.23 um 12:53 schrieb Armin Wolf:
> If one or both sensor buffers could not be initialized, either
> due to missing hardware support or due to some error during probing,
> the resume handler will encounter undefined behaviour when
> attempting to lock buffers then protected by an uninitialized or
> destroyed mutex.
> Fix this by introducing a "active" flag which is set during probe,
> and only invalidate buffers which where flaged as "active".
>
> Tested on a Dell Inspiron 3505.
Hello,
what is the status of this series? Both patches are tested on real hardware
and work flawlessly.
Armin Wolf
> Fixes: 3b7eeff93d29 ("platform/x86: dell-ddv: Add hwmon support")
> Signed-off-by: Armin Wolf <W_Armin@gmx.de>
> ---
> Changes in v2:
> - move checking of the "active" flag inside
> dell_wmi_ddv_hwmon_cache_invalidate()
> ---
> drivers/platform/x86/dell/dell-wmi-ddv.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c
> index d547c9d09725..eff4e9649faf 100644
> --- a/drivers/platform/x86/dell/dell-wmi-ddv.c
> +++ b/drivers/platform/x86/dell/dell-wmi-ddv.c
> @@ -96,6 +96,7 @@ struct combined_chip_info {
> };
>
> struct dell_wmi_ddv_sensors {
> + bool active;
> struct mutex lock; /* protect caching */
> unsigned long timestamp;
> union acpi_object *obj;
> @@ -520,6 +521,9 @@ static struct hwmon_channel_info *dell_wmi_ddv_channel_create(struct device *dev
>
> static void dell_wmi_ddv_hwmon_cache_invalidate(struct dell_wmi_ddv_sensors *sensors)
> {
> + if (!sensors->active)
> + return;
> +
> mutex_lock(&sensors->lock);
> kfree(sensors->obj);
> sensors->obj = NULL;
> @@ -530,6 +534,7 @@ static void dell_wmi_ddv_hwmon_cache_destroy(void *data)
> {
> struct dell_wmi_ddv_sensors *sensors = data;
>
> + sensors->active = false;
> mutex_destroy(&sensors->lock);
> kfree(sensors->obj);
> }
> @@ -549,6 +554,7 @@ static struct hwmon_channel_info *dell_wmi_ddv_channel_init(struct wmi_device *w
> return ERR_PTR(ret);
>
> mutex_init(&sensors->lock);
> + sensors->active = true;
>
> ret = devm_add_action_or_reset(&wdev->dev, dell_wmi_ddv_hwmon_cache_destroy, sensors);
> if (ret < 0)
> @@ -852,7 +858,7 @@ static int dell_wmi_ddv_resume(struct device *dev)
> {
> struct dell_wmi_ddv_data *data = dev_get_drvdata(dev);
>
> - /* Force re-reading of all sensors */
> + /* Force re-reading of all active sensors */
> dell_wmi_ddv_hwmon_cache_invalidate(&data->fans);
> dell_wmi_ddv_hwmon_cache_invalidate(&data->temps);
>
> --
> 2.30.2
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume
2023-02-18 11:53 [PATCH v2 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume Armin Wolf
2023-02-18 11:53 ` [PATCH v2 2/2] platform/x86: dell-ddv: Fix temperature scaling Armin Wolf
2023-02-28 13:21 ` [PATCH v2 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume Armin Wolf
@ 2023-03-01 12:15 ` Hans de Goede
2 siblings, 0 replies; 5+ messages in thread
From: Hans de Goede @ 2023-03-01 12:15 UTC (permalink / raw)
To: Armin Wolf, markgross
Cc: jdelvare, linux, platform-driver-x86, linux-hwmon, linux-kernel
Hi,
On 2/18/23 12:53, Armin Wolf wrote:
> If one or both sensor buffers could not be initialized, either
> due to missing hardware support or due to some error during probing,
> the resume handler will encounter undefined behaviour when
> attempting to lock buffers then protected by an uninitialized or
> destroyed mutex.
> Fix this by introducing a "active" flag which is set during probe,
> and only invalidate buffers which where flaged as "active".
>
> Tested on a Dell Inspiron 3505.
>
> Fixes: 3b7eeff93d29 ("platform/x86: dell-ddv: Add hwmon support")
> Signed-off-by: Armin Wolf <W_Armin@gmx.de>
> ---
> Changes in v2:
> - move checking of the "active" flag inside
> dell_wmi_ddv_hwmon_cache_invalidate()
Thanks, I've applied this patch to my review-hans branch:
https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans
I'll rebase that branch once 6.3-rc1 is out and then push the rebased
patch to the fixes branch and include it in my next 6.3 fixes pull-req
to Linus.
Regards,
Hans
> ---
> drivers/platform/x86/dell/dell-wmi-ddv.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c
> index d547c9d09725..eff4e9649faf 100644
> --- a/drivers/platform/x86/dell/dell-wmi-ddv.c
> +++ b/drivers/platform/x86/dell/dell-wmi-ddv.c
> @@ -96,6 +96,7 @@ struct combined_chip_info {
> };
>
> struct dell_wmi_ddv_sensors {
> + bool active;
> struct mutex lock; /* protect caching */
> unsigned long timestamp;
> union acpi_object *obj;
> @@ -520,6 +521,9 @@ static struct hwmon_channel_info *dell_wmi_ddv_channel_create(struct device *dev
>
> static void dell_wmi_ddv_hwmon_cache_invalidate(struct dell_wmi_ddv_sensors *sensors)
> {
> + if (!sensors->active)
> + return;
> +
> mutex_lock(&sensors->lock);
> kfree(sensors->obj);
> sensors->obj = NULL;
> @@ -530,6 +534,7 @@ static void dell_wmi_ddv_hwmon_cache_destroy(void *data)
> {
> struct dell_wmi_ddv_sensors *sensors = data;
>
> + sensors->active = false;
> mutex_destroy(&sensors->lock);
> kfree(sensors->obj);
> }
> @@ -549,6 +554,7 @@ static struct hwmon_channel_info *dell_wmi_ddv_channel_init(struct wmi_device *w
> return ERR_PTR(ret);
>
> mutex_init(&sensors->lock);
> + sensors->active = true;
>
> ret = devm_add_action_or_reset(&wdev->dev, dell_wmi_ddv_hwmon_cache_destroy, sensors);
> if (ret < 0)
> @@ -852,7 +858,7 @@ static int dell_wmi_ddv_resume(struct device *dev)
> {
> struct dell_wmi_ddv_data *data = dev_get_drvdata(dev);
>
> - /* Force re-reading of all sensors */
> + /* Force re-reading of all active sensors */
> dell_wmi_ddv_hwmon_cache_invalidate(&data->fans);
> dell_wmi_ddv_hwmon_cache_invalidate(&data->temps);
>
> --
> 2.30.2
>
^ permalink raw reply [flat|nested] 5+ messages in thread