[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAJZ5v0h5ZvB2yQz3m5Z149jCMvNhzwt_a76tm5bVK8VzC5YY9A@mail.gmail.com>
Date: Tue, 10 May 2022 18:40:34 +0200
From: "Rafael J. Wysocki" <rafael@...nel.org>
To: Srinivas Pandruvada <srinivas.pandruvada@...ux.intel.com>
Cc: "Rafael J. Wysocki" <rafael@...nel.org>,
Daniel Lezcano <daniel.lezcano@...aro.org>,
Amit Kucheria <amitk@...nel.org>,
"Zhang, Rui" <rui.zhang@...el.com>,
Linux PM <linux-pm@...r.kernel.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
Stable <stable@...r.kernel.org>
Subject: Re: [PATCH] thermal: int340x: Mode setting with new OS handshake
On Fri, May 6, 2022 at 2:21 PM Srinivas Pandruvada
<srinivas.pandruvada@...ux.intel.com> wrote:
>
> With the new OS handshake introduced with the commit: "c7ff29763989
> ("thermal: int340x: Update OS policy capability handshake")",
> thermal zone mode "enabled" doesn't work in the same way as the legacy
> handshake. The mode "enabled" fails with -EINVAL using new handshake.
>
> To address this issue, when the new OS UUID mask is set:
> - When mode is "enabled", return 0 as the firmware already has the
> latest policy mask.
> - When mode is "disabled", update the firmware with UUID mask of zero.
> In this way firmware can take control of the thermal control. Also
> reset the OS UUID mask. This allows user space to update with new
> set of policies.
>
> Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@...ux.intel.com>
> Cc: stable@...r.kernel.org
It would be good to have a Fixes tag for this one.
> ---
> .../intel/int340x_thermal/int3400_thermal.c | 48 ++++++++++++-------
> 1 file changed, 32 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/thermal/intel/int340x_thermal/int3400_thermal.c b/drivers/thermal/intel/int340x_thermal/int3400_thermal.c
> index d97f496bab9b..1061728ad5a9 100644
> --- a/drivers/thermal/intel/int340x_thermal/int3400_thermal.c
> +++ b/drivers/thermal/intel/int340x_thermal/int3400_thermal.c
> @@ -194,12 +194,31 @@ static int int3400_thermal_run_osc(acpi_handle handle, char *uuid_str, int *enab
> return result;
> }
>
> +static int set_os_uuid_mask(struct int3400_thermal_priv *priv, u32 mask)
> +{
> + int cap = 0;
> +
> + /*
> + * Capability bits:
> + * Bit 0: set to 1 to indicate DPTF is active
> + * Bi1 1: set to 1 to active cooling is supported by user space daemon
> + * Bit 2: set to 1 to passive cooling is supported by user space daemon
> + * Bit 3: set to 1 to critical trip is handled by user space daemon
> + */
> + if (mask)
> + cap = ((priv->os_uuid_mask << 1) | 0x01);
> +
> + return int3400_thermal_run_osc(priv->adev->handle,
> + "b23ba85d-c8b7-3542-88de-8de2ffcfd698",
> + &cap);
> +}
> +
> static ssize_t current_uuid_store(struct device *dev,
> struct device_attribute *attr,
> const char *buf, size_t count)
> {
> struct int3400_thermal_priv *priv = dev_get_drvdata(dev);
> - int i;
> + int ret, i;
>
> for (i = 0; i < INT3400_THERMAL_MAXIMUM_UUID; ++i) {
> if (!strncmp(buf, int3400_thermal_uuids[i],
> @@ -231,19 +250,7 @@ static ssize_t current_uuid_store(struct device *dev,
> }
>
> if (priv->os_uuid_mask) {
> - int cap, ret;
> -
> - /*
> - * Capability bits:
> - * Bit 0: set to 1 to indicate DPTF is active
> - * Bi1 1: set to 1 to active cooling is supported by user space daemon
> - * Bit 2: set to 1 to passive cooling is supported by user space daemon
> - * Bit 3: set to 1 to critical trip is handled by user space daemon
> - */
> - cap = ((priv->os_uuid_mask << 1) | 0x01);
> - ret = int3400_thermal_run_osc(priv->adev->handle,
> - "b23ba85d-c8b7-3542-88de-8de2ffcfd698",
> - &cap);
> + ret = set_os_uuid_mask(priv, priv->os_uuid_mask);
> if (ret)
> return ret;
> }
> @@ -469,17 +476,26 @@ static int int3400_thermal_change_mode(struct thermal_zone_device *thermal,
> if (mode != thermal->mode) {
> int enabled;
>
> + enabled = (mode == THERMAL_DEVICE_ENABLED);
> +
> + if (priv->os_uuid_mask) {
> + if (!enabled) {
> + priv->os_uuid_mask = 0;
> + result = set_os_uuid_mask(priv, priv->os_uuid_mask);
> + }
> + goto eval_odvp;
> + }
> +
> if (priv->current_uuid_index < 0 ||
> priv->current_uuid_index >= INT3400_THERMAL_MAXIMUM_UUID)
> return -EINVAL;
>
> - enabled = (mode == THERMAL_DEVICE_ENABLED);
> result = int3400_thermal_run_osc(priv->adev->handle,
> int3400_thermal_uuids[priv->current_uuid_index],
> &enabled);
> }
>
> -
> +eval_odvp:
> evaluate_odvp(priv);
>
> return result;
> --
> 2.31.1
>
Powered by blists - more mailing lists