From patchwork Mon Jan 2 18:01:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 38174 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp4262104wrt; Mon, 2 Jan 2023 10:05:10 -0800 (PST) X-Google-Smtp-Source: AMrXdXueTj7lfmHX1wRNA7Uwq8t9aK5ccFesANB+frwqwZ5+J4CwujKb3F+QJkBr+eFvU5rzgDEp X-Received: by 2002:a17:90a:a0b:b0:223:7514:15cb with SMTP id o11-20020a17090a0a0b00b00223751415cbmr10404948pjo.3.1672682709785; Mon, 02 Jan 2023 10:05:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672682709; cv=none; d=google.com; s=arc-20160816; b=0+YPRrNxKWDNCJBIwsyrtdWvj1YFswjctBlFJWIxOf7yT+XpLukzQjO5ePDW4CBCAF Cf8iKfzp2s6cgkTebWOjwHLlYTQlJXCSgakq7F62Tsk8PT/Vdc6/E5ykPjUGdNsvji2U v+B7TlaHA3J261HhMMBwvJlurj5pZXKK3d1awivQocCa2DHN2g7XLZbtr5INyBmukq7z vRoFeqlKPl0gR1DMjAnGGnGwWDd04XOM1m375UJY0ebb4URUEDxHhPzJLbijomsdNENB PQdwEfQOgaHKKw5763VSscP+YWVQ2VqJsIUW3PvKCDQGU+urxMJ4EZ760cHSSbOiIxqm Zdbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=wcDgEmHqM7zr2mEB43fsbAcVvNC2pS3Sh8IUVblzWGA=; b=zbqHFK8RvPA5PgEqAuQav1gypi7I9S+xU9MbDVATU+HONQo1xelKL24omMtrlEhQlI 5o4y9D7/kVR5v3IQ2+5Jvz+3UHogP0291L9nVKrfXDVg2s0lcnmAN5PXjCWQQuQLfQ/J Ef14eJDbghcu7l9AZ1MKeC+nShHJhEJ7WnILMqBFwXPxV1PVOiQ+KJdmaf/X+F99CctF uOQ0w6pUnELUD26iCBoFD7tmeZhUJX90ukn9LAGtELtDY9UZj/9XcTS31guNYLFptvYa d8d1oZqXVq7nfErjUOlHT5JydoX2PGeZxmfj/hKCH47vMt5EqFkI3Mye9JWfFGzpv7qG 7TUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=UqwIz8lh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l8-20020a17090a850800b002265072bb71si8056575pjn.100.2023.01.02.10.04.58; Mon, 02 Jan 2023 10:05:09 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=UqwIz8lh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229447AbjABSBm (ORCPT + 99 others); Mon, 2 Jan 2023 13:01:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44188 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233426AbjABSB1 (ORCPT ); Mon, 2 Jan 2023 13:01:27 -0500 Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6CCB3DD4 for ; Mon, 2 Jan 2023 10:01:25 -0800 (PST) Received: by mail-wr1-x429.google.com with SMTP id bk16so13786721wrb.11 for ; Mon, 02 Jan 2023 10:01:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wcDgEmHqM7zr2mEB43fsbAcVvNC2pS3Sh8IUVblzWGA=; b=UqwIz8lhDmpsYb1/vTcWZSNosu064Qevofdof8dft7EZFSqBHBb56uo6dXOtscUi4n eVhIEbcSfn9vEgSCLGqdOe4Lqi7sTEasQIMAv67m4rHwM8RFIT4xILT2Wrq27hizbAEj 1K01IKAQj0gwS9BUDUlAwTvoPLZm4POIE66Tfi/EH/3q6jBrSd2Qf+sRHj9xv1mmRdj3 jUs1cUwzpu+cVM9+O/KERQiQlN/1ht22//mO4LsfeYYm3A/9FSv3/i3iM0xm3MgzRzX/ VVZthMVlsnU7BeUKx2zDlMFjspv1dBJjcr3i5RRrNLQZvAkEgsVq7kkgjfuwlsuddW+m veFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wcDgEmHqM7zr2mEB43fsbAcVvNC2pS3Sh8IUVblzWGA=; b=T3/hA53Mxwi3H70jM66iVopwiYyWlHdnLfMsSCS8J4E5pjIXJJYTtl4LDlEJ4yqd5g VhizGdyyEft20Oc3LUg452MDFc73rWotv92o7Zla45nRDEDfP3fXJrDv5SYb8941b20f nF1jbb4WeZbrofYYyycDJi4iBnwUJtRVV7yhrW1yKl0IcR/NUc1Jt24h4OqWuvS6bVk1 0pHSpaZ4GCcBhD3btNAUbgCBoWoRaNrLgEjG9VfTgPu2sLyYciD0JohdEuBrxtHQvJuv TGEGZz0h4gtLgcbcMtYjdOC6NQx9NBVK00jzeIU916oV2OKFF+ycrah34aaPOKZt3/gD 9g8g== X-Gm-Message-State: AFqh2kogiwVkFkZo5aCBRBZZYqA53npeLmhqUTjuBP0z26HSyZlql6pL ufyE7T6JCt0leu6ndwEZJxrGpQ== X-Received: by 2002:a5d:4601:0:b0:242:63a3:2f20 with SMTP id t1-20020a5d4601000000b0024263a32f20mr32824722wrq.11.1672682483739; Mon, 02 Jan 2023 10:01:23 -0800 (PST) Received: from mai.. (146725694.box.freepro.com. [130.180.211.218]) by smtp.gmail.com with ESMTPSA id c17-20020adffb51000000b0027cb20605e3sm21375588wrs.105.2023.01.02.10.01.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jan 2023 10:01:23 -0800 (PST) From: Daniel Lezcano X-Google-Original-From: Daniel Lezcano To: daniel.lezcano@linaro.org, rafael@kernel.org, srinivas.pandruvada@linux.intel.com Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, rui.zhang@intel.com, Amit Kucheria Subject: [PATCH v2 1/3] thermal/acpi: Add ACPI trip point routines Date: Mon, 2 Jan 2023 19:01:10 +0100 Message-Id: <20230102180112.1954082-2-daniel.lezcano@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230102180112.1954082-1-daniel.lezcano@kernel.org> References: <20230102180112.1954082-1-daniel.lezcano@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1753934945230474513?= X-GMAIL-MSGID: =?utf-8?q?1753934945230474513?= From: Daniel Lezcano The ACPI specification describes the trip points, the device tree bindings as well. The OF code uses the generic trip point structures. The ACPI has their own trip points structure and uses the get_trip_* ops to retrieve them. We can do the same as the OF code and create a set of ACPI functions to retrieve a trip point description. Having a common code for ACPI will help to cleanup the remaining Intel drivers and get rid of the get_trip_* functions. These changes add the ACPI thermal calls to retrieve the basic information we need to be reused in the thermal ACPI and Intel drivers. The different ACPI functions have the generic trip point structure passed as parameter where it is filled. This structure aims to be the one used by all the thermal drivers and the thermal framework. After this series, a couple of Intel drivers and the ACPI thermal driver will still have their own trip points definition but a new series on top of this one will finish the conversion to the generic trip point handling. This series depends on the generic trip point added to the thermal framework and available in the thermal/linux-next branch. https://lkml.org/lkml/2022/10/3/456 It has been tested on a Intel i7-8650U - x280 with the INT3400, the PCH, ACPITZ, and x86_pkg_temp. No regression observed so far. Signed-off-by: Daniel Lezcano --- drivers/thermal/Kconfig | 13 ++ drivers/thermal/Makefile | 1 + drivers/thermal/thermal_acpi.c | 279 +++++++++++++++++++++++++++++++++ include/linux/thermal.h | 16 ++ 4 files changed, 309 insertions(+) create mode 100644 drivers/thermal/thermal_acpi.c diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig index e052dae614eb..2c19bccd1223 100644 --- a/drivers/thermal/Kconfig +++ b/drivers/thermal/Kconfig @@ -76,6 +76,19 @@ config THERMAL_OF Say 'Y' here if you need to build thermal infrastructure based on device tree. +config THERMAL_ACPI + bool + prompt "APIs to parse thermal data out of the ACPI tables" + depends on ACPI_THERMAL + default y + help + This options provides helpers to add the support to + read and parse thermal data definitions out of the + ACPI tables blob. + + Say 'Y' here if you need to build thermal infrastructure + based on ACPI. + config THERMAL_WRITABLE_TRIPS bool "Enable writable trip points" help diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile index 2506c6c8ca83..60f0dfa9aae2 100644 --- a/drivers/thermal/Makefile +++ b/drivers/thermal/Makefile @@ -13,6 +13,7 @@ thermal_sys-$(CONFIG_THERMAL_NETLINK) += thermal_netlink.o # interface to/from other layers providing sensors thermal_sys-$(CONFIG_THERMAL_HWMON) += thermal_hwmon.o thermal_sys-$(CONFIG_THERMAL_OF) += thermal_of.o +thermal_sys-$(CONFIG_THERMAL_ACPI) += thermal_acpi.o # governors thermal_sys-$(CONFIG_THERMAL_GOV_FAIR_SHARE) += gov_fair_share.o diff --git a/drivers/thermal/thermal_acpi.c b/drivers/thermal/thermal_acpi.c new file mode 100644 index 000000000000..28c629b4d814 --- /dev/null +++ b/drivers/thermal/thermal_acpi.c @@ -0,0 +1,279 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright 2022 Linaro Limited + * + * Author: Daniel Lezcano + * + * ACPI thermal configuration + */ +#include +#include +#include +#include +#include + +#include "thermal_core.h" + +int thermal_acpi_trip_gtsh(struct acpi_device *adev) +{ + unsigned long long hyst; + acpi_status status; + + status = acpi_evaluate_integer(adev->handle, "GTSH", NULL, &hyst); + if (ACPI_FAILURE(status)) + return 0; + + return (int)(hyst * 100); +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_gtsh); + +int thermal_acpi_get_tzd(struct acpi_device *adev, struct acpi_handle_list *devices) +{ + acpi_status status; + + /* + * _TZD (Thermal zone device): This optional object evaluates + * to a package of device names. Each name corresponds to a + * device in the ACPI namespace that is associated with the + * thermal zone. The temperature reported by the thermal zone + * is roughly correspondent to that of each of the devices. + */ + status = acpi_evaluate_reference(adev->handle, "_TZD", NULL, devices); + if (ACPI_FAILURE(status)) + return -EIO; + + return 0; +} +EXPORT_SYMBOL_GPL(thermal_acpi_get_tzd); + +int thermal_acpi_get_temp(struct acpi_device *adev, int *temperature) +{ + unsigned long long temp; + acpi_status status; + + /* + * _TMP (Temperature): This control method returns the thermal zone’s + * current operating temperature. The return value is the current + * temperature of the thermal zone in tenths of degrees Kelvin + */ + status = acpi_evaluate_integer(adev->handle, "_TMP", NULL, &temp); + if (ACPI_FAILURE(status)) + return -EIO; + + *temperature = deci_kelvin_to_millicelsius(temp); + + return 0; +} +EXPORT_SYMBOL_GPL(thermal_acpi_get_temp); + +int thermal_acpi_trip_crit(struct acpi_device *adev, struct thermal_trip *trip) +{ + unsigned long long temp; + acpi_status status; + + /* + * _CRT (Critical temperature): This object, when defined under a thermal + * zone, returns the critical temperature at which OSPM must shutdown + * the system. If this object it present under a device, the device’s + * driver evaluates this object to determine the device’s critical cooling + * temperature trip point. This value may then be used by the device’s + * driver to program an internal device temperature sensor trip point + */ + status = acpi_evaluate_integer(adev->handle, "_CRT", NULL, &temp); + if (ACPI_FAILURE(status)) + return -EIO; + + trip->hysteresis = thermal_acpi_trip_gtsh(adev); + trip->temperature = deci_kelvin_to_millicelsius(temp); + trip->type = THERMAL_TRIP_CRITICAL; + + return 0; +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_crit); + +int thermal_acpi_trip_hot(struct acpi_device *adev, struct thermal_trip *trip) +{ + unsigned long long temp; + acpi_status status; + + /* + * _HOT (Hot Temperature): This optional object, when defined under a + * thermal zone, returns the critical temperature at which OSPM may + * choose to transition the system into the S4 sleeping state. The + * platform vendor should define _HOT to be far enough below _CRT so as + * to allow OSPM enough time to transition the system into the S4 + * sleeping state. While dependent on the amount of installed memory, + * on typical platforms OSPM implementations can transition the system + * into the S4 sleeping state in tens of seconds. If this object it + * present under a device, the device’s driver evaluates this object to + * determine the device’s hot cooling temperature trip point. This value + * may then be used by the device’s driver to program an internal device + * temperature sensor trip point. + */ + status = acpi_evaluate_integer(adev->handle, "_HOT", NULL, &temp); + if (ACPI_FAILURE(status)) + return -EIO; + + trip->hysteresis = thermal_acpi_trip_gtsh(adev); + trip->temperature = deci_kelvin_to_millicelsius(temp); + trip->type = THERMAL_TRIP_HOT; + + return 0; +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_hot); + +int thermal_acpi_trip_psv_psl(struct acpi_device *adev, struct acpi_handle_list *devices) +{ + acpi_status status; + + /* + * _PSL (Passive List): This object is defined under a thermal zone and + * evaluates to a list of processor objects to be used for passive cooling + */ + status = acpi_evaluate_reference(adev->handle, "_PSL", NULL, devices); + if (ACPI_FAILURE(status)) + return -EIO; + + return 0; +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_psv_psl); + +int thermal_acpi_trip_psv_tsp(struct acpi_device *adev) +{ + acpi_status status; + unsigned long long tsp; + + /* + * _TSP (Thermal Sampling Period): This object evaluates to a thermal + * sampling period (in tenths of seconds) used by OSPM to implement the + * Passive cooling equation. This value, along with _TC1 and _TC2, will + * enable OSPM to provide the proper hysteresis required by the system + * to accomplish an effective passive cooling policy. + */ + status = acpi_evaluate_integer(adev->handle, "_TSP", NULL, &tsp); + if (ACPI_FAILURE(status)) + return -EIO; + + return (int)tsp; +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_psv_tsp); + +int thermal_acpi_trip_psv_tc1(struct acpi_device *adev) +{ + acpi_status status; + unsigned long long tc1; + + /* + * _TC1 (Thermal Constant 1): This object evaluates to the constant _TC1 + * for use in the Passive cooling formula + */ + status = acpi_evaluate_integer(adev->handle, "_TC1", NULL, &tc1); + if (ACPI_FAILURE(status)) + return -EINVAL; + + return (int)tc1; +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_psv_tc1); + +int thermal_acpi_trip_psv_tc2(struct acpi_device *adev) +{ + acpi_status status; + unsigned long long tc2; + + /* + * _TC2 (Thermal Constant 1): This object evaluates to the constant _TC2 + * for use in the Passive cooling formula + */ + status = acpi_evaluate_integer(adev->handle, "_TC2", NULL, &tc2); + if (ACPI_FAILURE(status)) + return -EINVAL; + + return (int)tc2; +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_psv_tc2); + +int thermal_acpi_trip_psv(struct acpi_device *adev, struct thermal_trip *trip) +{ + unsigned long long temp; + acpi_status status; + + /* + * _PSV (Passive): This optional object, if present under a thermal zone, + * evaluates to the temperature at which OSPM must activate passive + * cooling policy + */ + status = acpi_evaluate_integer(adev->handle, "_PSV", NULL, &temp); + if (ACPI_FAILURE(status)) + return -EINVAL; + + /* + * The _PSL, _TSP, _TC1 and _TC2 are required if the _PSV object exists. + * We assume the caller will raise an error if it was able to get the _PSV + * but then fail to get the other objects. + */ + trip->hysteresis = thermal_acpi_trip_gtsh(adev); + trip->temperature = deci_kelvin_to_millicelsius(temp); + trip->type = THERMAL_TRIP_PASSIVE; + + return 0; +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_psv); + +int thermal_acpi_trip_acl(struct acpi_device *adev, + struct acpi_handle_list *devices, int id) +{ + acpi_status status; + char name[5]; + + /* + * _ALx: This object is defined under a thermal zone and evaluates to a + * list of Active cooling devices to be turned on when the corresponding + * _ACx temperature threshold is exceeded. For example, these devices + * could be fans. + */ + sprintf(name, "_AL%d", id); + + status = acpi_evaluate_reference(adev->handle, name, NULL, devices); + if (ACPI_FAILURE(status)) + return -EINVAL; + + return 0; +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_acl); + +int thermal_acpi_trip_act(struct acpi_device *adev, + struct thermal_trip *trip, int id) +{ + acpi_status status; + unsigned long long temp; + char name[5]; + + /* + * _ACx: This optional object, if present under a thermal zone, returns + * the temperature trip point at which OSPM must start or stop active + * cooling, where x is a value between 0 and 9 that designates multiple + * active cooling levels of the thermal zone. If the Active cooling + * device has one cooling level (that is, “on”) then that cooling level + * must be defined as _AC0. If the cooling device has two levels of + * capability, such as a high fan speed and a low fan speed, then they + * must be defined as _AC0 and _AC1 respectively. The smaller the value + * of x, the greater the cooling strength _ACx represents. In the above + * example, _AC0 represents the greater level of cooling (the faster fan + * speed) and _AC1 represents the lesser level of cooling (the slower + * fan speed). For every _ACx method, there must be a matching _ALx + * object or a corresponding entry in an _ART object’s active cooling + * relationship list. + */ + sprintf(name, "_AC%d", id); + + status = acpi_evaluate_integer(adev->handle, name, NULL, &temp); + if (ACPI_FAILURE(status)) + return -EINVAL; + + trip->hysteresis = thermal_acpi_trip_gtsh(adev); + trip->temperature = deci_kelvin_to_millicelsius(temp); + trip->type = THERMAL_TRIP_ACTIVE; + + return 0; +} +EXPORT_SYMBOL_GPL(thermal_acpi_trip_act); diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 30353e4b1424..65c1f1aafe02 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -334,6 +334,22 @@ static inline void devm_thermal_of_zone_unregister(struct device *dev, } #endif +#ifdef CONFIG_THERMAL_ACPI +struct acpi_handle_list; +int thermal_acpi_get_temp(struct acpi_device *adev, int *temperature); +int thermal_acpi_trip_crit(struct acpi_device *adev, struct thermal_trip *trip); +int thermal_acpi_trip_hot(struct acpi_device *adev, struct thermal_trip *trip); +int thermal_acpi_trip_psv(struct acpi_device *adev, struct thermal_trip *trip); +int thermal_acpi_trip_act(struct acpi_device *adev, struct thermal_trip *trip, int id); +int thermal_acpi_trip_acl(struct acpi_device *adev, struct acpi_handle_list *devices, int id); +int thermal_acpi_trip_psv_psl(struct acpi_device *adev, struct acpi_handle_list *devices); +int thermal_acpi_trip_psv_tsp(struct acpi_device *adev); +int thermal_acpi_trip_psv_tc1(struct acpi_device *adev); +int thermal_acpi_trip_psv_tc2(struct acpi_device *adev); +int thermal_acpi_trip_gtsh(struct acpi_device *adev); +int thermal_acpi_get_tzd(struct acpi_device *adev, struct acpi_handle_list *devices); +#endif + int __thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id, struct thermal_trip *trip); int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id, From patchwork Mon Jan 2 18:01:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 38173 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp4261990wrt; Mon, 2 Jan 2023 10:04:56 -0800 (PST) X-Google-Smtp-Source: AMrXdXtXRrXyTpXUPE/TynDgU9n2roajAYvOiBTsyGL+5ZKSDSDWmHasPcgjxC/DgWoqUF6DjRb8 X-Received: by 2002:a05:6a00:26eb:b0:580:f61c:9340 with SMTP id p43-20020a056a0026eb00b00580f61c9340mr6690755pfw.3.1672682696578; Mon, 02 Jan 2023 10:04:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672682696; cv=none; d=google.com; s=arc-20160816; b=d9RQlbNIOtKUkiJb8iGtrrvGF+WQ18sHZbXf8rWm+IwBWgC31P20UP24izQYRtm/s2 r2Pgul1BkoLmNuyQa+/B3s58euOxWmKj5mAJG8CF3Xa//d5geDUTFG6ndRwC/5FguUkw jaoodjmE5/qZsSUr9xgzb2BODgMioDxXU9CCNB68KHnsm0ZAMH9p4RNL7rK3Xr4oN8r+ sFFE+RcGOUZglDCOashgo+it3+nZ16rjwHOTe3JtNYSVWqbJsyiaDbEAaEMZizNdmxZ1 vk8vRrWhFLQGxJ6f3fTNd1r3irKjpe2CTM75LVNTkngCNrEThs0hfE8MXMw0pZoQ8vPz Et2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=3POAW24Ia6Q6A+aQpi4Ruj0SmwaygTczZXF7y8o1qdY=; b=TOxFrPYojEm3wjxHUmakFC0qnySXIOKkE5MbtGGAgT7yhmc/xWW8GCFZOs+TebeQIG H7TKlYtX6V1L6cagIP+x38atpYpTI7hKBpgrVgA19ShUQFk+4+Uy48RBKcw0TRaVynmb xDq/2W+g9LPkWDrjVhq/69DjdKWkTbdymKW39RnMOw7ykRMd27FRTXfMqxLvDC/osDOQ GA5RwswTEwPk4IUfA5zIoCerjWchK3Y61qsUOZqgiGp+iUM/iftVnff4LUith3Or2Zcy nXBMUDReOr5LJ7rRqKNrT88fj24V3Nnf/OYHinn/YD4JjBE/iHBt7ZZzG35huZD0jvE/ TI2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=HTYIjR51; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b4-20020a056a00114400b00572f3be59f6si31279165pfm.136.2023.01.02.10.04.45; Mon, 02 Jan 2023 10:04:56 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=HTYIjR51; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236250AbjABSBt (ORCPT + 99 others); Mon, 2 Jan 2023 13:01:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44206 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233748AbjABSB2 (ORCPT ); Mon, 2 Jan 2023 13:01:28 -0500 Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2FA423896 for ; Mon, 2 Jan 2023 10:01:27 -0800 (PST) Received: by mail-wr1-x42e.google.com with SMTP id bn26so7549717wrb.0 for ; Mon, 02 Jan 2023 10:01:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3POAW24Ia6Q6A+aQpi4Ruj0SmwaygTczZXF7y8o1qdY=; b=HTYIjR510LBjsWbfxE9VaopKOa5/Xr077RkfF8WnFgFGDU8JLmuRws9sjNaQ4PWy4g +NqPU3DAkmPBR9NLjN9clgGhgu5WTMu+iq/sMhKryWNqKNwJU9oS7CBYLN8yXgJex2Nv RXaN3kkfM3kRNIeDQ0ULuLPIM1870Q+EbFVAI8at7YtU0TD0W2yLYU9PXNZjZHV7VxiC fM7Phn92mVdsMaL6Y33b7OawzHZyjBcdJvk2Q0I+m8m6GaZ71LzBLVhvX2pztvLSmbiv pwUlgZB9YBSj0OsbdsaCqzuSuNkM0EV/3WHTBUGk35koMjUceQvkDyZ2ze5NVr1e+CfP SFSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3POAW24Ia6Q6A+aQpi4Ruj0SmwaygTczZXF7y8o1qdY=; b=LYoN7i6IpG9+kgj9kRUKsVDLKJ+O/+0tmOeOKw8/lrPtH7pUPTjpLNDCOs4FOxCj/H TFPEmMgDXrl71h3Knh96yOda/4kf8TBAy69DYm1Y+QOHzRx54ZZ9+jNkvSzWokkuOm1c pCs40Qcsv6lMySME+X1kZGZvkEPzI1ctd7S/KVQUsD8j/LzGWoi2ugQZ0Zc0IVmQEITc roAbGhbCZO+xDH9zw64GQQUXdd7VjoP14gvvJL4SfFAmT+Qr6EV/0TOJm/AqN43NsrWU zHNi/Xzb85L28OTkkdGsl5dv1yeX1mhz9Vzu9ywPoAZAPFrr3EwAZ6j5+ADLvP1glfjp 04ZQ== X-Gm-Message-State: AFqh2koC2RvF1qYJqzAOkwam+LDPwvg9GFnXBaSMqyVz63Xdw89Q/U1S yYqZucf1r7GE0Mw77v5mCoErvw== X-Received: by 2002:adf:f00c:0:b0:242:63e5:fdaa with SMTP id j12-20020adff00c000000b0024263e5fdaamr23363745wro.62.1672682485581; Mon, 02 Jan 2023 10:01:25 -0800 (PST) Received: from mai.. (146725694.box.freepro.com. [130.180.211.218]) by smtp.gmail.com with ESMTPSA id c17-20020adffb51000000b0027cb20605e3sm21375588wrs.105.2023.01.02.10.01.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jan 2023 10:01:25 -0800 (PST) From: Daniel Lezcano X-Google-Original-From: Daniel Lezcano To: daniel.lezcano@linaro.org, rafael@kernel.org, srinivas.pandruvada@linux.intel.com Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, rui.zhang@intel.com, Amit Kucheria Subject: [PATCH v2 2/3] thermal/drivers/intel: Use generic trip points for intel_pch Date: Mon, 2 Jan 2023 19:01:11 +0100 Message-Id: <20230102180112.1954082-3-daniel.lezcano@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230102180112.1954082-1-daniel.lezcano@kernel.org> References: <20230102180112.1954082-1-daniel.lezcano@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1753934931033146186?= X-GMAIL-MSGID: =?utf-8?q?1753934931033146186?= From: Daniel Lezcano The thermal framework gives the possibility to register the trip points with the thermal zone. When that is done, no get_trip_* ops are needed and they can be removed. Convert the ops content logic into generic trip points and register them with the thermal zone. In order to consolidate the code, use the ACPI thermal framework API to fill the generic trip point from the ACPI tables. It has been tested on a Intel i7-8650U - x280 with the INT3400, the PCH, ACPITZ, and x86_pkg_temp. No regression observed so far. Signed-off-by: Daniel Lezcano --- drivers/thermal/intel/intel_pch_thermal.c | 88 +++++------------------ 1 file changed, 19 insertions(+), 69 deletions(-) diff --git a/drivers/thermal/intel/intel_pch_thermal.c b/drivers/thermal/intel/intel_pch_thermal.c index dabf11a687a1..530fe9b38381 100644 --- a/drivers/thermal/intel/intel_pch_thermal.c +++ b/drivers/thermal/intel/intel_pch_thermal.c @@ -65,6 +65,8 @@ #define WPT_TEMP_OFFSET (PCH_TEMP_OFFSET * MILLIDEGREE_PER_DEGREE) #define GET_PCH_TEMP(x) (((x) / 2) + PCH_TEMP_OFFSET) +#define PCH_MAX_TRIPS 3 /* critical, hot, passive */ + /* Amount of time for each cooling delay, 100ms by default for now */ static unsigned int delay_timeout = 100; module_param(delay_timeout, int, 0644); @@ -82,12 +84,7 @@ struct pch_thermal_device { const struct pch_dev_ops *ops; struct pci_dev *pdev; struct thermal_zone_device *tzd; - int crt_trip_id; - unsigned long crt_temp; - int hot_trip_id; - unsigned long hot_temp; - int psv_trip_id; - unsigned long psv_temp; + struct thermal_trip trips[PCH_MAX_TRIPS]; bool bios_enabled; }; @@ -102,33 +99,22 @@ static void pch_wpt_add_acpi_psv_trip(struct pch_thermal_device *ptd, int *nr_trips) { struct acpi_device *adev; - - ptd->psv_trip_id = -1; + int ret; adev = ACPI_COMPANION(&ptd->pdev->dev); - if (adev) { - unsigned long long r; - acpi_status status; - - status = acpi_evaluate_integer(adev->handle, "_PSV", NULL, - &r); - if (ACPI_SUCCESS(status)) { - unsigned long trip_temp; - - trip_temp = deci_kelvin_to_millicelsius(r); - if (trip_temp) { - ptd->psv_temp = trip_temp; - ptd->psv_trip_id = *nr_trips; - ++(*nr_trips); - } - } - } + if (!adev) + return; + + ret = thermal_acpi_trip_psv(adev, &ptd->trips[*nr_trips]); + if (ret) + return; + + ++(*nr_trips); } #else static void pch_wpt_add_acpi_psv_trip(struct pch_thermal_device *ptd, int *nr_trips) { - ptd->psv_trip_id = -1; } #endif @@ -163,21 +149,19 @@ static int pch_wpt_init(struct pch_thermal_device *ptd, int *nr_trips) } read_trips: - ptd->crt_trip_id = -1; trip_temp = readw(ptd->hw_base + WPT_CTT); trip_temp &= 0x1FF; if (trip_temp) { - ptd->crt_temp = GET_WPT_TEMP(trip_temp); - ptd->crt_trip_id = 0; + ptd->trips[*nr_trips].temperature = GET_WPT_TEMP(trip_temp); + ptd->trips[*nr_trips].type = THERMAL_TRIP_CRITICAL; ++(*nr_trips); } - ptd->hot_trip_id = -1; trip_temp = readw(ptd->hw_base + WPT_PHL); trip_temp &= 0x1FF; if (trip_temp) { - ptd->hot_temp = GET_WPT_TEMP(trip_temp); - ptd->hot_trip_id = *nr_trips; + ptd->trips[*nr_trips].temperature = GET_WPT_TEMP(trip_temp); + ptd->trips[*nr_trips].type = THERMAL_TRIP_HOT; ++(*nr_trips); } @@ -298,39 +282,6 @@ static int pch_thermal_get_temp(struct thermal_zone_device *tzd, int *temp) return ptd->ops->get_temp(ptd, temp); } -static int pch_get_trip_type(struct thermal_zone_device *tzd, int trip, - enum thermal_trip_type *type) -{ - struct pch_thermal_device *ptd = tzd->devdata; - - if (ptd->crt_trip_id == trip) - *type = THERMAL_TRIP_CRITICAL; - else if (ptd->hot_trip_id == trip) - *type = THERMAL_TRIP_HOT; - else if (ptd->psv_trip_id == trip) - *type = THERMAL_TRIP_PASSIVE; - else - return -EINVAL; - - return 0; -} - -static int pch_get_trip_temp(struct thermal_zone_device *tzd, int trip, int *temp) -{ - struct pch_thermal_device *ptd = tzd->devdata; - - if (ptd->crt_trip_id == trip) - *temp = ptd->crt_temp; - else if (ptd->hot_trip_id == trip) - *temp = ptd->hot_temp; - else if (ptd->psv_trip_id == trip) - *temp = ptd->psv_temp; - else - return -EINVAL; - - return 0; -} - static void pch_critical(struct thermal_zone_device *tzd) { dev_dbg(&tzd->device, "%s: critical temperature reached\n", tzd->type); @@ -338,8 +289,6 @@ static void pch_critical(struct thermal_zone_device *tzd) static struct thermal_zone_device_ops tzd_ops = { .get_temp = pch_thermal_get_temp, - .get_trip_type = pch_get_trip_type, - .get_trip_temp = pch_get_trip_temp, .critical = pch_critical, }; @@ -423,8 +372,9 @@ static int intel_pch_thermal_probe(struct pci_dev *pdev, if (err) goto error_cleanup; - ptd->tzd = thermal_zone_device_register(bi->name, nr_trips, 0, ptd, - &tzd_ops, NULL, 0, 0); + ptd->tzd = thermal_zone_device_register_with_trips(bi->name, ptd->trips, + nr_trips, 0, ptd, + &tzd_ops, NULL, 0, 0); if (IS_ERR(ptd->tzd)) { dev_err(&pdev->dev, "Failed to register thermal zone %s\n", bi->name); From patchwork Mon Jan 2 18:01:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 38172 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp4261980wrt; Mon, 2 Jan 2023 10:04:54 -0800 (PST) X-Google-Smtp-Source: AMrXdXu8nnG/R13YkiVlleRaYJFtVgkfMymg+LtckivuixKyU7MwOTnIZprPfXgX2xHl4M62OqIR X-Received: by 2002:a17:903:1351:b0:192:5a90:b047 with SMTP id jl17-20020a170903135100b001925a90b047mr9756822plb.3.1672682694145; Mon, 02 Jan 2023 10:04:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672682694; cv=none; d=google.com; s=arc-20160816; b=bc3oNjh9hLC46waS1l4e+U23J3Zky4YqrFaC8tEnAeTMVm3/pNC1cCTcdttGnmcuLx oa+DNE7mAvusOtcoiQg7vzZs9JDR7IHg53rQvSr2PfuIF4+9pIkxvh+fTJC426HelmNE /nsW3Lvp78au+ExwqIZqpbmmgZ+lwz+O18YTp5Pny30hj0w/aaoCDuYXsiqXNs5aQSTy gNSNClDdFT9gPOhsQ27HIZTtbh6hslj1wf+ra7B7HN8WjIuesfzaUl4CM727Gm7K7g2y I5NL6k66GKpk6ex4lAhfiJymuRMb0iNcOrMylYl6prfMcGc/+ksIjsg0lrL8UYj16sbC 15hw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=HMLGEkEBbCyAG46RbAdRIZrpI31jaD7n2sQxNUO8dTY=; b=lYTjrGjVZP1PVX4/kVco2fchJA+vorB+4VzsEQ00p0JELlszpPlI0/7rVZ9lhncoIn cNJxHvVF/GbJY7ryEbhbvSIpUqNJ+nhtryOKvfgFPKeIydunGz4kA2Z5ws0EbIWrnJYS OxQZqCeToUoRtvVrwmc1GOIg574PkajvNUzwD/luRWAizoNmlPh2EfLKhehiArnDBZkd 4yztWC0KoOCK0mhVww48/GcgjtoFmB8ai3PYcb0iLUlI8H1sms9NoU2o4yidiI4IAmCQ HPj/dSeCPP1vKVqzqrul6051p7CkVIYp5zNcaNSaqSJH+NjfqZbDzaVwb9atKNWKmoUY 43yg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="cX/asn3N"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h29-20020a63385d000000b0043c5d3dc0d4si24679282pgn.332.2023.01.02.10.04.41; Mon, 02 Jan 2023 10:04:54 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="cX/asn3N"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236371AbjABSBz (ORCPT + 99 others); Mon, 2 Jan 2023 13:01:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44324 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235115AbjABSBk (ORCPT ); Mon, 2 Jan 2023 13:01:40 -0500 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9D16D5FEF for ; Mon, 2 Jan 2023 10:01:29 -0800 (PST) Received: by mail-wr1-x433.google.com with SMTP id bs20so24892269wrb.3 for ; Mon, 02 Jan 2023 10:01:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HMLGEkEBbCyAG46RbAdRIZrpI31jaD7n2sQxNUO8dTY=; b=cX/asn3NFckwhcGeaaJddKfmfLVzyv8ZWOtQok353aZ2w0O/Z1BDVJvSYo8z6eT81G 1IHGqKs9z67ljkC6GSKHM4Z3dD3EhExNKbv8l/s9ZsZUZoG6cUhcs8sDR+GWOaRrpp7g aH4IBL/svRrD38M+ov1m3uG7yJrsexIIjxXIrPqw7sB501ICk3KO9qDIJXCkc9Hyka4B CJWIOPUHhlxdjUnA3FVmTj9GJg4sFJnaEpBgKVrIlzHUU9bPF6l1TC90peuTWr4S/GOK 0T6bd62gDTUaE9G3KBBmxwRe4ql6RNnrEZXe5HB8YIP5axO5gZz1fCzZ864BJFNu7Oxj 1sRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HMLGEkEBbCyAG46RbAdRIZrpI31jaD7n2sQxNUO8dTY=; b=rdpv2Wo0dPmErzID5ioJfPhV2dMwiLV9Y/zgu4syHO8ipop7MRvj+bMtypqPM3AqpT sm/NS138NXkW7oJ8vYPXnRrQ78AnUvf/YOtrIUR3ouaPBn/RLo+fZ+8MsmkFc5Kk/i2Q XC/6JXXDqFh0SZvgiVS1iRK/dq6IH3W3M7z76x//rSF7qXniQ+mi+bp3XLhXz8q6/MwK 0ipePKEK/Sipb9dNa85pzn5EvRmXL61wuySf7+mwmDhdecnv3KGLFVextFA2306XuTFM MUtpPJgnGBOaujs9ozqsci3Fg/aCxHhAXzXUF4bugFXnAfAIKa8twFT3DYTpqdCDNpiS 3zYQ== X-Gm-Message-State: AFqh2koXAeb4RWdL3NMCKaN4G0loh8dfFJQB6WPExcQ9xkKY5K+m5Nit uamok0XRwVZMrxgLRXWddjSCxg== X-Received: by 2002:adf:fe87:0:b0:274:fae4:a512 with SMTP id l7-20020adffe87000000b00274fae4a512mr20980823wrr.71.1672682488069; Mon, 02 Jan 2023 10:01:28 -0800 (PST) Received: from mai.. (146725694.box.freepro.com. [130.180.211.218]) by smtp.gmail.com with ESMTPSA id c17-20020adffb51000000b0027cb20605e3sm21375588wrs.105.2023.01.02.10.01.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jan 2023 10:01:27 -0800 (PST) From: Daniel Lezcano X-Google-Original-From: Daniel Lezcano To: daniel.lezcano@linaro.org, rafael@kernel.org, srinivas.pandruvada@linux.intel.com Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, rui.zhang@intel.com, Amit Kucheria Subject: [PATCH v2 3/3] thermal/drivers/intel: Use generic trip points int340x Date: Mon, 2 Jan 2023 19:01:12 +0100 Message-Id: <20230102180112.1954082-4-daniel.lezcano@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230102180112.1954082-1-daniel.lezcano@kernel.org> References: <20230102180112.1954082-1-daniel.lezcano@kernel.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1753934928285318348?= X-GMAIL-MSGID: =?utf-8?q?1753934928285318348?= From: Daniel Lezcano The thermal framework gives the possibility to register the trip points with the thermal zone. When that is done, no get_trip_* ops are needed and they can be removed. Convert the ops content logic into generic trip points and register them with the thermal zone. In order to consolidate the code, use the ACPI thermal framework API to fill the generic trip point from the ACPI tables. It has been tested on a Intel i7-8650U - x280 with the INT3400, the PCH, ACPITZ, and x86_pkg_temp. No regression observed so far. Signed-off-by: Daniel Lezcano --- .../int340x_thermal/int340x_thermal_zone.c | 175 ++++-------------- .../int340x_thermal/int340x_thermal_zone.h | 10 +- 2 files changed, 40 insertions(+), 145 deletions(-) diff --git a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c index 228f44260b27..4f2e518caf8d 100644 --- a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c +++ b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c @@ -37,65 +37,6 @@ static int int340x_thermal_get_zone_temp(struct thermal_zone_device *zone, return 0; } -static int int340x_thermal_get_trip_temp(struct thermal_zone_device *zone, - int trip, int *temp) -{ - struct int34x_thermal_zone *d = zone->devdata; - int i; - - if (trip < d->aux_trip_nr) - *temp = d->aux_trips[trip]; - else if (trip == d->crt_trip_id) - *temp = d->crt_temp; - else if (trip == d->psv_trip_id) - *temp = d->psv_temp; - else if (trip == d->hot_trip_id) - *temp = d->hot_temp; - else { - for (i = 0; i < INT340X_THERMAL_MAX_ACT_TRIP_COUNT; i++) { - if (d->act_trips[i].valid && - d->act_trips[i].id == trip) { - *temp = d->act_trips[i].temp; - break; - } - } - if (i == INT340X_THERMAL_MAX_ACT_TRIP_COUNT) - return -EINVAL; - } - - return 0; -} - -static int int340x_thermal_get_trip_type(struct thermal_zone_device *zone, - int trip, - enum thermal_trip_type *type) -{ - struct int34x_thermal_zone *d = zone->devdata; - int i; - - if (trip < d->aux_trip_nr) - *type = THERMAL_TRIP_PASSIVE; - else if (trip == d->crt_trip_id) - *type = THERMAL_TRIP_CRITICAL; - else if (trip == d->hot_trip_id) - *type = THERMAL_TRIP_HOT; - else if (trip == d->psv_trip_id) - *type = THERMAL_TRIP_PASSIVE; - else { - for (i = 0; i < INT340X_THERMAL_MAX_ACT_TRIP_COUNT; i++) { - if (d->act_trips[i].valid && - d->act_trips[i].id == trip) { - *type = THERMAL_TRIP_ACTIVE; - break; - } - } - if (i == INT340X_THERMAL_MAX_ACT_TRIP_COUNT) - return -EINVAL; - } - - return 0; -} - static int int340x_thermal_set_trip_temp(struct thermal_zone_device *zone, int trip, int temp) { @@ -109,25 +50,6 @@ static int int340x_thermal_set_trip_temp(struct thermal_zone_device *zone, if (ACPI_FAILURE(status)) return -EIO; - d->aux_trips[trip] = temp; - - return 0; -} - - -static int int340x_thermal_get_trip_hyst(struct thermal_zone_device *zone, - int trip, int *temp) -{ - struct int34x_thermal_zone *d = zone->devdata; - acpi_status status; - unsigned long long hyst; - - status = acpi_evaluate_integer(d->adev->handle, "GTSH", NULL, &hyst); - if (ACPI_FAILURE(status)) - *temp = 0; - else - *temp = hyst * 100; - return 0; } @@ -138,58 +60,36 @@ static void int340x_thermal_critical(struct thermal_zone_device *zone) static struct thermal_zone_device_ops int340x_thermal_zone_ops = { .get_temp = int340x_thermal_get_zone_temp, - .get_trip_temp = int340x_thermal_get_trip_temp, - .get_trip_type = int340x_thermal_get_trip_type, .set_trip_temp = int340x_thermal_set_trip_temp, - .get_trip_hyst = int340x_thermal_get_trip_hyst, .critical = int340x_thermal_critical, }; -static int int340x_thermal_get_trip_config(acpi_handle handle, char *name, - int *temp) -{ - unsigned long long r; - acpi_status status; - - status = acpi_evaluate_integer(handle, name, NULL, &r); - if (ACPI_FAILURE(status)) - return -EIO; - - *temp = deci_kelvin_to_millicelsius(r); - - return 0; -} - int int340x_thermal_read_trips(struct int34x_thermal_zone *int34x_zone) { - int trip_cnt = int34x_zone->aux_trip_nr; - int i; + int trip_cnt; + int i, ret; - int34x_zone->crt_trip_id = -1; - if (!int340x_thermal_get_trip_config(int34x_zone->adev->handle, "_CRT", - &int34x_zone->crt_temp)) - int34x_zone->crt_trip_id = trip_cnt++; + trip_cnt = int34x_zone->aux_trip_nr; + + ret = thermal_acpi_trip_crit(int34x_zone->adev, &int34x_zone->trips[trip_cnt]); + if (!ret) + trip_cnt++; - int34x_zone->hot_trip_id = -1; - if (!int340x_thermal_get_trip_config(int34x_zone->adev->handle, "_HOT", - &int34x_zone->hot_temp)) - int34x_zone->hot_trip_id = trip_cnt++; + ret = thermal_acpi_trip_hot(int34x_zone->adev, &int34x_zone->trips[trip_cnt]); + if (!ret) + trip_cnt++; - int34x_zone->psv_trip_id = -1; - if (!int340x_thermal_get_trip_config(int34x_zone->adev->handle, "_PSV", - &int34x_zone->psv_temp)) - int34x_zone->psv_trip_id = trip_cnt++; + ret = thermal_acpi_trip_psv(int34x_zone->adev, &int34x_zone->trips[trip_cnt]); + if (!ret) + trip_cnt++; for (i = 0; i < INT340X_THERMAL_MAX_ACT_TRIP_COUNT; i++) { - char name[5] = { '_', 'A', 'C', '0' + i, '\0' }; - if (int340x_thermal_get_trip_config(int34x_zone->adev->handle, - name, - &int34x_zone->act_trips[i].temp)) + ret = thermal_acpi_trip_act(int34x_zone->adev, &int34x_zone->trips[trip_cnt], i); + if (ret) break; - int34x_zone->act_trips[i].id = trip_cnt++; - int34x_zone->act_trips[i].valid = true; + trip_cnt++; } return trip_cnt; @@ -208,7 +108,7 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev, acpi_status status; unsigned long long trip_cnt; int trip_mask = 0; - int ret; + int i, ret; int34x_thermal_zone = kzalloc(sizeof(*int34x_thermal_zone), GFP_KERNEL); @@ -228,32 +128,33 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev, int34x_thermal_zone->ops->get_temp = get_temp; status = acpi_evaluate_integer(adev->handle, "PATC", NULL, &trip_cnt); - if (ACPI_FAILURE(status)) - trip_cnt = 0; - else { - int i; - - int34x_thermal_zone->aux_trips = - kcalloc(trip_cnt, - sizeof(*int34x_thermal_zone->aux_trips), - GFP_KERNEL); - if (!int34x_thermal_zone->aux_trips) { - ret = -ENOMEM; - goto err_trip_alloc; - } - trip_mask = BIT(trip_cnt) - 1; + if (!ACPI_FAILURE(status)) { int34x_thermal_zone->aux_trip_nr = trip_cnt; - for (i = 0; i < trip_cnt; ++i) - int34x_thermal_zone->aux_trips[i] = THERMAL_TEMP_INVALID; + trip_mask = BIT(trip_cnt) - 1; } + int34x_thermal_zone->trips = kzalloc(sizeof(*int34x_thermal_zone->trips) * + (INT340X_THERMAL_MAX_TRIP_COUNT + trip_cnt), + GFP_KERNEL); + if (!int34x_thermal_zone->trips) { + ret = -ENOMEM; + goto err_trips_alloc; + } + + for (i = 0; i < trip_cnt; ++i) { + int34x_thermal_zone->trips[i].hysteresis = thermal_acpi_trip_gtsh(adev); + int34x_thermal_zone->trips[i].type = THERMAL_TRIP_PASSIVE; + int34x_thermal_zone->trips[i].temperature = THERMAL_TEMP_INVALID; + } + trip_cnt = int340x_thermal_read_trips(int34x_thermal_zone); int34x_thermal_zone->lpat_table = acpi_lpat_get_conversion_table( adev->handle); - int34x_thermal_zone->zone = thermal_zone_device_register( + int34x_thermal_zone->zone = thermal_zone_device_register_with_trips( acpi_device_bid(adev), + int34x_thermal_zone->trips, trip_cnt, trip_mask, int34x_thermal_zone, int34x_thermal_zone->ops, @@ -272,9 +173,9 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev, err_enable: thermal_zone_device_unregister(int34x_thermal_zone->zone); err_thermal_zone: + kfree(int34x_thermal_zone->trips); acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table); - kfree(int34x_thermal_zone->aux_trips); -err_trip_alloc: +err_trips_alloc: kfree(int34x_thermal_zone->ops); err_ops_alloc: kfree(int34x_thermal_zone); @@ -287,7 +188,7 @@ void int340x_thermal_zone_remove(struct int34x_thermal_zone { thermal_zone_device_unregister(int34x_thermal_zone->zone); acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table); - kfree(int34x_thermal_zone->aux_trips); + kfree(int34x_thermal_zone->trips); kfree(int34x_thermal_zone->ops); kfree(int34x_thermal_zone); } diff --git a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h index e28ab1ba5e06..0c2c8de92014 100644 --- a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h +++ b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h @@ -10,6 +10,7 @@ #include #define INT340X_THERMAL_MAX_ACT_TRIP_COUNT 10 +#define INT340X_THERMAL_MAX_TRIP_COUNT INT340X_THERMAL_MAX_ACT_TRIP_COUNT + 3 struct active_trip { int temp; @@ -19,15 +20,8 @@ struct active_trip { struct int34x_thermal_zone { struct acpi_device *adev; - struct active_trip act_trips[INT340X_THERMAL_MAX_ACT_TRIP_COUNT]; - unsigned long *aux_trips; + struct thermal_trip *trips; int aux_trip_nr; - int psv_temp; - int psv_trip_id; - int crt_temp; - int crt_trip_id; - int hot_temp; - int hot_trip_id; struct thermal_zone_device *zone; struct thermal_zone_device_ops *ops; void *priv_data;