From nobody Sat May 30 08:43:32 2026 Received: from mail-dl1-f41.google.com (mail-dl1-f41.google.com [74.125.82.41]) (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 3F91E286D5E for ; Sun, 10 May 2026 04:25:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387152; cv=none; b=OLMsQKq2lQeJHuEocqtzpGXcOKwRDdtIakgQZ3AoJUkzgoXVaha7N2c9nO0pYuESQuJ7R6vAnoJ2N8vvmBDjevA3actFgD6sgPkfjY6mU/kYiUFNMwOcIi5I/XheK0AQmSE/rfJlB5XoXETxcFQndhW3QKLS+AjcC4v9lw4l5Ng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387152; c=relaxed/simple; bh=as/Y6rgrCLbxvFJK4woRt4WCiXpZGU5Bmcl75dpz1Ic=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qhgKUTrCNn+0upIfwuSQywW8y0YBNfivaKuTiR0uKhU5NQV9Cm0+VqzWsKzYy7WdwfOKCl10dcL1xjqqPjOkCcTlomyy/eojnoC21m8tWo5z+XSISZ7R/pdIPhYuLK1bRZZjG3qgMj39zOvhjW3r3r8HITDwqwTajW18fTBXN5Q= 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=hiMikodo; arc=none smtp.client-ip=74.125.82.41 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="hiMikodo" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-12c45281a06so5424316c88.1 for ; Sat, 09 May 2026 21:25:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387150; x=1778991950; 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=6Epvlpqxnk7CA+C9ymJCfGqy8SHrtqDJZ4fsM6TY9RM=; b=hiMikodo+8X16zCDJhpb9ONw7FFkUK6p1I02t7t7D+rdTBojVfKB7EMhf6chktd5QL qJIGTi3GM+2rPp4sCDrM/5Hhfkjml6g4q1Yv+0Yw3spHzj7LSQB3wmak+19XCtLakP1T agxCvmtEGcg1dgXeJJafeEMIklEICP//FtrqQxb/Har4i79knh4iBBy0OrU5nIhjxonk eub3nXLAqQrNT/EYCTKJuzAPJJyzmh+bHccFIpky5aqIIiMUzl98Ytj2ffqo0ftOzBRj nvK0sAPGZImtK0UQd9NZnxpBBkHxJq6IWYtbSHAGLKp+mQRTQ1X7OZm/wb5d/r+iXCQ7 OMHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387150; x=1778991950; 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=6Epvlpqxnk7CA+C9ymJCfGqy8SHrtqDJZ4fsM6TY9RM=; b=CWk3C3mlBVdKxVF/RkvoL4vIHJR2MJZV27SgoYdchoZpA+LbqmiJ/nzzUmyE8kB8Nf dRHaHB0EVhudAv/IauCsl6mHrIH0jilYNDV4bVP6Wj4piH/VlHT6Yz9CplGQX6slxDl3 RRWmHGqID18SXJalw16kZ3sUgqqj57JHBZbIFe2hTG7uHeX8lBMLOgUEBE033nXU+Mb0 Kl8zlHUsJKnEqHeisDHs6wg1UJYkc6bbXIe99Pv8FywcUveM3JRgu71wgPfEWufDMAPf 3IhJ2d4BgZTqPLAm2EKYwgRip9pEEXy8Hgnol4+jpgybI6Sv6m7wQrrw3V8sFwJCuCkl wjRg== X-Forwarded-Encrypted: i=1; AFNElJ/IUp9iWioE8UrtxIaJitM+bW0k1vLCuK22r6q/oX53jTInaQHLE3icd/cxgj50AArCvV5HlM+59Wrmv1E=@vger.kernel.org X-Gm-Message-State: AOJu0YwivqwaYNjYd2XbQJg7KTx0GsjREXI5mOHgTjlh1MiELxPq32fc V1/OMxU3URpmKq41HvYS+CzjsykJirx2qKBHX90Hy+OErvGmqAHFstoK X-Gm-Gg: Acq92OHzw/BrRF7r94t25thb1Mj89gQlt+bH13ggI4JBtf/0x5XhDmUi0Dg/5SK6gQG 1gWfLeH7YO0lSRRL7iKUT2/EXIPGsHRrDZBilW/hTO/ldvCNH0O65mHf/+fxffvQ+ExveM447qW Dw8UBou7pseWNJ1LTR1JEiDFxe44mNrf1DfB0q1ap1PDcT8/VuviuaWAhslfXzRyO8jBJSmH3zy oogHjGnpOKqDi34P8klBwyWexAynVx8mEmurzdc8xffaLcza6SKBbK5FZSS5JiLpM80wtsWMdvl SJx3N+CtgcD/4bIiWr4bY2+OQomSLalKitFjW0cxdGX/3uaHFamf/mwbcHSytAIi6jB/Ycogu3I 4rqeSQ8wFWM2ISb0n4s1HVm36GZVLdnuxb/VPkon9UT1BrSkzQvYhd7xu74zzDHQBU3YPXxpkm2 msjlKovwf8VlSFL3JXnaSev2DrQpo0+/LvN8S5nHJWnln4IV8b2b3Mit0+hzpKdL2Lt0U7UpKHH o/u X-Received: by 2002:a05:7301:2c84:b0:2ed:e14:7f5b with SMTP id 5a478bee46e88-2f54b797cf9mr9088145eec.31.1778387150168; Sat, 09 May 2026 21:25:50 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:49 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v12 01/16] platform/x86: lenovo-wmi-helpers: Fix memory leak in lwmi_dev_evaluate_int() Date: Sun, 10 May 2026 04:25:31 +0000 Message-ID: <20260510042546.436874-2-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" From: Rong Zhang lwmi_dev_evaluate_int() leaks output.pointer when retval =3D=3D NULL (found by sashiko.dev [1]). Fix it by moving `ret_obj =3D output.pointer' outside of the `if (retval)' block so that it is always freed by the __free cleanup callback. No functional change intended. Reviewed-by: Mark Pearson Fixes: e521d16e76cd ("platform/x86: Add lenovo-wmi-helpers") Cc: stable@vger.kernel.org Link: https://sashiko.dev/#/patchset/20260331181208.421552-1-derekjohn.clar= k%40gmail.com [1] Signed-off-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-helpers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-helpers.c b/drivers/platform/x= 86/lenovo/wmi-helpers.c index 7379defac500..018d7642e2bd 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.c +++ b/drivers/platform/x86/lenovo/wmi-helpers.c @@ -46,7 +46,6 @@ int lwmi_dev_evaluate_int(struct wmi_device *wdev, u8 ins= tance, u32 method_id, unsigned char *buf, size_t size, u32 *retval) { struct acpi_buffer output =3D { ACPI_ALLOCATE_BUFFER, NULL }; - union acpi_object *ret_obj __free(kfree) =3D NULL; struct acpi_buffer input =3D { size, buf }; acpi_status status; =20 @@ -55,8 +54,9 @@ int lwmi_dev_evaluate_int(struct wmi_device *wdev, u8 ins= tance, u32 method_id, if (ACPI_FAILURE(status)) return -EIO; =20 + union acpi_object *ret_obj __free(kfree) =3D output.pointer; + if (retval) { - ret_obj =3D output.pointer; if (!ret_obj) return -ENODATA; =20 --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f171.google.com (mail-dy1-f171.google.com [74.125.82.171]) (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 0DC7A28A3F8 for ; Sun, 10 May 2026 04:25:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387153; cv=none; b=RDL8Tpa22iTOq/s1W2sbPl/mpwT2M1dyXb7vnSAJSBFE2CeU3yqoPtg6XXoPqEQITOulzhXq3VknkPK84qbQjrpsvGlUO22ZcgkJnpUb6J17b4f5HX8jAV894xSYU3ImqzgVvu6wAOdoJsnEDMEqODyTak/cgKoaEM0IrAquVN8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387153; c=relaxed/simple; bh=8LUDQtMderd6djIBXviEFlt08t4GGAhmClar2YVACLg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u+Q0TeVVoOHGFNQdJFLnZ8zuZx8kFeCStK+/sV+9aLF48VluvEMgAxG1wgogKmFwvDPjwiSMPx0tmSzo8mrmySw5CH4pxNf2akg7ao0hWq9T3Jpng08P/klIJenAWeqHvDMmvXRL/QOlnTd3x6jdtUNSYYyQGjjHscUGEXU9xIc= 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=gSGWCjEw; arc=none smtp.client-ip=74.125.82.171 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="gSGWCjEw" Received: by mail-dy1-f171.google.com with SMTP id 5a478bee46e88-2f68f3b075fso3369135eec.0 for ; Sat, 09 May 2026 21:25:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387151; x=1778991951; 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=JnJVHMF3J4KnB49uOjeY/NdO1ByBdmanEQTbiS1LzsE=; b=gSGWCjEwr+ZPfijtrCy69MG15wxzsq9xLzv3dY4e9UqdbQ+Z8WK/2nCo11I4S8xtp4 0j84obEcGJnJhxyb3fAeB5fncC0NtBwVR9Z0F3TVt/+f6Ij8tk3Bp5d1bnHtEVoUPkTg thcDHy1h20dM2xDSElSS7VGu7wxhF8RxGnQLKzlOxSyTTQ9I1lIq5ue0U4RHkp+WU5Wn diIZcJWpPG2oqKaqJdKdeuwcHbzbWb/i8r8ziiu45pBUYADkm9ZSTqTwZjZOQ0fiyiZK uAXpFDlD0KM64YLIewjor9v902HYNyOeSMFvhJiQ/aiIb3KOJsuj1+Ew3df/f4Hi+v0x 9zyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387151; x=1778991951; 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=JnJVHMF3J4KnB49uOjeY/NdO1ByBdmanEQTbiS1LzsE=; b=aCKUn1Z1W2tiuNHFN6LB9uP9JFCL0WfiQvLsHM0TSCzekM814SvW268yZp+NkSPPFm +v1hGKWAQr3mtlLgfWkdI/YX9IlFx5KfYD+fUK1L17ofy9LOc/ctGBbECq2BRXWMTWEY /AlvRhIsMyqJedBdV4zLcth/xwGo8Qu37RbtvC47OKSkqpigOcFM0yeuSxjJzd4GbaAV qHswOH9IPA+FZaGOlK7wwhxz0OnA/+zVcF9ru7yKZYiCLVfPOSSpbSPsfE9jEVmDKaLE 1u1bwxBbTUYuWvLWezSVVW7v2PeAcyDOsc3lrm8isSlKUuHzzSw2GQX98LFW3p5/xFRP Salw== X-Forwarded-Encrypted: i=1; AFNElJ8JibRFAgxLVRjDEuVmxbVXOK9Eyyl8EQvbhXc8ns8obe1Yk7nY9uGn2h36YaF+Q6Wr+RYDgpbotZ5/nD8=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/97HRu8FBGiV6pX0UpmvzesntJ1sVoakWhB7jzkJnsPjJbr1g hs75RtuJDLAvAGUihHGmXF52glnbSv2M5D2r1d57tS8RZoXqj7faBYLC X-Gm-Gg: Acq92OFGoOi0CpEQ5pWOBmofQ0326Qf7fRj9C1OgXUHNfq6sVfKAWkSP0fXzLI09WeR GyTrDDego3ovL2+oDy0vci3UTNny++c+okxCyWsOspKkOCXvQ3VigySJITraEsGcs1gj2s0/t4X f9l4ASp3550LYgfR+F5GjGAuvu4fQ+FANhDjZWnrT13eosApK8I7vXgvW6fw3UhCTgzvQcNqXKK xOoi0N4RaGkcYJUYPFm5fFT6ncaYpAXh6A3++KM6wQuXufD7ZBv34qhHpS86hZEVfsen2Qko3hC RAVsqnvfxI3adWBZWI41eCqsx8cNty4vtai3IouhgmjWjSCPorERdMWTYylRw9LjjE9eCWfX1k9 tZsgK/TKelhMpESfZMbsP9EwwnKhEEVTz9vZRySs+y+Cy0ZBz2hSlNpugvlVIfGNPeZiPcWBhs3 xY4W5mu9/e3phn4qUSoqyis5uj7qVOoBw7ElQp35RxikT/ovO5el6QHwUZjX3IINnuUUbUsw/hZ 0Q6 X-Received: by 2002:a05:7301:4088:b0:2ed:6f94:9d9f with SMTP id 5a478bee46e88-2f85c07ca45mr4571233eec.11.1778387151021; Sat, 09 May 2026 21:25:51 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:50 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v12 02/16] platform/x86: lenovo-wmi-other: Balance IDA id allocation and free Date: Sun, 10 May 2026 04:25:32 +0000 Message-ID: <20260510042546.436874-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" From: Rong Zhang Currently, the IDA id is only freed on wmi-other device removal or failure to create firmware-attributes device, kset, or attributes. It leaks IDA ids if the wmi-other device is bound multiple times, as the unbind callback never frees the previously allocated IDA id. Additionally, if the wmi-other device has failed to create a firmware-attributes device before it gets removed, the wmi-device removal callback double frees the same IDA id. These bugs were found by sashiko.dev [1]. Fix them by moving ida_free() into lwmi_om_fw_attr_remove() so it is balanced with ida_alloc() in lwmi_om_fw_attr_add(). With them fixed, properly set and utilize the validity of priv->ida_id to balance firmware-attributes registration and removal, without relying on propagating the registration error to the component framework, which is more reliable and aligns with the hwmon device registration and removal sequences. No functional change intended. Reviewed-by: Mark Pearson Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Cc: stable@vger.kernel.org Link: https://sashiko.dev/#/patchset/20260331181208.421552-1-derekjohn.clar= k%40gmail.com [1] Signed-off-by: Rong Zhang Signed-off-by: Derek J. Clark --- v9: - Invert err logic for when allocating IDA fails. - Rename ida_alloc err goto from 'err' to 'err_no_ida' to disambiguate from 'int err'. --- drivers/platform/x86/lenovo/wmi-other.c | 36 ++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 6040f45aa2b0..be3309d74e03 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -957,17 +957,17 @@ static struct capdata01_attr_group cd01_attr_groups[]= =3D { /** * lwmi_om_fw_attr_add() - Register all firmware_attributes_class members * @priv: The Other Mode driver data. - * - * Return: Either 0, or an error code. */ -static int lwmi_om_fw_attr_add(struct lwmi_om_priv *priv) +static void lwmi_om_fw_attr_add(struct lwmi_om_priv *priv) { unsigned int i; int err; =20 - priv->ida_id =3D ida_alloc(&lwmi_om_ida, GFP_KERNEL); - if (priv->ida_id < 0) - return priv->ida_id; + err =3D ida_alloc(&lwmi_om_ida, GFP_KERNEL); + if (err < 0) + goto err_no_ida; + + priv->ida_id =3D err; =20 priv->fw_attr_dev =3D device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), NULL, "%s-%u", @@ -993,7 +993,7 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *pri= v) =20 cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; } - return 0; + return; =20 err_remove_groups: while (i--) @@ -1007,7 +1007,12 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *= priv) =20 err_free_ida: ida_free(&lwmi_om_ida, priv->ida_id); - return err; + +err_no_ida: + priv->ida_id =3D -EIDRM; + + dev_warn(&priv->wdev->dev, + "failed to register firmware-attributes device: %d\n", err); } =20 /** @@ -1016,12 +1021,17 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv = *priv) */ static void lwmi_om_fw_attr_remove(struct lwmi_om_priv *priv) { + if (priv->ida_id < 0) + return; + for (unsigned int i =3D 0; i < ARRAY_SIZE(cd01_attr_groups) - 1; i++) sysfs_remove_group(&priv->fw_attr_kset->kobj, cd01_attr_groups[i].attr_group); =20 kset_unregister(priv->fw_attr_kset); device_unregister(priv->fw_attr_dev); + ida_free(&lwmi_om_ida, priv->ida_id); + priv->ida_id =3D -EIDRM; } =20 /* =3D=3D=3D=3D=3D=3D=3D=3D Self (master: lenovo-wmi-other) =3D=3D=3D=3D= =3D=3D=3D=3D */ @@ -1063,7 +1073,9 @@ static int lwmi_om_master_bind(struct device *dev) =20 lwmi_om_fan_info_collect_cd00(priv); =20 - return lwmi_om_fw_attr_add(priv); + lwmi_om_fw_attr_add(priv); + + return 0; } =20 /** @@ -1115,13 +1127,7 @@ static int lwmi_other_probe(struct wmi_device *wdev,= const void *context) =20 static void lwmi_other_remove(struct wmi_device *wdev) { - struct lwmi_om_priv *priv =3D dev_get_drvdata(&wdev->dev); - component_master_del(&wdev->dev, &lwmi_om_master_ops); - - /* No IDA to free if the driver is never bound to its components. */ - if (priv->ida_id >=3D 0) - ida_free(&lwmi_om_ida, priv->ida_id); } =20 static const struct wmi_device_id lwmi_other_id_table[] =3D { --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f172.google.com (mail-dy1-f172.google.com [74.125.82.172]) (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 A2FEB286D56 for ; Sun, 10 May 2026 04:25:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387154; cv=none; b=oanuZrAEAmQC77TKj1cbRfuI0iGi/+VWfQNw+uCYFTyyvq8G/Y+AQxtwueWKtpcQM42ZgwH2aDPvBnKeSqRojOyv/EGWk7PRxOLtzOe/OYk1H47gGp4Sji5vbPmKFDzwm1DswWSUnYUHYoJk+qipgoD/1lIW7mxA7nT/celwXn4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387154; c=relaxed/simple; bh=6uvm7kxcoZxl4SJop0VuYLP778pizJEeCY5iHUnRujE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=N9SgD4X/INYVHLVKC4jhq97nROWcSqiyX8zLe7v8/m7vshOFBuXGnxXOqZW1MOR9g0hyHva+OYDaUB6jOdZFdxCoPSTBoz0xY89bCWbLURE2Fr+L+vBDc+4M4RnnqOgPY8OZRpaEz5HFJONNArF+c54v76GSVPQEkMoK8UUR13s= 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=dms11K2j; arc=none smtp.client-ip=74.125.82.172 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="dms11K2j" Received: by mail-dy1-f172.google.com with SMTP id 5a478bee46e88-2f3c623322bso5361409eec.0 for ; Sat, 09 May 2026 21:25:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387152; x=1778991952; 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=4ki2zpxXcCZiQ654Cm5JOUD1c7/Sq7YjZSIjBtyxJhk=; b=dms11K2jMcDfQbw8xdMgaYe88MJgln/XfhDTd4/L2OnwUbq0H623qiTK1lbl4pRsdN F72mDZcMBXNrIKGy6jTnlIJ8I4PhqZnH4vx0yckkCSbl3Byfd0sl5ia27rADR+0Kgriy ivoLDZDVTMC7DPwJVTkHw2EWgPC0er/Hc50zq1HGYNbCXE59GZwnVgYHF3RK/VJzpEzx JlJoCQWJMUoy6JZHpDHpkGy3FnrWcKAQzOxnxx1Jz0kM+qsoIZA16UwKqamof6DUb1yO CgCitzl/r3ax5m9jlEsX9ao6PTvKkr/tnmJtmvzyc6XiJV6NvGEn+rWgu4EOcm372eJ2 BVDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387152; x=1778991952; 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=4ki2zpxXcCZiQ654Cm5JOUD1c7/Sq7YjZSIjBtyxJhk=; b=FBIKuCfePIx/6UnzOMP41zj+VMDn+BXNX2jjWOiK+57yghKIpwl5tk1aAgI73x3Rn9 whwQ/blJyVNLaWjkM1LPwZfyeKklU8YbylzAeu0zBwCYvhDt6GEfpe/bd5sy7e5mQCjN /Qk+LRzjozdzQjgUAeNZ23LP1XEUbBWWdcr1XygNJHD0LH+E/NOBZep2PPjWkoU09xJB h6MYNpuZfCVIKVL+7qFdygyvKR+ZQjuVHqctoIqm62a95PIhZKyifypbbyF+xLR6fQW9 NQCeEky/Cxco2GWNwWDEeDPSli5nVxF2dlnLmDGobeUP2arSn5Gjafe1gfZXK2TULuPb AUew== X-Forwarded-Encrypted: i=1; AFNElJ8gErRJ/ssdhChcW2ap0Z9ayYuFmMU9/JVUo+fbTNhYnRC9i5OqVd6RX6JL0Ub+5+1pBHsSXQqTk/PdPKA=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0PSNzuMGgFL90nvZpDm/MZPpJ1UT+sdDws5u3znPdzy5W5yUA TFNnt5OURrrS2XAzXZmKiVMmNNp5TSMQdzHMKwxv4DXmYhy5coB9vql1 X-Gm-Gg: Acq92OFse5nce/FTjT7u0XSfk/AWYNRKAUkExt4kQdbZ8nFsfVoptZns02UFQuwTvRM FJ4q9DLDg5LNOUxfw7t/SLojTr4gSN/OaNNnN2Xi6/nn9D/QjfwVnTUCBjsKLc/33Kjgrgvcmlx P8LSEf2Yuifns+CQkU6AGUdD4gVH/ARM9qzHV4HC/MuCyd5WAa0gbwAoXNOzSXQ717wZyu2RVTw Zq94R1HntHo1/02wTWHFzFj8hNdxwHShlTdDca/fnqmWPMAeLYJrUhnoBxWNjFh7F0sWPCc+f1w +pQmqVusq6ik8oEhwIZV364sEG/FHyv7K4vc4PLZ6O6I3fS6cqqVpW4OdnJVLMuw42Fa/yKw2NH RKBpL/Z6fcXPQZgnLDP2jwqYQevWJjrPK3fFFwbh7pII5q07+FPQEfWyaHos6KWoXPNiQdjtWLW faOg6Hyq85L7lbouJdc2e9pVV8yhvY8f2B5xH6CK9AJP8mzV+iuIJEpY+imIZTULPlIvVDq6BM8 BQD X-Received: by 2002:a05:7300:434b:b0:2ce:3aa1:d39b with SMTP id 5a478bee46e88-2f54c97128bmr9262664eec.20.1778387151815; Sat, 09 May 2026 21:25:51 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:51 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v12 03/16] platform/x86: lenovo-wmi-other: Balance component bind and unbind Date: Sun, 10 May 2026 04:25:33 +0000 Message-ID: <20260510042546.436874-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Rong Zhang When lwmi_om_master_bind() fails, the master device's components are left bound, with the aggregate device destroyed due to the failure (found by sashiko.dev [1]). Balance calls to component_bind_all() and component_unbind_all() when an error is propagated to the component framework. No functional change intended. Reviewed-by: Mark Pearson Reviewed-by: Ilpo J=C3=A4rvinen Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Cc: stable@vger.kernel.org Link: https://sashiko.dev/#/patchset/20260331181208.421552-1-derekjohn.clar= k%40gmail.com [1] Signed-off-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-other.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index be3309d74e03..a6be3463341c 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -1068,8 +1068,11 @@ static int lwmi_om_master_bind(struct device *dev) =20 priv->cd00_list =3D binder.cd00_list; priv->cd01_list =3D binder.cd01_list; - if (!priv->cd00_list || !priv->cd01_list) + if (!priv->cd00_list || !priv->cd01_list) { + component_unbind_all(dev, NULL); + return -ENODEV; + } =20 lwmi_om_fan_info_collect_cd00(priv); =20 --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f170.google.com (mail-dy1-f170.google.com [74.125.82.170]) (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 9AF132C026C for ; Sun, 10 May 2026 04:25:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387155; cv=none; b=OFrLXpfCYfP9hdnn3krBJkkQIXnExbs4gjiAt7D7feNFXuU5DeIvpjBJiWRmtcjSdYq6o4sL3Nu7ZJJ8CQ1GHq4cQ+dnRm6qBKifNZcO5GNxLglgoDl+10Vu/hN4MvpgnjAkUT+f1nDpRDnHuIQDTztbQo5PM2oMXKsH2v4BKxs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387155; c=relaxed/simple; bh=pA4TfuBRYBkm06/i9YIAhD/h0U3iNM8NSUZPBNTS74Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WhQOncv4meq3PV3mhq1sJ0Z0JV5m4JP3tsEH98lPM3bgsSXa7yJlR1KrGrvujFNvcDyAEXf76r6AgEy6Vn6Z8q0e6qaomQdisBJxtQQtsDxYb9JYy2nlrdHAQI/zwYyZMW4fAR7LY4WH6mkg47l+R+n7dbAeNf59bRO9qaoBw0M= 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=SRL3dz6m; arc=none smtp.client-ip=74.125.82.170 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="SRL3dz6m" Received: by mail-dy1-f170.google.com with SMTP id 5a478bee46e88-2ecf9e398f4so8709106eec.1 for ; Sat, 09 May 2026 21:25:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387153; x=1778991953; 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=td5pnPiFY8lI+NT0TWL0GRlUXHfAOrA1KjpGkurMjvM=; b=SRL3dz6mAKhpM97wNPLkGPM6pUFDZdj9+KJBMluwUO6wY9uEdKmQ41xx08h9zxVyda gc7dldKgXzC1D3bQydDsxUaQg5aXhFeyFDQVeUbU0pqUIjHcxxaCzjHh5UFtHWouz68Z mn5kg/9rZdsj5LNYReXbDXYV9BjTSkLZiXwGuXgqTjddQK0p8DxH7XTcOu4lGCMuz4py uCcKs1hNzxWkUmDDfXjZrcLoG9wz8d8bieJPI10/2z2N5OrB7itUpR9fgpeQs/MoLDwv T/xmDY43idmGu7lQA4gGzbZoZ6s+q/DrRKyzsOprUvgG3JavCxTRUT89a1atpNaOx5Cc uavQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387153; x=1778991953; 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=td5pnPiFY8lI+NT0TWL0GRlUXHfAOrA1KjpGkurMjvM=; b=XBVaqCuNR1FkU2dKPiKUZzSEgEc7/TbbVW+HgCGVFZsqJ93Zvu0kgvQGS6cgPOxxDR bM4gWTmtb5YY9e74Ivu7TDWn6juIlJMq1Dp8rXnZ2RAW07uscnBi06NGZyUUEVzPlQTs fueV47YO6z7OBKr3++tZVfKdYHOAs8HGBJvG3m8doyEWgLL+40hecdEBwFZC8MeRVtgO PSX5gTvAKCRSz82Ef1ng51zOJ5S/dPQENOu5XMna6HrTmds45mxICBITUxZE4VZsMcNU /RB4b2Aqh2oIexyq27Ic2H+daFiLd/ciekf5dICOMrFxEvc8rtIg+YprwYDIsvrT+DQX yjtg== X-Forwarded-Encrypted: i=1; AFNElJ+Ya/vjGpgUPlw5q7lLmR2QUUIbQYqIj6L9cSpeLlUexVToXyeAZzLT3b1CpUK12IAjivBF6IAlrNGOzOk=@vger.kernel.org X-Gm-Message-State: AOJu0YxCeauVgcKsxMTani2TKOwPn4ZgdAnx6197QKE4Q43F59Ae9Tvy EuYgWuYgZvxXvNBI64/ckNSZqb209yMrI3yZrlTZif29LGips2l8McTCGCcjFA== X-Gm-Gg: Acq92OFJh+VAcGc0U8F7wD/MjEZNpG8z7YEQdw2rABEql32uD//jUuGiW8Q+/rp9Uds Jahlf9/ktJFK7ZfjUn01aFXBJZIyGLJu9ND8gWlkCPVakeDb4yc3uTuO5mfjF7f3rDv2my2ZdWn DBgNYdfYb0bYKelbIfXeY1KRckjfHhsOMw4QdD7UHNZt5kCkC5NJ6moR4kOV3wMPGNKUfCabVse x8WQC0IEGjelH+Ws5u0fEUJmfm2TtuJrLN6KJCJ/dVXwzZB3nVlxhxmKGahEoaLjRSPubFY5Zy1 zpDsKcLy1YuzcRQZLeUWfVUbQuTBI8LStnAULn5ZaFV3qSI7cqh89ZgcDcR+YcPpT9Sqq8mYJYy UyT9dYuuSMrE23Pt/HBVKYOmRGXJLS8FSDRzU5EsXuYXzIyZchKoTehjGTLBWyzd6B71dAKzRxW KGVQTelP0qwhUfhiASf/imiy1r9jNtZWg516uuJD8QfGNLggLmt/IqhLTl3kt6YxO+TwGs0iDRe fMVnHm7dvwRnRk= X-Received: by 2002:a05:7300:df4b:b0:2be:142f:d499 with SMTP id 5a478bee46e88-2f54c971297mr8865848eec.16.1778387152746; Sat, 09 May 2026 21:25:52 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:52 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v12 04/16] platform/x86: lenovo-wmi-other: Zero initialize WMI arguments Date: Sun, 10 May 2026 04:25:34 +0000 Message-ID: <20260510042546.436874-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" Adds explicit initialization of wmi_method_args_32 declarations with zero values to prevent uninitialized data from being sent to the device BIOS when passed. No functional change intended. Reviewed-by: Mark Pearson Fixes: 22024ac5366f ("platform/x86: Add Lenovo Gamezone WMI Driver") Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Reported-by: Rong Zhang Closes: https://lore.kernel.org/platform-driver-x86/95c7e7b539dd0af41189c75= 4fcd35cec5b6fe182.camel@rong.moe/ Cc: stable@vger.kernel.org Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- v12: Fix formatting of commit message. v7: - Include lwmi_gz_profile_set() fix as well. --- drivers/platform/x86/lenovo/wmi-gamezone.c | 2 +- drivers/platform/x86/lenovo/wmi-other.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.c b/drivers/platform/= x86/lenovo/wmi-gamezone.c index 381836d29a96..ca559e6c031d 100644 --- a/drivers/platform/x86/lenovo/wmi-gamezone.c +++ b/drivers/platform/x86/lenovo/wmi-gamezone.c @@ -203,7 +203,7 @@ static int lwmi_gz_profile_set(struct device *dev, enum platform_profile_option profile) { struct lwmi_gz_priv *priv =3D dev_get_drvdata(dev); - struct wmi_method_args_32 args; + struct wmi_method_args_32 args =3D {}; enum thermal_mode mode; int ret; =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index a6be3463341c..1e06b894cfcc 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -166,7 +166,7 @@ MODULE_PARM_DESC(relax_fan_constraint, */ static int lwmi_om_fan_get_set(struct lwmi_om_priv *priv, int channel, u32= *val, bool set) { - struct wmi_method_args_32 args; + struct wmi_method_args_32 args =3D {}; u32 method_id, retval; int err; =20 @@ -773,7 +773,7 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, struct tunable_attr_01 *tunable_attr) { struct lwmi_om_priv *priv =3D dev_get_drvdata(tunable_attr->dev); - struct wmi_method_args_32 args; + struct wmi_method_args_32 args =3D {}; struct capdata01 capdata; enum thermal_mode mode; u32 attribute_id; @@ -836,7 +836,7 @@ static ssize_t attr_current_value_show(struct kobject *= kobj, struct tunable_attr_01 *tunable_attr) { struct lwmi_om_priv *priv =3D dev_get_drvdata(tunable_attr->dev); - struct wmi_method_args_32 args; + struct wmi_method_args_32 args =3D {}; enum thermal_mode mode; u32 attribute_id; int retval; --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dl1-f43.google.com (mail-dl1-f43.google.com [74.125.82.43]) (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 86143299937 for ; Sun, 10 May 2026 04:25:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387156; cv=none; b=dWOg1AG6QniWktDXjHQShOUhnbuSN/Y3T1oGA+hyC/10gBx9ecRDt8jmlsQ9hMBPF051R3KRgmG8nJstEZXu/VICgxTxyYDTA7jldOHVXILUqzn5ALjrj6FQXs2ARlVO/cSBIyWZm3jlSTaTljryBAwo69xjBEezvcgCSFjQQus= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387156; c=relaxed/simple; bh=Tk/2aJhhC1s684/DYFLDntYmRO/aqAyYK0+/EXewrns=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GozyGyJPubGilNaf8dA+VFBODERmyRBGgr6UwD37y+yiKufGOkagBeJQ3MlpX1dIGNXMFVA//eNe8kHQnY5AkMlXW7d5GMiIfCY93jeyB3qWaPAOjSxxN0d/S3RIUI6XtlZU3bCxjLbu0m4iewhDb3miXDfEwd0oKz9+oC/zg9Y= 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=F4yqSHb5; arc=none smtp.client-ip=74.125.82.43 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="F4yqSHb5" Received: by mail-dl1-f43.google.com with SMTP id a92af1059eb24-1329507c387so4040290c88.1 for ; Sat, 09 May 2026 21:25:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387154; x=1778991954; 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=4+i5mv8Vqi4F1/QxRhQ01iidaQ4oFBJaEVmCvLgpSXI=; b=F4yqSHb5Ndk+NeL4fWDRY4HOAtYUIex+1HQVhZWD0aT29e82OxWT1kZfVPLQlnwygG YqNhjI37mNkXdHWM/tjcQlA3Eppdz5+R5oif22VqjEnDfC64LNQmOVFdnclWJDRShHpO AdAWQQelW2+7qcXDkvs3KifSBpPDJfTL37RI9mfo9wnEY8itVRzmZcMmwipmaE7W622r mCvdG5ZPxtdzXe2r1923NluYeMi6d5DSikkBQ7YyaFjwLKZdRYzqGvlkpNrG2zKap17e xOMfq41S0uwfWhcl5U/0kzXwVhG/wwfoKoBs58uH5ycRIDS6DhgDnFWq/eTVUtHlPYOn 8SRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387154; x=1778991954; 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=4+i5mv8Vqi4F1/QxRhQ01iidaQ4oFBJaEVmCvLgpSXI=; b=K3sE0TOnnaxkdoioYlwWo2nQOxjOsiytZjdeTCf129iPlRaYGF8TkZpAdsNLV+a5uy HK4VvsRcnQQnNAL2ASjRrWiyRTi9YEkADULC7ijW5jah2Iu7Wu2FQ8TFEIfIy8Sw+eTs WiXyV/K+n91YF2pgUTTXghgjfSG6Vehitp/V/DbB3fk2GALgbxnl60tn2fOZNTw5Ka50 ujRmBYaPogfXNOb9OsE27T6ZEmlBbtS7i/Dvg/6JfUu4UzkJ+BvyfR6IuDEj5FbKsZX6 1ZLIc7uuVtgkIOesjbW8jfamMfSadG+VrQOtidps9KWdtgwxf/pz7IE26QcHKkTUsdzy QSrQ== X-Forwarded-Encrypted: i=1; AFNElJ8ry5sj2N/EidpuD6kkPA+Qn41ZGksJD48knCEZE4bqrFABjZ2JYcf1Q48Y0F0X4SY5vNiEOYpWFeohF/s=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6TYSG8jJnVIUEfXFCV7LassdfU8tpxJSms0EyXqji/zs66E2K z7JypbpLEqBpsSQTviFJtGispXfH2hN1luA3o48GrXWgNPKXj1Z/0GfK X-Gm-Gg: Acq92OHXhyXpvUzWITaSxMeZIHr02TnAomgG/wrCnb2dE3PT1iNR7Ul8youR6KwRfwJ 6zA5xqv0lX3sCHHejaS1KZ9aPvo307l19zUlmrl93q0/WpMex1UiTgFMKFpBwYBPO0pg5B46QY4 ZxWK7+oEUhzbeOcVxI7GcVRIgFT2PdMLkZCsGyzfjf974V1PAiWV8EvxfVBitharPnNVsek1vJ3 6MRG9GdZzU3JzKU6Ndf7uzkupPuK+bJ6CzUbzt6zVUfjU38pwGKJkOFAwojHT4OHnl6JIF8ePi6 LpU6GJBpHPNyuSwnvrpijZpvhhWer4VOnx+hSS8rqxpYhT39vKF8h9JX4qM8GnXOpiD3eJbKeQo 96yOHZiikv2vZ8yp5j1D/fC6cHrJ7kwv+293Hh/olzt6DOX4LQUuOJw2qXV18RoGipTTBSgd1p5 49BwT8PvpFarhZGJ+Ou6Kire/Ig1jGU2Gts6j/s/3byKhh/HFuUWU8scVwufGzlSMGSvtVT442I 8tJuZ6iU0g0v3JmxJN8XUvsbw== X-Received: by 2002:a05:7300:6ca8:b0:2f5:3641:f110 with SMTP id 5a478bee46e88-2f54d790853mr9736990eec.31.1778387153587; Sat, 09 May 2026 21:25:53 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:53 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v12 05/16] platform/x86: lenovo-wmi-other: Fix tunable_attr_01 struct members Date: Sun, 10 May 2026 04:25:35 +0000 Message-ID: <20260510042546.436874-6-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" In struct tunable_attr_01 the capdata pointer is unused and the size of the id members is u32 when it should be u8. Fix these prior to adding additional members. No functional change intended. Reviewed-by: Mark Pearson Cc: stable@vger.kernel.org Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- v12: - Drop fixes tag in formatting only patch. --- drivers/platform/x86/lenovo/wmi-other.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 1e06b894cfcc..50a03f5fd6ab 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -546,11 +546,10 @@ static void lwmi_om_fan_info_collect_cd_fan(struct de= vice *dev, struct cd_list * /* =3D=3D=3D=3D=3D=3D=3D=3D fw_attributes (component: lenovo-wmi-capdata 0= 1) =3D=3D=3D=3D=3D=3D=3D=3D */ =20 struct tunable_attr_01 { - struct capdata01 *capdata; struct device *dev; - u32 feature_id; - u32 device_id; - u32 type_id; + u8 feature_id; + u8 device_id; + u8 type_id; }; =20 static struct tunable_attr_01 ppt_pl1_spl =3D { --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f180.google.com (mail-dy1-f180.google.com [74.125.82.180]) (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 72F792BD02A for ; Sun, 10 May 2026 04:25:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387157; cv=none; b=FawTu2odHZZfEFzn36W6Wo+WAk7HIeprIwV0dQSPDukZFQMCO2bwuR+goaIBbcrTq1vf4a1c5Mdba1INRmzbn274t4dXm9EMBhqa1YT1yMuFILTR4EQ0EqNVYDt+ymDNuWjCCpL3WFzpwKVNYtfaNEtJYThF0CusT9dCdA+LEE0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387157; c=relaxed/simple; bh=bj4C9Fc61rCAzPyrp61MDvcTmd2sCIQxMjxgyu5JgQQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q0cUFJhg2o+SuFWPnAHqg0qjBhlcO0Qq81uRm9AnfwauSXX6hg2d2/iZx4IZc0yoQub/lFvSeZSftVWQV6IQ1vwiJPCa/kx5oTr2GQgVGPjuNN+HQsjTVFfQ6fVxIeBRA2wNZ2EUS2CG0FWoOWEe86BSISyHjo63Z3I5exRdVRw= 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=IXYBDdvT; arc=none smtp.client-ip=74.125.82.180 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="IXYBDdvT" Received: by mail-dy1-f180.google.com with SMTP id 5a478bee46e88-2c15849aa2cso4033260eec.0 for ; Sat, 09 May 2026 21:25:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387155; x=1778991955; 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=p1cRzZDSWJH5H5+eCrS0Sgu0LPV5VbpIpPVM+ffFO/g=; b=IXYBDdvTEf8N3dLW+2XztHbe/bIOl2iY2uFYd7lQtK8bH7Pt7FkyV2OMPZ1gAt5Ieu Fm+izoD5G1B/vJI084fzhsRgJPqFBeQ3f7CUw9OtKUymB7n4xdLOsU1RBcPEs0X6YsW6 Gr4sm5TYglht+5S9jkzJcahWDhLqn7nQG1QsUVfZJhPU1vJM6I44Sh6gS38VuywFXrZp nry4RezE8ax6yinJ5EXTIGiwyX2mAowFnBpEYP0mBlqapxlir6JwDJ9oCpvOKyHDQ0Lm ghDlbB/WRaSEC3dqyYR1elNY6M5o95sMXWcdtDqsypWX6SKQF0JXSQ3ZHI9szqDGK+vY D+FQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387155; x=1778991955; 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=p1cRzZDSWJH5H5+eCrS0Sgu0LPV5VbpIpPVM+ffFO/g=; b=d3vbQiAp0SfYETigMn54mrun84q8Q9Un2OPOIIr8lYHeKMHRJPvB6fIyVfgi6Vy/W6 77lTL7ZmNWFqD/DYVbSxkMJyBjB2WqNTV1/W3c8bnUxus2ahgmnkobub3oROrHfqC18c vc5KhrQxlTKhHXJ7tlDRA62MlgRDu2txjQzCZw8t/KaNjKZs9kEdt3qXrkzsItOVUxtO Oz/CzLKBsIPJUs3ill+9zmblPvvJXH/VFmVOyQYLhRwFzfsUymkagw7WUQm6cO4Ik86s Y/xkHbC+Vp3hWJ/UcpiHhBo9IE0rzSQDnYH2uc+6T1Z/dXwsS4QX9weMMlM+3I+Vkda1 Fq4Q== X-Forwarded-Encrypted: i=1; AFNElJ+6YOxlYv12cGkHn3/Hg3K9nP0ks3ORvuLm1y5/Jlebw9c/hngy1LYZr6AG4hQV0xmjCubLsDAaHuZhhYU=@vger.kernel.org X-Gm-Message-State: AOJu0YyAGVV8bTHv8OonJYJct53tMqyQIlFJvL5R3OzGz1NR35uyTo8j osLPl1Ftyuk80ZDxGsxOWmuCvsxNKjEFUQ3UayC1odvbXh4d+/Gx+XRp X-Gm-Gg: Acq92OGND0itQD2ELZYyDBB1h9E2wLFKlrxy/CmXo8jDTfrTgHiHOGokRS13//4WAeE N0esz2lHwasmwmQRy8fDCCo6m6vamFKroCf5gaDvTXSF/sjQZsePwcz15AzAABAnoo1i26pVfc1 GFpNBIB+ehMSEoixkB6Gvv3N7VxdcsgpDysz3VcelQRaT6ytFNyc6sXEUiOLGjnO++TNGh7P1xo UMpMS05KpcduzIRCLuQeNNX86atCCG7+8CAeHMS2azkNgRMCHKSLhsfO/fttj3qeFp/kqFc8KYu FcY5aRBGc43Aamj/zBQwrN4nmyhUkyg3i2zzkoS/nGNZYH+xa14aEzm+B4sLW6ouu3OfbnetYpN 2SwoIyHny7LpwkUZWJjUS24gqITRphMeUSsvu23QK1AbkDS+p7xqa9WkqUszqDwJ6M/IMVQ/15A b8tQsmWlb3ns3Yoi+qSxGH+o+keXzQwEzDuKVgaHExrhAvq7E4JP2v1XRDkoGH9sVXGC8chwjOU 6GpsHal/hYI/xY= X-Received: by 2002:a05:693c:300b:b0:2ea:5057:a2f9 with SMTP id 5a478bee46e88-2f549f7c2aamr8976103eec.16.1778387154454; Sat, 09 May 2026 21:25:54 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:54 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, kernel test robot Subject: [PATCH v12 06/16] platform/x86: lenovo: Decouple lenovo-wmi-gamezone and lenovo-wmi-other Date: Sun, 10 May 2026 04:25:36 +0000 Message-ID: <20260510042546.436874-7-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" From: Rong Zhang Currently, lenovo-wmi-gamezone depends on lenovo-wmi-other as the former imports symbols from the latter. The imported symbols are just used to register a notifier block. However, there is no runtime dependency between both drivers, and either of them can run without the other, which is the major purpose of using the notifier framework. Such a link-time dependency is non-optimal. A previous attempt to "fix" it made LENOVO_WMI_GAMEZONE select LENOVO_WMI_TUNING, which was fundamentally broken and resulted in undefined Kconfig behavior, as `select' cannot be used on a symbol with potentially unmet dependencies. Decouple both drivers by moving the thermal mode notifier chain to lenovo-wmi-helpers. Methods for notifier block (un)registration are exported for lenovo-wmi-gamezone, while a method for querying the current thermal mode are exported for lenovo-wmi-other. This turns the dependency graph from +------------ lenovo-wmi-gamezone | | v | lenovo-wmi-helpers | ^ | | V +------------ lenovo-wmi-other into +------------ lenovo-wmi-gamezone | v lenovo-wmi-helpers ^ | +------------ lenovo-wmi-other To make it clear, the name of the notifier chain is also renamed from `om_chain_head' to `tm_chain_head', indicating that it's used to query the current thermal mode. No functional change intended. Reviewed-by: Mark Pearson Fixes: 6e38b9fcbfa3 ("platform/x86: lenovo: gamezone needs "other mode"") Cc: stable@vger.kernel.org Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202603252259.gHvJDyh3-lkp@int= el.com/ Closes: https://lore.kernel.org/oe-kbuild-all/202603260302.X0NjQOda-lkp@int= el.com/ Signed-off-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/Kconfig | 1 - drivers/platform/x86/lenovo/wmi-gamezone.c | 4 +- drivers/platform/x86/lenovo/wmi-helpers.c | 101 ++++++++++++++++++++ drivers/platform/x86/lenovo/wmi-helpers.h | 8 ++ drivers/platform/x86/lenovo/wmi-other.c | 104 +-------------------- drivers/platform/x86/lenovo/wmi-other.h | 16 ---- 6 files changed, 112 insertions(+), 122 deletions(-) delete mode 100644 drivers/platform/x86/lenovo/wmi-other.h diff --git a/drivers/platform/x86/lenovo/Kconfig b/drivers/platform/x86/len= ovo/Kconfig index f885127b007f..09b1b055d2e0 100644 --- a/drivers/platform/x86/lenovo/Kconfig +++ b/drivers/platform/x86/lenovo/Kconfig @@ -252,7 +252,6 @@ config LENOVO_WMI_GAMEZONE select ACPI_PLATFORM_PROFILE select LENOVO_WMI_EVENTS select LENOVO_WMI_HELPERS - select LENOVO_WMI_TUNING help Say Y here if you have a WMI aware Lenovo Legion device and would like = to use the platform-profile firmware interface to manage power usage. diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.c b/drivers/platform/= x86/lenovo/wmi-gamezone.c index ca559e6c031d..a91089694727 100644 --- a/drivers/platform/x86/lenovo/wmi-gamezone.c +++ b/drivers/platform/x86/lenovo/wmi-gamezone.c @@ -23,7 +23,6 @@ #include "wmi-events.h" #include "wmi-gamezone.h" #include "wmi-helpers.h" -#include "wmi-other.h" =20 #define LENOVO_GAMEZONE_GUID "887B54E3-DDDC-4B2C-8B88-68A26A8835D0" =20 @@ -385,7 +384,7 @@ static int lwmi_gz_probe(struct wmi_device *wdev, const= void *context) return ret; =20 priv->mode_nb.notifier_call =3D lwmi_gz_mode_call; - return devm_lwmi_om_register_notifier(&wdev->dev, &priv->mode_nb); + return devm_lwmi_tm_register_notifier(&wdev->dev, &priv->mode_nb); } =20 static const struct wmi_device_id lwmi_gz_id_table[] =3D { @@ -407,7 +406,6 @@ module_wmi_driver(lwmi_gz_driver); =20 MODULE_IMPORT_NS("LENOVO_WMI_EVENTS"); MODULE_IMPORT_NS("LENOVO_WMI_HELPERS"); -MODULE_IMPORT_NS("LENOVO_WMI_OTHER"); MODULE_DEVICE_TABLE(wmi, lwmi_gz_id_table); MODULE_AUTHOR("Derek J. Clark "); MODULE_DESCRIPTION("Lenovo GameZone WMI Driver"); diff --git a/drivers/platform/x86/lenovo/wmi-helpers.c b/drivers/platform/x= 86/lenovo/wmi-helpers.c index 018d7642e2bd..7a198259e393 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.c +++ b/drivers/platform/x86/lenovo/wmi-helpers.c @@ -21,11 +21,15 @@ #include #include #include +#include #include #include =20 #include "wmi-helpers.h" =20 +/* Thermal mode notifier chain. */ +static BLOCKING_NOTIFIER_HEAD(tm_chain_head); + /** * lwmi_dev_evaluate_int() - Helper function for calling WMI methods that * return an integer. @@ -84,6 +88,103 @@ int lwmi_dev_evaluate_int(struct wmi_device *wdev, u8 i= nstance, u32 method_id, }; EXPORT_SYMBOL_NS_GPL(lwmi_dev_evaluate_int, "LENOVO_WMI_HELPERS"); =20 +/** + * lwmi_tm_register_notifier() - Add a notifier to the blocking notifier c= hain + * @nb: The notifier_block struct to register + * + * Call blocking_notifier_chain_register to register the notifier block to= the + * thermal mode notifier chain. + * + * Return: 0 on success, %-EEXIST on error. + */ +int lwmi_tm_register_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&tm_chain_head, nb); +} +EXPORT_SYMBOL_NS_GPL(lwmi_tm_register_notifier, "LENOVO_WMI_HELPERS"); + +/** + * lwmi_tm_unregister_notifier() - Remove a notifier from the blocking not= ifier + * chain. + * @nb: The notifier_block struct to register + * + * Call blocking_notifier_chain_unregister to unregister the notifier bloc= k from the + * thermal mode notifier chain. + * + * Return: 0 on success, %-ENOENT on error. + */ +int lwmi_tm_unregister_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&tm_chain_head, nb); +} +EXPORT_SYMBOL_NS_GPL(lwmi_tm_unregister_notifier, "LENOVO_WMI_HELPERS"); + +/** + * devm_lwmi_tm_unregister_notifier() - Remove a notifier from the blocking + * notifier chain. + * @data: Void pointer to the notifier_block struct to register. + * + * Call lwmi_tm_unregister_notifier to unregister the notifier block from = the + * thermal mode notifier chain. + * + * Return: 0 on success, %-ENOENT on error. + */ +static void devm_lwmi_tm_unregister_notifier(void *data) +{ + struct notifier_block *nb =3D data; + + lwmi_tm_unregister_notifier(nb); +} + +/** + * devm_lwmi_tm_register_notifier() - Add a notifier to the blocking notif= ier + * chain. + * @dev: The parent device of the notifier_block struct. + * @nb: The notifier_block struct to register + * + * Call lwmi_tm_register_notifier to register the notifier block to the + * thermal mode notifier chain. Then add devm_lwmi_tm_unregister_notifier + * as a device managed action to automatically unregister the notifier blo= ck + * upon parent device removal. + * + * Return: 0 on success, or an error code. + */ +int devm_lwmi_tm_register_notifier(struct device *dev, + struct notifier_block *nb) +{ + int ret; + + ret =3D lwmi_tm_register_notifier(nb); + if (ret < 0) + return ret; + + return devm_add_action_or_reset(dev, devm_lwmi_tm_unregister_notifier, + nb); +} +EXPORT_SYMBOL_NS_GPL(devm_lwmi_tm_register_notifier, "LENOVO_WMI_HELPERS"); + +/** + * lwmi_tm_notifier_call() - Call functions for the notifier call chain. + * @mode: Pointer to a thermal mode enum to retrieve the data from. + * + * Call blocking_notifier_call_chain to retrieve the thermal mode from the + * lenovo-wmi-gamezone driver. + * + * Return: 0 on success, or an error code. + */ +int lwmi_tm_notifier_call(enum thermal_mode *mode) +{ + int ret; + + ret =3D blocking_notifier_call_chain(&tm_chain_head, + LWMI_GZ_GET_THERMAL_MODE, &mode); + if ((ret & ~NOTIFY_STOP_MASK) !=3D NOTIFY_OK) + return -EINVAL; + + return 0; +} +EXPORT_SYMBOL_NS_GPL(lwmi_tm_notifier_call, "LENOVO_WMI_HELPERS"); + MODULE_AUTHOR("Derek J. Clark "); MODULE_DESCRIPTION("Lenovo WMI Helpers Driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/lenovo/wmi-helpers.h b/drivers/platform/x= 86/lenovo/wmi-helpers.h index 20fd21749803..651a039228ed 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.h +++ b/drivers/platform/x86/lenovo/wmi-helpers.h @@ -7,6 +7,8 @@ =20 #include =20 +struct device; +struct notifier_block; struct wmi_device; =20 struct wmi_method_args_32 { @@ -17,4 +19,10 @@ struct wmi_method_args_32 { int lwmi_dev_evaluate_int(struct wmi_device *wdev, u8 instance, u32 method= _id, unsigned char *buf, size_t size, u32 *retval); =20 +int lwmi_tm_register_notifier(struct notifier_block *nb); +int lwmi_tm_unregister_notifier(struct notifier_block *nb); +int devm_lwmi_tm_register_notifier(struct device *dev, + struct notifier_block *nb); +int lwmi_tm_notifier_call(enum thermal_mode *mode); + #endif /* !_LENOVO_WMI_HELPERS_H_ */ diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 50a03f5fd6ab..f63e568a4e12 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -40,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -49,7 +48,6 @@ #include "wmi-events.h" #include "wmi-gamezone.h" #include "wmi-helpers.h" -#include "wmi-other.h" #include "../firmware_attributes_class.h" =20 #define LENOVO_OTHER_MODE_GUID "DC2A8805-3A8C-41BA-A6F7-092E0089CD3B" @@ -81,7 +79,6 @@ #define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 -static BLOCKING_NOTIFIER_HEAD(om_chain_head); static DEFINE_IDA(lwmi_om_ida); =20 enum attribute_property { @@ -109,7 +106,6 @@ struct lwmi_om_priv { struct device *hwmon_dev; struct device *fw_attr_dev; struct kset *fw_attr_kset; - struct notifier_block nb; struct wmi_device *wdev; int ida_id; =20 @@ -575,102 +571,6 @@ struct capdata01_attr_group { struct tunable_attr_01 *tunable_attr; }; =20 -/** - * lwmi_om_register_notifier() - Add a notifier to the blocking notifier c= hain - * @nb: The notifier_block struct to register - * - * Call blocking_notifier_chain_register to register the notifier block to= the - * lenovo-wmi-other driver notifier chain. - * - * Return: 0 on success, %-EEXIST on error. - */ -int lwmi_om_register_notifier(struct notifier_block *nb) -{ - return blocking_notifier_chain_register(&om_chain_head, nb); -} -EXPORT_SYMBOL_NS_GPL(lwmi_om_register_notifier, "LENOVO_WMI_OTHER"); - -/** - * lwmi_om_unregister_notifier() - Remove a notifier from the blocking not= ifier - * chain. - * @nb: The notifier_block struct to register - * - * Call blocking_notifier_chain_unregister to unregister the notifier bloc= k from the - * lenovo-wmi-other driver notifier chain. - * - * Return: 0 on success, %-ENOENT on error. - */ -int lwmi_om_unregister_notifier(struct notifier_block *nb) -{ - return blocking_notifier_chain_unregister(&om_chain_head, nb); -} -EXPORT_SYMBOL_NS_GPL(lwmi_om_unregister_notifier, "LENOVO_WMI_OTHER"); - -/** - * devm_lwmi_om_unregister_notifier() - Remove a notifier from the blocking - * notifier chain. - * @data: Void pointer to the notifier_block struct to register. - * - * Call lwmi_om_unregister_notifier to unregister the notifier block from = the - * lenovo-wmi-other driver notifier chain. - * - * Return: 0 on success, %-ENOENT on error. - */ -static void devm_lwmi_om_unregister_notifier(void *data) -{ - struct notifier_block *nb =3D data; - - lwmi_om_unregister_notifier(nb); -} - -/** - * devm_lwmi_om_register_notifier() - Add a notifier to the blocking notif= ier - * chain. - * @dev: The parent device of the notifier_block struct. - * @nb: The notifier_block struct to register - * - * Call lwmi_om_register_notifier to register the notifier block to the - * lenovo-wmi-other driver notifier chain. Then add devm_lwmi_om_unregiste= r_notifier - * as a device managed action to automatically unregister the notifier blo= ck - * upon parent device removal. - * - * Return: 0 on success, or an error code. - */ -int devm_lwmi_om_register_notifier(struct device *dev, - struct notifier_block *nb) -{ - int ret; - - ret =3D lwmi_om_register_notifier(nb); - if (ret < 0) - return ret; - - return devm_add_action_or_reset(dev, devm_lwmi_om_unregister_notifier, - nb); -} -EXPORT_SYMBOL_NS_GPL(devm_lwmi_om_register_notifier, "LENOVO_WMI_OTHER"); - -/** - * lwmi_om_notifier_call() - Call functions for the notifier call chain. - * @mode: Pointer to a thermal mode enum to retrieve the data from. - * - * Call blocking_notifier_call_chain to retrieve the thermal mode from the - * lenovo-wmi-gamezone driver. - * - * Return: 0 on success, or an error code. - */ -static int lwmi_om_notifier_call(enum thermal_mode *mode) -{ - int ret; - - ret =3D blocking_notifier_call_chain(&om_chain_head, - LWMI_GZ_GET_THERMAL_MODE, &mode); - if ((ret & ~NOTIFY_STOP_MASK) !=3D NOTIFY_OK) - return -EINVAL; - - return 0; -} - /* Attribute Methods */ =20 /** @@ -779,7 +679,7 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, u32 value; int ret; =20 - ret =3D lwmi_om_notifier_call(&mode); + ret =3D lwmi_tm_notifier_call(&mode); if (ret) return ret; =20 @@ -841,7 +741,7 @@ static ssize_t attr_current_value_show(struct kobject *= kobj, int retval; int ret; =20 - ret =3D lwmi_om_notifier_call(&mode); + ret =3D lwmi_tm_notifier_call(&mode); if (ret) return ret; =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.h b/drivers/platform/x86= /lenovo/wmi-other.h deleted file mode 100644 index 8ebf5602bb99..000000000000 --- a/drivers/platform/x86/lenovo/wmi-other.h +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ - -/* Copyright (C) 2025 Derek J. Clark */ - -#ifndef _LENOVO_WMI_OTHER_H_ -#define _LENOVO_WMI_OTHER_H_ - -struct device; -struct notifier_block; - -int lwmi_om_register_notifier(struct notifier_block *nb); -int lwmi_om_unregister_notifier(struct notifier_block *nb); -int devm_lwmi_om_register_notifier(struct device *dev, - struct notifier_block *nb); - -#endif /* !_LENOVO_WMI_OTHER_H_ */ --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f170.google.com (mail-dy1-f170.google.com [74.125.82.170]) (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 1507B2BE033 for ; Sun, 10 May 2026 04:25:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387161; cv=none; b=KNSXkrqgswcBxIGd81X+6I4oPJS/Vpz1LUZc6vogsK/ubazQUTT94D8dXDB+ifXGA2UO5jlsGq5+UZ+AUbOeGA6w3HPW7B48MbCB0rXQ8t6OqmtxwRukZj9lnOuNonT1ZmPOa9pwrY32Ev55Jdy4UuzKzRXg4H6UcnrvZ1uR91M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387161; c=relaxed/simple; bh=34+fkHSR6l4jKj4YWixRZYYin5/PZ48FReD1pd7ivFc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GC6JyBBTttkFEkHNM+xyi38EnUTwvBGWixDWsdhnzzZsi3R9DSDDayocUiqlJ4pC4WQrb/2Yk2+yovA9lcyopi9qGoA/zCPvn01dNxxhVqLni9S1rOb14kYKHKZ6EpaY0cx3QxBGwbAq5xW0E0jeb3PIhmu1yvf5vy33G8GzTAI= 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=GgwLiZiO; arc=none smtp.client-ip=74.125.82.170 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="GgwLiZiO" Received: by mail-dy1-f170.google.com with SMTP id 5a478bee46e88-2ef8d6ba48bso1906131eec.1 for ; Sat, 09 May 2026 21:25:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387155; x=1778991955; 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=byCcm4UvUyAudsPVFuUMkipae/+5ZMC4ds8FS7jEx3I=; b=GgwLiZiO8kHYyhZ3YtGu3mlrNhgRyZqsKzi6oy+FvFeIYMboqd2Ld9wEYbOs7oUgQl TfDSJYwLurm9pTFfJXu166pzCzlLXDiPbafcQHKuYPCdzGb0jfsGOUu+U0DUlnsX5sX4 LWBwX2XxFX7+0PxWzJyZ672s0Gevhjh/HozplsDsDeNVZMHwITm6G1TqVbXXZ+zkZ/X1 UKq7Mgs8OoY9vEYoIR+5aEA6l60rg7vtUey9wOuvVaU2bGDauEKftmKV1xAwBsp1XbMk NDTyJGX2TAT+gXv4zTebSv9Q7QMap/C/8pUcneyyz5ZZ1z9r47oBA0YnkeXwh8XprJ+U NGsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387155; x=1778991955; 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=byCcm4UvUyAudsPVFuUMkipae/+5ZMC4ds8FS7jEx3I=; b=awbS2HYUo4vEHv2QVON3ukHXZF+5RdjfvqBJ4QjyxezRkkgbnZzl0kfM1JNwUWbwg8 AKRmejnwqQz9yZParYlNmZtO5jal/kaEONh5RjfcZ/EK7iXps51UMKtd8nPw0j3lzxPA NkDGIZBdrHZqHThP4/YYOT6VsUzuL+v3olWrTyEcnoM/FO/rIgRmjcnULF6Ab9deFGdP 8Le4w8u3r4/5OMtEBIUiWSSRYbj+rZp83V4ks8vDsxivgRhqnnGLRNyKjRYK18vCB2Ez aokReE7xlOXfXFv77Qlp9a8CoscNEKtyJnmD0XpUdQWw+Vjcr2k5cK01nh7Ym2PRL/AB eDUQ== X-Forwarded-Encrypted: i=1; AFNElJ/oWU90+37claqZz9w0iVO82vYVkbd3O2JucV3ogw9GeFPM0a0FV2TllIODoO/E1P6sHm782nBMCRTcMG8=@vger.kernel.org X-Gm-Message-State: AOJu0YxVBt5LMI5LdOta/ZR+V4YFCId0nW5L4GzNwTK3k5fAWnM2lzWT qBWYdpH/N9H7gGF2OLjwXimqsHPWqoFBvLQymqcNdpvulvFwYMka2+rg X-Gm-Gg: Acq92OE3kEXPjujPJrFXG1viMJ4Zsdn5wVSrieNNkZ69WK6e2cSLT+F+XQId5odoRnA 4SCHf5nj38JFHCiCaREAzLmRFbDyN/NsC/It4H7UnUYR3BLXcGGZ8BvlDMR+jqiO5aqf09OiJsI 0bPRrD+qBSlDqzgnoTH5ddF2JSA11HP9qXcEoUzp4RVK+Y9cEjjJOQolEdl4leJJLKfqq79z6RR FmWkyGdCCuFHBa0MvgCCUAtlleQc7j9qrqKkPRpQ6bMdbPX+CP2eKnp7EMk/L6rlJirsy0fHCi/ Li8vdXOgBU8+zHSQA9OArKfH/iwYrLV7jmMG6WqKMzOf1fweGVxc8rVA/KbqjAb1UveWI+4NDlY VWOUkzXUXusqlnVa4rFUueFE6mKTtSNOcm6V6SEBoe4N3/lOqm3/N7RVIAzTAUJtwjJ8iDzxczI XR+5/CTdQmgtVtJefMlvusrTkSpiL6W7s7kf78bWOiLWPcqPybqVrTQJlxkAPBn7EwSOLc+5H+m D6M X-Received: by 2002:a05:7301:19a4:b0:2ed:a58c:942 with SMTP id 5a478bee46e88-2f6e28f9a48mr5723905eec.8.1778387155325; Sat, 09 May 2026 21:25:55 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:55 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v12 07/16] platform/x86: lenovo-wmi-helpers: Move gamezone enums to wmi-helpers Date: Sun, 10 May 2026 04:25:37 +0000 Message-ID: <20260510042546.436874-8-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" In a later patch in the series the thermal mode enum will be accessed across three separate drivers (wmi-capdata, wmi-gamezonem and wmi-other). An additional patch in the series will also add a function prototype that needs to reference this enum in wmi-helpers.h. To avoid having all these drivers begin to import each others headers, and to avoid declaring an opaque enum to hande the second case, move the thermal mode enum to helpers where it can be safely accessed by everything that needs it from a single import. While at it, since the gamezone_events_type enum is the only remaining item in the header, move that as well and remove the gamezone header entirely. Cc: stable@vger.kernel.org Reviewed-by: Mark Pearson Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- v12: - Drop fixes tag in formatting only patch. - Fix typo in commit message. v11: - Move to earlier in the series as later patches depend on it. --- drivers/platform/x86/lenovo/wmi-events.c | 2 +- drivers/platform/x86/lenovo/wmi-gamezone.c | 1 - drivers/platform/x86/lenovo/wmi-gamezone.h | 20 -------------------- drivers/platform/x86/lenovo/wmi-helpers.h | 13 +++++++++++++ drivers/platform/x86/lenovo/wmi-other.c | 1 - 5 files changed, 14 insertions(+), 23 deletions(-) delete mode 100644 drivers/platform/x86/lenovo/wmi-gamezone.h diff --git a/drivers/platform/x86/lenovo/wmi-events.c b/drivers/platform/x8= 6/lenovo/wmi-events.c index 0994cd7dd504..9e9f2e82e04d 100644 --- a/drivers/platform/x86/lenovo/wmi-events.c +++ b/drivers/platform/x86/lenovo/wmi-events.c @@ -17,7 +17,7 @@ #include =20 #include "wmi-events.h" -#include "wmi-gamezone.h" +#include "wmi-helpers.h" =20 #define THERMAL_MODE_EVENT_GUID "D320289E-8FEA-41E0-86F9-911D83151B5F" =20 diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.c b/drivers/platform/= x86/lenovo/wmi-gamezone.c index a91089694727..5a8f4aee02cf 100644 --- a/drivers/platform/x86/lenovo/wmi-gamezone.c +++ b/drivers/platform/x86/lenovo/wmi-gamezone.c @@ -21,7 +21,6 @@ #include =20 #include "wmi-events.h" -#include "wmi-gamezone.h" #include "wmi-helpers.h" =20 #define LENOVO_GAMEZONE_GUID "887B54E3-DDDC-4B2C-8B88-68A26A8835D0" diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.h b/drivers/platform/= x86/lenovo/wmi-gamezone.h deleted file mode 100644 index 6b163a5eeb95..000000000000 --- a/drivers/platform/x86/lenovo/wmi-gamezone.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ - -/* Copyright (C) 2025 Derek J. Clark */ - -#ifndef _LENOVO_WMI_GAMEZONE_H_ -#define _LENOVO_WMI_GAMEZONE_H_ - -enum gamezone_events_type { - LWMI_GZ_GET_THERMAL_MODE =3D 1, -}; - -enum thermal_mode { - LWMI_GZ_THERMAL_MODE_QUIET =3D 0x01, - LWMI_GZ_THERMAL_MODE_BALANCED =3D 0x02, - LWMI_GZ_THERMAL_MODE_PERFORMANCE =3D 0x03, - LWMI_GZ_THERMAL_MODE_EXTREME =3D 0xE0, /* Ver 6+ */ - LWMI_GZ_THERMAL_MODE_CUSTOM =3D 0xFF, -}; - -#endif /* !_LENOVO_WMI_GAMEZONE_H_ */ diff --git a/drivers/platform/x86/lenovo/wmi-helpers.h b/drivers/platform/x= 86/lenovo/wmi-helpers.h index 651a039228ed..ed7db3ebba6c 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.h +++ b/drivers/platform/x86/lenovo/wmi-helpers.h @@ -16,6 +16,19 @@ struct wmi_method_args_32 { u32 arg1; }; =20 +enum lwmi_event_type { + LWMI_GZ_GET_THERMAL_MODE =3D 0x01, +}; + +enum thermal_mode { + LWMI_GZ_THERMAL_MODE_NONE =3D 0x00, + LWMI_GZ_THERMAL_MODE_QUIET =3D 0x01, + LWMI_GZ_THERMAL_MODE_BALANCED =3D 0x02, + LWMI_GZ_THERMAL_MODE_PERFORMANCE =3D 0x03, + LWMI_GZ_THERMAL_MODE_EXTREME =3D 0xE0, /* Ver 6+ */ + LWMI_GZ_THERMAL_MODE_CUSTOM =3D 0xFF, +}; + int lwmi_dev_evaluate_int(struct wmi_device *wdev, u8 instance, u32 method= _id, unsigned char *buf, size_t size, u32 *retval); =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index f63e568a4e12..b4ed7af50a24 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -46,7 +46,6 @@ =20 #include "wmi-capdata.h" #include "wmi-events.h" -#include "wmi-gamezone.h" #include "wmi-helpers.h" #include "../firmware_attributes_class.h" =20 --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f175.google.com (mail-dy1-f175.google.com [74.125.82.175]) (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 BB23C2DC331 for ; Sun, 10 May 2026 04:25:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387161; cv=none; b=hrf0CeMYu1BXI0TszAjScbmvznbIy76LJ+rqRIxEfTFwILr/okzYLhliP/2uLrXhaQbPBZSE8+cXCmb3QsU/JYXuM4ps2XIKuc5+yve3RARaaoB5rCwWRUE1Fkm/y6YfC2XAqdvpe6/kgDi4dmmTCmdkveGMgJnbUhJhhLL7MrA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387161; c=relaxed/simple; bh=rtB7kXOAbEEnFe5fLjtmYZkBLTuwzu9NfWjFUgacF8s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ON8K6cb67P5PCUZtAkYiI9kHa+Cv9narnN5UlsrnMZuLsb4LpB9ZSvVbcJ65TxSi21U0NYm6vQ+f9hSjoAPyAbOpoJhrLA3ieQXuGMpbSRvT0GT7NyUb/JbgJa05T71cOL8KS+/n4dvXd/3NEDl7fvlvq4ZGuS+yVs7ZaWqxvIM= 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=af06FwvA; arc=none smtp.client-ip=74.125.82.175 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="af06FwvA" Received: by mail-dy1-f175.google.com with SMTP id 5a478bee46e88-2f33ae12f97so3225674eec.1 for ; Sat, 09 May 2026 21:25:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387156; x=1778991956; 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=no/pDLERRqLa/cFmcAEOSiBCI+pFTd4yzVbvME7Rz5c=; b=af06FwvATsoSO2s1PEiyH3HmaVYh86CDIvk50FEhMor0lg/wT0UO45IAikOjakrmr4 /F03alD8/P+GVjrLMoUNTUk0xigHw+/4IEkg0x/LGL21Lo3UVPKtzioGMJAi3J43IGvW j266klSNt39vJZw7HitUHHVxE9TVj0CZl5J3JC/Ua3PaDP4GvPk5wCb47mQlw2uvRN3p H5uanYUQ858npyFRzf3t4gAI0U+zyzaJryiUhyjenTc5/mih32puQp/HilDhB/4mvWt7 rO4KYVdTKUStee8etI5zEGKGtV7yGHRDYz1GWoc3b0aayBNG8MHysIsDlqWMwKYtJBKB pjGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387156; x=1778991956; 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=no/pDLERRqLa/cFmcAEOSiBCI+pFTd4yzVbvME7Rz5c=; b=OPWhtQKmHXSYhDbaMRWiu3nL90BN77FQbuhqsBJL6fNfC9coTgQ+DtywDyjLyqqoZL y83ix9df0AUS7Tm6si24xtu2bBbqDCgf5g72lBogaUuO68o9NC+RyVi6uvy73lgaiJs4 Hn2csHnXHt0i0sSVPVPGoNRAHPqRPTxerIIeo8I79vK8/IhuVUysTqkEIniKJzkenkun TLABQcaTdOso1sJa2LUlk3MyLKs8Zy/8N7a4sKxAcmBoYBUu2QF4O3Xlj2q7wpIm2daH hjF0GJri9FIi1ELGcYlSy9Y3KYUGQq4O4UWx9D/eSsojXehw1PpbMIPvedDma6aeKq4g bioA== X-Forwarded-Encrypted: i=1; AFNElJ+ZmkJzsFOwb2tT9hwYy+oASPU6HtamipM2VV5V0l1ikbBfVK8v5tQOwOFCGy2fbXpRQFVyi2KxhKxziP4=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9iuFq8AnspBW+Ra81OninLDcEsGn9Jn4rEieg95UeQ22f9lGs KMqX0LDfZRNlVQDOUTCKNYkGXUE7zjFd+HZnlxyAUBMtHjXTkP/Ju5gY X-Gm-Gg: Acq92OEYQfYCQTFO4aL9ZeSnNW510I779fIJ3nNvx5jKX3XI/tDKOCxoY7Ct1uJ7x9D qVihHQ6Cmmnze6dCC+EZOw2Vl9hHf46zRLzzAiaCVMU4Ll3Qo+Wiafm5z1v20HkRB53P69i4YPT rbzJiStKM7CJJ+W6BfbufjhXF63BihGe5xcNTlCmV/8gAZINCN6EniIhPJ9k6I8NhtIwpV2syoc XKosnzk52JN/lF8knYf4w4Mcv6BcpPSoAXKcJLoPzyXk3R28LAQUVNx1coNHnKkBinLqNbjB7J/ vLZPEJB0pZE5xFqcVeAlD6uWZRUnBh9VUKiiOn6+CHQuYHetE7BUXsO7QvxGEBoSb7myt0kOx7Z 3mAvWLScx9IwWzRedpwQ4dVwo8kSK7DZ301ME5QrtvSTn+n49sXeofo0vFbZa8Vh6ea1EVOev9Z y2hrjEIG+YW/29RFHwbxxY2AI6p/7nbGfgAetNkUOQWfIR4hVTC3L0WDsA3IpYZ2sD0s/RsFhnC jZc X-Received: by 2002:a05:7300:3207:b0:2c5:60d0:701e with SMTP id 5a478bee46e88-2f85bb73083mr4372047eec.3.1778387156148; Sat, 09 May 2026 21:25:56 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:55 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v12 08/16] platform/x86: lenovo-wmi-other: Add Attribute ID helper functions Date: Sun, 10 May 2026 04:25:38 +0000 Message-ID: <20260510042546.436874-9-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" Adds lwmi_attr_id() function. In the same vein as LWMI_ATTR_ID_FAN_RPM(), but as a generic, to de-duplicate attribute_id assignment biolerplate. Adds tunable_attr_01_id() function that breaks out the members of a tunable_attr_01 struct and passes them to lwmi_attr_id(). No functional change intended. Cc: stable@vger.kernel.org Reviewed-by: Rong Zhang Tested-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- v12: - Drop fixes tag in patch with no functional changes. - Clarify kerneldocs comments. v11: - Move to earlier in the series to clean up later patches that can use it. - Add helper function that takes a tunable_attr_01 instead of breaking out all struct members manually each time the macro is used. v9: - Fix dropped use of mode variable in current_value_show. v7: - Incorporate additional replacements in lwmi_attr_01_is_supported after moving the patch that adds it to earlier in the series. v6: - Move lwmi_attr_id to wmi-capdata.h as static inline. v5: - Move references to cv/cd_mode_id to patch 4/8. - Move lwmi_attr_id to wmi-capdata.c and export with namespace. v4: - Switch from macro to static inline to preserve types. --- drivers/platform/x86/lenovo/wmi-capdata.c | 8 ++-- drivers/platform/x86/lenovo/wmi-capdata.h | 20 +++++++++ drivers/platform/x86/lenovo/wmi-other.c | 49 +++++++++-------------- 3 files changed, 44 insertions(+), 33 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-capdata.c b/drivers/platform/x= 86/lenovo/wmi-capdata.c index ee1fb02d8e31..169665be4dcf 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.c +++ b/drivers/platform/x86/lenovo/wmi-capdata.c @@ -27,7 +27,6 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 #include -#include #include #include #include @@ -48,6 +47,7 @@ #include =20 #include "wmi-capdata.h" +#include "wmi-helpers.h" =20 #define LENOVO_CAPABILITY_DATA_00_GUID "362A3AFE-3D96-4665-8530-96DAD5BB30= 0E" #define LENOVO_CAPABILITY_DATA_01_GUID "7A8F5407-CB67-4D6E-B547-39B3BE0181= 54" @@ -58,9 +58,9 @@ =20 #define LWMI_FEATURE_ID_FAN_TEST 0x05 =20 -#define LWMI_ATTR_ID_FAN_TEST \ - (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) | \ - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_TEST)) +#define LWMI_ATTR_ID_FAN_TEST \ + lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_TEST, \ + LWMI_GZ_THERMAL_MODE_NONE, LWMI_TYPE_ID_NONE) =20 enum lwmi_cd_type { LENOVO_CAPABILITY_DATA_00, diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index 8c1df3efcc55..c3e760b8c3c3 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -6,6 +6,7 @@ #define _LENOVO_WMI_CAPDATA_H_ =20 #include +#include #include =20 #define LWMI_SUPP_VALID BIT(0) @@ -19,6 +20,8 @@ =20 #define LWMI_DEVICE_ID_FAN 0x04 =20 +#define LWMI_TYPE_ID_NONE 0x00 + struct component_match; struct device; struct cd_list; @@ -57,6 +60,23 @@ struct lwmi_cd_binder { cd_list_cb_t cd_fan_list_cb; }; =20 +/** + * lwmi_attr_id() - Formats a capability data attribute ID + * @dev_id: The u8 corresponding to the device ID. + * @feat_id: The u8 corresponding to the feature ID on the device. + * @mode_id: The u8 corresponding to the wmi-gamezone mode for set/get. + * @type_id: The u8 corresponding to the sub-device. + * + * Return: encoded capability data attribute ID. + */ +static inline u32 lwmi_attr_id(u8 dev_id, u8 feat_id, u8 mode_id, u8 type_= id) +{ + return (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, dev_id) | + FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, feat_id) | + FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode_id) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, type_id)); +} + void lwmi_cd_match_add_all(struct device *master, struct component_match *= *matchptr); int lwmi_cd00_get_data(struct cd_list *list, u32 attribute_id, struct capd= ata00 *output); int lwmi_cd01_get_data(struct cd_list *list, u32 attribute_id, struct capd= ata01 *output); diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index b4ed7af50a24..4da0da8459c7 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -59,8 +59,6 @@ =20 #define LWMI_FEATURE_ID_FAN_RPM 0x03 =20 -#define LWMI_TYPE_ID_NONE 0x00 - #define LWMI_FEATURE_VALUE_GET 17 #define LWMI_FEATURE_VALUE_SET 18 =20 @@ -68,13 +66,12 @@ #define LWMI_FAN_NR 4 #define LWMI_FAN_ID(x) ((x) + LWMI_FAN_ID_BASE) =20 -#define LWMI_ATTR_ID_FAN_RPM(x) \ - (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) | \ - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_RPM) | \ - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, LWMI_FAN_ID(x))) - #define LWMI_FAN_DIV 100 =20 +#define LWMI_ATTR_ID_FAN_RPM(x) \ + lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \ + LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x)) + #define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 @@ -547,6 +544,18 @@ struct tunable_attr_01 { u8 type_id; }; =20 +/** + * tunable_attr_01_id() - Formats a tunable_attr_01 to a capdata attribute= ID + * @attr: The tunable_attr_01 to format. + * @mode: The u8 corresponding to the wmi-gamezone mode for set/get. + * + * Return: encoded capability data attribute ID. + */ +static u32 tunable_attr_01_id(struct tunable_attr_01 *attr, u8 mode) +{ + return lwmi_attr_id(attr->device_id, attr->feature_id, mode, attr->type_i= d); +} + static struct tunable_attr_01 ppt_pl1_spl =3D { .device_id =3D LWMI_DEVICE_ID_CPU, .feature_id =3D LWMI_FEATURE_ID_CPU_SPL, @@ -614,12 +623,7 @@ static ssize_t attr_capdata01_show(struct kobject *kob= j, u32 attribute_id; int value, ret; =20 - attribute_id =3D - FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, - LWMI_GZ_THERMAL_MODE_CUSTOM) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + attribute_id =3D tunable_attr_01_id(tunable_attr, LWMI_GZ_THERMAL_MODE_CU= STOM); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, attribute_id, &capdata); if (ret) @@ -674,7 +678,6 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, struct wmi_method_args_32 args =3D {}; struct capdata01 capdata; enum thermal_mode mode; - u32 attribute_id; u32 value; int ret; =20 @@ -685,13 +688,9 @@ static ssize_t attr_current_value_store(struct kobject= *kobj, if (mode !=3D LWMI_GZ_THERMAL_MODE_CUSTOM) return -EBUSY; =20 - attribute_id =3D - FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D tunable_attr_01_id(tunable_attr, mode); =20 - ret =3D lwmi_cd01_get_data(priv->cd01_list, attribute_id, &capdata); + ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); if (ret) return ret; =20 @@ -702,7 +701,6 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, if (value < capdata.min_value || value > capdata.max_value) return -EINVAL; =20 - args.arg0 =3D attribute_id; args.arg1 =3D value; =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, @@ -736,7 +734,6 @@ static ssize_t attr_current_value_show(struct kobject *= kobj, struct lwmi_om_priv *priv =3D dev_get_drvdata(tunable_attr->dev); struct wmi_method_args_32 args =3D {}; enum thermal_mode mode; - u32 attribute_id; int retval; int ret; =20 @@ -744,13 +741,7 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, if (ret) return ret; =20 - attribute_id =3D - FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); - - args.arg0 =3D attribute_id; + args.arg0 =3D tunable_attr_01_id(tunable_attr, mode); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f175.google.com (mail-dy1-f175.google.com [74.125.82.175]) (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 BB3562DC783 for ; Sun, 10 May 2026 04:25:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387161; cv=none; b=HVEZVjOb91RLuBXkdZuXaCd/bRKulDoYpaDki6WmK7CA/sjiOkpbSrJJV8IucqNySCr+iFhQO9Sx4HaWYYxi96EOdUYotyExsB+iO39zTKV4WwD35D/jf0sINlcDEA0vmw37s5HFVt1gwrZFanBJDlY9+2Bk00oDBwV5Ii7JudI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387161; c=relaxed/simple; bh=wrZCEpxGJ1HrG+ZmPhbTEh8zz+vUelD8MO2uqSqDolI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EdspNU/Wxc05bk+U9b9kM2kuxyE/3aE9kHIsmshqWMHK7c6Nk/Y8GAzrEqze7dKqPxdy9VUF5HIejBSSvr3oU4t+o1qGrBcHQObr/ms8KYNFnrD5yQaKreEo1+8qQk5lC2ZT3Hs0OwtxPIYSag/nXX0TzNDEvqNPD1EKXbD0LYk= 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=DJMFxTz2; arc=none smtp.client-ip=74.125.82.175 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="DJMFxTz2" Received: by mail-dy1-f175.google.com with SMTP id 5a478bee46e88-2ecf9e398f4so8709203eec.1 for ; Sat, 09 May 2026 21:25:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387157; x=1778991957; 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=iMjJCm7j0mrZhLPBJddnmVOHTjp+7AQzabv6smV3XbA=; b=DJMFxTz2QGIAI/qxnYg1VdzC93EXAhC9Q+3oEVguYL6z/qe/QxL51h0L/5wNTUauvL FWlciqObmPDdj/SlOQvrMet41vyTg/+15l+VHUb3Aq0oH0gpkQ4ogw3wOXrhvJeTvTI8 KoJRlNo87eTiwOa83hu9hA1rHs3VVbe8PSQEm88QvfKIxgG4DHt2Z+tSfFCRmYfj/nAe 8ZWJj9vwJFftQ5TVKszdphNUB9ZjjfnYmHrhvJSbPNrLJaU2Gryd+fS1Bm9WzNmXlgrv wH//+2NZ54OUX2akOOewm+eHeCNT33bQ0uJKsuhXAj1J3zt1xJtZYYATXKDeqlxXx5tb aPrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387157; x=1778991957; 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=iMjJCm7j0mrZhLPBJddnmVOHTjp+7AQzabv6smV3XbA=; b=ZY0ESJx6rmOUeTx7MVCnZ3rjsgSR00GnreAXm4bN4ogUQYn+5C8+qB0uDyttxERMoU N/tUb7V3w9p/nGii9/8mHuPxFi6XPhc2bsIbfaw3+rRIz0ijjZ61lCzcLnOcscaPxxC0 7mfLd1B/i1ymcExDcJtEb3/3lvPEFz6qAcrtuZqO77SkgMUgf3zSLN1FIvBH71oiXMs/ Z6rppHzNrmUTYur8p/CoObCQ37a/ep1Lm28p7Wam19yneSmN3SWK0Z2zfZf9YTTyi5MQ mjRjGvRiMhIdnktMPEaITo0Iy7qxWDKkSxjDhIGq+RgGSlMQBaTlsOVs6EoOuc90T5qV v+1g== X-Forwarded-Encrypted: i=1; AFNElJ/VX4foyIoRg3SdGzGFEG272DrOQZVn5oyYH3XwCpsvzhSquurN6Rv5ITLoSh7BLnkPd3egKjWXPUJJ7ZE=@vger.kernel.org X-Gm-Message-State: AOJu0YzO8AfsosIr1VojEk0ocGBJarpmfz9n4emPo2pWGefhzJR0Ncpf v81W15vOZvfJm8jIFlG9xa4YhmpmwiSTD0qGgjzqu0Y2tLAsqkAOEyrr X-Gm-Gg: Acq92OG+h9W6qA2ui7nHBcsm63kUwhTcUiuLl5YYRb7dkcpdR8T9nzOvw/gU243mmad aKW4qh63vLj5MLdlMh8e730odaD28JDNqDDULWz2EOhK+vqncq/UMZcFiBOC5E2Zvy2OWTnlkA/ mcbA84PCLO/FZcvFWsg3awnz98GhD3o9V0typojV5rCE4DPC8cPVSW2X7v0Gb4woSWdjPxeAmKk 5GgCyvxLuz3fleWjyFgFZczCASH50Gxj+EXi8IASSVJ8J/Z6T2CKLJOElsDkhFPi4iO3ResjmQQ t4amai1XdjwKNHRSh4NyuZsW0oWA0nFmSiaa5gA0CIqUyRWeW+G0dbeOv06eqC5p8L3J1euddhS 4lheFv6dLbJRnzaHlAgxQXM8VPM8ScWvx0sfbrwJ1HW/tldyWfK1wVyQHojJf/+LiC6N8iEodvl hFORhEy6wyx1ZTGRzizBOrCjBI+VOSngtfJ+kP1rc2t2o07MKsTpchL/3h1FaTRxaHNYINfCWmv 57t7yo6ny908j8= X-Received: by 2002:a05:7301:6790:b0:2de:c5ca:c1f3 with SMTP id 5a478bee46e88-2f54ad72101mr8973026eec.4.1778387156999; Sat, 09 May 2026 21:25:56 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:56 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v12 09/16] platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices Date: Sun, 10 May 2026 04:25:39 +0000 Message-ID: <20260510042546.436874-10-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" Adds lwmi_is_attr_01_supported, and only creates the attribute subfolder if the attribute is supported by the hardware. Due to some poorly implemented BIOS this is a multi-step sequence of events. This is because: - Some BIOS support getting the capability data from custom mode (0xff), while others only support it in no-mode (0x00). - Some BIOS support get/set for the current value from custom mode (0xff), while others only support it in no-mode (0x00). - Some BIOS report capability data for a method that is not fully implemented. - Some BIOS have methods fully implemented, but no complimentary capability data. To ensure we only expose fully implemented methods with corresponding capability data, we check each outcome before reporting that an attribute can be supported. Checking for lwmi_is_attr_01_supported during remove is not done to ensure that we don't attempt to call cd01 or send WMI events if one of the interfaces being removed was the cause of the driver unloading. Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Reported-by: Kurt Borja Closes: https://lore.kernel.org/platform-driver-x86/DG60P3SHXR8H.3NSEHMZ6J7= XRC@gmail.com/ Cc: stable@vger.kernel.org Reviewed-by: Rong Zhang Tested-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- v12: - Reword lwmi_is_attr_01_supported kerneldoc text block. - Fix formatting in lwmi_is_attr_01_supported. - Use correct type cast when passing args in new funciton. v11: - Also use cd_mode_id in attr_capdata_show. v7: - Move earlier in the series. This required dropping the use of lwmi_attr_id as it will be added later. - Add missing switch between cd_mode_id and cv_mode_id in current_value_store. v6: - Zero initialize args in lwmi_is_attr_01_supported. - Fix formatting. v5: - Move cv/cd_mode_id refrences from path 3/4. - Add missing import for ARRAY_SIZE. - Make lwmi_is_attr_01_supported return bool instead of u32. - Various formatting fixes. v4: - Use for loop instead of backtrace gotos for checking if an attribute is supported. - Add include for dev_printk. - Wrap dev_dbg in lwmi_is_attr_01_supported earlier. - Don't use symmetric cleanup of attributes in error states. --- drivers/platform/x86/lenovo/wmi-other.c | 92 +++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 4da0da8459c7..e6834dec2381 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -542,6 +542,8 @@ struct tunable_attr_01 { u8 feature_id; u8 device_id; u8 type_id; + u8 cd_mode_id; /* mode arg for searching capdata */ + u8 cv_mode_id; /* mode arg for set/get current_value */ }; =20 /** @@ -623,7 +625,7 @@ static ssize_t attr_capdata01_show(struct kobject *kobj, u32 attribute_id; int value, ret; =20 - attribute_id =3D tunable_attr_01_id(tunable_attr, LWMI_GZ_THERMAL_MODE_CU= STOM); + attribute_id =3D tunable_attr_01_id(tunable_attr, tunable_attr->cd_mode_i= d); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, attribute_id, &capdata); if (ret) @@ -688,7 +690,7 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, if (mode !=3D LWMI_GZ_THERMAL_MODE_CUSTOM) return -EBUSY; =20 - args.arg0 =3D tunable_attr_01_id(tunable_attr, mode); + args.arg0 =3D tunable_attr_01_id(tunable_attr, tunable_attr->cd_mode_id); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); if (ret) @@ -701,6 +703,7 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, if (value < capdata.min_value || value > capdata.max_value) return -EINVAL; =20 + args.arg0 =3D tunable_attr_01_id(tunable_attr, tunable_attr->cv_mode_id); args.arg1 =3D value; =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, @@ -741,6 +744,10 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, if (ret) return ret; =20 + /* If "no-mode" is the supported mode, ensure we never send current mode = */ + if (tunable_attr->cv_mode_id =3D=3D LWMI_GZ_THERMAL_MODE_NONE) + mode =3D tunable_attr->cv_mode_id; + args.arg0 =3D tunable_attr_01_id(tunable_attr, mode); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, @@ -752,6 +759,81 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, return sysfs_emit(buf, "%d\n", retval); } =20 +/** + * lwmi_attr_01_is_supported() - Determine if the given attribute is suppo= rted. + * @tunable_attr: The attribute to verify. + * + * For an attribute to be supported it must have a functional get/set meth= od, + * as well as associated capability data stored in the capdata01 table. + * + * First check if the attribute has a corresponding data table under custo= m mode + * (0xff), then under no mode (0x00). If either of those passes, check if = the + * supported field of the capdata struct is > 0. If it is supported, store= the + * successful mode in the cd_mode_id field of tunable_attr. + * + * If the attribute capdata shows it is supported, attempt to determine th= e mode + * for the current value property get/set methods using a similar pattern = to the + * capdata table check. If the value returned by either mode is 0 or an er= ror, + * assume that mode is not supported. Otherwise, store the successful mode= in the + * cv_mode_id field of tunable_attr. + * + * If any of the above checks fail then the attribute is not fully support= ed. + * + * Return: true if capdata and set/get modes are found, otherwise false. + */ +static bool lwmi_attr_01_is_supported(struct tunable_attr_01 *tunable_attr) +{ + u8 modes[2] =3D { LWMI_GZ_THERMAL_MODE_CUSTOM, LWMI_GZ_THERMAL_MODE_NONE = }; + struct lwmi_om_priv *priv =3D dev_get_drvdata(tunable_attr->dev); + struct wmi_method_args_32 args =3D {}; + bool cd_mode_found =3D false; + bool cv_mode_found =3D false; + struct capdata01 capdata; + int retval, ret, i; + + /* Determine tunable_attr->cd_mode_id */ + for (i =3D 0; i < ARRAY_SIZE(modes); i++) { + args.arg0 =3D tunable_attr_01_id(tunable_attr, modes[i]); + + ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); + if (ret || !capdata.supported) + continue; + + tunable_attr->cd_mode_id =3D modes[i]; + cd_mode_found =3D true; + break; + } + + if (!cd_mode_found) + return cd_mode_found; + + dev_dbg(tunable_attr->dev, + "cd_mode_id: %#010x\n", args.arg0); + + /* Determine tunable_attr->cv_mode_id, returns 1 if supported */ + for (i =3D 0; i < ARRAY_SIZE(modes); i++) { + args.arg0 =3D tunable_attr_01_id(tunable_attr, modes[i]); + + ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, + (u8 *)&args, sizeof(args), + &retval); + if (ret || !retval) + continue; + + tunable_attr->cv_mode_id =3D modes[i]; + cv_mode_found =3D true; + break; + } + + if (!cv_mode_found) + return cv_mode_found; + + dev_dbg(tunable_attr->dev, "cv_mode_id: %#010x, attribute support level: = %#010x\n", + args.arg0, capdata.supported); + + return capdata.supported > 0; +} + /* Lenovo WMI Other Mode Attribute macros */ #define __LWMI_ATTR_RO(_func, _name) \ { \ @@ -875,12 +957,14 @@ static void lwmi_om_fw_attr_add(struct lwmi_om_priv *= priv) } =20 for (i =3D 0; i < ARRAY_SIZE(cd01_attr_groups) - 1; i++) { + cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; + if (!lwmi_attr_01_is_supported(cd01_attr_groups[i].tunable_attr)) + continue; + err =3D sysfs_create_group(&priv->fw_attr_kset->kobj, cd01_attr_groups[i].attr_group); if (err) goto err_remove_groups; - - cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; } return; =20 --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f169.google.com (mail-dy1-f169.google.com [74.125.82.169]) (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 A96F129BD87 for ; Sun, 10 May 2026 04:25:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387160; cv=none; b=E6tSh4CgYYMndsKO1Radlq1kdnYgEt0MMNDioeN0wkGFRpaYNnjYoMZ/qAhoP9kjrcTQL89sXTIoQNoS9DixotBeM3dUsZkG+NMEWVM93qNI2AY/l4FKms4lvId5dggq7EjvevqkKbhhzvNtnZfB8zFdcVTscrjIo2y/Dkq67Zc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387160; c=relaxed/simple; bh=0YJ2mGtXs7oR6Bdz5DJ0rUlnC2n4UGHIBGCDMZGzoHc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r3qw99QLBqy0IQoc6YImGxAHtoWzV29Mx80MHpmu7spNcUXb122sunXrjg2xUPV+NmneREu7Y2gml/a49OlxIqTN5PoJ128zCrE2bYXWZ2RErbU7pzhpcW1+4hkVsB1WLL7rBSln3Q1akLHE8Ox4cwe6c9chI5++AQqlnQQ+r9A= 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=Bivi/iJ9; arc=none smtp.client-ip=74.125.82.169 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="Bivi/iJ9" Received: by mail-dy1-f169.google.com with SMTP id 5a478bee46e88-2b4520f6b32so5726772eec.0 for ; Sat, 09 May 2026 21:25:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387158; x=1778991958; 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=yJ3472GP71sRhCd8CKP2V4Y6tZBdEnK/su5iObiDPXk=; b=Bivi/iJ90UL8VX8Q66h0mV1kBk1ttfoXgjjr9/w0hMhBB5NAsVFKM1wWK2LIVM9702 zJaIYgVomENV7Yuvkm2tEENixMhaCxiO4e7m8oGNtGPZnxX4mRfWexS8wXSRA6ghIDoP TbAF8Qg8/zazTu0fdyLZkqMiOIcYa4P7K1tcTISynpntZqlU62UpAJnFFot/UILDN85F ws4wNkWvDZd9U5/Cip57VahMs7TqyDBVaQBv6l0v9g8wJX2Rm/DLhPP2OaKcl6dkZ8Ea dNmWxyca0zf7EKLB6qWsVetJkHga2J76+rMQYvliT/aPe7IwDHHUQckVuwFs6i0hhy8m eHWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387158; x=1778991958; 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=yJ3472GP71sRhCd8CKP2V4Y6tZBdEnK/su5iObiDPXk=; b=q5Erk1UPWz+oXAcJBfQH1qgJBT5Mvagc0puE7X9xGCBJGrDkLY5ucRU3OjC0VLJoZC PUlbMGzthbeNFMD8bGtiOr86veIqflsSH0IN+vbKg9y96rqxR7fb/uY6reYxXlyz3twE jA2zLAlmr/3GCXqD08Ooy4m87f/h+7lw3RNgPk9yDrEUmxluPl8Eg3f5lG+PuG6ZQQyC zPN48ue6MUW7GO5s5xIdxKiq8WiXVrimUIdiia7rlBPG5im4yIY7rKm4jpTd/h5uP4TJ C+mXUb29uavjEyLQk30S1W9nCJkzmNkvpS/Hfu1/iVJZY/Dv98PP/D0fJQBKIW4FKILX FbEw== X-Forwarded-Encrypted: i=1; AFNElJ/4H2I6RK1JDxQrviZhuttjbjDnK47n+a3D0TjrF2imonkC+vB5dxq+JoS+rbG7U6u/5c/ot+jIN7Cv+P0=@vger.kernel.org X-Gm-Message-State: AOJu0Yxk9vS4D/khHf5jRU7xuqD99QJ6SiTxY0cI9CIlk9t9KaBA8kPU 4fFhOn+5nIfgGVDLc4iSPwR6yO5id2bNc7VNqkuWCV9RpLvyxXksuGKW X-Gm-Gg: Acq92OHhRTWeVs5M8VINfA8C5NKMf9Xv0ZlThGhIbd06eNVC5j6dG78za/qt80arqnj I+p8dS44Y9RG+18PYNrKcsWdEN8XZ8sPEcEtwp+8oVyMlU54SF3aMN3+o8GT4nYFiTMY+wOySZs knIMwQO92Z3g5jxwSkUmSyFqcFMCd9LBJbUeTIUuWl1cTPTkMR6hYClEtsZAcsOIOFP1XMR4ofl toodkM19nEIKqKY0TeaQphREH7nMuhVoGhzlaYXyG42+8hnWOyneaAhAQES97bpQWRrMGmOx6Yd yIJ31mTawFqlbCATa3Sd7Hhv7BhmvfV34QuKXTTpglPOfAxOfLddp6O/a0fkximL1ZauvN1F5dp NDDtCJiHalhRlfRuDYT4Ah5oLuO+aJDxgGRIeAV3Po0bTId7nIWzJPMNOvFN0AUTylQlu6apUkU diuOV4ohfN6axZ8BBrVYiaSAQJnrWh7HAqjNJ/B1mMoR7Y28VW+yGP8UdBqjp28dXqSVPTgpubV xqG X-Received: by 2002:a05:7301:5784:b0:2f3:dbfa:1955 with SMTP id 5a478bee46e88-2f550f44b83mr8817978eec.34.1778387157853; Sat, 09 May 2026 21:25:57 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:57 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v12 10/16] platform/x86: lenovo-wmi-other: Add missing CPU tunable attributes Date: Sun, 10 May 2026 04:25:40 +0000 Message-ID: <20260510042546.436874-11-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" Use an enum for all device ID's and CPU attribute feature ID's, add missing CPU attributes. Reviewed-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- v7: - Fix typo in documentation. v4: - Align type ID defines. - Align CPU feature enum values. - remove cpu_oc_stat from Documentation. v3: - Remove cpu_oc_stat. --- .../wmi/devices/lenovo-wmi-other.rst | 9 ++ drivers/platform/x86/lenovo/wmi-capdata.h | 5 +- drivers/platform/x86/lenovo/wmi-other.c | 99 ++++++++++++++++++- 3 files changed, 107 insertions(+), 6 deletions(-) diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation= /wmi/devices/lenovo-wmi-other.rst index 01d471156738..189dd4d31926 100644 --- a/Documentation/wmi/devices/lenovo-wmi-other.rst +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst @@ -68,9 +68,18 @@ Each attribute has the following properties: - type =20 The following firmware-attributes are implemented: + - cpu_temp: CPU Thermal Load Limit + - ppt_cpu_cl: CPU Cross Loading Power Limit + - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit + - ppt_pl1_spl_cl: Platform Profile Tracking Cross Loading Sustained Power= Limit + - ppt_pl1_tau: Exceed Duration for Platform Profile Tracking Sustained Po= wer Limit - ppt_pl2_sppt: Platform Profile Tracking Slow Package Power Tracking + - ppt_pl2_sppt_cl: Platform Profile Tracking Cross Loading Slow Package T= racking - ppt_pl3_fppt: Platform Profile Tracking Fast Package Power Tracking + - ppt_pl3_fppt_cl: Platform Profile Tracking Cross Loading Fast Package P= ower Tracking + - ppt_pl4_ipl: Platform Profile Tracking Instantaneous Power Limit + - ppt_pl4_ipl_cl: Platform Profile Tracking Cross Loading Instantaneous P= ower Limit =20 LENOVO_FAN_TEST_DATA ------------------------- diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index c3e760b8c3c3..c74a0e5294e7 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -18,7 +18,10 @@ #define LWMI_ATTR_MODE_ID_MASK GENMASK(15, 8) #define LWMI_ATTR_TYPE_ID_MASK GENMASK(7, 0) =20 -#define LWMI_DEVICE_ID_FAN 0x04 +enum lwmi_device_id { + LWMI_DEVICE_ID_CPU =3D 0x01, + LWMI_DEVICE_ID_FAN =3D 0x04, +}; =20 #define LWMI_TYPE_ID_NONE 0x00 =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index e6834dec2381..5f7d7d353e90 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -51,14 +51,21 @@ =20 #define LENOVO_OTHER_MODE_GUID "DC2A8805-3A8C-41BA-A6F7-092E0089CD3B" =20 -#define LWMI_DEVICE_ID_CPU 0x01 - -#define LWMI_FEATURE_ID_CPU_SPPT 0x01 -#define LWMI_FEATURE_ID_CPU_SPL 0x02 -#define LWMI_FEATURE_ID_CPU_FPPT 0x03 +enum lwmi_feature_id_cpu { + LWMI_FEATURE_ID_CPU_SPPT =3D 0x01, + LWMI_FEATURE_ID_CPU_SPL =3D 0x02, + LWMI_FEATURE_ID_CPU_FPPT =3D 0x03, + LWMI_FEATURE_ID_CPU_TEMP =3D 0x04, + LWMI_FEATURE_ID_CPU_APU =3D 0x05, + LWMI_FEATURE_ID_CPU_CL =3D 0x06, + LWMI_FEATURE_ID_CPU_TAU =3D 0x07, + LWMI_FEATURE_ID_CPU_IPL =3D 0x09, +}; =20 #define LWMI_FEATURE_ID_FAN_RPM 0x03 =20 +#define LWMI_TYPE_ID_CROSSLOAD 0x01 + #define LWMI_FEATURE_VALUE_GET 17 #define LWMI_FEATURE_VALUE_SET 18 =20 @@ -564,18 +571,72 @@ static struct tunable_attr_01 ppt_pl1_spl =3D { .type_id =3D LWMI_TYPE_ID_NONE, }; =20 +static struct tunable_attr_01 ppt_pl1_spl_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_SPL, + .type_id =3D LWMI_TYPE_ID_CROSSLOAD, +}; + static struct tunable_attr_01 ppt_pl2_sppt =3D { .device_id =3D LWMI_DEVICE_ID_CPU, .feature_id =3D LWMI_FEATURE_ID_CPU_SPPT, .type_id =3D LWMI_TYPE_ID_NONE, }; =20 +static struct tunable_attr_01 ppt_pl2_sppt_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_SPPT, + .type_id =3D LWMI_TYPE_ID_CROSSLOAD, +}; + static struct tunable_attr_01 ppt_pl3_fppt =3D { .device_id =3D LWMI_DEVICE_ID_CPU, .feature_id =3D LWMI_FEATURE_ID_CPU_FPPT, .type_id =3D LWMI_TYPE_ID_NONE, }; =20 +static struct tunable_attr_01 ppt_pl3_fppt_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_FPPT, + .type_id =3D LWMI_TYPE_ID_CROSSLOAD, +}; + +static struct tunable_attr_01 cpu_temp =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_TEMP, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_pl1_apu_spl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_APU, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_cpu_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_CL, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_pl1_tau =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_TAU, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_pl4_ipl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_IPL, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_pl4_ipl_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_IPL, + .type_id =3D LWMI_TYPE_ID_CROSSLOAD, +}; + struct capdata01_attr_group { const struct attribute_group *attr_group; struct tunable_attr_01 *tunable_attr; @@ -911,17 +972,45 @@ static bool lwmi_attr_01_is_supported(struct tunable_= attr_01 *tunable_attr) .name =3D _fsname, .attrs =3D _attrname##_attrs \ } =20 +LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp", + "Set the CPU thermal load limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl", + "Set the CPU cross loading power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_apu_spl, "ppt_pl1_apu_spl", + "Set the APU sustained power limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_spl, "ppt_pl1_spl", "Set the CPU sustained power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_spl_cl, "ppt_pl1_spl_cl", + "Set the CPU cross loading sustained power limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl2_sppt, "ppt_pl2_sppt", "Set the CPU slow package power tracking limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl2_sppt_cl, "ppt_pl2_sppt_cl", + "Set the CPU cross loading slow package power tracking limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl3_fppt, "ppt_pl3_fppt", "Set the CPU fast package power tracking limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl3_fppt_cl, "ppt_pl3_fppt_cl", + "Set the CPU cross loading fast package power tracking limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_tau, "ppt_pl1_tau", + "Set the CPU sustained power limit exceed duration"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_ipl", + "Set the CPU instantaneous power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl", + "Set the CPU cross loading instantaneous power limit"); + =20 static struct capdata01_attr_group cd01_attr_groups[] =3D { + { &cpu_temp_attr_group, &cpu_temp }, + { &ppt_cpu_cl_attr_group, &ppt_cpu_cl }, + { &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl }, { &ppt_pl1_spl_attr_group, &ppt_pl1_spl }, + { &ppt_pl1_spl_cl_attr_group, &ppt_pl1_spl_cl }, + { &ppt_pl1_tau_attr_group, &ppt_pl1_tau }, { &ppt_pl2_sppt_attr_group, &ppt_pl2_sppt }, + { &ppt_pl2_sppt_cl_attr_group, &ppt_pl2_sppt_cl }, { &ppt_pl3_fppt_attr_group, &ppt_pl3_fppt }, + { &ppt_pl3_fppt_cl_attr_group, &ppt_pl3_fppt_cl }, + { &ppt_pl4_ipl_attr_group, &ppt_pl4_ipl }, + { &ppt_pl4_ipl_cl_attr_group, &ppt_pl4_ipl_cl }, {}, }; =20 --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f178.google.com (mail-dy1-f178.google.com [74.125.82.178]) (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 99C86282F29 for ; Sun, 10 May 2026 04:25:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387161; cv=none; b=K05+f0YtJ8CGUqGP7h1hlYUKdVF294efe320tVtPRfpCZmvuk/nWN+nFIielD/fsCrVQb6JZbuOviNctjx7KktDYce5DqgzKHpaz1SLsP2bjU62dIIg1bw9I7nCl0X5IHGrPrjeHtI9/SIHkMH15RHyPv1G/gK02JxXcMzeN44I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387161; c=relaxed/simple; bh=cZAkj4+tlHKa4ezsJzjY3hrvyqhr+bBbm0KjlLCzRP0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sjs3A9/bIw2ap1fruLoRk5otlaHb2GI2IHlXx0bIpQbWVUJqhouUHfY57d823oFCB90+rxoDRRhtKQXDLkTluW57vezaMW2AturRNZvm0RNf22/BQj7bQ5yhgEP0Imm+uTVI9AOO8lkdoIruWANILTu7NQvAZi1Mt7SuHTQle20= 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=nqiVLehT; arc=none smtp.client-ip=74.125.82.178 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="nqiVLehT" Received: by mail-dy1-f178.google.com with SMTP id 5a478bee46e88-2ef8d6ba48bso1906140eec.1 for ; Sat, 09 May 2026 21:25:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387159; x=1778991959; 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=VOzlvMONAy6ogeRc45/tNnY3rbJUwTVUZCB3cxp5xkg=; b=nqiVLehTm94GAijLUN10tjQvgr6l6yOyk2QqX+l2qZdfA4oMofTXw4NYJ46ENVOsUJ 8O84O/RcqXCgnvWIHy51SnXWZCj7L93Sz/NgDY1iWnxhRZ+68k2va5myiEstOW8NxfBA evr64mMbCCG2NHJCx6BJcAu7QgiETP19wiz36M0dIOPQEDgKyQJsBDo4rNwGHl/M8Bfa EnURUn8dTGX+7dfXrq73b63sAL3OUMwU3QtBmvs6FDSyO+L7KgRXGLSivU0K/+ZuRzbi Db3mhImtUpQgDsKxG4uS4Rtmq34l45OqTxowtB34G5R8NUoKGSzpNYdqk2C7OlFhMRUs woaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387159; x=1778991959; 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=VOzlvMONAy6ogeRc45/tNnY3rbJUwTVUZCB3cxp5xkg=; b=MEZtHqEx/nN4bJicx8tGbSbaqz8ORAJCwBjzBrARnP4lbOed31JAl1mpQ6ynzDfn7C KD+M9VyWkfPY5ym9Bov+9rSo9rT9Umz6drWz2Mxi/mwJvhw8C5LtOkFWs7wWqVvTZH+Y Aoi1W8nHKc794RQ3vZ661CpPLNLXWqkcPZ5coaTQCuzdLBbFxPptmz2ITKWR54Ft0g8X TbYWkriMv4RrT4adAVxANSUwilGGuoE5uAsGsMTp522uWwEkWsQ4VX3LmD2ZcBUy09AJ joQNNV6ki/v3x5g3DyJ5c2QAN5p7dSFWQFaHTG3553FJn6yzXTkAxHQ2KYk2MKPXHHJ6 JB9Q== X-Forwarded-Encrypted: i=1; AFNElJ/rCrQ4Mb6uRZq9W8HBlYtSRrnItCc2+3LXqi00J0eVb3biaCKZy/OGomTOnnELOrLrTHh/uGq9WpsY5e4=@vger.kernel.org X-Gm-Message-State: AOJu0YyXYGB6g/iWvlI6LXAHW2YH5BpUADMZ/WNu9FnlILX+QZXvWfck XVthogNYcckg49MLR0OUuVatge2Y5ecGqtNBjz0uafHSRn+Uolvhtg5k X-Gm-Gg: Acq92OGEpw8bjj/Cozs0QqR9/8Dnd9oTeOsS90ODkb4EpA0z/sHzvuFhBgfw9oZJHqx bXKEmBocU5HwhO377IoeBzD5ez/rh5t3HJueCmcD43ioXkXL2fg2/5WyKIk6/B88eYhpfWwhfkk mbOSig+GRxvKra84jKKm4VgduFO1oLrcfazV0dOnuJBJHirvZrG/5FLWbNIdeWGmDB1eJgRWYSn Y3z3aQlaSUm8TwA1rAlLFwUSs20NguOKBENWgzSTkNQw13K1xVQppp10gz6rz4WOqoMp2HAX3Qn X/5E3EY87G5042+KR1XqtrwLRgnUL+kncrRSF64mic699Qoy9lCMk4MVJgXadSX+vydEasTrjSf 0LpXYzCR4BEx5EPDNqjKU0x1IBk6VQl1wIP4i50cy1VmjaCR1Eb7YT5MD8nt/6+r9R+8rsgiJc7 f+QYU6bXrRKIr7wpFnCunLcejjCMf7p+jhszusI/RPI5Kjfs/W4Ckmn58sYgXr5ccXrwbjsY+XV Em0H/OqsH11j+s= X-Received: by 2002:a05:7301:1f04:b0:2f3:b7b2:cbd3 with SMTP id 5a478bee46e88-2f6e2402b30mr5297394eec.5.1778387158703; Sat, 09 May 2026 21:25:58 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:58 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v12 11/16] platform/x86: lenovo-wmi-other: Add GPU tunable attributes Date: Sun, 10 May 2026 04:25:41 +0000 Message-ID: <20260510042546.436874-12-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" Use an enum for all GPU attribute feature ID's and add GPU attributes. Reviewed-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- v9: - Rename gpu_didvid -> dgpu_didvid in documentation to match actual attribute name. v7: - Fix typo in dgpu_boost_clk attribute string. v4: - Align CPU feature enum values. - Remove gpu_oc_stat from Documentation. v3: - Remove gpu_oc_stat. --- .../wmi/devices/lenovo-wmi-other.rst | 10 ++ drivers/platform/x86/lenovo/wmi-capdata.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 105 ++++++++++++++++++ 3 files changed, 116 insertions(+) diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation= /wmi/devices/lenovo-wmi-other.rst index 189dd4d31926..011054d64eac 100644 --- a/Documentation/wmi/devices/lenovo-wmi-other.rst +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst @@ -69,6 +69,16 @@ Each attribute has the following properties: =20 The following firmware-attributes are implemented: - cpu_temp: CPU Thermal Load Limit + - dgpu_boost_clk: Dedicated GPU Boost Clock + - dgpu_didvid: Dedicated GPU Device Identifier and Vendor Identifier + - dgpu_enable: Dedicated GPU Enabled Status + - gpu_mode: GPU Mode by Power Limit + - gpu_nv_ac_offset: Nvidia GPU AC Total Processing Power Baseline Offset + - gpu_nv_bpl: Nvidia GPU Base Power Limit + - gpu_nv_cpu_boost: Nvidia GPU to CPU Dynamic Boost Limit + - gpu_nv_ctgp: Nvidia GPU Configurable Total Graphics Power + - gpu_nv_ppab: Nvidia GPU Power Performance Aware Boost Limit + - gpu_temp: GPU Thermal Load Limit - ppt_cpu_cl: CPU Cross Loading Power Limit - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index c74a0e5294e7..a7cfdeaa58f7 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -20,6 +20,7 @@ =20 enum lwmi_device_id { LWMI_DEVICE_ID_CPU =3D 0x01, + LWMI_DEVICE_ID_GPU =3D 0x02, LWMI_DEVICE_ID_FAN =3D 0x04, }; =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 5f7d7d353e90..d31af69433aa 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -62,6 +62,19 @@ enum lwmi_feature_id_cpu { LWMI_FEATURE_ID_CPU_IPL =3D 0x09, }; =20 +enum lwmi_feature_id_gpu { + LWMI_FEATURE_ID_GPU_NV_PPAB =3D 0x01, + LWMI_FEATURE_ID_GPU_NV_CTGP =3D 0x02, + LWMI_FEATURE_ID_GPU_TEMP =3D 0x03, + LWMI_FEATURE_ID_GPU_AC_OFFSET =3D 0x04, + LWMI_FEATURE_ID_DGPU_BOOST_CLK =3D 0x06, + LWMI_FEATURE_ID_DGPU_EN =3D 0x07, + LWMI_FEATURE_ID_GPU_MODE =3D 0x08, + LWMI_FEATURE_ID_DGPU_DIDVID =3D 0x09, + LWMI_FEATURE_ID_GPU_NV_BPL =3D 0x0a, + LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =3D 0x0b, +}; + #define LWMI_FEATURE_ID_FAN_RPM 0x03 =20 #define LWMI_TYPE_ID_CROSSLOAD 0x01 @@ -637,6 +650,66 @@ static struct tunable_attr_01 ppt_pl4_ipl_cl =3D { .type_id =3D LWMI_TYPE_ID_CROSSLOAD, }; =20 +static struct tunable_attr_01 gpu_nv_ppab =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_PPAB, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_ctgp =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_CTGP, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_temp =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_TEMP, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_ac_offset =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_AC_OFFSET, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 dgpu_boost_clk =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_DGPU_BOOST_CLK, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 dgpu_enable =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_DGPU_EN, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_mode =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_MODE, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 dgpu_didvid =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_DGPU_DIDVID, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_bpl =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_BPL, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_cpu_boost =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_CPU_BOOST, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + struct capdata01_attr_group { const struct attribute_group *attr_group; struct tunable_attr_01 *tunable_attr; @@ -972,6 +1045,7 @@ static bool lwmi_attr_01_is_supported(struct tunable_a= ttr_01 *tunable_attr) .name =3D _fsname, .attrs =3D _attrname##_attrs \ } =20 +/* CPU tunable attributes */ LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp", "Set the CPU thermal load limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl", @@ -997,9 +1071,40 @@ LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_i= pl", LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl", "Set the CPU cross loading instantaneous power limit"); =20 +/* GPU tunable attributes */ +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_boost_clk, "dgpu_boost_clk", + "Set the dedicated GPU boost clock"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_didvid, "dgpu_didvid", + "Get the GPU device identifier and vendor identifier"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_enable, "dgpu_enable", + "Set the dedicated Nvidia GPU enabled status"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_mode, "gpu_mode", + "Set the GPU mode by power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ac_offset, "gpu_nv_ac_offset", + "Set the Nvidia GPU AC total processing power baseline offset"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_bpl, "gpu_nv_bpl", + "Set the Nvidia GPU base power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_cpu_boost, "gpu_nv_cpu_boost", + "Set the Nvidia GPU to CPU dynamic boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ctgp, "gpu_nv_ctgp", + "Set the GPU configurable total graphics power"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ppab, "gpu_nv_ppab", + "Set the Nvidia GPU power performance aware boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_temp, "gpu_temp", + "Set the GPU thermal load limit"); =20 static struct capdata01_attr_group cd01_attr_groups[] =3D { { &cpu_temp_attr_group, &cpu_temp }, + { &dgpu_boost_clk_attr_group, &dgpu_boost_clk }, + { &dgpu_didvid_attr_group, &dgpu_didvid }, + { &dgpu_enable_attr_group, &dgpu_enable }, + { &gpu_mode_attr_group, &gpu_mode }, + { &gpu_nv_ac_offset_attr_group, &gpu_nv_ac_offset }, + { &gpu_nv_bpl_attr_group, &gpu_nv_bpl }, + { &gpu_nv_cpu_boost_attr_group, &gpu_nv_cpu_boost }, + { &gpu_nv_ctgp_attr_group, &gpu_nv_ctgp }, + { &gpu_nv_ppab_attr_group, &gpu_nv_ppab }, + { &gpu_temp_attr_group, &gpu_temp }, { &ppt_cpu_cl_attr_group, &ppt_cpu_cl }, { &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl }, { &ppt_pl1_spl_attr_group, &ppt_pl1_spl }, --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f174.google.com (mail-dy1-f174.google.com [74.125.82.174]) (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 645ED2D6E72 for ; Sun, 10 May 2026 04:26:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387163; cv=none; b=OMdxnJpPbyucZt0IRqXeelOcN2arXHdbKs66+Q57a6/EqgZ/TZLWCDaxuT0dmfKQv4nd6qtEkfXSoNcXgpSXwzG5Jel7pTP+t+wQQ6NUnrHeizcT4hvGmCtL1R9WjT+36OuPoX+hSESd+JQnqdgSVtjE0OSVnfkfDnwORFRXlQ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387163; c=relaxed/simple; bh=caZqlTRKqQF3IqrYehKOwh1MDmByNafnSmvdeaDjblg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pT8954FOySyJkhxkjynjperzP0LkayVyx/DnOdHtZSB9UfE8CXmEYSE35i7kUjBRR7QTzrIgBNMZaJdufkizfNxZXgG8U2HWaiiItXyYJX5LiN3anrH+hAT6latA02qc0Z0ONeo5FvGyg+ZcbPqYlQqh2yOnmofhK2YZ06dMjyI= 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=XZPiMvMJ; arc=none smtp.client-ip=74.125.82.174 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="XZPiMvMJ" Received: by mail-dy1-f174.google.com with SMTP id 5a478bee46e88-2f33ae12f97so3225710eec.1 for ; Sat, 09 May 2026 21:26:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387160; x=1778991960; 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=TZTffhfk4dyzIVwn7drdzYjvOglnYeXnZo5zKEHkWWI=; b=XZPiMvMJiOatXEOAVW5biQlN/HGrv3rzbdClpigE7oDr+cgSBYIHvyrRS9aQA1thoG z3apowNz1eGlLTlUAJtkGxGcAgXZYjDsEvIdf0jtb92gWxaTE5NVIcQsmpd6EdZFZGFJ aL8oxDjjLZ+HH0Qhw0y7laUuS4C1X+rPdNoXMmY14DFZVUGnQUHo61jNk7JJyKr7Ktp9 hMTBvs3H6WUeKmP3ZF6rUDwj1fav7zbscFi4UzHl1DKKGOdaSkAElLMUQl1avq/mKRaB GvdG3okZYnnokzY8G94pLs0KYxAKg3+hMzNkbJ4GLtmy8fd/viDKnY/HXAuT7Kv2kf9S nfBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387160; x=1778991960; 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=TZTffhfk4dyzIVwn7drdzYjvOglnYeXnZo5zKEHkWWI=; b=C7RzRCamK5gPUqz4mlTd2OGeF4pey+Q+S/1WlDk8xaWeWtAa8AGvM2dgb0IQu9DGrL Ri2IxXBF1Y3/RT8MZGQb0ruZXsQGf7fx5H4prrmfUf3pjFcNEwnJBb631CA+ufmIRg6F sHPFdX59J09EGbC0Rjtg3c+pgMC5DqwJiA/xE7d7r6NS+0Z+eP6aTB/roEmGrRmmBo2+ djizF1fMdIorEMMZVpkTPXekXC4LzsR1aQS1rFxh+vJTTeEMCvUYfc5UGG/USsoNKUlr dp2l1hkus5VTOU79kJhyLkHQaKUD12PSF/9FlZ0IycYQFukHY5NU+ptnKeOJh3rYEwMS hNiA== X-Forwarded-Encrypted: i=1; AFNElJ+g0ZsmH+0s22dwFxWBMpbuTHshd2v3YL8dgrGriN3m7zn6Lk+VcnQb+L2eMF+/3A280pd5pnV6dowQgDc=@vger.kernel.org X-Gm-Message-State: AOJu0YzuwW5OmzdwGMCXlrU1q0UI/1AZGt/kR1LCMc1Pg/LMcMoaGSmh 6YYNu62PB7ujTwBhqe+GfS0Y+U8vQbumva3trlFBnPf3G7MwPyNflX3s X-Gm-Gg: Acq92OGy1aMGat5Nmf8oRQs+lKrqfbY5Hl43v2a9lNQwMCMkxPUQqZP7lZMvZ/X92oK v7dhXtddRB0uqcH3EFns07sv7NeU6HjY7HE9/CuJSoUR1rMnfxHhepP/I70ZFOOuJNar8mpt2TX EYLcThyS9LzM0Fofyg9G+BRKPomE8bHLsZaF5pYt6Q1e3NUJhHHY71PfcpdG6y0Opm2sAJeI+yq 8HiMDIYA5m5GGcvKYPA1B0flmHHPFamMep7VIYWVzHXx3gSP/vJhTuylGfsgY0FWWZgH2PaEeiG R8GwQuQC/nq0pLyDMQ82swXcEB7porxOWQiKxhgY3jPBLDbat/VYsmkCb5EdNKxgGs8KM/ZjfSL vhwDT9QqojuvrBGq5jy1fec9nmiDLH9PqD5OoeKAre6Vfs2QJlY+a7BQebTjeNcgTVLswNJ/D+E j5cbLDSmzSKUi74fikJMtFRzYcghyR0QPeXodkGGLvs447LDQ57oEewHWG7wvFqFe3aDA7nPCNc oVJeTBf0KNh9yg= X-Received: by 2002:a05:7300:8187:b0:2ed:e16:6b4c with SMTP id 5a478bee46e88-2f85ea2ad44mr4633106eec.34.1778387159492; Sat, 09 May 2026 21:25:59 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:25:59 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v12 12/16] platform/x86: lenovo-wmi-other: Rename LWMI_OM_FW_ATTR_BASE_PATH Date: Sun, 10 May 2026 04:25:42 +0000 Message-ID: <20260510042546.436874-13-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" In the next patch a power supply extension is added which requires a name attribute. Instead of creating another const macro with the same information, rename LWMI_OM_FW_ATTR_BASE_PATH to LWMI_OM_SYSFS_NAME. Reviewed-by: Rong Zhang Tested-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-other.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index d31af69433aa..1cd2bb5244d2 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -92,7 +92,7 @@ enum lwmi_feature_id_gpu { lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \ LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x)) =20 -#define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" +#define LWMI_OM_SYSFS_NAME "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 static DEFINE_IDA(lwmi_om_ida); @@ -1136,8 +1136,7 @@ static void lwmi_om_fw_attr_add(struct lwmi_om_priv *= priv) =20 priv->fw_attr_dev =3D device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), NULL, "%s-%u", - LWMI_OM_FW_ATTR_BASE_PATH, - priv->ida_id); + LWMI_OM_SYSFS_NAME, priv->ida_id); if (IS_ERR(priv->fw_attr_dev)) { err =3D PTR_ERR(priv->fw_attr_dev); goto err_free_ida; --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f174.google.com (mail-dy1-f174.google.com [74.125.82.174]) (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 6468C2DF3F2 for ; Sun, 10 May 2026 04:26:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387164; cv=none; b=Xkvfe4LETlxOlHou7buOzkisWLZT5OXkOFFhZYmElmipS3uV/U6z1etmPZXN6nRjq0+wqHrDT++KN0l45ufEhLUL6oSVhgPXpXoagQQDgbbAHETjuLNAp7fn3LrvMnl0pom5xIvsCV+WDKpV5n8/H5IQ62LRTlc+HTvIQu6fd+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387164; c=relaxed/simple; bh=vDlqkqsk+KV6e58wjmZOIM4f2bT4B/aOZ9IAQeZ26xM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jh2gigMjuOi2iVcl81vYNg62w2Rijo3z3iLItavZPd821oScvyAB4TpvCm6FSDaPGGvkNgQBcMUCtsM9K9QfMxM50IsNvM/NPSqG/Cu4A1xD8jM5YIsuBCnyoPcGsqFFp9TBb3ry7u9UhYyDpse/o+vOd7QgB1jXQcILT458T94= 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=jZ4pcI4g; arc=none smtp.client-ip=74.125.82.174 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="jZ4pcI4g" Received: by mail-dy1-f174.google.com with SMTP id 5a478bee46e88-2f3c623322bso5361487eec.0 for ; Sat, 09 May 2026 21:26:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387161; x=1778991961; 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=xz3/JqoUhNYoFGTIyAeMyAR/r2Ht8u+K0vHE99/D1TU=; b=jZ4pcI4gPEGbM+AyDB6nw2btAbqGk5ybcc8GVZTEQtFWJiTm0DpPk2Rm9i9e0ANObB nRFsR8AREgIDAuYKjw4BpwaPkir9KPCIIdN5fatTNSKsiPOd5xW5lNWZEQlbz6XUhEsA CNn1sXsNHycMXBTwQDrP2MzRfkcR0ZqJy8m9wchcsbeJfY5WE2rm891g9I5jeQCOWeom 2AsVPgQunXM+dKmbu6FAD15cWnlFv5TVd9gMvsm2T550y4ViP6QPq/hS3bRrnmOgCbFz E2trGQMDTLssEMo5Kx0xaT9iX4DZHZDSkK1m49xmjA/1DaSW0RCQvTJTgYQmD5UTOeFH +IQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387161; x=1778991961; 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=xz3/JqoUhNYoFGTIyAeMyAR/r2Ht8u+K0vHE99/D1TU=; b=mq/Hm2tt6tjdLcYGAZRBGOhcspQ7gsRsg7nT6JKiNQjWlLC02gPpKrWWKk+EioPRny KZx3ENByCFO7R7gm1Zw2UzFWcuBe4IZLGgPNVka+surmaBrDJTEE/q2yEG28AzOA4Kpg mAtFQIsq9pjUZ7Sb359+RBBawdTK9KUlP6W7BGQUudHs+mN+ltsH490AM/Y1QdcQ8n63 2mAg/TxCTboytrf+SO8dbw5o8+CsQz1ptE0St8xjXkiA8ACgtpbBgq8Zpit3/Q/NFnRY aiXvW2FHye8UW7t/Oy4mMzny/j4t6cfnHiMLP15z1UcIntkWhsDaeH6L0dB868RlKhT6 xX/w== X-Forwarded-Encrypted: i=1; AFNElJ+zOivLvQWyfRY834mL3ZG1CL1VGvjhtEJIH0/DfGhog7XlGSH20lMNLwUJR51eqc2GJirw12Y3nOTpl4g=@vger.kernel.org X-Gm-Message-State: AOJu0YwaquX3s9bFerfDqwZBLJcSNPZetGzHi79ZIgWhglAeFM6n24MB EXUBOobmFyxymnD/8sssi4jqUm4nZzuoi0simVb07D4ufBBBW3ZjQbT8 X-Gm-Gg: Acq92OHhXRf4wJIXyeoYc9SNS9+xzwq2KaWVy1rfckWo3kVk1MAhuVD5gzlRzIwODrp tpjTudPDuJ4Kb1W4k1xFRtT2IEoBoRnSGhIlBQFb7OmchHbIRxAuPeKfT3kvPI2qdvP2NjIS6aY Ax7DeQLUWvdZ16lh7dLPZtwIi/HzXBK+g8nSL3MjCNN60WzXiLn67et1cG47659U00nd/6j5waq cQOKIR2sKkVeSE4KhwRxO+2pTzilut18tIo6ah0VbCjx1bQth+k1OnvCW1A2er4i17hoYHcW5ey PGvhAVMlQfhplPvBb0Al5vkAUloP6UAGye7hJWWOZRZ//dY/+zuJVdJQp8j6xZvtU4XYD+YsXWT 936F8DqqT0U/bCSYsKicrCCJ+eBZGv5gcdg9ZwN8LX4h226stSIS2bVk5tixUQsfMifYL+zLro+ bkX4AfvTiXSM7ZC6Zj8EADuCaaoPDVCHFZprKd+nHHeJk7jjduaMLlc5n76jX0lb5284KIuEEEr 5evNZXdrC12HwA= X-Received: by 2002:a05:7300:b919:b0:2e7:120:137b with SMTP id 5a478bee46e88-2f547f6f1a0mr10092874eec.0.1778387160466; Sat, 09 May 2026 21:26:00 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.25.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:26:00 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v12 13/16] platform/x86: lenovo-wmi-other: Add WMI battery charge limiting Date: Sun, 10 May 2026 04:25:43 +0000 Message-ID: <20260510042546.436874-14-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" Add charge_behaviour and charge_control_end_threshold attributes through a power supply extension for devices that support WMI based charge enable & disable. Lenovo Legion devices that implement WMI function and capdata ID 0x03010001 in their BIOS are able to enable or disable charging at 80% through the lenovo-wmi-other interface. Add a charge_control_end_threshold attribute for BATX devices to expose this capability. The GET method for this attribute is bugged. After analyzing the DSDT and some testing it appears the method grabs bit(3) instead of bit(4) from the EC register that stores the current status, and will only report if charging has been inhibited or not. To work around this, store and report the last setting written to the attribute. Additionally, devices that support WMI function and capdata ID 0x03020000 are able to force discharge of the battery. Expose this capability with a charge_behaviour attribute in the power supply extension, with the AUTO and FORCE_DISCHARGE behaviors enabled. As some devices only expose one attribute or the other, a bitmask is added with a lookup table and some helper macros to select the correct configuration for the hardware at runtime. The ideapad_laptop driver provides the charge_type attribute to provide similar functionality. When the WMI method is set this can corrupt the ACPI method return and cause hardware and driver errors. To avoid conflicts between the drivers, we get the acpi_handle and do the same check that ideapad_laptop does when it enables the feature. If the feature is supported in ideapad_laptop, abort adding the extension from lenovo-wmi-other. The ACPI method is more reliable when both are present, from my testing, so we can prefer that implementation and do not need to worry about de-conflicting from inside that driver. A new module parameter, force_load_psy_ext, is provided to bypass this ACPI check, as well as feature supported checks, if desired. Signed-off-by: Derek J. Clark --- v12: - Move force_load_psy_ext into its own patch after this. - Use correct type casting for args in new funtions. - Remove extra parenthesis. v11: - Refactor to use charge_behaviour and charge_control_end_threshold, per the class documentation. The ideapad_laptop driver will be fixed in a separate patch series. - Due to the extensive refactoring, I have removed the reviewed-by tags from Rong and Mark to allow them to recertify the code in its current state. v7: - Use devm_battery_hook_register, manually unregister during unbind. v6: - Check feature flags to determine if the extension should be loaded and if it is writable. - Zero initialize wmi_method_args_32. - Fix formatting. v5: - Use switch statement instead of if for battery charge state set/get. - use force_load_psy_ext to skip all ACPI interactions. - Various formatting fixes. v4: - Remove unused defines. - Disambiguate charging defines by renaming them to be more consistent with the kernel modes they represent. - Add module parameter to ignore ACPI checks. - Don't fail if the ACPI handle isn't found, skip the ACPI check instead. --- drivers/platform/x86/lenovo/Kconfig | 1 + drivers/platform/x86/lenovo/wmi-capdata.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 388 ++++++++++++++++++++++ 3 files changed, 390 insertions(+) diff --git a/drivers/platform/x86/lenovo/Kconfig b/drivers/platform/x86/len= ovo/Kconfig index 09b1b055d2e0..b9a5d18caa1e 100644 --- a/drivers/platform/x86/lenovo/Kconfig +++ b/drivers/platform/x86/lenovo/Kconfig @@ -262,6 +262,7 @@ config LENOVO_WMI_GAMEZONE config LENOVO_WMI_TUNING tristate "Lenovo Other Mode WMI Driver" depends on ACPI_WMI + depends on ACPI_BATTERY select HWMON select FW_ATTR_CLASS select LENOVO_WMI_CAPDATA diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index a7cfdeaa58f7..a49229cec245 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -21,6 +21,7 @@ enum lwmi_device_id { LWMI_DEVICE_ID_CPU =3D 0x01, LWMI_DEVICE_ID_GPU =3D 0x02, + LWMI_DEVICE_ID_PSU =3D 0x03, LWMI_DEVICE_ID_FAN =3D 0x04, }; =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 1cd2bb5244d2..4d95a9109f5e 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -41,9 +41,12 @@ #include #include #include +#include #include #include =20 +#include + #include "wmi-capdata.h" #include "wmi-events.h" #include "wmi-helpers.h" @@ -75,9 +78,15 @@ enum lwmi_feature_id_gpu { LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =3D 0x0b, }; =20 +enum lwmi_feature_id_psu { + LWMI_FEATURE_ID_PSU_CHARGE_END_THRESHOLD =3D 0x01, + LWMI_FEATURE_ID_PSU_CHARGE_BEHAVIOR =3D 0x02, +}; + #define LWMI_FEATURE_ID_FAN_RPM 0x03 =20 #define LWMI_TYPE_ID_CROSSLOAD 0x01 +#define LWMI_TYPE_ID_PSU_AC 0x01 =20 #define LWMI_FEATURE_VALUE_GET 17 #define LWMI_FEATURE_VALUE_SET 18 @@ -88,10 +97,19 @@ enum lwmi_feature_id_gpu { =20 #define LWMI_FAN_DIV 100 =20 +#define LWMI_CHARGE_BEHAVIOR_DISCHARGE 0x00 +#define LWMI_CHARGE_BEHAVIOR_AUTO 0x01 +#define LWMI_CHARGE_END_100 0x00 +#define LWMI_CHARGE_END_80 0x01 + #define LWMI_ATTR_ID_FAN_RPM(x) \ lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \ LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x)) =20 +#define LWMI_ATTR_ID_PSU(feat, type) \ + lwmi_attr_id(LWMI_DEVICE_ID_PSU, feat, \ + LWMI_GZ_THERMAL_MODE_NONE, type) + #define LWMI_OM_SYSFS_NAME "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 @@ -131,6 +149,11 @@ struct lwmi_om_priv { bool capdata00_collected : 1; bool capdata_fan_collected : 1; } fan_flags; + + enum power_supply_charge_behaviour charge_behaviour; + const struct power_supply_ext *battery_ext; + struct acpi_battery_hook battery_hook; + bool bh_registered; }; =20 /* @@ -555,6 +578,368 @@ static void lwmi_om_fan_info_collect_cd_fan(struct de= vice *dev, struct cd_list * lwmi_om_hwmon_add(priv); } =20 +/* =3D=3D=3D=3D=3D=3D=3D=3D Power Supply Extension (component: lenovo-wmi-= capdata 00) =3D=3D=3D=3D=3D=3D=3D=3D */ + +/** + * lwmi_psy_ext_get_prop() - Get a power_supply_ext property + * @ps: The battery that was extended + * @ext: The extension + * @ext_data: Pointer to the lwmi_om_priv drvdata + * @prop: The property to read + * @val: The value to return + * + * Writes the given value to the power_supply_ext property + * + * Return: 0 on success, or an error + */ +static int lwmi_psy_ext_get_prop(struct power_supply *ps, + const struct power_supply_ext *ext, + void *ext_data, + enum power_supply_property prop, + union power_supply_propval *val) +{ + struct lwmi_om_priv *priv =3D ext_data; + struct wmi_method_args_32 args =3D {}; + u32 retval; + int ret; + + switch (prop) { + case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR: + /* Reading from BIOS reads the wrong bit. Use cached value */ + val->intval =3D priv->charge_behaviour; + return 0; + case POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD: + args.arg0 =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_END_THRESHOLD, + LWMI_TYPE_ID_PSU_AC); + break; + default: + return -EINVAL; + } + + ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, + (u8 *)&args, sizeof(args), + &retval); + if (ret) + return ret; + + dev_dbg(&priv->wdev->dev, "Got return value %#x for property %#x\n", retv= al, prop); + + switch (retval) { + case LWMI_CHARGE_END_80: + val->intval =3D 80; + break; + case LWMI_CHARGE_END_100: + val->intval =3D 100; + break; + default: + dev_err(&priv->wdev->dev, "Got invalid charge limit value: %#x\n", retva= l); + return -EINVAL; + } + + return 0; +} + +/** + * lwmi_psy_ext_set_prop() - Set a power_supply_ext property + * @ps: The battery that was extended + * @ext: The extension + * @ext_data: Pointer to the lwmi_om_priv drvdata + * @prop: The property to write + * @val: The value to write + * + * Writes the given value to the power_supply_ext property + * + * Return: 0 on success, or an error + */ +static int lwmi_psy_ext_set_prop(struct power_supply *ps, + const struct power_supply_ext *ext, + void *ext_data, + enum power_supply_property prop, + const union power_supply_propval *val) +{ + struct lwmi_om_priv *priv =3D ext_data; + struct wmi_method_args_32 args =3D {}; + + switch (prop) { + case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR: + args.arg0 =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_BEHAVIOR, + LWMI_TYPE_ID_NONE); + switch (val->intval) { + case POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO: + args.arg1 =3D LWMI_CHARGE_BEHAVIOR_AUTO; + break; + case POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE: + args.arg1 =3D LWMI_CHARGE_BEHAVIOR_DISCHARGE; + break; + default: + dev_err(&priv->wdev->dev, "Got invalid charge behavior value: %#x\n", + val->intval); + return -EINVAL; + } + priv->charge_behaviour =3D val->intval; + break; + case POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD: + args.arg0 =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_END_THRESHOLD, + LWMI_TYPE_ID_PSU_AC); + switch (val->intval) { + case 0 ... 80: + args.arg1 =3D LWMI_CHARGE_END_80; + break; + case 81 ... 100: + args.arg1 =3D LWMI_CHARGE_END_100; + break; + default: + dev_err(&priv->wdev->dev, "Got invalid charge limit value: %#x\n", + val->intval); + return -EINVAL; + } + break; + default: + return false; + } + + dev_dbg(&priv->wdev->dev, "Attempting to set %#010x for property %#x to %= #x\n", + args.arg0, prop, args.arg1); + + return lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, + (u8 *)&args, sizeof(args), NULL); +} + +/** + * lwmi_psy_prop_is_suppported() - Determine if the property is supported + * @priv: Pointer to the lwmi_om_priv drvdata + * @prop: The power supply property to be evaluated + * + * Checks capdata 00 to determine if the property is supported. + * + * Return: true if readable, or false + */ +static bool lwmi_psy_prop_is_supported(struct lwmi_om_priv *priv, enum pow= er_supply_property prop) +{ + struct capdata00 capdata; + u32 attribute_id; + int ret; + + switch (prop) { + case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR: + attribute_id =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_BEHAVIOR, + LWMI_TYPE_ID_NONE); + break; + case POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD: + attribute_id =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_END_THRESHO= LD, + LWMI_TYPE_ID_PSU_AC); + break; + default: + return false; + } + + ret =3D lwmi_cd00_get_data(priv->cd00_list, attribute_id, &capdata); + if (ret) + return false; + + dev_dbg(&priv->wdev->dev, "Battery charge feature (%#010x) support level:= %#x\n", + attribute_id, capdata.supported); + + return (capdata.supported & LWMI_SUPP_VALID) && (capdata.supported & LWMI= _SUPP_GET); +} + +/** + * lwmi_psy_prop_is_writeable() - Determine if the property is writeable + * @ps: The battery that was extended + * @ext: The extension + * @ext_data: Pointer the lwmi_om_priv drvdata + * @prop: The property to check + * + * Checks capdata 00 to determine if the property is writable. + * + * Return: true if writable, or false + */ +static int lwmi_psy_prop_is_writeable(struct power_supply *ps, + const struct power_supply_ext *ext, + void *ext_data, + enum power_supply_property prop) +{ + struct lwmi_om_priv *priv =3D ext_data; + struct capdata00 capdata; + u32 attribute_id; + int ret; + + switch (prop) { + case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR: + attribute_id =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_BEHAVIOR, + LWMI_TYPE_ID_NONE); + break; + case POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD: + attribute_id =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_END_THRESHO= LD, + LWMI_TYPE_ID_PSU_AC); + break; + default: + return false; + } + + ret =3D lwmi_cd00_get_data(priv->cd00_list, attribute_id, &capdata); + if (ret) + return false; + + return !!(capdata.supported & LWMI_SUPP_SET); +} + +static const enum power_supply_property lwmi_psy_ext_props_all[] =3D { + POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR, + POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD, +}; + +static const enum power_supply_property lwmi_psy_ext_props_threshold[] =3D= { + POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD, +}; + +static const enum power_supply_property lwmi_psy_ext_props_behaviour[] =3D= { + POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR, +}; + +#define DEFINE_LWMI_POWER_SUPPLY_EXTENSION(_name, _props, _behaviours) \ + static const struct power_supply_ext _name =3D { \ + .name =3D LWMI_OM_SYSFS_NAME, \ + .properties =3D _props, \ + .num_properties =3D ARRAY_SIZE(_props), \ + .charge_behaviours =3D _behaviours, \ + .get_property =3D lwmi_psy_ext_get_prop, \ + .set_property =3D lwmi_psy_ext_set_prop, \ + .property_is_writeable =3D lwmi_psy_prop_is_writeable, \ + } + +#define LWMI_CHARGE_BEHAVIOURS (BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO) | \ + BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE)) + +DEFINE_LWMI_POWER_SUPPLY_EXTENSION(lwmi_psy_ext_all, lwmi_psy_ext_props_al= l, + LWMI_CHARGE_BEHAVIOURS); +DEFINE_LWMI_POWER_SUPPLY_EXTENSION(lwmi_psy_ext_threshold, + lwmi_psy_ext_props_threshold, 0); +DEFINE_LWMI_POWER_SUPPLY_EXTENSION(lwmi_psy_ext_behaviour, + lwmi_psy_ext_props_behaviour, + LWMI_CHARGE_BEHAVIOURS); + +#define LWMI_PSY_PROP_BEHAVIOUR BIT(0) +#define LWMI_PSY_PROP_THRESHOLD BIT(1) + +static const struct power_supply_ext *lwmi_psy_exts[] =3D { + [LWMI_PSY_PROP_BEHAVIOUR] =3D &lwmi_psy_ext_behaviour, + [LWMI_PSY_PROP_THRESHOLD] =3D &lwmi_psy_ext_threshold, + [LWMI_PSY_PROP_BEHAVIOUR | LWMI_PSY_PROP_THRESHOLD] =3D &lwmi_psy_ext_all, +}; + +/** + * lwmi_add_battery() - Connect the power_supply_ext + * @battery: The battery to extend + * @hook: The driver hook used to extend the battery + * + * Return: 0 on success, or an error. + */ +static int lwmi_add_battery(struct power_supply *battery, struct acpi_batt= ery_hook *hook) +{ + struct lwmi_om_priv *priv =3D container_of(hook, struct lwmi_om_priv, bat= tery_hook); + + return power_supply_register_extension(battery, priv->battery_ext, &priv-= >wdev->dev, priv); +} + +/** + * lwmi_remove_battery() - Disconnect the power_supply_ext + * @battery: The battery that was extended + * @hook: The driver hook used to extend the battery + * + * Return: 0 on success, or an error. + */ +static int lwmi_remove_battery(struct power_supply *battery, struct acpi_b= attery_hook *hook) +{ + struct lwmi_om_priv *priv =3D container_of(hook, struct lwmi_om_priv, bat= tery_hook); + + power_supply_unregister_extension(battery, priv->battery_ext); + return 0; +} + +/** + * lwmi_acpi_match() - Attempts to return the ideapad acpi handle + * @handle: The ACPI handle that manages battery charging + * @lvl: Unused + * @context: Void pointer to the acpi_handle object to return + * @retval: Unused + * + * Checks if the ideapad_laptop driver is going to manage charge_type firs= t, + * then if not, hooks the battery to our WMI methods. + * + * Return: AE_CTRL_TERMINATE if found, AE_OK if not found. + */ +static acpi_status lwmi_acpi_match(acpi_handle handle, u32 lvl, + void *context, void **retval) +{ + acpi_handle *ahand =3D context; + + if (!handle) + return AE_OK; + + *ahand =3D handle; + + return AE_CTRL_TERMINATE; +} + +/** + * lwmi_om_psy_ext_init() - Hooks power supply extension to device battery + * @priv: Pointer to the lwmi_om_priv drvdata. + * + * Checks if the ideapad_laptop driver is going to manage charge attribute= s first, + * then if not, hooks the battery to our WMI methods if they are supported. + */ +static void lwmi_om_psy_ext_init(struct lwmi_om_priv *priv) +{ + static const char * const ideapad_hid =3D "VPC2004"; + acpi_handle handle =3D NULL; + unsigned int props =3D 0; + int ret; + + priv->bh_registered =3D false; + + /* Deconflict ideapad_laptop driver */ + ret =3D acpi_get_devices(ideapad_hid, lwmi_acpi_match, &handle, NULL); + if (ret) + return; + + if (handle && acpi_has_method(handle, "GBMD") && acpi_has_method(handle, = "SBMC")) { + dev_dbg(&priv->wdev->dev, "ideapad_laptop driver manages battery for dev= ice\n"); + return; + } + + if (lwmi_psy_prop_is_supported(priv, POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR)) + props |=3D LWMI_PSY_PROP_BEHAVIOUR; + if (lwmi_psy_prop_is_supported(priv, POWER_SUPPLY_PROP_CHARGE_CONTROL_END= _THRESHOLD)) + props |=3D LWMI_PSY_PROP_THRESHOLD; + if (!props) + return; + + /* Add battery hooks */ + priv->battery_ext =3D lwmi_psy_exts[props]; + priv->battery_hook.add_battery =3D lwmi_add_battery; + priv->battery_hook.remove_battery =3D lwmi_remove_battery; + priv->battery_hook.name =3D "Lenovo WMI Other Battery Extension"; + priv->bh_registered =3D true; + + battery_hook_register(&priv->battery_hook); +} + +/** + * lwmi_om_psy_remove() - Unregister battery hook + * @priv: Driver private data + * + * Unregisters the battery hook if applicable. + */ +static void lwmi_om_psy_remove(struct lwmi_om_priv *priv) +{ + if (!priv->bh_registered) + return; + + battery_hook_unregister(&priv->battery_hook); + priv->bh_registered =3D false; +} + /* =3D=3D=3D=3D=3D=3D=3D=3D fw_attributes (component: lenovo-wmi-capdata 0= 1) =3D=3D=3D=3D=3D=3D=3D=3D */ =20 struct tunable_attr_01 { @@ -1241,6 +1626,7 @@ static int lwmi_om_master_bind(struct device *dev) } =20 lwmi_om_fan_info_collect_cd00(priv); + lwmi_om_psy_ext_init(priv); =20 lwmi_om_fw_attr_add(priv); =20 @@ -1263,6 +1649,8 @@ static void lwmi_om_master_unbind(struct device *dev) =20 lwmi_om_hwmon_remove(priv); =20 + lwmi_om_psy_remove(priv); + component_unbind_all(dev, NULL); } =20 --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f182.google.com (mail-dy1-f182.google.com [74.125.82.182]) (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 E93412E7BD6 for ; Sun, 10 May 2026 04:26:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387165; cv=none; b=X75ln8lOjuy6Y8hMSOfjUumvIL3wnFof+Wml+x4Q1iUjodlAW3ZAOqoHveWzVf95PJZ36bY0Bbn/92vpjto1nLgSIYMMYygJWWux2tq30JZFClfj+GJiCyLyA3G+SRd6e9I1MjKQ60+rvncq7bFZq/TxlmYdmTz5Mms+qIh3ba8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387165; c=relaxed/simple; bh=cMLvcCzRf16Fy4OllrJfM9VTUlGAhvt/d2WJ+ZYZj/I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Og5HVCkBAzt8UvGKGdst1r6ODkagQAQEmWSnmcZBY00afpCM/5/r5QjME5mDG4BTWUPfurgSjpqCAiRzK0mf1k44Drwu7i60xT7chMxEJj01WWOjR5rzEh5Gvf8GQd834Pp15kyrhhu4y1ketpzeL0du4oLFAMUYDRuhNjsDJ5s= 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=kARFxBVi; arc=none smtp.client-ip=74.125.82.182 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="kARFxBVi" Received: by mail-dy1-f182.google.com with SMTP id 5a478bee46e88-2f3c623322bso5361496eec.0 for ; Sat, 09 May 2026 21:26:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387161; x=1778991961; 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=UwkFBGvTENMc4sGLGliEmbZKBhpnHayO4oiqQfRUuMk=; b=kARFxBVilkFJZsKlFCpaPVYnRNMeZPsPPC8xXYDzSZlE15sq0HexUjD/5vqfbcqigN 8QfqkHoFFivrmLchgntOd1tEpN8aPlYC24iNgBKTTEY5XESUKGeOzg7YVPUtnhLIkee4 8jd0ig2oaoaC1QJ8xMUjTcMkOErL4MYt0YT+eU5wOsbHaY70h+Zn1j5GT18amwxoF0Zu N9WWZPPxqUL+uZi/1fBw4Z9blBETsXCpBWQW/b1z+yf2xjRmfoZYOsuhrEwFQxXJxOY9 PlGd0AWXavXIO+X9gRubxvNTY3gZE7fz/0fIWydDpSCb0PIfu7NG5QlPSaq359i5fHZZ m8Xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387161; x=1778991961; 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=UwkFBGvTENMc4sGLGliEmbZKBhpnHayO4oiqQfRUuMk=; b=HEXoHqPTttUWMeCNIT26gak5EDdzn2Q4HVu1fEPPu+OfQ94+H0xLfkGT0fyDyW0Gr5 SLuhrllquEe1DLR0KqbDQtH5SsKP4S7eVmGZUyDz9fuUH13CKPwa5MYzBFqr5B99GGzc wSDG9cXftfr0JO0eeUWf4hsvCCG/Ws1zM943CjNcFxVOaksZNWZWIFDKFuV1GljBGICn WQPGzYY+4uQJshl+GfqlVU+SZasGmxTC6znW979kZqk9e0Scg3VPKS5t9zjU3tlfT9mP IdmpFtKdDEDwzm6PXoEQBObBD6Y5d3/uH9XmU4I39VGb9/1dPjnLFqBpq8XD4RZptWxN +iUQ== X-Forwarded-Encrypted: i=1; AFNElJ/21cJKiY9V+UNxd2zbFXV0ABs7u9/mBfUfh0o6wGuE5pbW291qTumDEWsY4dRjilMvGxSUznX/3YfmOxg=@vger.kernel.org X-Gm-Message-State: AOJu0YxSRT0mONSeGzXU06SVVGaxXm+/+jizEz7KQCvLB/QHPXJpZiDJ zns8LrqXj2VbZ/LKtPE62h4kOVEAkqNK38r001WGPfy2mOkpxfraEMws X-Gm-Gg: Acq92OFfJTQgPc7Ts73ue0HUGA3PM7mCp/DiB1iUoFw98WPUHvrE9eZZ322lxQMMzi2 aDgaoKey9PEXt1FOLTtlZi2SJj6wGr0ea5yubwPssg3uUNLJcVphH1fHmOAJHt9nB5VGTGsYwmk LeQ9finAJblR3VBGbNhVnzDWR/yJ96VVOqpGDX85n3T9e1AFzGPfvUKHJ3m3iLKiwZzLYWt8uKh TFdCg61iT89+EdIuam+VSTVH5hAjEIoSDpCW3TXos1ya8GDsFpc57wyLP82S3Qu+qksA+QNmEIW y1Uq3aTv6M/btc0kTMSwvt/Q6Y4fvVG+1Zemnw4ht4H/kP4ooIuAXF3odm7pvRG3JGw/04QYVP/ 9ZRg/Rwarqv9AJr5JlN0efhacFXpMEuu5HFDworSmRwalGvB6bYHxkFUtJNyns/09eglSKsnMcH IIzCDz6XGDHZXnnzZpZyPLKBHA57duzsQWmT/EUoUZFu2xF/ioXLNhyJqmxiDs8G5E6SgY9w/6t ZGQ X-Received: by 2002:a05:7300:3b08:b0:2c7:3a7:c7a7 with SMTP id 5a478bee46e88-2f54d15fe7amr8804109eec.25.1778387161244; Sat, 09 May 2026 21:26:01 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.26.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:26:01 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v12 14/16] platform/x86: lenovo-wmi-other: Add force_load_psy_ext module parameter Date: Sun, 10 May 2026 04:25:44 +0000 Message-ID: <20260510042546.436874-15-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" Some Lenovo BIOS have been shown to have incomplete and/or broken capability data and WMI attribute IDs. In some cases the capability data reports that a feature is not supported when the get/set methods are fully implemented. It is also possible that the ACPI methods from the ideapad_laptop driver we defer to could be bugged while the WMI method is fully working. To aid end users in submitting more complete bug reports in these situations, add an override to skip the ACPI and compatibility checks to force load the power supply extension as if it is fully supported and has no conflicts. Signed-off-by: Derek J. Clark --- v12: - Move the force_load_psy_ext into its own distinct patch. --- drivers/platform/x86/lenovo/wmi-other.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 4d95a9109f5e..007fef658bfe 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -185,6 +185,16 @@ MODULE_PARM_DESC(relax_fan_constraint, "Enabling this may results in HWMON attributes being out-of-sync, " "and setting a too low RPM stops the fan. Use with caution."); =20 +/* Visibility of power supply extensions */ +static bool force_load_psy_ext; +module_param(force_load_psy_ext, bool, 0444); +MODULE_PARM_DESC(force_load_psy_ext, + "This option will skip checking if the ideapad_laptop driver will conflic= t " + "with adding an extension to set the battery charge behavior and battery = charge " + "control end threshold. It will also skip checking if the BIOS reports th= at " + "those features are fully supported. It is recommended to blacklist the i= deapad " + "driver before using this option."); + /* =3D=3D=3D=3D=3D=3D=3D=3D HWMON (component: lenovo-wmi-capdata 00 & fan)= =3D=3D=3D=3D=3D=3D=3D=3D */ =20 /** @@ -898,6 +908,11 @@ static void lwmi_om_psy_ext_init(struct lwmi_om_priv *= priv) =20 priv->bh_registered =3D false; =20 + if (force_load_psy_ext) { + props =3D LWMI_PSY_PROP_BEHAVIOUR | LWMI_PSY_PROP_THRESHOLD; + goto load_psy_ext; + } + /* Deconflict ideapad_laptop driver */ ret =3D acpi_get_devices(ideapad_hid, lwmi_acpi_match, &handle, NULL); if (ret) @@ -915,6 +930,7 @@ static void lwmi_om_psy_ext_init(struct lwmi_om_priv *p= riv) if (!props) return; =20 +load_psy_ext: /* Add battery hooks */ priv->battery_ext =3D lwmi_psy_exts[props]; priv->battery_hook.add_battery =3D lwmi_add_battery; --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dy1-f181.google.com (mail-dy1-f181.google.com [74.125.82.181]) (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 E52162D837C for ; Sun, 10 May 2026 04:26:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387165; cv=none; b=UVkkiUX65lfIg7UFFOtq0BhF4Q6hGz/zMhz66NGgMEl5tTNnD9fEPytjJPXUyagMmGXtxojlDz+mr8vfflHforXlQ3Nl9OIwncDvFvT/EwrF/LhWicVdentMDhzv60hK0MnKxr4FAm/yuudDUgreJNByLDErtrLdlA3kKJQzKto= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387165; c=relaxed/simple; bh=nw7kdTs1biYqcCyLBgFFjUVOcmzqKE/6nPTRSBdw19M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Av0z7TlUDnIyHSzPg+8ZIU7PwxfY7dcWieACEzt7yAS7W0kGyzMaWZW/aXaDvRdMFVoNbrigyk/7FF8a+wEsu73eQBTOkAkKgS5pFTRGCkqQKmgY8E0n6yV4TYGgkvJl+QwsC2jz2F7vBOOhbuqJQA6luwN70HkF3S9Ncu5SBFA= 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=iVaj5vAr; arc=none smtp.client-ip=74.125.82.181 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="iVaj5vAr" Received: by mail-dy1-f181.google.com with SMTP id 5a478bee46e88-2bdcf5970cdso2349694eec.0 for ; Sat, 09 May 2026 21:26:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387162; x=1778991962; 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=mZGzwivOSp3+FMEX/5WCBroL/DIUwpA8g1utSU5YDlE=; b=iVaj5vArUDb5f+y/YnzWpnxrblO7yot8i/mGsffmXVPKdjenuaTA42a6KQp/0qkKs4 Myp2REDqwlWFzXstIKzuBlOONdd36zmb+EupxnWPnzNc/uHf3DoTXnfqBng7uaRDkB6R yMvlZKkNgsMaXW4/004sMmzg3RPdTkSRC3XRHbvcq8S00Fn8uUk4LLRMIs+j59Fom5cK SW/g4bnDtAhiAcKAmccnAaQdroDeitT6PtFQYnGmIqdVf95ehDkTiVDpNLYRfhdtTfRQ kGG6wwr1ObgPiz/hKXYBQA+zKbWVCUvbRwnJpI2X2kx/QmpISqamYFFvwyjs/onoYNpx tapA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387162; x=1778991962; 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=mZGzwivOSp3+FMEX/5WCBroL/DIUwpA8g1utSU5YDlE=; b=G7Uk07LUDtPYgeskn9fz7EcAL2lB8ZrIuxpr6ukMdJPcFl4PWVyUmvdjrbdVDyXvTh 2d0HTnHRVHOTCf50YYvvK1cZeR+nIUZBLHRc1kj72AQieuSlR4rJHR173M87VyrJQkrl JnmUtBVtZPLpKmzONYjN6XXn4ftcTdso7/Zl7mIpoTbCYVUEZMi6OgiHlJC2CuhQIhhV gnSGytlRSoRwqeeMQ6Et3tIPdhmmjyQZ+TW8Fmrv7UZrI9l2g1iWmgdQceSmVqMpnTUv WUa6keOwnZKLjunyQ+JXIeCYbp+u4aLubq46BgV0pt1P6CQvIkzzejwM/R4yU3wvGqir IdyA== X-Forwarded-Encrypted: i=1; AFNElJ8HYwsWMgCkS1ToLI275BCahSwbfGiBwhcqf9BecupXTOoN0mzelTeES1QjViAtYHnrgbE9Hh71SSCm4+M=@vger.kernel.org X-Gm-Message-State: AOJu0YzGUg4G7dI5l5v746M/zr7jfNoJEWPgt+SkJ4YXqmfvPXoOBtxD 55eSKue2AA0iDewt974tGeTibMrSmxXRTRYih83wj9Ih2Tuas1qWOIxZ X-Gm-Gg: Acq92OFgJzi1CJ3zznLY9b5ifuMo+9ZN4oR+FPpnJLohXkVBsE+LNTw7klofwHq7qZj K5TvJUHqZWGt++P7MsmxcIArOQ0/Z12eOWV/vFHHqrFCsWChbpNzjAv1jg0t5k0mVJhKApSIhwC Wr0kvLfFiiiQ4TvA9G4iBxMu/sjG9mpKXsP54k+NWK+jb9Cd1akNeFyjOAaAEChS2htY+jJ/DxX ymnYoWnuTClPVzNBCo+gEAXRhLd0lzbeZRvcDDKb4oFw00y3jX03LFJbFEZJngMIgeHN4AwMVVB sVE2CHCyTG4DjKXGZNVKFrfkbAyfciGdYiluF43h0qTFTLuNtQ+0Zs3NT9ldJMEliGof9uDEbgi 2qFVXffrJDLhwXVlgfJ13BudSyxeS/Updnu0yxY01x5voyGuf6M+1VSWJKkKng4fI1cMaSlA6fY ayf9KyABwnXjCrBx+44QhxKpTIh1HBP7NIzRYAmoZrzZuC4fX4NbFVPekvqfY11bfPpDIMga5OQ hAw X-Received: by 2002:a05:7301:9f03:b0:2be:ca4:e114 with SMTP id 5a478bee46e88-2f6e3e93a6amr5658200eec.9.1778387162042; Sat, 09 May 2026 21:26:02 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.26.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:26:01 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v12 15/16] platform/x86: lenovo-wmi-helpers: Add helper for creating per-device debugfs dir Date: Sun, 10 May 2026 04:25:45 +0000 Message-ID: <20260510042546.436874-16-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" From: Rong Zhang We are about to add debugfs support for lenovo-wmi-capdata. Let's setup a debugfs directory called "lenovo_wmi" for tidiness, so that any lenovo-wmi-* device can put its subdirectory under the directory. Subdirectories will be named after the corresponding WMI devices. Signed-off-by: Rong Zhang Signed-off-by: Derek J. Clark --- v7: - Use subsys_initcall() instead of module_init(). --- drivers/platform/x86/lenovo/wmi-helpers.c | 34 +++++++++++++++++++++++ drivers/platform/x86/lenovo/wmi-helpers.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/drivers/platform/x86/lenovo/wmi-helpers.c b/drivers/platform/x= 86/lenovo/wmi-helpers.c index 7a198259e393..82dfd26c9c2b 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.c +++ b/drivers/platform/x86/lenovo/wmi-helpers.c @@ -17,6 +17,8 @@ */ =20 #include +#include +#include #include #include #include @@ -185,6 +187,38 @@ int lwmi_tm_notifier_call(enum thermal_mode *mode) } EXPORT_SYMBOL_NS_GPL(lwmi_tm_notifier_call, "LENOVO_WMI_HELPERS"); =20 +static struct dentry *lwmi_debugfs_dir; + +/** + * lwmi_debugfs_create_dir() - Helper function for creating a debugfs dire= ctory + * for a device. + * @wdev: Pointer to the WMI device to be called. + * + * Caller must remove the directory with debugfs_remove_recursive() on dev= ice + * removal. + * + * Return: Pointer to the created directory. + */ +struct dentry *lwmi_debugfs_create_dir(struct wmi_device *wdev) +{ + return debugfs_create_dir(dev_name(&wdev->dev), lwmi_debugfs_dir); +} +EXPORT_SYMBOL_NS_GPL(lwmi_debugfs_create_dir, "LENOVO_WMI_HELPERS"); + +static int __init lwmi_helpers_init(void) +{ + lwmi_debugfs_dir =3D debugfs_create_dir("lenovo_wmi", NULL); + + return 0; +} +subsys_initcall(lwmi_helpers_init) + +static void __exit lwmi_helpers_exit(void) +{ + debugfs_remove_recursive(lwmi_debugfs_dir); +} +module_exit(lwmi_helpers_exit) + MODULE_AUTHOR("Derek J. Clark "); MODULE_DESCRIPTION("Lenovo WMI Helpers Driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/lenovo/wmi-helpers.h b/drivers/platform/x= 86/lenovo/wmi-helpers.h index ed7db3ebba6c..039fe61003ce 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.h +++ b/drivers/platform/x86/lenovo/wmi-helpers.h @@ -16,6 +16,8 @@ struct wmi_method_args_32 { u32 arg1; }; =20 +struct dentry *lwmi_debugfs_create_dir(struct wmi_device *wdev); + enum lwmi_event_type { LWMI_GZ_GET_THERMAL_MODE =3D 0x01, }; --=20 2.53.0 From nobody Sat May 30 08:43:32 2026 Received: from mail-dl1-f49.google.com (mail-dl1-f49.google.com [74.125.82.49]) (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 E7A8D2C15AB for ; Sun, 10 May 2026 04:26:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387166; cv=none; b=FtdWI3p/WZyPVF0eKCGSKamHFzSy3Ug77eE9gd9AaiIFDQ0aA6BhL7rYipN+1NJNzBWqpMOvgybzOY/EZSPlRRAWzo1hzPHrQhzISYEGpeczvRkjSm0kSS9ihNZCEVD5mU+fFuPs2OQS78NVNo1hP2Dri6Sya9fUuPIY5Jo/c1I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778387166; c=relaxed/simple; bh=OgxzN92YsSq8XXvmHxxPVvtGkiV1+rIsQMXH/cf1Bt8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=C2ZOuedb+9AxRUeaW0Sxi/1hrX9Fz2PAtigGO6jjhKUVFZt1lldwTBaZvhdeGhL75OosG+gGn0KrJ7BqASu0JcWdG07IOE3avANbBchK+3/p6jtpqiYqCjxPr+RcgVsIBfOXjFpJgx1uTLyc7ICmCTTsG/Xn2vwNIE4zu84hf34= 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=fUDRL7LC; arc=none smtp.client-ip=74.125.82.49 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="fUDRL7LC" Received: by mail-dl1-f49.google.com with SMTP id a92af1059eb24-12c19d23b19so5578852c88.0 for ; Sat, 09 May 2026 21:26:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778387163; x=1778991963; 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=Vsqr/VZxyQ1YPkQlz6R0M08w/ShHAMNim70De2aBRuo=; b=fUDRL7LCeeSZLdOhEmK+p9TAXwlW2eRRZrOr9qOyrtBFTV7ewQBpshXgULkp5PjXJK A8eHCAJryjn36StGnsiQ/epJNU1qU3DikfZPmVhnwX7jZ9X7NWD+rqWVn+1M+E18wTpr sw3+DsMdhHjUZuD2FXIOCwE1x8ZwCmhxuS5ZyPW65awplynzLnnZxdFGN8yqWFINrnzQ Hj/gzaa3q4ukEwc155zpmVV9DDSqYGn4oHIE4f4Q+TNq//8yZEAH2Jd19Qjbor1mZyTa fxUf+V8Usl5APjsy3cNlLu7UhDpSFIdjZNMHMzxJgev1bMMwLSvAB7r5MQo99ot4aCe+ 6DWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778387163; x=1778991963; 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=Vsqr/VZxyQ1YPkQlz6R0M08w/ShHAMNim70De2aBRuo=; b=pa5GJavYwNdH61JvnF+4/kDO1Db0GQ1/iOVIF5JBcc+fgN8NeyzNlI+/ZLZfPl1C6+ S0UJHxWC+2p4prV3i9e4BQLaag5NUqFeqQ7MM2MoWF+IzJgW9lBL3SHGfKVaWtyIg8FA bik+jhT6ecHayuG2lmm13tnQbZ/czElh4x275CQG9j40TjffecRKaLt4e7N8ohHIxuaQ lE/Wp7MeturCxKe4hbcroLPvQ5ggAe+pLvtlPjn22Y55Gos2UH9NKX12vPuD7nSIk6N9 8MZANmflRJVQ3kJJcPcif38qY7cO8ajdKwKbK3g2xmkoFAb/rgAw2S5TLvFYKMAqOCz3 /yDw== X-Forwarded-Encrypted: i=1; AFNElJ/y0ZznyYq+HLKOIv4cmQBBoKnut5mrciYLhLwLhb9R8L++y701cPdmHB4m0cRiJ08wGG9Ge3jbaiY/2OI=@vger.kernel.org X-Gm-Message-State: AOJu0YwqjnDAse1DgLMULrsqoXvyvGLLLkM3PYrJ82ehOhMoI478L7WP g7c4wMp1FhWa5Eal2n85jLhgHpGDb4c8foWvE6EJY9vTG4pPqAVnFi4r X-Gm-Gg: Acq92OHayaYFd+mfVO8WMZIDePe0vsOWl5WRPW+I4ds/aFNcP7CtX8kZb0oCI0fwngb DvnoTDPh32DeufTx0cCY5afi8VNouohnPOKBhXJfjWpVTcqsVZ92VhzNTxujT94hGcbqpMy7/Vv N+O40N9L9oSdcxkETdYle+2pIE9JXt9hvfDeiNIJfJdBYdUOHMIFhu3Og5xfsHX1re+KBd+r2eu muteyd/VbjuAlXm/zd7kPW0EewWSY6ARNt0qlrI8+2ui+BddGwdIZx6X2o4w65qzxWzke4fkGBI h5+R5VXOZKukoKMI7c0DHFbiXZz4TpES0+RBBQrGIHZEUX+B4SLOmyPt47fC6D8aWhLpDG+EUaO 9Lcs9WW6Yntnz60Qe/xElv5gsr32BAKOG/I8z/n6edd/rMfj6ZvVqMNNai1wUBSrU/YIvs+RSr5 apCSQXqEDzAq9nO1UsL4k8uYOxVnwasJRDRNo3nb+uka5JcbAcTQPepAqU4atQwOx3xOW71b8Qf 5ZG X-Received: by 2002:a05:7301:7c12:b0:2f2:6dde:df50 with SMTP id 5a478bee46e88-2f54d79bc2dmr9452002eec.17.1778387162907; Sat, 09 May 2026 21:26:02 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2f8862d3047sm10069960eec.10.2026.05.09.21.26.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 May 2026 21:26:02 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , "Pierre-Loup A . Griffais" , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , marshall@shzj.cc, hyacinth@shzj.cc, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v12 16/16] platform/x86: lenovo-wmi-capdata: Add debugfs file for dumping capdata Date: Sun, 10 May 2026 04:25:46 +0000 Message-ID: <20260510042546.436874-17-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260510042546.436874-1-derekjohn.clark@gmail.com> References: <20260510042546.436874-1-derekjohn.clark@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" From: Rong Zhang The Lenovo GameZone/Other interfaces have some delicate divergences among different devices. When making a bug report or adding support for new devices/interfaces, capdata is the most important information to cross-check with. Add a debugfs file (lenovo_wmi//capdata), so that users can dump capdata and include it in their reports. Since `struct capdata01' is just an extension to `struct capdata00', also convert the former to include the latter anonymously (-fms-extensions, since v6.19). This is declared as a union in the capdata01 struct, with both the anonymous declaration and as a named member to avoid type casting when passing just the capdata00 struct pointer. Tested-by: Kurt Borja Signed-off-by: Rong Zhang Signed-off-by: Derek J. Clark --- v12: - Make capdata00 a union of an anonymous member and a named member of capdata01 to avoid casting when capdata00 is accessed directly. --- drivers/platform/x86/lenovo/Kconfig | 1 + drivers/platform/x86/lenovo/wmi-capdata.c | 120 ++++++++++++++++++++++ drivers/platform/x86/lenovo/wmi-capdata.h | 7 +- 3 files changed, 125 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/lenovo/Kconfig b/drivers/platform/x86/len= ovo/Kconfig index b9a5d18caa1e..4443f40ef8aa 100644 --- a/drivers/platform/x86/lenovo/Kconfig +++ b/drivers/platform/x86/lenovo/Kconfig @@ -236,6 +236,7 @@ config YT2_1380 config LENOVO_WMI_CAPDATA tristate depends on ACPI_WMI + depends on LENOVO_WMI_HELPERS =20 config LENOVO_WMI_EVENTS tristate diff --git a/drivers/platform/x86/lenovo/wmi-capdata.c b/drivers/platform/x= 86/lenovo/wmi-capdata.c index 169665be4dcf..63561af734c8 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.c +++ b/drivers/platform/x86/lenovo/wmi-capdata.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -42,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -88,6 +90,7 @@ struct lwmi_cd_priv { struct notifier_block acpi_nb; /* ACPI events */ struct wmi_device *wdev; struct cd_list *list; + struct dentry *debugfs_dir; =20 /* * A capdata device may be a component master of another capdata device. @@ -118,6 +121,8 @@ struct cd_list { =20 static struct wmi_driver lwmi_cd_driver; =20 +/* =3D=3D=3D=3D=3D=3D=3D=3D Device components =3D=3D=3D=3D=3D=3D=3D=3D */ + /** * lwmi_cd_match() - Match rule for the master driver. * @dev: Pointer to the capability data parent device. @@ -471,6 +476,116 @@ EXPORT_SYMBOL_NS_GPL(lwmi_cd01_get_data, "LENOVO_WMI_= CAPDATA"); DEF_LWMI_CDXX_GET_DATA(cd_fan, LENOVO_FAN_TEST_DATA, struct capdata_fan); EXPORT_SYMBOL_NS_GPL(lwmi_cd_fan_get_data, "LENOVO_WMI_CAPDATA"); =20 +/* =3D=3D=3D=3D=3D=3D=3D=3D debugfs =3D=3D=3D=3D=3D=3D=3D=3D */ + +/** + * lwmi_cd00_show() - Dump capdata00 + * @s: Pointer to seq_file where the capdata00 is dumped. + * @cd00: Pointer to a capdata00 struct to be dumped. + */ +static void lwmi_cd00_show(struct seq_file *s, struct capdata00 *cd00) +{ + u8 dev =3D FIELD_GET(LWMI_ATTR_DEV_ID_MASK, cd00->id); + u8 feat =3D FIELD_GET(LWMI_ATTR_FEAT_ID_MASK, cd00->id); + u8 mode =3D FIELD_GET(LWMI_ATTR_MODE_ID_MASK, cd00->id); + u8 type =3D FIELD_GET(LWMI_ATTR_TYPE_ID_MASK, cd00->id); + bool extra =3D cd00->supported & ~(LWMI_SUPP_GET | LWMI_SUPP_SET | LWMI_S= UPP_VALID); + bool get =3D cd00->supported & LWMI_SUPP_GET; + bool set =3D cd00->supported & LWMI_SUPP_SET; + bool valid =3D cd00->supported & LWMI_SUPP_VALID; + + seq_printf(s, " id: 0x%08x [dev: %2u, feat: %2u, mode: %2u, = type: %2u]\n", + cd00->id, dev, feat, mode, type); + + seq_printf(s, " supported: 0x%08x [%c%c%c%c]\n", cd00->supported, + extra ? '+' : ' ', + get ? 'R' : ' ', + set ? 'W' : ' ', + valid ? 'V' : ' '); + + seq_printf(s, " default_value: %u\n", cd00->default_value); +} + +/** + * lwmi_cd01_show() - Dump capdata01 + * @s: Pointer to seq_file where the capdata01 is dumped. + * @cd01: Pointer to a capdata01 struct to be dumped. + */ +static void lwmi_cd01_show(struct seq_file *s, struct capdata01 *cd01) +{ + /* capdata01 is an extension to capdata00. */ + lwmi_cd00_show(s, &cd01->cd00); + + seq_printf(s, " step: %u\n", cd01->step); + seq_printf(s, " min_value: %u\n", cd01->min_value); + seq_printf(s, " max_value: %u\n", cd01->max_value); +} + +/** + * lwmi_cd_fan_show() - Dump capdata_fan + * @s: Pointer to seq_file where the capdata_fan is dumped. + * @cd_fan: Pointer to a capdata_fan struct to be dumped. + */ +static void lwmi_cd_fan_show(struct seq_file *s, struct capdata_fan *cd_fa= n) +{ + seq_printf(s, " id: %u\n", cd_fan->id); + seq_printf(s, " min_rpm: %u\n", cd_fan->min_rpm); + seq_printf(s, " max_rpm: %u\n", cd_fan->max_rpm); +} + +/** + * lwmi_cd_debugfs_show() - Dump capability data to debugfs + * @s: Pointer to seq_file where the capability data is dumped. + * @data: unused. + * + * Return: 0 + */ +static int lwmi_cd_debugfs_show(struct seq_file *s, void *data) +{ + struct lwmi_cd_priv *priv =3D s->private; + u8 idx; + + guard(mutex)(&priv->list->list_mutex); + + /* lwmi_cd_alloc() ensured priv->list->type must be a valid type. */ + for (idx =3D 0; idx < priv->list->count; idx++) { + seq_printf(s, "%s[%u]:\n", lwmi_cd_table[priv->list->type].name, idx); + + if (priv->list->type =3D=3D LENOVO_CAPABILITY_DATA_00) + lwmi_cd00_show(s, &priv->list->cd00[idx]); + else if (priv->list->type =3D=3D LENOVO_CAPABILITY_DATA_01) + lwmi_cd01_show(s, &priv->list->cd01[idx]); + else if (priv->list->type =3D=3D LENOVO_FAN_TEST_DATA) + lwmi_cd_fan_show(s, &priv->list->cd_fan[idx]); + } + + return 0; +} +DEFINE_SHOW_ATTRIBUTE(lwmi_cd_debugfs); + +/** + * lwmi_cd_debugfs_add() - Create debugfs directory and files for a device + * @priv: lenovo-wmi-capdata driver data. + */ +static void lwmi_cd_debugfs_add(struct lwmi_cd_priv *priv) +{ + priv->debugfs_dir =3D lwmi_debugfs_create_dir(priv->wdev); + + debugfs_create_file("capdata", 0444, priv->debugfs_dir, priv, &lwmi_cd_de= bugfs_fops); +} + +/** + * lwmi_cd_debugfs_remove() - Remove debugfs directory for a device + * @priv: lenovo-wmi-capdata driver data. + */ +static void lwmi_cd_debugfs_remove(struct lwmi_cd_priv *priv) +{ + debugfs_remove_recursive(priv->debugfs_dir); + priv->debugfs_dir =3D NULL; +} + +/* =3D=3D=3D=3D=3D=3D=3D=3D WMI interface =3D=3D=3D=3D=3D=3D=3D=3D */ + /** * lwmi_cd_cache() - Cache all WMI data block information * @priv: lenovo-wmi-capdata driver data. @@ -773,6 +888,8 @@ static int lwmi_cd_probe(struct wmi_device *wdev, const= void *context) dev_err(&wdev->dev, "failed to register %s: %d\n", info->name, ret); } else { + lwmi_cd_debugfs_add(priv); + dev_dbg(&wdev->dev, "registered %s with %u items\n", info->name, priv->list->count); } @@ -783,6 +900,8 @@ static void lwmi_cd_remove(struct wmi_device *wdev) { struct lwmi_cd_priv *priv =3D dev_get_drvdata(&wdev->dev); =20 + lwmi_cd_debugfs_remove(priv); + switch (priv->list->type) { case LENOVO_CAPABILITY_DATA_00: lwmi_cd_sub_master_del(priv); @@ -822,6 +941,7 @@ static struct wmi_driver lwmi_cd_driver =3D { =20 module_wmi_driver(lwmi_cd_driver); =20 +MODULE_IMPORT_NS("LENOVO_WMI_HELPERS"); MODULE_DEVICE_TABLE(wmi, lwmi_cd_id_table); MODULE_AUTHOR("Derek J. Clark "); MODULE_AUTHOR("Rong Zhang "); diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index a49229cec245..92098aeeee84 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -38,9 +38,10 @@ struct capdata00 { }; =20 struct capdata01 { - u32 id; - u32 supported; - u32 default_value; + union { + struct capdata00; + struct capdata00 cd00; + }; u32 step; u32 min_value; u32 max_value; --=20 2.53.0