thermal: ACPI: Initialize trips if temperature is out of range
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 26 Jan 2023 12:53:49 +0000 (13:53 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 27 Jan 2023 14:09:47 +0000 (15:09 +0100)
In some cases it is still useful to register a trip point if the
temperature returned by the corresponding ACPI thermal object (for
example, _HOT) is invalid to start with, because the same ACPI
thermal object may start to return a valid temperature after a
system configuration change (for example, from an AC power source
to battery an vice versa).

For this reason, if the ACPI thermal object evaluated by
thermal_acpi_trip_init() successfully returns a temperature value that
is out of the range of values taken into account, initialize the trip
point using THERMAL_TEMP_INVALID as the temperature value instead of
returning an error to allow the user of the trip point to decide what
to do with it.

Also update pch_wpt_add_acpi_psv_trip() to reject trip points with
invalid temperature values.

Fixes: 7a0e39748861 ("thermal: ACPI: Add ACPI trip point routines")
Reported-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/thermal/intel/intel_pch_thermal.c
drivers/thermal/thermal_acpi.c

index cc4e9d28496b5f8d4aee29c5fc9f6e864eeed913..45a9ea86907e943839b2617c5ddecca3fec1deb2 100644 (file)
@@ -107,7 +107,7 @@ static void pch_wpt_add_acpi_psv_trip(struct pch_thermal_device *ptd,
                return;
 
        ret = thermal_acpi_trip_passive(adev, &ptd->trips[*nr_trips]);
-       if (ret)
+       if (ret || ptd->trips[*nr_trips].temperature <= 0)
                return;
 
        ++(*nr_trips);
index f65281ca3ed0f4936ed0f42eea0b526775a4b34b..671f774a76219c601489f42d30e63c6ce8f3f2c9 100644 (file)
@@ -64,13 +64,14 @@ static int thermal_acpi_trip_init(struct acpi_device *adev,
                return -ENODATA;
        }
 
-       if (temp < TEMP_MIN_DECIK || temp >= TEMP_MAX_DECIK) {
+       if (temp >= TEMP_MIN_DECIK && temp <= TEMP_MAX_DECIK) {
+               trip->temperature = deci_kelvin_to_millicelsius(temp);
+       } else {
                acpi_handle_debug(adev->handle, "%s result %llu out of range\n",
                                  obj_name, temp);
-               return -ENODATA;
+               trip->temperature = THERMAL_TEMP_INVALID;
        }
 
-       trip->temperature = deci_kelvin_to_millicelsius(temp);
        trip->hysteresis = 0;
        trip->type = type;