Commit 6908097a authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

ACPI: thermal_lib: Add functions returning temperature in deci-Kelvin

Because the ACPI thermal driver generally operates temperature values
in deci-Kelvin, it needs the library functions returning temperature
for various trip point types to use deci-Kelvin too.

To address that, arrange the ACPI thermal library code in three levels
of functions where the high-level ones will return temperature in
milli-Celsius, as needed by the thermal core and the majority of
thermal drivers, the mid-level ones will return temperature in
deci-Kelvin and will be called internally by the corresponding high-
level functions, and all of the mid-level functions will call the same
low-level one, acpi_trip_temp(), to actually evaluate ACPI objects to
retrieve themperature values from the platform firmware.

Going forward, this will allow the ACPI thermal driver to use the
mid-level functions to provide temperature values needed by it, so as
to reduce code duplication related to evaluating trip temperature ACPI
control methods.

No intentional functional impact.
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent f4750798
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
* Copyright 2023 Linaro Limited * Copyright 2023 Linaro Limited
* Copyright 2023 Intel Corporation * Copyright 2023 Intel Corporation
* *
* Library routines for populating a generic thermal trip point structure * Library routines for retrieving trip point temperature values from the
* with data obtained by evaluating a specific object in the ACPI Namespace. * platform firmware via ACPI.
*/ */
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/units.h> #include <linux/units.h>
...@@ -17,11 +17,11 @@ ...@@ -17,11 +17,11 @@
* firmware. Any values out of these boundaries may be considered * firmware. Any values out of these boundaries may be considered
* bogus and we can assume the firmware has no data to provide. * bogus and we can assume the firmware has no data to provide.
*/ */
#define TEMP_MIN_DECIK 2180 #define TEMP_MIN_DECIK 2180ULL
#define TEMP_MAX_DECIK 4480 #define TEMP_MAX_DECIK 4480ULL
static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name, static int acpi_trip_temp(struct acpi_device *adev, char *obj_name,
int *ret_temp) int *ret_temp)
{ {
unsigned long long temp; unsigned long long temp;
acpi_status status; acpi_status status;
...@@ -33,7 +33,7 @@ static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name, ...@@ -33,7 +33,7 @@ static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name,
} }
if (temp >= TEMP_MIN_DECIK && temp <= TEMP_MAX_DECIK) { if (temp >= TEMP_MIN_DECIK && temp <= TEMP_MAX_DECIK) {
*ret_temp = deci_kelvin_to_millicelsius(temp); *ret_temp = temp;
} else { } else {
acpi_handle_debug(adev->handle, "%s result %llu out of range\n", acpi_handle_debug(adev->handle, "%s result %llu out of range\n",
obj_name, temp); obj_name, temp);
...@@ -43,6 +43,44 @@ static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name, ...@@ -43,6 +43,44 @@ static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name,
return 0; return 0;
} }
int acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp)
{
char obj_name[] = {'_', 'A', 'C', '0' + id, '\0'};
if (id < 0 || id > 9)
return -EINVAL;
return acpi_trip_temp(adev, obj_name, ret_temp);
}
int acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp)
{
return acpi_trip_temp(adev, "_PSV", ret_temp);
}
int acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp)
{
return acpi_trip_temp(adev, "_HOT", ret_temp);
}
int acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp)
{
return acpi_trip_temp(adev, "_CRT", ret_temp);
}
static int thermal_temp(int error, int temp_decik, int *ret_temp)
{
if (error)
return error;
if (temp_decik == THERMAL_TEMP_INVALID)
*ret_temp = THERMAL_TEMP_INVALID;
else
*ret_temp = deci_kelvin_to_millicelsius(temp_decik);
return 0;
}
/** /**
* thermal_acpi_active_trip_temp - Retrieve active trip point temperature * thermal_acpi_active_trip_temp - Retrieve active trip point temperature
* @adev: Target thermal zone ACPI device object. * @adev: Target thermal zone ACPI device object.
...@@ -57,12 +95,10 @@ static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name, ...@@ -57,12 +95,10 @@ static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name,
*/ */
int thermal_acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp) int thermal_acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp)
{ {
char obj_name[] = {'_', 'A', 'C', '0' + id, '\0'}; int temp_decik;
int ret = acpi_active_trip_temp(adev, id, &temp_decik);
if (id < 0 || id > 9)
return -EINVAL;
return thermal_acpi_trip_temp(adev, obj_name, ret_temp); return thermal_temp(ret, temp_decik, ret_temp);
} }
EXPORT_SYMBOL_GPL(thermal_acpi_active_trip_temp); EXPORT_SYMBOL_GPL(thermal_acpi_active_trip_temp);
...@@ -78,7 +114,10 @@ EXPORT_SYMBOL_GPL(thermal_acpi_active_trip_temp); ...@@ -78,7 +114,10 @@ EXPORT_SYMBOL_GPL(thermal_acpi_active_trip_temp);
*/ */
int thermal_acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp) int thermal_acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp)
{ {
return thermal_acpi_trip_temp(adev, "_PSV", ret_temp); int temp_decik;
int ret = acpi_passive_trip_temp(adev, &temp_decik);
return thermal_temp(ret, temp_decik, ret_temp);
} }
EXPORT_SYMBOL_GPL(thermal_acpi_passive_trip_temp); EXPORT_SYMBOL_GPL(thermal_acpi_passive_trip_temp);
...@@ -95,7 +134,10 @@ EXPORT_SYMBOL_GPL(thermal_acpi_passive_trip_temp); ...@@ -95,7 +134,10 @@ EXPORT_SYMBOL_GPL(thermal_acpi_passive_trip_temp);
*/ */
int thermal_acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp) int thermal_acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp)
{ {
return thermal_acpi_trip_temp(adev, "_HOT", ret_temp); int temp_decik;
int ret = acpi_hot_trip_temp(adev, &temp_decik);
return thermal_temp(ret, temp_decik, ret_temp);
} }
EXPORT_SYMBOL_GPL(thermal_acpi_hot_trip_temp); EXPORT_SYMBOL_GPL(thermal_acpi_hot_trip_temp);
...@@ -111,6 +153,9 @@ EXPORT_SYMBOL_GPL(thermal_acpi_hot_trip_temp); ...@@ -111,6 +153,9 @@ EXPORT_SYMBOL_GPL(thermal_acpi_hot_trip_temp);
*/ */
int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp) int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp)
{ {
return thermal_acpi_trip_temp(adev, "_CRT", ret_temp); int temp_decik;
int ret = acpi_critical_trip_temp(adev, &temp_decik);
return thermal_temp(ret, temp_decik, ret_temp);
} }
EXPORT_SYMBOL_GPL(thermal_acpi_critical_trip_temp); EXPORT_SYMBOL_GPL(thermal_acpi_critical_trip_temp);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment