mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Zhang, Rui" <rui.zhang@intel.com>
To: "srinivas.pandruvada@linux.intel.com" 
	<srinivas.pandruvada@linux.intel.com>,
	"rafael@kernel.org" <rafael@kernel.org>,
	"daniel.lezcano@linaro.org" <daniel.lezcano@linaro.org>
Cc: "Brown, Len" <len.brown@intel.com>,
	"rdunlap@infradead.org" <rdunlap@infradead.org>,
	"christophe.jaillet@wanadoo.fr" <christophe.jaillet@wanadoo.fr>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"amitk@kernel.org" <amitk@kernel.org>,
	"ricardo.neri-calderon@linux.intel.com" 
	<ricardo.neri-calderon@linux.intel.com>,
	"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>
Subject: Re: [PATCH v3 2/3] thermal/drivers/intel: Use generic trip points for intel_pch
Date: Fri, 6 Jan 2023 08:32:51 +0000	[thread overview]
Message-ID: <ff0b001a0b7c7beb17e007219414a39ba6d953ef.camel@intel.com> (raw)
In-Reply-To: <20230104222127.2364396-3-daniel.lezcano@kernel.org>

On Wed, 2023-01-04 at 23:21 +0100, Daniel Lezcano wrote:
> From: Daniel Lezcano <daniel.lezcano@linaro.org>
> 
> 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 <daniel.lezcano@kernel.org>
> ---
>     V3:
>       - The driver Kconfig option selects CONFIG_THERMAL_ACPI
> ---
>  drivers/thermal/intel/Kconfig             |  1 +
>  drivers/thermal/intel/intel_pch_thermal.c | 88 +++++--------------
> ----
>  2 files changed, 20 insertions(+), 69 deletions(-)
> 
> diff --git a/drivers/thermal/intel/Kconfig
> b/drivers/thermal/intel/Kconfig
> index f0c845679250..738b88b290f4 100644
> --- a/drivers/thermal/intel/Kconfig
> +++ b/drivers/thermal/intel/Kconfig
> @@ -75,6 +75,7 @@ config INTEL_BXT_PMIC_THERMAL
>  config INTEL_PCH_THERMAL
>  	tristate "Intel PCH Thermal Reporting Driver"
>  	depends on X86 && PCI
> +	select THERMAL_ACPI

THERMAL_ACPI depends on ACPI but the PCH thermal driver does not.
So we will run into "unmet dependencies" issue when CONFIG_ACPI is
cleared like below

WARNING: unmet direct dependencies detected for THERMAL_ACPI
  Depends on [n]: THERMAL [=y] && ACPI [=n]
  Selected by [m]:
  - INTEL_PCH_THERMAL [=m] && THERMAL [=y] && (X86 [=y] ||
X86_INTEL_QUARK [=n] || COMPILE_TEST [=n]) && X86 [=y] && PCI [=y]

thanks,
rui
>  	help
>  	  Enable this to support thermal reporting on certain intel
> PCHs.
>  	  Thermal reporting device will provide temperature reading,
> 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);

  reply	other threads:[~2023-01-06  8:33 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-04 22:21 [PATCH v3 0/3] Thermal ACPI APIs for generic trip points Daniel Lezcano
2023-01-04 22:21 ` [PATCH v3 1/3] thermal/acpi: Add ACPI trip point routines Daniel Lezcano
2023-01-04 22:21 ` [PATCH v3 2/3] thermal/drivers/intel: Use generic trip points for intel_pch Daniel Lezcano
2023-01-06  8:32   ` Zhang, Rui [this message]
2023-01-06 13:19     ` Daniel Lezcano
2023-01-04 22:21 ` [PATCH v3 3/3] thermal/drivers/intel: Use generic trip points int340x Daniel Lezcano
2023-01-06  8:25 ` [PATCH v3 0/3] Thermal ACPI APIs for generic trip points Zhang, Rui
2023-01-06 13:25   ` Daniel Lezcano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ff0b001a0b7c7beb17e007219414a39ba6d953ef.camel@intel.com \
    --to=rui.zhang@intel.com \
    --cc=amitk@kernel.org \
    --cc=christophe.jaillet@wanadoo.fr \
    --cc=daniel.lezcano@linaro.org \
    --cc=len.brown@intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rafael@kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=ricardo.neri-calderon@linux.intel.com \
    --cc=srinivas.pandruvada@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®