Re: [PATCH v1] thermal: ACPI: Make helpers retrieve temperature only

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jan 27, 2023 at 7:18 PM Rafael J. Wysocki <rjw@xxxxxxxxxxxxx> wrote:
>
> From: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
>
> It is slightly better to make the ACPI thermal helper functions retrieve
> the trip point temperature only instead of doing the full trip point
> initialization, because they are also used for updating some already
> registered trip points, in which case initializing a new trip just
> in order to update the temperature of an existing one is somewhat
> wasteful.
>
> Modify the ACPI thermal helpers accordingly and update their users.
>
> No intentional functional impact.
>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
> ---
>
> I've change my mind regarding what the ACPI thermal helpers should do after
> the realization that they can be used for updating an existing trip point
> as well as for initializing a new one.  It makes more sense for them to
> return the temperature because of that, which is the change made here.
>
> The patch is on top of the current linux-next branch in linux-pm.git.

And I'm assuming no objections here, because patch series depending on
this one have been tested, reviewed and ACKed.

> ---
>  drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c |   40 ++--
>  drivers/thermal/intel/intel_pch_thermal.c                    |    7
>  drivers/thermal/thermal_acpi.c                               |  108 +++--------
>  include/linux/thermal.h                                      |    9
>  4 files changed, 70 insertions(+), 94 deletions(-)
>
> Index: linux-pm/drivers/thermal/thermal_acpi.c
> ===================================================================
> --- linux-pm.orig/drivers/thermal/thermal_acpi.c
> +++ linux-pm/drivers/thermal/thermal_acpi.c
> @@ -21,42 +21,11 @@
>  #define TEMP_MIN_DECIK 2180
>  #define TEMP_MAX_DECIK 4480
>
> -static int thermal_acpi_trip_init(struct acpi_device *adev,
> -                                 enum thermal_trip_type type, int id,
> -                                 struct thermal_trip *trip)
> +static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name,
> +                                 int *ret_temp)
>  {
>         unsigned long long temp;
>         acpi_status status;
> -       char obj_name[5];
> -
> -       switch (type) {
> -       case THERMAL_TRIP_ACTIVE:
> -               if (id < 0 || id > 9)
> -                       return -EINVAL;
> -
> -               obj_name[1] = 'A';
> -               obj_name[2] = 'C';
> -               obj_name[3] = '0' + id;
> -               break;
> -       case THERMAL_TRIP_PASSIVE:
> -               obj_name[1] = 'P';
> -               obj_name[2] = 'S';
> -               obj_name[3] = 'V';
> -               break;
> -       case THERMAL_TRIP_HOT:
> -               obj_name[1] = 'H';
> -               obj_name[2] = 'O';
> -               obj_name[3] = 'T';
> -               break;
> -       case THERMAL_TRIP_CRITICAL:
> -               obj_name[1] = 'C';
> -               obj_name[2] = 'R';
> -               obj_name[3] = 'T';
> -               break;
> -       }
> -
> -       obj_name[0] = '_';
> -       obj_name[4] = '\0';
>
>         status = acpi_evaluate_integer(adev->handle, obj_name, NULL, &temp);
>         if (ACPI_FAILURE(status)) {
> @@ -65,87 +34,84 @@ static int thermal_acpi_trip_init(struct
>         }
>
>         if (temp >= TEMP_MIN_DECIK && temp <= TEMP_MAX_DECIK) {
> -               trip->temperature = deci_kelvin_to_millicelsius(temp);
> +               *ret_temp = deci_kelvin_to_millicelsius(temp);
>         } else {
>                 acpi_handle_debug(adev->handle, "%s result %llu out of range\n",
>                                   obj_name, temp);
> -               trip->temperature = THERMAL_TEMP_INVALID;
> +               *ret_temp = THERMAL_TEMP_INVALID;
>         }
>
> -       trip->hysteresis = 0;
> -       trip->type = type;
> -
>         return 0;
>  }
>
>  /**
> - * thermal_acpi_trip_active - Get the specified active trip point
> - * @adev: Thermal zone ACPI device object to get the description from.
> + * thermal_acpi_active_trip_temp - Retrieve active trip point temperature
> + * @adev: Target thermal zone ACPI device object.
>   * @id: Active cooling level (0 - 9).
> - * @trip: Trip point structure to be populated on success.
> + * @ret_temp: Address to store the retrieved temperature value on success.
>   *
>   * Evaluate the _ACx object for the thermal zone represented by @adev to obtain
>   * the temperature of the active cooling trip point corresponding to the active
> - * cooling level given by @id and initialize @trip as an active trip point using
> - * that temperature value.
> + * cooling level given by @id.
>   *
>   * Return 0 on success or a negative error value on failure.
>   */
> -int thermal_acpi_trip_active(struct acpi_device *adev, int id,
> -                            struct thermal_trip *trip)
> +int thermal_acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp)
>  {
> -       return thermal_acpi_trip_init(adev, THERMAL_TRIP_ACTIVE, id, trip);
> +       char obj_name[] = {'_', 'A', 'C', '0' + id, '\0'};
> +
> +       if (id < 0 || id > 9)
> +               return -EINVAL;
> +
> +       return thermal_acpi_trip_temp(adev, obj_name, ret_temp);
>  }
> -EXPORT_SYMBOL_GPL(thermal_acpi_trip_active);
> +EXPORT_SYMBOL_GPL(thermal_acpi_active_trip_temp);
>
>  /**
> - * thermal_acpi_trip_passive - Get the passive trip point
> - * @adev: Thermal zone ACPI device object to get the description from.
> - * @trip: Trip point structure to be populated on success.
> + * thermal_acpi_passive_trip_temp - Retrieve passive trip point temperature
> + * @adev: Target thermal zone ACPI device object.
> + * @ret_temp: Address to store the retrieved temperature value on success.
>   *
>   * Evaluate the _PSV object for the thermal zone represented by @adev to obtain
> - * the temperature of the passive cooling trip point and initialize @trip as a
> - * passive trip point using that temperature value.
> + * the temperature of the passive cooling trip point.
>   *
>   * Return 0 on success or -ENODATA on failure.
>   */
> -int thermal_acpi_trip_passive(struct acpi_device *adev, struct thermal_trip *trip)
> +int thermal_acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp)
>  {
> -       return thermal_acpi_trip_init(adev, THERMAL_TRIP_PASSIVE, INT_MAX, trip);
> +       return thermal_acpi_trip_temp(adev, "_PSV", ret_temp);
>  }
> -EXPORT_SYMBOL_GPL(thermal_acpi_trip_passive);
> +EXPORT_SYMBOL_GPL(thermal_acpi_passive_trip_temp);
>
>  /**
> - * thermal_acpi_trip_hot - Get the near critical trip point
> - * @adev: the ACPI device to get the description from.
> - * @trip: a &struct thermal_trip to be filled if the function succeed.
> + * thermal_acpi_hot_trip_temp - Retrieve hot trip point temperature
> + * @adev: Target thermal zone ACPI device object.
> + * @ret_temp: Address to store the retrieved temperature value on success.
>   *
>   * Evaluate the _HOT object for the thermal zone represented by @adev to obtain
>   * the temperature of the trip point at which the system is expected to be put
> - * into the S4 sleep state and initialize @trip as a hot trip point using that
> - * temperature value.
> + * into the S4 sleep state.
>   *
>   * Return 0 on success or -ENODATA on failure.
>   */
> -int thermal_acpi_trip_hot(struct acpi_device *adev, struct thermal_trip *trip)
> +int thermal_acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp)
>  {
> -       return thermal_acpi_trip_init(adev, THERMAL_TRIP_HOT, INT_MAX, trip);
> +       return thermal_acpi_trip_temp(adev, "_HOT", ret_temp);
>  }
> -EXPORT_SYMBOL_GPL(thermal_acpi_trip_hot);
> +EXPORT_SYMBOL_GPL(thermal_acpi_hot_trip_temp);
>
>  /**
> - * thermal_acpi_trip_critical - Get the critical trip point
> - * @adev: the ACPI device to get the description from.
> - * @trip: a &struct thermal_trip to be filled if the function succeed.
> + * thermal_acpi_critical_trip_temp - Retrieve critical trip point temperature
> + * @adev: Target thermal zone ACPI device object.
> + * @ret_temp: Address to store the retrieved temperature value on success.
>   *
>   * Evaluate the _CRT object for the thermal zone represented by @adev to obtain
> - * the temperature of the critical cooling trip point and initialize @trip as a
> - * critical trip point using that temperature value.
> + * the temperature of the critical cooling trip point.
>   *
>   * Return 0 on success or -ENODATA on failure.
>   */
> -int thermal_acpi_trip_critical(struct acpi_device *adev, struct thermal_trip *trip)
> +int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp)
>  {
> -       return thermal_acpi_trip_init(adev, THERMAL_TRIP_CRITICAL, INT_MAX, trip);
> +       return thermal_acpi_trip_temp(adev, "_CRT", ret_temp);
>  }
> -EXPORT_SYMBOL_GPL(thermal_acpi_trip_critical);
> +EXPORT_SYMBOL_GPL(thermal_acpi_critical_trip_temp);
> Index: linux-pm/include/linux/thermal.h
> ===================================================================
> --- linux-pm.orig/include/linux/thermal.h
> +++ linux-pm/include/linux/thermal.h
> @@ -347,11 +347,10 @@ int thermal_zone_get_num_trips(struct th
>  int thermal_zone_get_crit_temp(struct thermal_zone_device *tz, int *temp);
>
>  #ifdef CONFIG_THERMAL_ACPI
> -int thermal_acpi_trip_active(struct acpi_device *adev, int id,
> -                            struct thermal_trip *trip);
> -int thermal_acpi_trip_passive(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_critical(struct acpi_device *adev, struct thermal_trip *trip);
> +int thermal_acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp);
> +int thermal_acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp);
> +int thermal_acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp);
> +int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp);
>  #endif
>
>  #ifdef CONFIG_THERMAL
> Index: linux-pm/drivers/thermal/intel/intel_pch_thermal.c
> ===================================================================
> --- linux-pm.orig/drivers/thermal/intel/intel_pch_thermal.c
> +++ linux-pm/drivers/thermal/intel/intel_pch_thermal.c
> @@ -100,16 +100,17 @@ static void pch_wpt_add_acpi_psv_trip(st
>                                       int *nr_trips)
>  {
>         struct acpi_device *adev;
> -       int ret;
> +       int temp;
>
>         adev = ACPI_COMPANION(&ptd->pdev->dev);
>         if (!adev)
>                 return;
>
> -       ret = thermal_acpi_trip_passive(adev, &ptd->trips[*nr_trips]);
> -       if (ret || ptd->trips[*nr_trips].temperature <= 0)
> +       if (thermal_acpi_passive_trip_temp(adev, &temp) || temp <= 0)
>                 return;
>
> +       ptd->trips[*nr_trips].type = THERMAL_TRIP_PASSIVE;
> +       ptd->trips[*nr_trips].temperature = temp;
>         ++(*nr_trips);
>  }
>  #else
> Index: linux-pm/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
> ===================================================================
> --- linux-pm.orig/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
> +++ linux-pm/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c
> @@ -70,24 +70,35 @@ static int int340x_thermal_read_trips(st
>  {
>         int i, ret;
>
> -       ret = thermal_acpi_trip_critical(zone_adev, &zone_trips[trip_cnt]);
> -       if (!ret)
> +       ret = thermal_acpi_critical_trip_temp(zone_adev,
> +                                             &zone_trips[trip_cnt].temperature);
> +       if (!ret) {
> +               zone_trips[trip_cnt].type = THERMAL_TRIP_CRITICAL;
>                 trip_cnt++;
> +       }
>
> -       ret = thermal_acpi_trip_hot(zone_adev, &zone_trips[trip_cnt]);
> -       if (!ret)
> +       ret = thermal_acpi_hot_trip_temp(zone_adev,
> +                                        &zone_trips[trip_cnt].temperature);
> +       if (!ret) {
> +               zone_trips[trip_cnt].type = THERMAL_TRIP_HOT;
>                 trip_cnt++;
> +       }
>
> -       ret = thermal_acpi_trip_passive(zone_adev, &zone_trips[trip_cnt]);
> -       if (!ret)
> +       ret = thermal_acpi_passive_trip_temp(zone_adev,
> +                                            &zone_trips[trip_cnt].temperature);
> +       if (!ret) {
> +               zone_trips[trip_cnt].type = THERMAL_TRIP_PASSIVE;
>                 trip_cnt++;
> +       }
>
>         for (i = 0; i < INT340X_THERMAL_MAX_ACT_TRIP_COUNT; i++) {
>
> -               ret = thermal_acpi_trip_active(zone_adev, i, &zone_trips[trip_cnt]);
> +               ret = thermal_acpi_active_trip_temp(zone_adev, i,
> +                                                   &zone_trips[trip_cnt].temperature);
>                 if (ret)
>                         break;
>
> +               zone_trips[trip_cnt].type = THERMAL_TRIP_ACTIVE;
>                 trip_cnt++;
>         }
>
> @@ -213,22 +224,21 @@ void int340x_thermal_update_trips(struct
>         mutex_lock(&int34x_zone->zone->lock);
>
>         for (i = int34x_zone->aux_trip_nr; i < trip_cnt; i++) {
> -               struct thermal_trip trip;
> -               int err;
> +               int temp, err;
>
>                 switch (zone_trips[i].type) {
>                 case THERMAL_TRIP_CRITICAL:
> -                       err = thermal_acpi_trip_critical(zone_adev, &trip);
> +                       err = thermal_acpi_critical_trip_temp(zone_adev, &temp);
>                         break;
>                 case THERMAL_TRIP_HOT:
> -                       err = thermal_acpi_trip_hot(zone_adev, &trip);
> +                       err = thermal_acpi_hot_trip_temp(zone_adev, &temp);
>                         break;
>                 case THERMAL_TRIP_PASSIVE:
> -                       err = thermal_acpi_trip_passive(zone_adev, &trip);
> +                       err = thermal_acpi_passive_trip_temp(zone_adev, &temp);
>                         break;
>                 case THERMAL_TRIP_ACTIVE:
> -                       err = thermal_acpi_trip_active(zone_adev, act_trip_nr++,
> -                                                      &trip);
> +                       err = thermal_acpi_active_trip_temp(zone_adev, act_trip_nr++,
> +                                                           &temp);
>                         break;
>                 default:
>                         err = -ENODEV;
> @@ -238,7 +248,7 @@ void int340x_thermal_update_trips(struct
>                         continue;
>                 }
>
> -               zone_trips[i].temperature = trip.temperature;
> +               zone_trips[i].temperature = temp;
>         }
>
>         mutex_unlock(&int34x_zone->zone->lock);
>
>
>



[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]
  Powered by Linux