From nobody Sun Feb 8 09:32:51 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 13F87EB64DD for ; Wed, 12 Jul 2023 08:49:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232140AbjGLItw (ORCPT ); Wed, 12 Jul 2023 04:49:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231856AbjGLIts (ORCPT ); Wed, 12 Jul 2023 04:49:48 -0400 Received: from SHSQR01.spreadtrum.com (mx1.unisoc.com [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 22FDFB1; Wed, 12 Jul 2023 01:49:44 -0700 (PDT) Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 36C8mjdd097455; Wed, 12 Jul 2023 16:48:45 +0800 (+08) (envelope-from Di.Shen@unisoc.com) Received: from SHDLP.spreadtrum.com (bjmbx01.spreadtrum.com [10.0.64.7]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4R1BFq1lLMz2MK44l; Wed, 12 Jul 2023 16:47:43 +0800 (CST) Received: from bj10906pcu1.spreadtrum.com (10.0.73.63) by BJMBX01.spreadtrum.com (10.0.64.7) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Wed, 12 Jul 2023 16:48:43 +0800 From: Di Shen To: , , , , CC: , , , , , , Subject: [PATCH] Revert "thermal: power allocator: change the 'k_*' always in estimate_pid_constants()" Date: Wed, 12 Jul 2023 16:48:40 +0800 Message-ID: <20230712084840.3594-1-di.shen@unisoc.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 X-Originating-IP: [10.0.73.63] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To BJMBX01.spreadtrum.com (10.0.64.7) X-MAIL: SHSQR01.spreadtrum.com 36C8mjdd097455 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This reverts commit 90a996544946d1d4834ec2ec8add586edd905779. The commit ensures that the pid constants are updated when sustainable_power changes, but it makes it impossible for the driver to set the pid constants when the sustainable_power is not changed. When the driver tries to register a thermal zone device by thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *trips, int num_trips, int mask, void *devdata, struct thermal_zone_device_ops *ops, struct thermal_zone_params *tzp, int passive_delay, int polling_delay) and passes the private thermal_zone_params structure data, thermal_zone_devcice_register_with_trips | thermal_set_governor | bind_to_tz | power_allocator_bind | estimate_pid_constants the tzp->k_* will not be the data that driver have given, but the data estimated by sustainable_power. To make it possible for driver to add its own pid constants, the 'force' flag is needed to indicate whether the tzp->k_* should be estimated by sustainable_power or not. Signed-off-by: Di Shen --- drivers/thermal/gov_power_allocator.c | 28 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/thermal/gov_power_allocator.c b/drivers/thermal/gov_po= wer_allocator.c index 8642f1096b91..f1753291b827 100644 --- a/drivers/thermal/gov_power_allocator.c +++ b/drivers/thermal/gov_power_allocator.c @@ -116,13 +116,18 @@ static u32 estimate_sustainable_power(struct thermal_= zone_device *tz) * @sustainable_power: sustainable power for the thermal zone * @trip_switch_on: trip point number for the switch on temperature * @control_temp: target temperature for the power allocator governor + * @force: whether to force the update of the constants * * This function is used to update the estimation of the PID * controller constants in struct thermal_zone_parameters. + * + * If @force is not set, the values in the thermal zone's parameters + * are preserved if they are not zero. If @force is set, the values + * in thermal zone's parameters are overwritten. */ static void estimate_pid_constants(struct thermal_zone_device *tz, u32 sustainable_power, int trip_switch_on, - int control_temp) + int control_temp, bool force) { struct thermal_trip trip; u32 temperature_threshold =3D control_temp; @@ -144,14 +149,18 @@ static void estimate_pid_constants(struct thermal_zon= e_device *tz, if (!temperature_threshold) return; =20 - tz->tzp->k_po =3D int_to_frac(sustainable_power) / - temperature_threshold; + if (!tz->tzp->k_po || force) + tz->tzp->k_po =3D int_to_frac(sustainable_power) / + temperature_threshold; =20 - tz->tzp->k_pu =3D int_to_frac(2 * sustainable_power) / - temperature_threshold; + if (!tz->tzp->k_pu || force) + tz->tzp->k_pu =3D int_to_frac(2 * sustainable_power) / + temperature_threshold; =20 - k_i =3D tz->tzp->k_pu / 10; - tz->tzp->k_i =3D k_i > 0 ? k_i : 1; + if (!tz->tzp->k_i || force) { + k_i =3D tz->tzp->k_pu / 10; + tz->tzp->k_i =3D k_i > 0 ? k_i : 1; + } =20 /* * The default for k_d and integral_cutoff is 0, so we can @@ -184,7 +193,8 @@ static u32 get_sustainable_power(struct thermal_zone_de= vice *tz, /* Check if it's init value 0 or there was update via sysfs */ if (sustainable_power !=3D params->sustainable_power) { estimate_pid_constants(tz, sustainable_power, - params->trip_switch_on, control_temp); + params->trip_switch_on, control_temp, + true); =20 /* Do the estimation only once and make available in sysfs */ tz->tzp->sustainable_power =3D sustainable_power; @@ -662,7 +672,7 @@ static int power_allocator_bind(struct thermal_zone_dev= ice *tz) if (!ret) estimate_pid_constants(tz, tz->tzp->sustainable_power, params->trip_switch_on, - trip.temperature); + trip.temperature, false); } =20 reset_pid_controller(params); --=20 2.17.1