From nobody Sun Feb 8 08:27:37 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C0F3138B983 for ; Wed, 21 Jan 2026 18:29:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769020161; cv=none; b=bZBTUimSsOJNqK8mpqV2AiJHE7y+bZhupfxINknOrsi+WS00WP/9AugLcKcHBxeGyY7AUHhXOMsZAPXbKVKnjqRemzxPxvp5U5BW8B5BmeFQc9Y/L/RBi8HT+ubYlxmAiBQrml6Jv3Bof8o+9yy/Ft12U0LS0FGrOhuUM1YoReQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769020161; c=relaxed/simple; bh=svWYAOEp6ij6g+8vL15ysVMAJrFDV6PpHu6arYfSljY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z0i9BEBh/GJnFmfyM5Q8OpT4P03yd3Z6a6bh48iFO7eZgQ3j4jAIbmFkblDP4gA8yHPmuIypVuWLg7DrB/SgPuf5CQeyJWH5mTCNNV8njik1Dm6foYwicGwK4E4HiEBhaCDWKG0xR/c28ylVociPNIwWcDvjrs/6SbB5fOhzs8A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=kl4k3gWV; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kl4k3gWV" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2a75a4a140eso766845ad.3 for ; Wed, 21 Jan 2026 10:29:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769020158; x=1769624958; darn=vger.kernel.org; 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=8Xl3aa6opPUprRkwoBGqbq15zpYR77lS9AnPKKGuIhw=; b=kl4k3gWV0DUMiu6q/PgEt278CRVqC8CkYxgZpfOwQkpIoU8E1vLLRPflqrBNBbJCu7 0J6MeEHe7bcS1EVYfFj/Pbr1jkkS190VbE3LXiFt+YaZXHJ5HSRFgG17RPBBWhWGe3rd XD2tsxyAHNa0xZdVqXJSILEBrpnQZ7U6QXPzmywsQKXy6MtxQgXRZpjbh2P0oSqbSPQA D38Dm1AiTjUZ+oQegZZFQdWXNoeW9mE1vIRqPZz3hPGfuqPD0z+eb3uscR4ljPPUayok qHNoUm2UrQHjMCUa8iMKuSuIk7AtUOTqhmckq6B7vNVXc2+V3cmuVdH4Rz2l4qaTqnio oB8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769020158; x=1769624958; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=8Xl3aa6opPUprRkwoBGqbq15zpYR77lS9AnPKKGuIhw=; b=KBLIVbELR1dYVfjwa6ehRkGed7etikv1DgPaONG+z8gQio+39OFobsmmNIFh4r4lYE 1nAURqyc1eFdl0XYuMZdCBLBw0IKuAurlcczcArC0gzHbEnAH05b7LowoCPPGj95Usy0 96XUnVReBQyp0T7zyfY18IF3Hf7IXeKjTBlgol7nEp58Uz9hD4OAw9lUaCZp6Cad7+0S 9OTdaPebppUyazOV6twX/Rpz4P23WInnT2cFQ5pREdt4NsXC6vPLiEIIKkJxd8I11hX/ Q0YFYq/xFHEdubVT4lMrRZaCcAlgJIuUWe3qYCDNtRi5mYJUdeF88WSRvMS5UZXI01cB Csfg== X-Forwarded-Encrypted: i=1; AJvYcCVgQarbBffnFxtXromOUfZrCBDig0HR0t8lQUSjg48tgVEUyQUZIfyMWwCl2rWMgMvCuKh+pAtWM8tTa80=@vger.kernel.org X-Gm-Message-State: AOJu0Ywr0z+7eGZ6ahI9grdM4gkdONMLJylrrGk66msQgqCHBMwSxGIn Rks8rToYPeO6pv1hOurWriLVz58ArOpuZT8fEXlV8xEnFXzwptXfObSk X-Gm-Gg: AZuq6aLdOJKh8mjBe/B5zNSe14KaXLZWXzBxH83dOZHzjh7usDqP4wd2yzMH9io/c02 K/jad7esM657BIkpO08saA29hI9So9iffn8YR27gWKhi095qATyPs9WB8xXfP1TXmi92+knhfId I+USTaPz/pfKstxupzESSawalxsM/3tL2eCo4EsesAHrHzLXd9sYhzzPx0ioWklXHcUqS0t0O3E Glt3KrF+g0dRD+mPqlA7pCmOSBDtQMV2s/PzEPvabnP+Mmy0SmaVBehyBmMaTpas7ipw7Px2r9q AX5+yJdxKST7cmd2Kp+1mjfCgdEyS+Z5Lr7nVd1A4r83o+2x4GXfAkSi2Z0uHnuWV4knOFZPdFb KAWAA25haowdIlKh/lyCG1DctQhBYnR8E/qq7oinnYJt7rB6/OzpyTdjWbI20Lezl2ZrBFGyr4r D31dN7GSarZRebty7dAtM= X-Received: by 2002:a17:902:ecc6:b0:2a0:afeb:fbbb with SMTP id d9443c01a7336-2a768b7a743mr49195465ad.1.1769020157611; Wed, 21 Jan 2026 10:29:17 -0800 (PST) Received: from archlinux ([2405:201:1b:225c:9e18:7101:be84:75eb]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a7193dc83dsm162051195ad.50.2026.01.21.10.29.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Jan 2026 10:29:16 -0800 (PST) From: Krishna Chomal To: ilpo.jarvinen@linux.intel.com, hansg@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Krishna Chomal Subject: [PATCH v6] platform/x86: hp-wmi: Add EC offsets to read Victus S thermal profile Date: Wed, 21 Jan 2026 23:58:58 +0530 Message-ID: <20260121182858.66363-1-krishna.chomal108@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260113182604.115211-1-krishna.chomal108@gmail.com> References: <20260113182604.115211-1-krishna.chomal108@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The current implementation for Victus S thermal profiles only supports setting the profile. The driver was missing the logic to read the hardware state, meaning it would default to "Balanced" on driver load, overriding the currently active profile. Furthermore, the driver could not detect if the firmware reset the profile on a power source change. Statically store the known EC offsets for reading thermal profile in the new .ec_tp_offset field of struct thermal_profile_params. Implement platform_profile_victus_s_get_ec() to use this offset to read the real hardware state. Additionally, update the power source event notifier to use the actual hardware state when re-triggering CPU power limits actualization. Testing on HP Omen 16-wf1xxx (board ID 8C78) confirmed that the thermal profile is now persistent across driver loads and power source change events. Signed-off-by: Krishna Chomal --- NOTE: Patch 1/2 of the v5 series (platform/x86: hp-wmi: fix platform profile values for Omen 16-wf1xxx) is already accepted into pdx86/for-next. This v6 contains only the remaining logic for EC readback and is based on the for-next branch. Changes in v6: - Update struct thermal_profile_params to include .ec_tp_offset field. - Use this field for reading from the embedded-controller. - Add a pr_warn for "unknown ec layout" boards once during init. Changes in v5: - Improved platform_profile_victus_s_get_ec() to support multiple EC layouts by iteratively probing offsets. Changes in v4: - Fixed platform_profile_victus_s_get_ec() to use both victus_s_thermal_params and omen_v1_thermal_params instead of active_thermal_params to fix regression caused in v3. - Handle err after calling victus_s_gpu_thermal_profile_get(). - Fixed a wrong function call in victus_s_powersource_event(). Changes in v3: - New patch in this series. --- drivers/platform/x86/hp/hp-wmi.c | 103 ++++++++++++++++++++++++++++--- 1 file changed, 96 insertions(+), 7 deletions(-) diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-= wmi.c index 31c6cca6ec34..304d9ac63c8a 100644 --- a/drivers/platform/x86/hp/hp-wmi.c +++ b/drivers/platform/x86/hp/hp-wmi.c @@ -46,9 +46,13 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45E9-BE91-3D44E2C707E4"); #define HPWMI_EVENT_GUID "95F24279-4D7B-4334-9387-ACCDC67EF61C" #define HPWMI_BIOS_GUID "5FB7F034-2C63-45E9-BE91-3D44E2C707E4" =20 -#define HP_OMEN_EC_THERMAL_PROFILE_FLAGS_OFFSET 0x62 -#define HP_OMEN_EC_THERMAL_PROFILE_TIMER_OFFSET 0x63 -#define HP_OMEN_EC_THERMAL_PROFILE_OFFSET 0x95 +enum hp_ec_offsets { + HP_EC_OFFSET_UNKNOWN =3D 0x00, + HP_VICTUS_S_EC_THERMAL_PROFILE_OFFSET =3D 0x59, + HP_OMEN_EC_THERMAL_PROFILE_FLAGS_OFFSET =3D 0x62, + HP_OMEN_EC_THERMAL_PROFILE_TIMER_OFFSET =3D 0x63, + HP_OMEN_EC_THERMAL_PROFILE_OFFSET =3D 0x95, +}; =20 #define HP_FAN_SPEED_AUTOMATIC 0x00 #define HP_POWER_LIMIT_DEFAULT 0x00 @@ -94,22 +98,26 @@ enum hp_thermal_profile { HP_THERMAL_PROFILE_QUIET =3D 0x03, }; =20 + struct thermal_profile_params { u8 performance; u8 balanced; u8 low_power; + u8 ec_tp_offset; }; =20 static const struct thermal_profile_params victus_s_thermal_params =3D { .performance =3D HP_VICTUS_S_THERMAL_PROFILE_PERFORMANCE, .balanced =3D HP_VICTUS_S_THERMAL_PROFILE_DEFAULT, .low_power =3D HP_VICTUS_S_THERMAL_PROFILE_DEFAULT, + .ec_tp_offset =3D HP_EC_OFFSET_UNKNOWN, }; =20 static const struct thermal_profile_params omen_v1_thermal_params =3D { .performance =3D HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE, .balanced =3D HP_OMEN_V1_THERMAL_PROFILE_DEFAULT, .low_power =3D HP_OMEN_V1_THERMAL_PROFILE_DEFAULT, + .ec_tp_offset =3D HP_VICTUS_S_EC_THERMAL_PROFILE_OFFSET, }; =20 /* @@ -1785,6 +1793,60 @@ static int victus_s_set_cpu_pl1_pl2(u8 pl1, u8 pl2) return ret; } =20 +static int platform_profile_victus_s_get_ec(enum platform_profile_option *= profile) +{ + int ret =3D 0; + bool current_ctgp_state, current_ppab_state; + u8 current_dstate, current_gpu_slowdown_temp, tp; + const struct thermal_profile_params *params; + + params =3D active_thermal_profile_params; + if (params->ec_tp_offset =3D=3D HP_EC_OFFSET_UNKNOWN) { + *profile =3D active_platform_profile; + return 0; + } + + ret =3D ec_read(params->ec_tp_offset, &tp); + if (ret) + return ret; + + /* + * We cannot use active_thermal_profile_params here, because boards + * like 8C78 have tp =3D=3D 0x0 || tp =3D=3D 0x1 after cold boot, but log= ically + * it should have tp =3D=3D 0x30 || tp =3D=3D 0x31, as corrected by the O= men + * Gaming Hub on windows. Hence accept both of these values. + */ + if (tp =3D=3D victus_s_thermal_params.performance || + tp =3D=3D omen_v1_thermal_params.performance) { + *profile =3D PLATFORM_PROFILE_PERFORMANCE; + } else if (tp =3D=3D victus_s_thermal_params.balanced || + tp =3D=3D omen_v1_thermal_params.balanced) { + /* + * Since both PLATFORM_PROFILE_LOW_POWER and + * PLATFORM_PROFILE_BALANCED share the same thermal profile + * parameter value, hence to differentiate between them, we + * query the GPU CTGP and PPAB states and compare based off of + * that. + */ + ret =3D victus_s_gpu_thermal_profile_get(¤t_ctgp_state, + ¤t_ppab_state, + ¤t_dstate, + ¤t_gpu_slowdown_temp); + if (ret < 0) + return ret; + if (current_ctgp_state =3D=3D 0 && current_ppab_state =3D=3D 0) + *profile =3D PLATFORM_PROFILE_LOW_POWER; + else if (current_ctgp_state =3D=3D 0 && current_ppab_state =3D=3D 1) + *profile =3D PLATFORM_PROFILE_BALANCED; + else + return -EINVAL; + } else { + return -EINVAL; + } + + return 0; +} + static int platform_profile_victus_s_set_ec(enum platform_profile_option p= rofile) { struct thermal_profile_params *params; @@ -1952,6 +2014,7 @@ static int victus_s_powersource_event(struct notifier= _block *nb, void *data) { struct acpi_bus_event *event_entry =3D data; + enum platform_profile_option actual_profile; int err; =20 if (strcmp(event_entry->device_class, ACPI_AC_CLASS) !=3D 0) @@ -1959,6 +2022,17 @@ static int victus_s_powersource_event(struct notifie= r_block *nb, =20 pr_debug("Received power source device event\n"); =20 + guard(mutex)(&active_platform_profile_lock); + err =3D platform_profile_victus_s_get_ec(&actual_profile); + if (err < 0) { + /* + * Although we failed to get the current platform profile, we + * still want the other event consumers to process it. + */ + pr_warn("Failed to read current platform profile (%d)\n", err); + return NOTIFY_DONE; + } + /* * Switching to battery power source while Performance mode is active * needs manual triggering of CPU power limits. Same goes when switching @@ -1967,7 +2041,7 @@ static int victus_s_powersource_event(struct notifier= _block *nb, * Seen on HP 16-s1034nf (board 8C9C) with F.11 and F.13 BIOS versions. */ =20 - if (active_platform_profile =3D=3D PLATFORM_PROFILE_PERFORMANCE) { + if (actual_profile =3D=3D PLATFORM_PROFILE_PERFORMANCE) { pr_debug("Triggering CPU PL1/PL2 actualization\n"); err =3D victus_s_set_cpu_pl1_pl2(HP_POWER_LIMIT_DEFAULT, HP_POWER_LIMIT_DEFAULT); @@ -2078,11 +2152,22 @@ static int thermal_profile_setup(struct platform_de= vice *device) ops =3D &platform_profile_victus_ops; } else if (is_victus_s_thermal_profile()) { /* - * Being unable to retrieve laptop's current thermal profile, - * during this setup, we set it to Balanced by default. + * For an unknown EC layout board, platform_profile_victus_s_get_ec(), + * behaves like a wrapper around active_platform_profile, to avoid using + * uninitialized data, we default to PLATFORM_PROFILE_BALANCED. */ - active_platform_profile =3D PLATFORM_PROFILE_BALANCED; + if (active_thermal_profile_params->ec_tp_offset =3D=3D HP_EC_OFFSET_UNKN= OWN) { + active_platform_profile =3D PLATFORM_PROFILE_BALANCED; + } else { + err =3D platform_profile_victus_s_get_ec(&active_platform_profile); + if (err < 0) + return err; + } =20 + /* + * call thermal profile write command to ensure that the + * firmware correctly sets the OEM variables + */ err =3D platform_profile_victus_s_set_ec(active_platform_profile); if (err < 0) return err; @@ -2505,6 +2590,10 @@ static void __init setup_active_thermal_profile_para= ms(void) */ is_victus_s_board =3D true; active_thermal_profile_params =3D id->driver_data; + if (active_thermal_profile_params->ec_tp_offset =3D=3D HP_EC_OFFSET_UNKN= OWN) { + pr_warn("Unknown EC layout for board %s. Thermal profile readback will = be disabled. Please report this to platform-driver-x86@vger.kernel.org\n", + dmi_get_system_info(DMI_BOARD_NAME)); + } } } =20 --=20 2.52.0