From nobody Sat Jun 13 10:57:59 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 D2FD73314A1 for ; Thu, 7 May 2026 18:05:22 +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=1778177124; cv=none; b=ogfarhjUJRRkp3Jtcgyran5QbCpE0NCwA5lwHu91F9ssBapBrwc3TVgQv/veczrRpBvchXbc+v3k+TMRBQuLRVbjyDDKV7eQm/g7V7xFoXV4wmnn9CkxxQlt/HyXcUgY4JLaTzmSkNNsODx3mVyoTGtaYqAnLrhkDJ+kdqZjsmo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177124; c=relaxed/simple; bh=as/Y6rgrCLbxvFJK4woRt4WCiXpZGU5Bmcl75dpz1Ic=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f8vAAAvsqV5sx1maRg8GMORh2Ugkf5H+j/IssMW/hlDm1a3cgJ0wWuVK5owXsjPqgraBf/KTv5p5UZwOp80FAcZweLrc6Y6lZqeusNQfV6wjg/v77cSN4QwsbHYK1vW5/l+ohdjRibPjaRmHNEWmpponlHIkIsg2hwdV5Ygz3Lg= 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=X4sr41SQ; 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="X4sr41SQ" Received: by mail-dy1-f174.google.com with SMTP id 5a478bee46e88-2f0ad52830cso1761617eec.1 for ; Thu, 07 May 2026 11:05:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177122; x=1778781922; 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=X4sr41SQPF6gq2J2TXbUY/C1NKf75OUu3x8t5VPcC9gHvOHZOpAwilembEyz3Bi9qP 2TX+A2YgxM7T8pKKRPcFfXrwtBgPSCFvVKpYdr58CsONFbIh5+xvtQ3kWF0jJVVmvrUV IJbf1BZZ6iSNwvhjlyiSqiLsNiTWFdF1ez4USxUPQrkFvOKH+7svAoIeHC8MOmSoTYms MAlJuzRFfroHFxnXD5bhRmN6SesZobjkVs39TNcMCPBkx8CU9eDnrR9zwOqfzKW07jBB DyAplEsAfdN9kFWjAvPcekD8670suArcjaptjIqWBBlDJYXG6w5jCWlhEZb8PdSDpCZR ZPhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177122; x=1778781922; 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=CJXbPt/5uldDmiPKIO7Y9cGA/nEj1os2k5Qmoq2YmYdVCH5TaFoRnTs6mpi0n0hZss Ga/z/Up8gRGoydgqQo28e3rBr4xD6Hu4chL27wb2aKNq6ykU69jCwqHGDTw2CLve56ES wBcE0GC/nkMIS5/c0bn1ECxcLezz8MIfleW7q6MUfhBi7K9rRjBOmFzDBYIDLV113gwT TNTjYlbEubi7TBcYWKKcHEThGfG27EpIInWbuiAhrwK+TuaFAqs9oEeSPbDr2nbNTo3R G8icqOcZAL01Da4E+l8F7nT6Nc0B683/XuLAzYLTR9JVnRuHwkGKfttlwLMAWvGQ8QLd uV1g== X-Forwarded-Encrypted: i=1; AFNElJ9um2i2Mn0GrCg48mZJ+tlswBtKdSH15aQosR9GxTeMCXZTGhRZMzRx0ZTgSjFcyBP3omaZTaIJBHcfERg=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7zQKiSzq2DTCR2U4UMSMgY2MVU83Zd5YNFqj/1Xn9LFOVDluY r4SXbfdlUweEi1LfF43MhpRTdZOBtd/L9ypR9HhpA0oZGUoIkw1c+O7W X-Gm-Gg: Acq92OEe8Y4PcaMjGEqjkvbMAnfUDXsepYPPOfWt+UURS6mElZsVDh2cQQRYWJ8l3wk +N8T2+zs48QbVaM1Px2OoEnPwhTlNqbStpAWPiDQgRODVOIBImj9nxjSkena+BrUAwaY6LREpoh VSJB3ntc0nXdhwvOKS2Mcnx4gb05UA7TxrQurdQrX+VNNJtUASGSuZENdCOiCXgB6p5gE4RtJ86 4z6biXGdYn+SUVAzFkf239JbqdC1143PsX1h9/9OTAfomHTkNpWFFUqAdiCZfjjcN56EnlRaJwz 5TImpuz5zQqSdfSqNPACQsIZiWLZiroKWvgcw/Kgl6SnHHBJiL67fg0QtG2Zjs0n42IrinE8XVx Yopd9f2CcXgoyD6PBZpGyB0808JpdpO/jmUdk7xCq6ASbMxI/yBIyv/DLLl5ztWK0N6C0BU746j 15RtRz+YsvURI1U1HTqalFqUQH/DYViMiaRsnGDWekNzx1TDSRufYTFBkkXI0LnLcmrM7q4VOjj M1s X-Received: by 2002:a05:7300:a987:b0:2c5:60d0:702e with SMTP id 5a478bee46e88-2f54a77f55cmr4538191eec.18.1778177122069; Thu, 07 May 2026 11:05:22 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:21 -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 v11 01/15] platform/x86: lenovo-wmi-helpers: Fix memory leak in lwmi_dev_evaluate_int() Date: Thu, 7 May 2026 18:04:53 +0000 Message-ID: <20260507180507.912966-2-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 Jun 13 10:57:59 2026 Received: from mail-dl1-f54.google.com (mail-dl1-f54.google.com [74.125.82.54]) (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 CF78A44E045 for ; Thu, 7 May 2026 18:05:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177125; cv=none; b=nwJNZlXyY3Y1SLL7cTZuq7oOX6REOR6G10HGGDDMFZAU2izp9YWW3U582eQGEOJPbzeo8cicpEIk+B+zzSXcyWXaOX0wgiVDIYrEpnHTaFPeV7AYLKu8hRZj7hqtmrE3398xmCocpK6xNSadCAwKo7Q0AiitVD6bjtDThCp0uAU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177125; c=relaxed/simple; bh=8LUDQtMderd6djIBXviEFlt08t4GGAhmClar2YVACLg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IfdeE0WnJhg+8dGBks2sh4ShCvRBUm5OyV9MEF4vVk/loBNVK0W4Faf9vHhRKCR0DQRjG7iHMIVE6cbAZKLncWeW/UFx9rUGrLWlEXCZVAzrbhngxVSz1luuZ2Fj8Cjm+eBbTB7oR9oP7b28l476jL4cohkqzFq9fnNwD0Dtcr0= 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=SVYOqRhH; arc=none smtp.client-ip=74.125.82.54 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="SVYOqRhH" Received: by mail-dl1-f54.google.com with SMTP id a92af1059eb24-1309f4ee973so1472854c88.1 for ; Thu, 07 May 2026 11:05:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177123; x=1778781923; 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=SVYOqRhHV8FQe5A/tvQI8xFnDHyoihaEoqEvqLYcb63KrkytLpek67cFeoJ81R081a 1lULaG4uihQxlvPUQSrqFsLgSeuFuVzkMb9fNSFm8nAGN77k8b0+Z7YH/7cCTdRldXjw sw07mh8AIC3g+KU3Sq8gqL86Dj/ByNGqSR7nC2z5/spiYBa1PD+2HAhPrBfd+kmsC/1t WGxVhMBuRTCRjXEeL4TAUEyYwgipLnvFwYGlT1dOXDFwcfyS0Hzdo7Rd+SkEY5cozw/N r0UbKqXDwuNO5Bv+KifRg7k/PiU7JImIuxvJen8JEblB5KfmXG0WNYq3rCKbd86kGB3B BFXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177123; x=1778781923; 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=eHnqm/H0hdW8mWs9kull7VoEHrLKxbIdQg/FQztN7JKNrryTsNsTmVF0tTkvWEtzx2 a8hDgPrTbD3Hi5KxC8vxFaplG8ROQIGvtWwM2RkInniT3kVRU25m934Bk7vOeor1GYm2 VybcSszaztCrnleZHLpR5mZ/rqTbmeJI0150S26JdUrCqrTLomrjH06H1x+Bo/lcxjUX aq71ipOCu7PHKSpva4A0+XytvZ8yxBxMdcykukcpTC1K8dsVykFof2BFjRgfbB98ptUb wznl9zQt8Tpg7aZHWWj20xC7iNWxylobemdeyfYM4S2OrleQJP4RJG60yiuk7NyHQYCX gyJA== X-Forwarded-Encrypted: i=1; AFNElJ8dquQR3v5zfpgLLGJcIzhKeCKdc+BlnNyUYR35lt1/1JjwVvvKCTCR7PRbnrgfal3lSezzYrMTCefBCMw=@vger.kernel.org X-Gm-Message-State: AOJu0Yxy4edYGM8Un9diMIlauIXLIUP1lyVjuTjsOCJ2pLbn9SwFidpQ Dt6qJrTWH7p6yzlkHZeylBxyYPNZAtKAj9gmQU2FsU7q563ALeM23vv6 X-Gm-Gg: Acq92OFapPQNFLq13XM/ozs8ntk67b0UmzT2bJAJa64dkcu2Q0ZdLKDKCS7R5E6hxSF 0qm6CU0nRfdCcarmwGXiZ+iHWzKBnfOksIuhKoc8g0c2kFUe4DPD4maC2nv3hdUCZWT9cryIe6f qcGtUBWypMXZFPl54dMurVuH/aZBg61zH1+Ufrpp/qPiC+mcPF+SFhzhBA/fkISTwxiHIK+06Hb z/hvO8J6emyb1zrTva1In1un+o4v+/ghDtozkGYWJZ2JyVdqop2hnV0VaqRO/HnvB0pd2eW7Me4 luyN5IQJZHJ5ra1HuZ3SsJK1rE97y0sfHLjjDzYK5jZ4VXQtz8D8GvRpz/VntGow6ACwHlEfmFN 5lA9YHKCNi4Bz/guF3ZRDz7WQIhJwpnxn4KxCyfYH76gyaB97sjk3g6kodiLln0VP4s/xvE7srG 7qZ6i7VmFpXdh6okZSv7+8f7nuEMOlHQXwSWJSB/9v5usgxsejJL5JZ9DOPgw6GEVhgFtK5u6ax ZzsJaLJfFWPVHk= X-Received: by 2002:a05:693c:2c02:b0:2de:cc07:e83 with SMTP id 5a478bee46e88-2f549294192mr4506652eec.15.1778177122894; Thu, 07 May 2026 11:05:22 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:22 -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 v11 02/15] platform/x86: lenovo-wmi-other: Balance IDA id allocation and free Date: Thu, 7 May 2026 18:04:54 +0000 Message-ID: <20260507180507.912966-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 Jun 13 10:57:59 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 A454E3AB29D for ; Thu, 7 May 2026 18:05:24 +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=1778177126; cv=none; b=OPWcKNYMZcv04GNHlTDPEjnwwzgoIwxGDZn8JNkoFB4WzKR+Ajr4YNSGk4iMSnOz7iUTtlZVw/XH3Gs6HHE3zQZJFEpvnvV8RMr7ilfLz8sUz+UpMkk1xiHtgc1YrbRbvr7XRREbJ41fRpqMouTMAq1MiDpJYInwGRjV46PabxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177126; c=relaxed/simple; bh=6uvm7kxcoZxl4SJop0VuYLP778pizJEeCY5iHUnRujE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=oCRV4Ir0aOOYeQlZ5uvgxqPUR0VTS84+LYju5es84OwQOy+DgceIlKP3g5PapRK/RnIBT7NF7OMQNUk6LrxkaUHZI5LhMLg4XWrAc17MyWnuRbIw8LyHsxzln0qm1LFEeiVBzOpOotopScF/K4ta3hr3g11EIJPqBNJ82f3qj8I= 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=ZAbJzQBV; 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="ZAbJzQBV" Received: by mail-dy1-f174.google.com with SMTP id 5a478bee46e88-2ee990e8597so1961690eec.1 for ; Thu, 07 May 2026 11:05:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177124; x=1778781924; 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=ZAbJzQBVI0cLGmwvL10G6q18zhdo8D4tLW2JaIVPv62Q0sd3lkm5WaEGSRgCqPakDD gMJ7XxQk22EExn/wquItvA7iItdR4zvtXI6R1fden0+wSKwCSsTfsvSUYCOmqHVNGE5u Zqnq5r5jSol/aCE95DJsdXMsgm/FZv1VY6csxjT5ZmDKYJGYv5izFz9x+nXurrENXnXl TokzK3kG0XARajmZNTxeJXtQ/6IdvXfoMPpD5rq3NKf7HFHCwSPU9R1kHW9vs+Ii5qQP g7jM2irEwrB7KDPm+/yL0mNn2c14J12ssaSc5IVJptacVB+dX3VHLII7YxyVI2B8DTaz V9qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177124; x=1778781924; 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=pXn4f6x3zjtSVkRGpPn3cOLohDdvMQIruqzbFC18H9LZD2fkndrjfY/V0XsaPnJwsS peoh29EcK2CZickBypyoD55fV3pNRVw3OB8JdNWHLA/BBzsojUak3hl5EMP8f1tQv4Lk y6Pd/hsBeSOUwv6ALwlxTorcUzyO/Y/BEcGsDguxB51/m9jTiXq58n0lQwTTXsNwU68a YqlAUrgcqtanmmOpBXbxO6+V9YR76lVxIjXBR9Gj4ghrcSdmujJ6sAULpgCmWFrRiCyT sfTt9vFMg9hQR/t6SlXjYQBq4Pe34S0WXlQn+jQ0FUw8s6w7MxSnPjo9nKN6E+OjVNAu /FjA== X-Forwarded-Encrypted: i=1; AFNElJ8FciUgkJ8FcjJKr2FMvPbvY+T59p1UD5iXJ7TfYyhpdvOVSdpd5JlXCe/qY0KMnn6WCM6CEl7sbcwK8Tc=@vger.kernel.org X-Gm-Message-State: AOJu0YxbRjn0J8ZvaxC0GF/V5EJy/GEo6H3Lyr19hpQVXe6gbl88H3mh rQpUlY1aXhX354G1nBU4/rmPxNB7S+9JE9dNqKwPK14oaZZpSAHNuUwl X-Gm-Gg: Acq92OEcf04hVqlH4dMySQmCsN1nLFI6S1HioK5Ok28KVtTaMceYj/K3e6dJy9a24j2 HmKLCn7qChUJaUHh8I2fczbd1wRX771Bf37sN+NVULTyjGfUrUFR2OsnhPPgvjIkL6wd/hzWPYS 72dvkTvywfGFgqzwE5TfmHBxnMdvMH8QWdcPxnGr92MKv1rl0ah1/i19+ei8P5J2X8p8UO52BVF AiXHMujnHQdky5tQJRQbzYMrgVLmpxwY+Wt2KgUR/qazOBGsvqXP2rClDu7aXk5aHkyASzIQOfl lTLtOPbkEWX3vSR7+3Z36n8xFy137Ik/8omy0WAfOrlz1BeFQvEnyIsYb/MvPNWfAyCqRA1OAJw tj0zCDjvf4nLWy7fm2PUvOQ+lVARczz6TP6yMOfWlpCuZg6fy10A/XN1EYtrDYnWCTf4MZsiUCr DdLPJo+SwcVN7J/AkjcbQduzeHDhgUkTBmCwHwmFsXDjuI/m3f7LQ8d8SnNpgmgkn83tMrG65tb axnEM0nbEU5kPc= X-Received: by 2002:a05:7300:72d1:b0:2f1:6252:f8ef with SMTP id 5a478bee46e88-2f548a9b30cmr5316897eec.1.1778177123686; Thu, 07 May 2026 11:05:23 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:23 -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 v11 03/15] platform/x86: lenovo-wmi-other: Balance component bind and unbind Date: Thu, 7 May 2026 18:04:55 +0000 Message-ID: <20260507180507.912966-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 Jun 13 10:57:59 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 8E789466B4B for ; Thu, 7 May 2026 18:05:25 +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=1778177127; cv=none; b=CaIiQ0bSu+/twVH9WoHe0tfshHXw591S5CBNelm+6DHsJmRRFTwS4/P7KIeqEBbatAYRMO/vd0pih8QJ1Wp7PfxE95RWHzH6Bw44wTvJru7NYzKKlc51LpF+mCwcMtJ5ns4p4dXglJI1qwwbl5NYF9aBaUd0kWUNHbL7ILNLJxM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177127; c=relaxed/simple; bh=Pw+ssuLutbx3g6u/jM5PMxxasbxx9jVlsAJtmVGQOkk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bi7FmjnllowteWrm97280EjoMoK4TRi15VPNkI5XLsD8f1Y0q9Q/bysFImIx7DwTW+j7T++usHwbJJiAOfalntP7FugrFzxPPxH57joX5QZ1SPZHOX/PT4C7/OdJk7Yt1ZEoLu4JBCF4eCugY76KXtdT17gfp7qM3PDSSGnrGrc= 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=P7y5f7n1; 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="P7y5f7n1" Received: by mail-dy1-f182.google.com with SMTP id 5a478bee46e88-2f7ca62a3c4so566912eec.0 for ; Thu, 07 May 2026 11:05:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177125; x=1778781925; 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=VtTcFBJ7InscTxETiiZ7Szcd4eyMEX33KwP3VapF0JQ=; b=P7y5f7n1h+pr4X/Iy60Gz4zGRAzIb5kycIhtxcsmZtLKy1U2Z3lrtlCA3x70FMe5em wfsAhlopLqLaeUFSWZ7lXq5JEYFlBwp7xweH0XB77cDq4CjhYokpW6TXRCqKE/q6PhSV myp3dGJDGcHuDvuXDOhxJNT5Q6rIEMZcgTw2dKlgrcD6/cJ3x3kKOqEQjd5BTDQtgnv2 D2lyxqRDSc15QPMf5rjFxFxeshNLHt+0WQ9+GgdBmzW6j/x6DXO/Ojv17QPaOVg/JKsW b5d5+NSKQmVWX3RaWoROXB26ahqzhr2+JCdDuTTHpJBEgnNYKL0Wl64Fa7TZzSujBEF6 fmGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177125; x=1778781925; 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=VtTcFBJ7InscTxETiiZ7Szcd4eyMEX33KwP3VapF0JQ=; b=qqzP73Di6+Ljff/SzfsOU5ATY+kPd/h+wgnY23qGmfQQl9hKr+Vy9flOaCcXjSDKbS 4uFC3V5D0ldhKSAyZDY644Ily3eN/puFYuHnH0fjcfvS8sKu1o6J1rviLwRVzxYJol4p zpVH5CD/q/mNpNSScnu3bxZ+MnBebqSaWgmYncUBtjsG8NLF6YX/z2oTNZK92EPQLxrE d/j+w9ObAih4dV7zmptcQcGWUf4Rqdv1w5QODmhdSUODjGUyoM9ZiDidU2/AZ21WzSJk n/LvR/mD5RlcIwyW1/OoiNpDO2Q20ZBEnw47E1SA6wJnG4bVssHW+VLqoUvh92PmHFuG sbiw== X-Forwarded-Encrypted: i=1; AFNElJ+SBXaGOb/AycAjGPLu335Rr8vGPT14pqzSwOxd45P2sFhj6F6+7OK/0xnxvM7copclPdKn0spCtEAe1Yk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/1o1tUMVmIMLlqBg/fdiAh/KzXRY+O2kZBitFo4A9g1fVLO2r UPSIAQRWpuLKiibr4ujIEL3zhikyJnhhkr/v+fnUWIqzqxPMfj8oBXMJ X-Gm-Gg: Acq92OFITNspitGV3pUmd9JxnwYOa6OgomocYfrAhJ3XHeouueIadiYMt1469LrqvXe mIBbr23CLPY+FHgiA/vNJpcxxiVPhpVHHA3UPrI3J9gj7ZqIiAShvvOoM8mU4fWaDRCLN/Lg2V2 QPZPNtWEBmq+jvFlKjIpYHm43g0MyC55sqA+ddeZr9LbgICPKWp3PtriExIdKmAyJDzFdUo1RN3 +zyJRsWaF5WQ2ZesZrsEUcssMDS6HkHjSuc82UMxuitG2oCihE13tSlp8ZZJSX7vrt5DZvo4DVl LQnYiro8XTRYzcpYSGem8g6kQqbRivL6qGCPtoRbjxiBd2fsYyGITpu7VNHGrgT3efiPNctWHAG C0sV4GabdEbJG4TQ5aJl8XXB5wnRw4huP424X8ZVq6k8gYd7yuPxWywiNH5XJ3dQeOpTCq3B8AM WxDZw+M+o7sAAjNQkAqcgucVKqPjzm449JdJ6yysCBJGwrf+s6a4bNSbkVa4P/2dyt0fH4+hJbq IXflS0VDR13PKs= X-Received: by 2002:a05:7300:e82b:b0:2ca:7eb4:3e0f with SMTP id 5a478bee46e88-2f54b897f52mr4549823eec.5.1778177124530; Thu, 07 May 2026 11:05:24 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:24 -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 v11 04/15] platform/x86: lenovo-wmi-other: Zero initialize WMI arguments Date: Thu, 7 May 2026 18:04:56 +0000 Message-ID: <20260507180507.912966-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 --- 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 Jun 13 10:57:59 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 CBEF8477995 for ; Thu, 7 May 2026 18:05:27 +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=1778177129; cv=none; b=DhF9vEICgbEcmSwzfqhvruW8KF6/fysF64NJZfMZGjWNVuzN6BCuiz+QOCHdkZ6aRaZGRZlO1Gm7gXmMzQUn2GP99llfjnXcXeBxkN7i3KtjLrYJ2/J0ScTEJo5LiwHtlHUgJ9TxuzvzXrG2E2IWEL9eW9y5+naFjO4IT9t5VvE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177129; c=relaxed/simple; bh=NlwwelYA8uSHgqW88Xvl+l0Vc3NtEotDqvYvC1ZDl1E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iczz7MYPpOiKUXKtpPEqDLWDxHjseuWWwSBwq4JGgae2aL1u5Rh7cxi7f+vayIxurLwuRt/SNb3aZYDmlgFgaTNiq+q/E9UQdwDz9jyhdOnWcDnHx8yeXLYvfzFo0KGCa5HXI2ij3v4WedGBiVSO51U8KJthfC9bVGZzm+vJuSs= 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=H9Aon4zs; 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="H9Aon4zs" Received: by mail-dy1-f175.google.com with SMTP id 5a478bee46e88-2ecf9e398f4so3138645eec.1 for ; Thu, 07 May 2026 11:05:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177127; x=1778781927; 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=2LD0U2JI3+b32qBu6y4JGUu0pIw+boTDqwL9bnMsDgY=; b=H9Aon4zsayzzgHkCSp+c2talcKOMl7cpNnKXFJoYoywEbMXnCTINJ7Z6EWhibseHKK EC0iG24VUt6jlyDGvCWS4tdqsG/EYszn6aJj7N/KxnZOFoJZ19r072ahlc9A04kzCgvR lqQW2vUfsdRhcPWW/kcqYgf7VzDwpYbzowmnmdRD6WpAI0UzJ2VQ/C975TxfR/iBSqzq cKFHNxLSIkkFpLpteB/gWVauApQA3LbJv5h3huSUccdlJ4Lmbegicmj/ZpvZ97CgIt3K I0rU0g+m1AZamLfAqY8hEXtKfpu+LfiYoGW8Mcnkx2EwoAH5yZk5NKrdJXqoAjnnL683 6EJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177127; x=1778781927; 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=2LD0U2JI3+b32qBu6y4JGUu0pIw+boTDqwL9bnMsDgY=; b=kOz23DUFsPcevbuJNY7kTn2i8lv84mJCCe9rbPwiCRixz/yVblYzwj3+jxFFL17Ydg h0dffF6Cp6Gg5Ma8Ul7KU0/JfRCb7EinlJ2H9hYZ6aD+AGbxWL863J3EY+QqBfNJPvTH ucNRvFizQSTHKBW8p1HSbMRY+ddC+daYSIl4CmoZTD32x1StuqKfWv9RAezG28NhddJe 6ZDQqKqPL7jdzF4nAY7HrYqdES88gLjyzJTjO8mgEneARgHE/OcRMOPsOnbYrt3gKvXu UsWqTMcyMtNHOhrN+Bf/8dN9vhEgPuB6DoaayYKSkmo3qCGYK+FWeoTkMtpMQIkDEKrt rNxg== X-Forwarded-Encrypted: i=1; AFNElJ8kFlumR0VyVDy1eKqcsrxoaFbY8A/H8D/20FjsC9q9LPGmjIDWs6VMSBOR7NY/RybpoS9sjrqTwEvO4yo=@vger.kernel.org X-Gm-Message-State: AOJu0Yz2wMw6NOAndYwtZ3d6itCPKzusBRFmXt9XTJNnKXzX2uUOAqMV RXAQ+uOd/2s++yCrsp1a7DIoyCQKdl/31ANgwCAARRiEqY0Cn90pHD8h X-Gm-Gg: Acq92OFqfTdGiU5at15ZzX4xjXiiXc3mQvwTJq+K0OQ5MxQG5zHqauko5VWy7b1UjhF 4PQ98ZcsdSl+iyfhm2S6SkZcrgxZWqKLoHUjj6NKylVRkLXlHYMeVGydCioV4RQDnN8WfxrtMjp 5ifGRLXGGssuL4vXGdgYc2/8SO9Abq2JroJUp0ly7PgrdReJ33OngFLJKr5j7dB6LN3IfcZ8HAU fBp27OSZtnKuguJCTyG5IJI+rEI4MKBzmT1DXiggzLUm0/d0/Iml7NcfWX3sEtZL3PlhwxyZ+Z/ 3iEOd5EHXEt0GVPh2ix9P2h/FBqmBa2KmxwxsCGSIG3ijPCx/QF70SXxtP+J6uLU5bQfItez33M HkaqFajGI0YlHuHFIBhfgA9E0cJbDlOkbo/wXjIJxduaYFXbWtCAuT9ngIduJnIIyWO3hN/yMsp mZJogtEpiN9OITwL9jtjXM8hJcWLuplUq/GATK5VaJi1U9AVfOYgi3RrRdmZP9SzHiO/hGMw/QE 5fdNUe0qmekKLI= X-Received: by 2002:a05:7300:ac82:b0:2ea:5057:a31d with SMTP id 5a478bee46e88-2f54ad72b1cmr4708213eec.1.1778177125292; Thu, 07 May 2026 11:05:25 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:25 -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 v11 05/15] platform/x86: lenovo-wmi-other: Fix tunable_attr_01 struct members Date: Thu, 7 May 2026 18:04:57 +0000 Message-ID: <20260507180507.912966-6-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 Fixes: e1a5fe662b59 ("platform/x86: Add Lenovo Capability Data 01 WMI Drive= r") Cc: stable@vger.kernel.org Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- 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 Jun 13 10:57:59 2026 Received: from mail-dy1-f176.google.com (mail-dy1-f176.google.com [74.125.82.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 388BA472774 for ; Thu, 7 May 2026 18:05:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177129; cv=none; b=NlfFmAEyIyamf5iApyxvAg1E+JtPkSKzj6QObscbAGplS0On/D1fMtpzUcnkt8NJy1i0DhCVwfQ8m1qytcCyN0QRWbVpH/OezIzp0Aii9x3cYAEfc4z0SNKsyQYgF9BaT0cmwuyrAaX15TR/IJ0YRVcoesYqvQ0aKfdFvFAr7tU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177129; c=relaxed/simple; bh=bj4C9Fc61rCAzPyrp61MDvcTmd2sCIQxMjxgyu5JgQQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IO7l2ostDKvBOex2VKPVCT6/Wrsm54hYI69W64GSd5oJbp/SaQPGn9XdVWQFit4+woMD+hgptPPhN14KS2WsNAPyej9U7O0AGzPWy66MoCC5f6qqM1WZf7/9rJCPzMGvV/elyIFmNBL6JzUu7/X6AHHrriRQ7SLygV6PtGHkUGw= 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=B20GdH+m; arc=none smtp.client-ip=74.125.82.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="B20GdH+m" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2f0ad52830cso1761698eec.1 for ; Thu, 07 May 2026 11:05:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177126; x=1778781926; 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=B20GdH+mL0OjC/4bkmhzIiSJrWP5Mt2A5BawyKngeOkKpWIrCimA9EgzxiVC98gx+0 82gpqV66vFYUuLMJkh5INUzOuxrXO6ahSD+aBZA4mPgxvX7G9t+LcmC4Wq2DyqyyJtVo wntt+GY44YrWNS1MydhYap5NmfkBzkHM9rnh/5TOQsP5iykz7RGcG1XIZq14Kk/SjwJ7 wstTxtuaH5mIlUQKx368/H6M1Jtu/WjDygOD0Wbf91+SpJJMQbSTSejTzsNmg8azSEOm d46j28KftPpff2rRvL64iafodN9r+W0az1hON9JyRnwFqGoNSRI+tYeG7rmM8Rw3CPPM NCMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177126; x=1778781926; 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=Ywlq3M/OKswrWWhqpPtnaYtalwEYaOfUJfGqP7sbN22HgpUgS5PWb3lOk2ZXG7LN1p okY46ih9XoeXazL6tiOxUO8HfKIU+8gBJib4vXi0vo/KM9dTWH2YpwCxodC7CEKSYA3q mheeGXVJhe8cvCCvtYHTjtBWM9rrPJQNLtCSJkKmyDgz6moC9bALYw0ic5f/n3rldyOn 2mch9VixNxg5Ke9/obYwqZe4diySyltrfYyKHpo4z3L78ZTee8+hj7DKm4fy6f2htPSe q5oU64wAHZHZ2tZKa2+eeUDzMV0Mh56VCBMh2OXUKkcOCln+Qwk0WOhUxWpWCAIl3apr Sb/w== X-Forwarded-Encrypted: i=1; AFNElJ9HnIKTqppZH9J/EkJQI9C74TC5QJQdpJnR5xVsArsrUdRTmkxMRJPqWBcK9r0dBwbrbp3uVcca/FAN0TE=@vger.kernel.org X-Gm-Message-State: AOJu0Yw+maSzR4dtL9OAZYDrecjUwGGOHEQArbU0hSK/X90x9GF6wogT kkS0IKcoAMUgmU4+FaF4cBgy2OXBp7zPcfSH+Nv3VPv7z8+8BOy+Eh6r X-Gm-Gg: Acq92OEQlGcN/L5koYGnAVTxIteBjP1lGpW8PlLAYlHpVJNMs4MfnhHhMnGLB0BCXVS P3hpKi0EoWkUaubf7J/X53lsO7ssuZAzw9bZCf4ZBPZp+RqkkUVR7kbX2DuZaK7YdLnaiOhGv+R SuIh11iftwSytfYcZeKjxyIZ5sfD/0CbQ0gDM87fNBQ0iuIovMgw1eY1HWKwaXgNLNpzMqzWU20 x8kHrIIO6Y3XH9jXxsozupyIiZK1Fqh3AcULCmNENpKZL9nNKv43jWaZTosi8ovzNSooGJ3Lnqz crHqxtgpYuTg/89vPg+U2OGR7OatvhXizViO6UNFNDR2QmvabWQq1TGnD2D0G7bGSPewaVx4MP6 vDN7PFlbHyovvH/agli9vLasFSUF72qK9XcBhpT9fFTpcRVEl5GTRDH6YtJLnIpt3aidPAwy1L4 +H5Ik8Ya6IGPkOt/lFUziBWgKtYatMlIx35AfqhWnETTXnTHwROfVLIM1wLeNUICOdpIDno8cCJ V5/fbrG+QkrZL8= X-Received: by 2002:a05:7301:3f07:b0:2d0:239a:23cb with SMTP id 5a478bee46e88-2f54a77fd56mr4588623eec.16.1778177126154; Thu, 07 May 2026 11:05:26 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:25 -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 v11 06/15] platform/x86: lenovo: Decouple lenovo-wmi-gamezone and lenovo-wmi-other Date: Thu, 7 May 2026 18:04:58 +0000 Message-ID: <20260507180507.912966-7-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 Jun 13 10:57:59 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 26B4E4779B1 for ; Thu, 7 May 2026 18:05:27 +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=1778177130; cv=none; b=TfdLckuhx1sZzpzyyaNVbmhzxwH7DrQeNRKc0G2BeTHLgDal6uAjH8D7zhbAdbWCkFIbW+2mDDSB/PqVBv8Yqle5v/AFfPwa200du6NJl4B4TNR3dtd4CzkNvEP90VJqlZgre7rVNjdpoJ3GBMn3p80dVzxu/P8qdvGuejbAiSY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177130; c=relaxed/simple; bh=Piaa7AgWZQklS9FETl7ZC9C5QDxdRu2MXtjVntyVsJs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s2rFViOZ94KvKoV0EmmMLl/A5KJd9fwJ9quSjvghHK7r27tFTUOf9bFv7ZtjarZy8FS0M0NSsFKdE8TdgC+PKB2s6SW6Lygl8Gl8P8M99htUFvD20znM00Xe1HkpRRewYnb+Roi0NBVfxuqAcpWl4VYm/AsfVx5OnH3vK0qlWVo= 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=ruNj0tlZ; 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="ruNj0tlZ" Received: by mail-dy1-f169.google.com with SMTP id 5a478bee46e88-2f0d3e07e30so2975317eec.0 for ; Thu, 07 May 2026 11:05:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177127; x=1778781927; 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=8CfDVFKSoZ/AeItTPx6z7QgTeQ9+ypXUzFJnVp37pF4=; b=ruNj0tlZ9ixQ8jTD8keFxHilDPQ1WMsX1era9ig8L/PKUzC7WtEPBx/bbxVsCYMfqZ 2PtSdBuJaHXT8a81EFqJMtfruWKdGuq92zcF+fyPFI8mRPw7zlci5lznd6JWSRejnKNB ZBF8T1F5PqBl44vntEHvpsBR53H0gRuj3wWEnikyKy/Uwl8wKuqbkIVDGqgZCY00Nzan S/VixM5WUVpMNGAjc6VIMy+sIVDGgasa0uzkgb7xJLV3dAo/Ch5WYaYj6i0K1P2V6n+0 VKElKZe3q8u3CWxiiCiJ2Z7SVfcPgs7EG6rOfbS6iIgiH2OwUTQXwVYrP57LEq4h9dcT iKyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177127; x=1778781927; 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=8CfDVFKSoZ/AeItTPx6z7QgTeQ9+ypXUzFJnVp37pF4=; b=dqRslAmwslw7spRG8p0GvQ1U4dP9G063qYsIzJy8KTerIu1KJhmFqlfy/pIAyN+nFG QbDXROV45dOM4DXAm/7dAEwFo6047fave2NfkC1pztABWnwTee4SdRzR7vNdhYMp/p+t b5OfaPZ2WW/vRhcduyzGPLyHxxBdgmKYDW8igR3GDpIuFJTd03fTsLXZ5/8F79JiZQEw hRSPBqF+fhG5n9pRLZvotwj0uyJr71fHypzsTnGjvqeq5UszBta51IrFf87oMm/u/Kgx aqY1nyEHKemfog93Gx04Y0MGZWIYd7IIJ5WEa16oPVaeym0dqMUhTd5+9l4FfcDrqeF/ iPjA== X-Forwarded-Encrypted: i=1; AFNElJ9pf2iCPgwss4ftqC5UloofUGu/zgFpZkjGPlIpyzG0yyfGal8MQmPCqnZdMDKrLx4SdMo3ghzn6jsNTio=@vger.kernel.org X-Gm-Message-State: AOJu0Ywnuo67PDncTmj+KvQXR+3mQ5R+Zw65QFynIWH46/O/s6nbYVtH Z24OnJJdy8jtZ1xYF4waHOqf4ci8OUzuvdAVOXwnaWDGogeF0XPeOvekes2WqQ== X-Gm-Gg: Acq92OFZ6kS8NT5zkcX0S4NbYMLKYCrnr/MV//ho+MdH6xJfLUb20vWmklNOVJ4XHmi fsX67dj3bvNmA/hzoVQpzNuaoCHI00XRPgzl+++F+cV+lqEwp2uKib4XEMhDbdhVnOWz3ikIctA hSMgGJlQoNEDiryMEZDGrHD6nXZ83wxjqNdjDWWmWNpS3Ig4ner9AJcBhwTw+KOV1wU8509QVJ2 UY5VHyoYRkBhPfoW/wlid1ziYQrUd7bMCfHGXsMai0qdoKDMrMPmaQ0aTJGlkoPYyReixjO/A48 UeriS8PF4YJt/dVW1jVnaKk1wM/GY4V9HsjnWbAXvSWPheIKgAeA/zsTKqve09GuaaYWC1/zKmx flSJ8jX0tG5uTujSi7tDkqBXY83OMKyn6HqW7kSsmG6Y0PZwMFn9EusOiGkdC4bayNo7yYCf5Dj B2gvxsy8+9h9Zfq6atXWv3bI2gZO1eHqBs+dcHgNd+U8YYd3qFEbjM3fP8qpUTRs+ktlb7nZjgv ewg X-Received: by 2002:a05:7300:570d:b0:2f1:fbbb:e321 with SMTP id 5a478bee46e88-2f548a99568mr5243996eec.6.1778177127092; Thu, 07 May 2026 11:05:27 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:26 -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 v11 07/15] platform/x86: lenovo-wmi-helpers: Move gamezone enums to wmi-helpers Date: Thu, 7 May 2026 18:04:59 +0000 Message-ID: <20260507180507.912966-8-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 protoype 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. Fixes: 22024ac5366f ("platform/x86: Add Lenovo Gamezone WMI Driver") Cc: stable@vger.kernel.org Reviewed-by: Mark Pearson Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- 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 Jun 13 10:57:59 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 3D9D4478E55 for ; Thu, 7 May 2026 18:05:30 +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=1778177132; cv=none; b=DcZVkhZHJkc6H4icBZGCAq/I2kAaUBEau96w+sJzzqwAp7wWZxNsXgtvQl9mzZl0asOIfPjoMSHyGBnxdWo3YVME21gIo0MbZuQ4Sw8c0uZPQBeChsPQJXXBz4TeRuKjMJM1juP5RcGozjoeEEu6tdHPxyTa1txE3QQ4dF588BM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177132; c=relaxed/simple; bh=mL0lfOE4yxLtgQ2PyR8gJywj7w+29I6o0b2ySuB469Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KDAzCEtlI3Ee4Bgf+Ge/tdwCaR6TQUWbn+lmyv1VzRAYEUoPRZg18xqrEZHN0V4BprM+k9VBFFOqvAdjpkDYM6djk2bJPvcP97Q9ox3dMBKRi9FLkGz5hrednSV+7chfAAlcLZsx4oigF8cO/YlzZ4NkUUfq2n1LNc1oZBGND2o= 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=UfkSCGxd; 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="UfkSCGxd" Received: by mail-dl1-f43.google.com with SMTP id a92af1059eb24-12c8ccc7755so1971023c88.0 for ; Thu, 07 May 2026 11:05:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177129; x=1778781929; 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=Od3MhystolTIKvbXiIb2J0gYt1F0SGwMJxdYrNhmx3E=; b=UfkSCGxdcLhWnqMTiH6xI+i+RAihOVEAJbLFfZngbTqQGKUPLLvbjRrSszCsvTpEPl 1tSJkAwl3UzW1FOJLt/HDHodFW6n+69t+B/iuBwiCThI/N/Rsa9ySDDPavP1rCMoYwee WRtHUtIjlpQDSec/ZyBr5JhA5g2qQ/jR7KdNq2Kd2qYanUrNCVkSW4JcA2cm9U47hYg4 ZZu3wn/3yOXr42ktrJw7pPBW9Rds6sJsGTb8TPk5SJ2oxsrDZ15Lo8ulccdgVcbQuChX +4dgfW1MgXUbPoifjC8qbQpAT7hssiohcyb09qEbE6t4aHnEg9LWcelfyRotmdQSP4N7 Cs9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177129; x=1778781929; 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=Od3MhystolTIKvbXiIb2J0gYt1F0SGwMJxdYrNhmx3E=; b=Ln+JQnepCDxtCBnAPeJVMjImKSoFu76f6TU77/5hNUm3oj5s6B5tU2TKflckkps7FF 12U3Z9u5PCBU2aeJhr70ha7Rv0Q6hKZ/lnJjF6Lr64Scg/yq1rGR8NBNMq5C5c7DKp3f knav14ns+VlSAuwaHNEAlnaHZSoL3919pfVaEUTJymQAcDVpA6NWmtBbgelILJUlVikg kCTe0xHSGOCqhuypw/zXAR4FtjMfS4fVxfxzu7/K1KJvSwvelM3jKbTTz8Lg7dPneSOV /6KyCHw+WELzivTigjG0u3g/kiiTZ2ZnGkqjdb+uvJiZQYxIUmn8pXj+J+0tsRH5G6LD m0vw== X-Forwarded-Encrypted: i=1; AFNElJ8Z1o+cIR/SGoueYVGx+pt1Xg1jf+HSpb1J7hdlpuUPewu3fQKb99QY7fcyCw3iO00i9iJABCCfr0YGnPA=@vger.kernel.org X-Gm-Message-State: AOJu0Yyfw4M8sSn65jFj65GuF1NZwReI2ZSn/nFrS2nvVICfcFhiXT7Q qj7a2KhmLa2GgHazqLhi8G99aSU8S8IMbVmqgrC4yXJR+EacBSRn5mK+Of4rhg== X-Gm-Gg: AeBDieto6KY6zyLoyXOobAZI9JrCuw5ANmJ69JG5ndUROL4Yv7sJ3/MDD9vTL/apbdu xOZO0w9y2BlfLhw8wzlSPz+CokFBACJXacRqc700Yyku3MRwmUyz+tJ7Dn9+0T3+/w68Awnz8v9 ttpz2ZR0qImum6bPrTq+16cL/k4pUQgTHHzFis7Amxu+J8o2CMsajo34N4+E5hvMpm/eQm9wiU5 AoUhi5u0hIT2DffqahdCjAViQ8QLtkgBACDRGFZsp7J8AfoC/qc5w6iOOgl6WxER9+v1rfP02yG ENeM9H37FVO03qEqjCa6NAcGFp56Xxiu1EIt2pxlF3PRmBJNTbqmbGatjI6lc2KtLOuLKUHkyRg BNTfhFqUfx65WEr+G4/HmJkd+iMhfeyDS+LfE6oGVLi9gic/Ir9gUVN72DQ/JebaRaccEi7mgKQ gNLDiT4aUL6GccJHvm3AjFHuVXIyaY/pYMT/PpO2th2rEmKDeswzBbLsYfskxRxwuN0q6sTnnYz Uy2 X-Received: by 2002:a05:7022:6609:b0:128:d24a:a5ba with SMTP id a92af1059eb24-1318e7f76f2mr4281285c88.20.1778177127896; Thu, 07 May 2026 11:05:27 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:27 -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 v11 08/15] platform/x86: lenovo-wmi-other: Add lwmi_attr_id() function Date: Thu, 7 May 2026 18:05:00 +0000 Message-ID: <20260507180507.912966-9-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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. Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Cc: stable@vger.kernel.org Reviewed-by: Rong Zhang Tested-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- 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..1388eaf4ab4a 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: u32. + */ +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..e69bea72e6d3 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: u32. + */ +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 Jun 13 10:57:59 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 AA9FE477E4F for ; Thu, 7 May 2026 18:05:29 +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=1778177131; cv=none; b=p+JPpBZmlINc/WGY5ef7266T7Yaft6eYxGcZLvHVAhHyFSy41IxyIFbtXBka8f7xsdCcC96HQMz3WuP8QjVYM/8dl9e7sWzjYzZX3hwwTQgIhrA9BHRSZpKQC9GJ+5c6VQh9J3qOlYSEc9uTmPZUqcb55Qby/bNdRg83omQaDqg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177131; c=relaxed/simple; bh=T4aRXknDQwMTNu9P1SJYUebCzEXCCGChFfvBtxKvA2I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ijc6fyBGuXs4anEwirjSDNUFof6bDRdsVADeGtL0niCXmvyX8cAqfnFicF2NThQCRGEWeyIII/muFOet2WhYO7QTpxc0zu5Vm1GQfTR+JjSo1UsBW/LohyhUXrCo8io9lRWuilfKD4Oa6cymrY9+RXJR+geHzrdmsf0d2k2MWRs= 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=D4W+aXhe; 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="D4W+aXhe" Received: by mail-dy1-f172.google.com with SMTP id 5a478bee46e88-2f33ae12f97so2106852eec.1 for ; Thu, 07 May 2026 11:05:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177129; x=1778781929; 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=MB9xcF1UeOpmjEj/AGTJRZmAzkM+hmCLAylWOoD7Z3I=; b=D4W+aXheAcsgIWhnZptjQGafE1wxWfauMVK/30M0ihhWyf6HVyAJnkSDyshGbhGJ3M /+6KC6Qh+Icv4ycWeiWR3ZlfWl3SC4IKaLam+HQxZPuknVydd/+9gshNyJk+wYf+GmAT Kx28ujzmj9t1njg/hI/xRYu1vDoKdo2VnO80RiqK9ljMQuEwUHEtDksDtPIqP5Rcs3fc r7/XqLTkVnpIvjyJD4q04TMJxXZe8MXl17dUzWui/dnPs/QK1v6r9boVucWLgMGlGNAO v3xXNDMVRoPQbgQE0y3jGoMNsg0e22u9PYJSgUIAVX76dbSixmjTj5I6kC+6G1gIBOUR F/dQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177129; x=1778781929; 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=MB9xcF1UeOpmjEj/AGTJRZmAzkM+hmCLAylWOoD7Z3I=; b=ehalC8pKryLjAh54rYBFQY0F+JUUjVscvvv72QTIny8lCKjvdtKA3T3bE8skAHySb6 lYWYxqVZZht5hzJu5ttoAXTy/t5SmvOv9GMb9JJM+yY42z2n0wQQHz2XxiQCHJl93SYM 7geFaReQfV9BYtwWawyRdatAFlT/xu10uh/jJHSC15FG/95LGUl+JOybHwchVnbJiNM+ UaKs1VeCdJgLPIT+voUc0tUY2O3RF7J4Wugo0SC7DYfnXkMqXwsRE1S6TC+o8TsVISpK ncgyAlUgbITpPqqegGOy+FiQtjxn5QrGVwGFEdXM6RH75mk8w0KNx/yhK9MO93zPLDFu x+2g== X-Forwarded-Encrypted: i=1; AFNElJ+R9Kjjm4Z9fBUbLYQLKUdm9zo3YQgVjJ3f8Kv89GwTk/HzZMZodb0DbttiDsutq2aMqGLaWY5syH3+B90=@vger.kernel.org X-Gm-Message-State: AOJu0YxbELfjylm7MbxuR7gAhXWOlQcykDTIByUzFFEpIfwhBKpABF5M jZEOj2h0Vdw/Orl8puwJ1bqR7wwkY1wqGHpaz1bmQkUpLva37shQxFQOpZxAew== X-Gm-Gg: Acq92OEmOng2r7qqpil6C0lVvdMZbvyq82oo965vJbcVcCNc9ifYIT6NJ8FeHqXaI7o NjGwVpP+EBhTLvaq/9AIbL9wO0hzGG4rfPqPDySR4GDqXZHSj/90IEVt1ClhtPEY7dbr5NfPhDb Yc41LzcRnKJeN6QFISqioHdvv/4vgv84RUemkqdm3qUFsEyrpexXDwwpYLwWcDCUjgEtFW9YiZ7 CrCVyQDFlVPaGDONqQw5PimlC8eoxqoWlAa3AKrFk0LS2hBqpg1lr5cisVAZGoeMMzuZh7gCxbB vjtIyN9FBToUrKntyBwhbftkrg/ZXEd832c2C9N/ovMcQgeLeiXEaf61e665O9ldeTYuKNNLQm2 u8GKFuptKXJg8bU1KyzSIYWyhtdRHkWACt0rTCVCYiZIk6slpUmPT/vbT7r5KuCSLvZfSZREs5u 84HH8dbPdOceh/2ua0czViajgxxAGK0MFHgyattnXJgnjDkn9m0GS/5uYjhBnQc8EHGU43d57ms QjE X-Received: by 2002:a05:7300:ac82:b0:2ef:9961:27fa with SMTP id 5a478bee46e88-2f54ad75680mr4610166eec.18.1778177128710; Thu, 07 May 2026 11:05:28 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:28 -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 v11 09/15] platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices Date: Thu, 7 May 2026 18:05:01 +0000 Message-ID: <20260507180507.912966-10-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 --- 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 | 86 +++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index e69bea72e6d3..e3cdcd0f4331 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,75 @@ 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. + * + * First check if the attribute has a corresponding capdata01 table in the= cd01 + * module under the "custom" mode (0xff). If that is not present then chec= k if + * there is a corresponding "no-mode" (0x00) entry. If either of those pas= ses, + * check capdata->supported for values > 0. If capdata is available, attem= pt to + * determine the set/get mode for the current value property using a simil= ar + * pattern. If the value returned by either custom or no-mode is 0, or we = get + * an error, we assume that mode is not supported. If any of the above che= cks + * fail then the attribute is not fully supported. + * + * The probed cd_mode_id/cv_mode_id are stored on the tunable_attr for lat= er + * reference. + * + * Return: bool. + */ +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, + (unsigned char *)&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 ? true : false; +} + /* Lenovo WMI Other Mode Attribute macros */ #define __LWMI_ATTR_RO(_func, _name) \ { \ @@ -875,12 +951,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 Jun 13 10:57:59 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 8FC5147A0D7 for ; Thu, 7 May 2026 18:05:30 +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=1778177132; cv=none; b=SARN0i+TpR98EqpH0L2rkZh/kol1eaPuyDgDqyEBhDrfYsczUspFUGr+QVWLscCCyx6MJ8QLPHN81yRNtDw7mXSQkBPlSTMux09EQe1LTh7XbXXN2f8hc3GIakfp8ON8PaeK4Z9U8Tw65qPanrbFwMMSIgMe1hiDmIH+F7ChqEI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177132; c=relaxed/simple; bh=DAoCGPsaR1EACEs79ZLUBnCKrY5CStAdQJc89u41Ubo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QuTHtAhdplecT1kY9EjEz2GB/7SlnvH6VWvh29FSW507+iJWpTKzLnmpgiJcCI2DGvWAonspThqzlTU0Sr01Tp+y6ArSCAkJpBWsyI+fvBxAl7Wpu9TwTkjCmv8pYAUbkTeoYZrSH4mfQu2XZlxJRuRPV3E7/JrcFOeusvR8WZU= 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=jXtdfrqA; 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="jXtdfrqA" Received: by mail-dy1-f180.google.com with SMTP id 5a478bee46e88-2ef38cf04f0so464616eec.1 for ; Thu, 07 May 2026 11:05:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177130; x=1778781930; 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=T1z8bYef7XaK4TdOKilumRIbpHe+QNSLXlfjcfuTzco=; b=jXtdfrqA49RVFxOihvQYLPced6kjfL7oFQHsRwRuLBbkUb/yL+NP2q172p6oBLoysC hLy5dqfop62z+NbpeLuAwAKZZAKj6GHbGNFXbaVzJ8kNdTy300iNBFUS/JviAA1/eReI gRN9YRYs1+TZUBqF9awd0SYRIHBCLF3ZYKjPd/gWGuCZ4G1/0Tj2dNXKef+/EKqpAYuX 9/N/+2P72N5sg3zv6E1l1YsxA4JFYfnA+jdLH8AbqixsifINF+yIW1xMVoLsdJUl655W 7SyW1L0ENVWknzTpysU2jIXvk2PvcBjQL6ydRcCrxCmzzFpiPpTFvoclfJAU2VON3buj XekQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177130; x=1778781930; 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=T1z8bYef7XaK4TdOKilumRIbpHe+QNSLXlfjcfuTzco=; b=eEgiiVxlbuXyIc8K/1CoYVk1BWoCLNlQMW9PctWxaN025ddGFZmOdADyBSyq1bh5cC leIyK8oRdbM7gjuTuVMVk1wneM2AAQxB7Y8tchnd6MM86Ts4m5u0Pwj9o4LSs/SV9mZO ccRYTiPIHXNmaeuxGzg0F7am/gxond8b1P+4hATxSVNMSVxVKbIHOVZEzpXOTUftp1iF +l08mfOOV+cyt26mvA5jT9OypwmwCtMYyeO2EBE+b5npUEfrtZK2azKG1rFdCL6b7xKk 2LfzabKlH+soiTEL2o2u2QJ/J0wzDPtk2ZWEwlOaAKb8MjTpePzCO/ElcTj8sNJIPVim UWbA== X-Forwarded-Encrypted: i=1; AFNElJ8NrWzl6QTUhWw+sOAjfrTfGsQ1ISBlBElyCYwIP9u5/cayAbuqM5ZAWX5uqrrz18TO6L3wWYxz/g0Uco4=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8b/ED9ko0eZxbjNlT0hq/n7HCfdekbqQY/LE/Xr3fJV0XTogG jyWLh3ql2mtmNwbnZsJgc6p9CNNNHv6s9nsYqi337eZtzp1fidF1unjq X-Gm-Gg: Acq92OGgTQWsDZGVZ6EGLfskMq9LlIQfWno+r0Q4J9EWiuXvH5Ihz2LnaJsO2yLD8p/ 0Qc9OgnuohO4phBDsgbZ1PnUCjRIiF0pVB3G1uJJVVX0zAZbULG5OP4AdxWTC6crWWutJmdUJhn tOrdUi1m7BWvkrJWyx7K3//sqlY012jV+GN950m4LgCXKMmrEONCpvRqnWHp7C/6utKsN3/eSPB oUGVlfK405cMA/fYFMnAMIw4ApWEhSU2sEbPrnCs8bxG2oHYxYzuzfvvNEFMczJi1FnkDJ+4kDp elmXn577FiZYu40WGpi+3Vtuxspe8QDeqgqaeLMvlwHhxIiNzl0gjatlwjJ7CdnAx1ijIdurawY J4lLu4+Ah6vzphd/pJhaxOU/cyIJDSRQXn/Reg32QPT0NLwfl/TsPnss2H1SkylKtaMPWM+KvVL e23mEiRMEO7fJC4dFjh/uqS1y9XvqyR5B2Xm1EvWHP6GzI6Shz2xdgIqMWWILBad8nDsQmYN0c1 Kl/ X-Received: by 2002:a05:7301:3f07:b0:2ed:e17:d50d with SMTP id 5a478bee46e88-2f54aa86739mr4946473eec.32.1778177129588; Thu, 07 May 2026 11:05:29 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:29 -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 v11 10/15] platform/x86: lenovo-wmi-other: Add missing CPU tunable attributes Date: Thu, 7 May 2026 18:05:02 +0000 Message-ID: <20260507180507.912966-11-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 1388eaf4ab4a..f2d45cd7a188 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 e3cdcd0f4331..43fe56a40498 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; @@ -905,17 +966,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 Jun 13 10:57:59 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 697E747AF66 for ; Thu, 7 May 2026 18:05:31 +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=1778177133; cv=none; b=H5rjlXUzlgPAuiK5yvddKWKDp3vm0x6soTeEddSegDT7yNLIs1LQw0SPENVqyyuzUWDbQ3BxPscHwban5icmC9Aqm11SA9GCHuSf4PnfRLYuOAuKm0KZyeZex59IAihZocB2Hi09J7LBH9rXRsGPSI8jxWHseD2P09HQerF3hSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177133; c=relaxed/simple; bh=rYAoMChL+f703OAS9deNQ5p8NAhTB3d69XXerf+y5lQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=T9ASxnmg4l9pD+Hzo67+U+fHt2U59KXCukgy7J6gzKIC7HKQMvVYP+yUMINp8JlrBrVwfIdFG6Y8cM0nz4K6B8hucYOYYEfNiNASiybq78SLEwC2vhZDCZTmM8qRhgYEgouDfU0HcwZyc21XWkuX46g8nRj1yVUUbbGbzPqqNlk= 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=DJTRKBMX; 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="DJTRKBMX" Received: by mail-dy1-f174.google.com with SMTP id 5a478bee46e88-2ee990e8597so1961913eec.1 for ; Thu, 07 May 2026 11:05:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177130; x=1778781930; 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=vCtWlqVluBBc6AGkLAJdrmb46oNIJ81KQ05m/in7DJA=; b=DJTRKBMXxBPgjAqefZ20tyw5EIE3obGu6BL6m33m6hCicD6EbQolap8o82Iy5SazQa MevuCRmqraUeyrdAJ0spIj8sNKtbGWry4BqZg5YT2K2xtPQSW1PZkKcLSNdaKgFwevpb aO8mTY9rBcooiaRSZFNUudw1ZUxmaoPzWVg4tCG3A49MSXmCYMLCYcueUR35yairnnp9 E46Ey2XfU6O1OkkAY1FqzJsXGzb2z7CbNEb1EQTmTrmIern6Uzh8j10kjhft6z9DLJCB t67qOoX986xQgKjMcfZUiehkE8Me3gYSKLBuN//uFkJf04Qa5n7JLcZkdKxbuKEegd4/ 5kfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177130; x=1778781930; 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=vCtWlqVluBBc6AGkLAJdrmb46oNIJ81KQ05m/in7DJA=; b=XNZfwbUchJWS9F9dWwYqbQvDMFzCYY1f0BRFtPs5hkF9iOVNt80FqUT09KLuKcvbrr RHMTPR9LKl5fDilvXzbBMszlKDab7RvOGFtjhqM8vfud8jxwX36wyoxpSvKbtOjQLTZ6 CxxtWWK9FCqhFZnRyVFr5AeGwzie+QBeyRVW6+fswhhrPnvjEiobu7pyVNK7JCblza4D XAMMQdaHTcxVcxvaytot+junbf17CmF0t3f4xWARXnGOKnn/tbouW0DvfmcJ+nuimUfn KBumch9qwBGdPM895mcDQKcA5XYOWDyelROfCbMLdujOWBEDNLudAEczgJaSThOaujwN 0DfA== X-Forwarded-Encrypted: i=1; AFNElJ9qR6Rut81E9t70EN6fCnYxWnGArbRC5WMiZT/7J0X9C+lFDe3wxBIrMD3gYbijq7CLGeAXuigN0vlKOtM=@vger.kernel.org X-Gm-Message-State: AOJu0YxGKYLh0Z4lTyWVpGEhrFFENi+TZSHOd+3q7VfiYafUV69OvWbC KpncVd821a3lKxToPMO3hbVMZFNDzhWzpjjhok+cu0Qf+HMVZ6L/ZnAQ X-Gm-Gg: Acq92OE/b8TY/L9mdAsyN1u0CHMtAz6g51m4iC8Gaphp0kbCsU21+VdYU7TdQq+Qh7O bRw9Wf4Oe3TUFa2HgsWmIVnDz2c7lBDFRA3oyDC1FQldNpsqGm4rCq6zlrMplcPC1HrUOGJMIuj vXnUZ2LRF1r34q/y/qTgtANX9jcQbN9FbfmF6Nyntfwo/zy56kF9xABjVl5SV+vE511EE+AM8U9 dbjQLKiqrbKJYGYF5dqGJXCogpH0Y/8sg6wOOAbtFFANCP7copHg7Rp3hO5DgtgiDlEuRPWNcTr NQYEGez5n/FF6dnUuOMF1fPapo3yBdFXFSaSk1SU4BwKeWbXEIXQwaMlFF7wzpD5OHyUR78Qbp/ Ixeey4jJoxfZ1nDQXbBbT0R0/oktVwOOyzzuGUPGAaeS7ezcuXRmxqrDktXCCfnGKEEIc8h4rsD mDLnbPRQA+CYqlNpLOapziv9CKOVuTBlkvd6af+GD3y0pXyx7IcfX42e4v7jQsMOryJT3L71x4U qFd8oMj+w03Gr8= X-Received: by 2002:a05:693c:2c01:b0:2c5:b23e:48a6 with SMTP id 5a478bee46e88-2f54b265a7dmr4776855eec.23.1778177130380; Thu, 07 May 2026 11:05:30 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:30 -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 v11 11/15] platform/x86: lenovo-wmi-other: Add GPU tunable attributes Date: Thu, 7 May 2026 18:05:03 +0000 Message-ID: <20260507180507.912966-12-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 f2d45cd7a188..891b12ca1db6 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 43fe56a40498..c84de0ad0cc4 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; @@ -966,6 +1039,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", @@ -991,9 +1065,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 Jun 13 10:57:59 2026 Received: from mail-dy1-f173.google.com (mail-dy1-f173.google.com [74.125.82.173]) (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 F2A8847B43B for ; Thu, 7 May 2026 18:05:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177133; cv=none; b=eTP5m33b+8kTzSHovH06ta6GXC3Hj5DnMMGn33umYHX3Kdkm9cqzbfmlI2JmPo/yWr6W3XHBN7y716cxgpOk+q5O9YozbrQAcFXQVg7/HBByYHZBFwlBh4QJ+cTKcbe83Tp6USZ9tFiEJuI4OJLVgIUF6edIBVqisWi48x++Lr4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177133; c=relaxed/simple; bh=+QPdSU+dPB1x1J3djFO1i0GpGdLxjcaXfm9GenpXhHg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=V2cv5lTiAJxEi+AUsOb1TAEMQGyo7jx5p8LZ39jatZVCJmJ0yRec+v/xHmHwPCloeLcyc64PP/ENkzOjDt9Kf71RJrLNq/UsOz7jTHIEXJg6/YovAMq+gxzA3cUi68Y3EClt65iQMLXghIolJ8S4bLHtMh8ny+W04bkjjpdtmjw= 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=qGh3PRt7; arc=none smtp.client-ip=74.125.82.173 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="qGh3PRt7" Received: by mail-dy1-f173.google.com with SMTP id 5a478bee46e88-2f68f3b075fso2066702eec.0 for ; Thu, 07 May 2026 11:05:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177131; x=1778781931; 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=Lo0uRteE6cnYV0vTF/SAFjT9HZ5JS4EyHjI/biZinx0=; b=qGh3PRt73KGLSUjMZQJv+xxAPgtvdACQY4Y58oqG6mhfXG9OWap3M78p3rxDDv+MDg GAh/HDY1rWv4gpoGpVCErU5TPzUlf0HYvoEByjhXEF0HRGwh82+Gc8S1heu3ZWu5DF8y drYXV8NK/M7Xg4YFmVoDNwY2PXn68d7Li80xLaP8KCZpJc7Ud0b68EBX2yzfx06flfD8 IHxg5Z3d+u+MhfqxMsdd9zo3rfRC7sygrPjuiceiJEjZxTXTahFydfabU+dkiieKc4Jz 4T6fW7FCW0QngJfslldZkow946ruIUE6k5OXCitCl7+gpTQr8Rejf8Os6Y6Z7+QTWboV UvvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177131; x=1778781931; 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=Lo0uRteE6cnYV0vTF/SAFjT9HZ5JS4EyHjI/biZinx0=; b=gkiZ2oe78XBWtkWvZa7jM0Wx9vwMcQ4MJYxOG8YQLf8i3Fb80NpH7HWHIZMFMh9iiz PwbCwM1HJSjIN0dSofh54tlj5uWn9a+mtDuWedRnZOTQUYRn3UTH6mEsT1N0Am+Af2OA W57iZ58JHeB6IARxQEyP3pcET3L9UieR1xwNzagL1F0TCaDUKX61CNnNQOMS8AHKjSqn ICh0w9yY7k+N0vylvZf+1hIL8DfY1f00rWc3ie17rJ1HQ2Sz5HbnV/fKOJsz1T0vloGn yIFJmcRPX8KfmFO1K5LkIaB2SxRjbANzl+PjMyiFCdADPBV9lVmQNH7hhSwEJs3rp7U+ V4eA== X-Forwarded-Encrypted: i=1; AFNElJ8KxFsN65Y4aZhftvKm0CBV59E9iCbFFvz4gONQ6L+cypNhRgUnoxxD8iZ7f57ZGLVl+ytFfe6O08qwUmA=@vger.kernel.org X-Gm-Message-State: AOJu0YygSpVirUh3JQNeUoLaEbPVjKRyebHg5x9VpXz7VPwkP1fmB/+9 ijI3lf1/rSqStO+MsE0Au/xtCQpnXg/psDpd+otLAz3my9D5rXx3NAn1 X-Gm-Gg: Acq92OHnQ+Ns3+G8AcEU9WXbuFAjzcmXno+nfPW4wN9wlpW1UHkPhbOSULHAWwZoe7w CVyEVnoM8vH/4+sT8isrwoICnfmvh5roAVkl/ceYmOpCLhN96O7Vo+fafOZ2pEJcz0tNPJuhgkF R22kI49BkZMSHIkrUEsClH7vgcOaq7hgt0ovfityBUJgpZUamUS2ijNRB1kzzLRATlA29duGgOU wQBCa8P/PYQff4rEklWpAWMSNt/DNjUTDrk+KO19x5M0OKxA9ATwzAj62W6y/K13j1TeTD3kDYF RpQLEiDkpaoG7pkCpurvQoVXwaqI31eFCVioRw2HLIkahcAiCnXWrlX5a/KnsM/8/KVu4uS884c AZpJCQJLbNThvvXB8QT+4XrWJPmZm5MdOjmCktZj2R2LemuLDD/bHb9JSVNGLYxJriFUpUD8OqT UYs8xZ/4oVe/05ABPWWdMgPpVRBewBRhuozsNDQLHQu42VuTd9YfDpo1ZfzpdEObe88efdzxCfz 4wu X-Received: by 2002:a05:7300:3245:b0:2ed:e16:6b4a with SMTP id 5a478bee46e88-2f54b98f603mr5358724eec.32.1778177131129; Thu, 07 May 2026 11:05:31 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:30 -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 v11 12/15] platform/x86: lenovo-wmi-other: Rename LWMI_OM_FW_ATTR_BASE_PATH Date: Thu, 7 May 2026 18:05:04 +0000 Message-ID: <20260507180507.912966-13-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 c84de0ad0cc4..fb301c54d26d 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); @@ -1130,8 +1130,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 Jun 13 10:57:59 2026 Received: from mail-dy1-f176.google.com (mail-dy1-f176.google.com [74.125.82.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2BB194611C7 for ; Thu, 7 May 2026 18:05:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177135; cv=none; b=RuyibnEp7adKYVsK7tp8BhlP6JyTBne1ZUeLUU3Z/SnxJMavuDkBKVzdEoFbKhQjrup1GU0tHXYFcEPfB6ISCpxC3QiQyu6qR54a7hYwS7LnHdv9zCMbyMNxZsJamnCIJ9kZxcyHo4QP7qqlsnJndSGv5cvzGRFGHQzfoMkAvJk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177135; c=relaxed/simple; bh=jCoic9Kl6EG9eHhsfR1pc6qLsyEM8rOivCsCLImLrqA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MnrOrsfoU4vuCi+cItyJE6IIDY9u0+MrbZKIpI5hxr2sFDiBHLB/stTEq8O5Zp2b6BsWJQ5R2U1BaT6qIgAM9jOhenLAu6bLQBX7A8HoPFAJfKne8HxnDtvq1vzPqhp52MOFW0mRYLtMHdYn75apLeucwRMuG/t3uJPOFoLiAVQ= 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=VVN9BjIy; arc=none smtp.client-ip=74.125.82.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VVN9BjIy" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2f03d6cf77bso1350527eec.0 for ; Thu, 07 May 2026 11:05:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177132; x=1778781932; 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=Dse98NWDMa0nWAE+EyJvSTepY+ye9SihZgDnRVgCSfc=; b=VVN9BjIyfDO1j7OV5Stv07mA8QAx7iq0Mf+vgUY3tX6hB5XEZ2gdOdrU06mcP6mgXr nyqLPj84Fj9g9kYxHGzvgHsGutfokxxbmSCwiRv1BnDetrGeVZ5ihg/XGH9CKQWP0fjl aWWPF1pCvdRQkJf4MGKD24V2zB15wyGd8Hr2A4sMPF8g7V2I2zJDcPM/yeWpxkjeytFD SXSYAnVW/K5cH7Q/j2949gR8NLwHYJ5ndTxIQmO7EC0+DkXlRhl670WpOzbDtot05rld CamrkBso240ep1b+xyEI467b0QZ8+U+GcundkD0Ku9i9mAZtwyp5RTMRBFH71ML80k8Y 6T5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177132; x=1778781932; 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=Dse98NWDMa0nWAE+EyJvSTepY+ye9SihZgDnRVgCSfc=; b=lBLbDe/gNv0U5dfDiT0Y0frOwZRWJVtfLCVXnFwYHRRQXq5Fv81H3LiuOTxSqQuTlV 4VZqRvuRRvYws8Yb9E28DGqqsrJ+zExW2kMhqKqhlVamjiFy1VPytG5Tk9YgbFBeGlgq Wewv1sHh72drj9I59RMV0X3WP0bMuvn7pWm4Q6ogbo73mx4QC6ychjxcfTjacbvwV/5J LfxP7QnPt/zRY4JQpcFEdFeRdCYgW4hBifhcE23WwaUX1iPh9KykzjOnWbsImNJiCRGR fYM23vfk6FJfLeToCCTq6j8FyN4/NPrfdbus6f6zrOBrHBudXQKaTj7l06BjHLH/xCsv 5ZeQ== X-Forwarded-Encrypted: i=1; AFNElJ/Ayk5y/EjGeuNATdl/n1n6U1wFHZmWAxQmWITwRozHQlBmSidk+zixzYgpAXzkhJD1uAjuuW6a6WSzgCM=@vger.kernel.org X-Gm-Message-State: AOJu0Yw8rsZEkA3UKMVfQ7IDFQXRRGZdCg7zRRfLPCOCwkoElW716OAN T8RMkngA8KBWYfj7Wh/PO83UkauyLpfmR01mkw+0W+3lk9zIYEhWrZBq X-Gm-Gg: Acq92OG5beDLb9y+BuCHz3OGHpSJdvBUwWopkZWs0BRuGaj5ymD46rL8R1oxt0jsV8+ Nh0DIbSNTGzuhTB9KDUlVTSKD2pMFDzq5kLyTUd0qE/orxB9UzDkMx1NiecgePj4sYTE18B78TZ HCRl9pHYzPHvzNEgtvj8yj3jiVXDZqVKZvKIEtymyUAPgVh5vdnKdPJPr2IYYT4/kkorFaUjs3f hMTRkGSuKs0ex4kK+R8G1ELVlPqgWlrBcYqy/n3H2sEj94gI2TdjV7pVsDOF1WowxL0jeQEx8re jd6iuCmfrwdbNZCTKCRl5EcHCyYzRzY0iZbUOyE+NNAC6mfroKapMxIqK0L7/XN2HdUMUpscYCx 8U9G9LPAI/2X9piMO7xmBFQg/5Gf2ata5ks1EAtZhVOBQoEcQ91RHAgbnDpaylVsbYhSxGPkO1c w3mBlAStZ4qc/ZdO7jFz6NcHA4h8W2RIBT8tHOcFhMiw46U2B0oQGMFb608KJgAnb0suzMZSpc1 12w3iTbVZC0qPQbmO3rkC+Meg== X-Received: by 2002:a05:7300:a54b:b0:2ed:6f94:9d96 with SMTP id 5a478bee46e88-2f54a87e3a1mr4270627eec.19.1778177131928; Thu, 07 May 2026 11:05:31 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:31 -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 v11 13/15] platform/x86: lenovo-wmi-other: Add WMI battery charge limiting Date: Thu, 7 May 2026 18:05:05 +0000 Message-ID: <20260507180507.912966-14-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 --- 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 | 401 ++++++++++++++++++++++ 3 files changed, 403 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 891b12ca1db6..e0a30f2c0c87 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 fb301c54d26d..4939a71e8fca 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,381 @@ 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, + (unsigned char *)&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, + (unsigned char *)&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 & LWM= I_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; +} + +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 type. It is recommend= ed " + "to blacklist the ideapad driver before using this option."); + +/** + * 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 */ + if (force_load_psy_ext) { + props =3D LWMI_PSY_PROP_BEHAVIOUR | LWMI_PSY_PROP_THRESHOLD; + goto load_psy_ext; + } + + 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; + +load_psy_ext: + /* 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 { @@ -1235,6 +1633,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 @@ -1257,6 +1656,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 Jun 13 10:57:59 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 E70624657F4 for ; Thu, 7 May 2026 18:05:33 +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=1778177135; cv=none; b=WLs7IwGB63OwMQDF6bHvJijqOs5koIP27iN3a9Hh3It9VoL6u9lPqftW3PhJ71GrkxdbYL/rfuudqIj/lR9YPVd47P8EaF3VSahs+9vUuMS8ucbd/ZZevZ0WaHALTOcilQVaW/In4UMBDVvVtMcAHBI01LkW4vNmoeNTwmjDm5U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177135; c=relaxed/simple; bh=nw7kdTs1biYqcCyLBgFFjUVOcmzqKE/6nPTRSBdw19M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NVyOobXKS9piosPsbwcDCttL/AVGURm9+xF/xeQ76T126tEr/EliKsGnfgjt8bhE+omQul/gmJoUGjMyCizCELZwBHIso6YV2PapluxUS6ZtTTfzHgiKI8dSz3scIN7DKXazucRTaPK2HSwa0oRhxK5t8Hm2X1L14u5tly60Yfw= 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=s2Ccr8uL; 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="s2Ccr8uL" Received: by mail-dy1-f181.google.com with SMTP id 5a478bee46e88-2c15849aa2cso1483615eec.0 for ; Thu, 07 May 2026 11:05:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177133; x=1778781933; 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=s2Ccr8uLLWroO2D0Jtkli5piMafIJ+dGQSAMjPLg2cuE5acY6VEd7WVl9uXk15EWKZ sv60UENorRlnfFRcuTZsCuyBw9D7rY6VVVcOl3V6mZnSys2vJl4VPCZRtZmYTrQJorBa KH9tBFp6ki1UJ7iIl9YOG9vA8IK7sead6VOU1LajFZWZVimC5HY9fFcv1R5pUwBY5XGd yqpdF/BGqv/FGX62FXXzmjGz/H20sYZDvdHMP00SZdLB4ipSpWxNLEx53me61J0M6MPO R3bZ62yVkcsu4qDLZhanQ25RHG98JT8rH8dz+Ly6zPrwhuGf/62aFUiCAPH9xk8dzdd4 KeYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177133; x=1778781933; 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=RcR/gLMA8LLCLuraywgZliPIWi8RZZZ+d5zX9lEFItxK+D21j50HmZcOJ54TJZ9du3 myHOgLeh0olhLtWInPF7ccKLlQDHJvl1bUw1ekB3o3oIxe/MV9tf6Ulrd4xNaeCwwJ8j CgXdiDVkUKW0obzo1c3uMWsIUNBaktNZ3TSCNEo9EZpbSNxYpF2BGQ8RCvji/d0QqvJA xW6pun0a35Nh4FpPLwb/BCNuJXuGsNGpG8SsesPGmILlzsPCeJsDqUcI6U6k/4sDmilX pnHtfHM3hD2Oal0hHVJtIEB9KLFu7WvE3LLf0DhM4sgU1H2nO9akjAVbQl/9t/ByxOZf v+jw== X-Forwarded-Encrypted: i=1; AFNElJ8u6OEPkuLHbxKe4VQ0bUOIFvvkO1+puthJuouyO+tjqwU7bHmpyQD21Hca98Y9kS25jzkxa3z0R1AmBtw=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7mRbhGHFvb4oKmnv3bkJeyiKwvVgLTABbkTx/T4FbLHlItVgW eb28Grer4n5UuDwlgE5elwwsMNJz6Y5TdFKN9L5t7XtiMkRXEDeBz22i X-Gm-Gg: Acq92OHoPdLURLSKb4BpWWtFL4x2HtuE3oJ2s0FcKDu8h1oFn1I9SScm6RwcCzd7NZm rtQqaq00g0p1cJ5gOekwcC2qVsJCPSpWWP2a2K/+FwUSlbK0m/F1ISXzFQCaZMCV3uTtWWMXZ1p Y3JVIPIWce9N2FwL4CfOmx989s0DTIrIfz8aVI5fOEqfdDRGPrKIIb98HCqXSh/e6jmdHLK5Z9W Ak3m1kZhuu4QCb+u6cBmGBF+KZHDf708dgQmp2bCI380KejLXncEi4L5VlZJNKpjqlE/e3qIgor F3fL9Ao59EFDR1o0x1cjGwb7MnumYfUIWxZN/5/+zweCFxTJUcSKx7sm9dlT6kZ8M3R9B9efA4V T0Ys0AhbbW1EaxpxdWf2hDY/jvePAwzio4bkgyi6c9L1Th2j1VkjAjJD8eaHGdMwEatrQNAuWWD vHhhLMotOTcPH/2K02/lqKzUcaJ73bsbK1dF+GWQ0TcHyigA0Gh5lsWNsAkV+ibLJc5Kupy7I81 gMt X-Received: by 2002:a05:7300:6d03:b0:2de:3022:a459 with SMTP id 5a478bee46e88-2f549f7c266mr4428613eec.21.1778177132842; Thu, 07 May 2026 11:05:32 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:32 -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 v11 14/15] platform/x86: lenovo-wmi-helpers: Add helper for creating per-device debugfs dir Date: Thu, 7 May 2026 18:05:06 +0000 Message-ID: <20260507180507.912966-15-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 Jun 13 10:57:59 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 ACAEF47DF8E for ; Thu, 7 May 2026 18:05:34 +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=1778177136; cv=none; b=WgNc0Lkb0/ZJSEGKk8XMapxmQ+V0MphTzbXdDYAJEdRuYSWcdhiXGzlmOlNtvd7Xgr6eJbzQ/tt4nqQp9TobfrDlFyxDjGuxpH2LwpB8iyFYZDoxfmJwPos6Ey5KpngRwnEmO5O4kWX0lvL3DGXf8MIY/pox2Lz+RKYUolmeGko= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778177136; c=relaxed/simple; bh=ZmXhWCRPkzi5nSZOzkOVzZtTzDx5rrOdANioh4FSUb8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RSM7wGKm9NXCluZ1ESZsYAfwfZIR67//ehGvySXIelaP9FjuT+5xsB+ZZgnqr6tr1ZS5p/Sg5zNxAG7p5VSwBN+IAkEPRDhfcwMfPr7rCm2zTSySUc1sUElhQ3s9jDIN1wn+1Y9extuQmDLCi3aAg9eng6kTQGYvZ0/thaoeidU= 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=AX9ujgwM; 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="AX9ujgwM" Received: by mail-dl1-f49.google.com with SMTP id a92af1059eb24-12dca45ca21so1829664c88.1 for ; Thu, 07 May 2026 11:05:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778177134; x=1778781934; 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=myMYYqTqp1LBWmWIy6uL5gTbQy4ZdtNkIDqtI6ndFyI=; b=AX9ujgwMoLvySFtxSy69DefQa9dAd+V4QkuqliNFalV5J8fXA+oxp5SCby4tMoKs5u 5HfME1PJEYqmdHP0oyo8AsIEr2rZrvwXKx+sQEIVhHhK4iVS8+FrKCR64j76aXL6dQuI hsx/cgRHqzBVhvYNJDanYNX6ddhgZcM56w/iwRkJgAj062bgKjczvVksPz1VpgR30Lhg JhsZif6YxfLqmTASHpZJy4LxcvMPHVkCLhwQUEFjUcHVxBHUoVpZQtuUi6s3IV83wFJw cdcj/GQ2DIB4GUWUGhelXjroRSjIizk0MFCe+yXA74fY8djYEkEZWN30ZWcWWLW9DHC3 9X6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778177134; x=1778781934; 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=myMYYqTqp1LBWmWIy6uL5gTbQy4ZdtNkIDqtI6ndFyI=; b=ocD4mz29OAiirb6I5isvEq4W+AYPpdrng7fQtgFOEWU7zJidUmFP7OOX3K7+UFSReY n1yGpmKloNluCNFgB+NZyZEFWV9Ez9PSUfoIqCOzhY+Gz4ALNbySusExrGEUGXWUGttO M22Kqu6yiuytsYhQ7qIP6coc+uKXe+KnLsCHf2gND5aEjMzE/SplZM2En5D+/HBa36us 0gvKPM8WUczhfrEhar/IfBFD7K1QFyXtzZRDsYJSLeFD6E6iR9shtxa+HWZU69PWpdgI pJdaFDQeK1jSKRURgykRb38UotkCl0MiyYGWwilH9wb2kTev1IwBbP9nKI1Uq2Xd+mV0 q4yA== X-Forwarded-Encrypted: i=1; AFNElJ+L1O8jnibxKUK3HAtEQmY4xJkRmk1j7lNfvXs05FNeUf1nRuyE965RVpLaW8ZU8YMCBdga5O1n48oa2BM=@vger.kernel.org X-Gm-Message-State: AOJu0YwFYAFP5+DjpZ+XqziKGYvhbSAiVmmLGgGA2Fg73z6qpmwmOr1F MGLqrSLAU81Xm9+si98B9OCri3wCf5/PbpF7dWAWVPLZXR1YnpYjHcfC X-Gm-Gg: AeBDietiQVZxyuZ2HLFTrRcu0l1Ya3i2gBcjFLMarl9W8oKRRpYGZFT+ypNfi5jGIXL iQ9hAimWJFgyOlXweq1KQBFdvZTlc0VP/MXXWnbftoGDebcnqqQAX2bApafNBhd2xJmK+ijKX1v zGnxSQkO+FCkS0V6A3lEb/oWDL11t45Ua6qNd2c29cimtEjRU75p/ZEVZRPTNbpluGn0PNLYH2A X7yH8dvb87hSLTKcWI+jJWbTP1vBK8/QIwrIxhQ2UeBC6ycJM+2uYqz9KpjEcKbSEUElmDNCcrS J9DrYIW8DXZNQD165uhSXlQokzq/6AENLY2AWlYIJJyM1Y+PPmX3sXKYI/Yte2+g49IMSCWgnDB yfsBzCsSWdybSdh01FoVrisMOhdpdPPZrZOiZtiNecijigfwt6CKTUj/O5blBO2uxa6vNVuuhrI fq8AZjwALyJAw1jgTA422PEXFVV0ORzo9ENpmWVur8trzS/XYdnZWUEW2OSdTd01C7KBGlI615a XJl X-Received: by 2002:a05:7301:fa0d:b0:2d9:2b54:ea9c with SMTP id 5a478bee46e88-2f549f7c312mr4856258eec.18.1778177133651; Thu, 07 May 2026 11:05:33 -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-2f82bd73a64sm44332eec.12.2026.05.07.11.05.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 11:05:33 -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 v11 15/15] platform/x86: lenovo-wmi-capdata: Add debugfs file for dumping capdata Date: Thu, 7 May 2026 18:05:07 +0000 Message-ID: <20260507180507.912966-16-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260507180507.912966-1-derekjohn.clark@gmail.com> References: <20260507180507.912966-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 converts the former to include the latter anonymously (-fms-extensions, since v6.19). In this manner type casting won't be confusing. Tested-by: Kurt Borja Signed-off-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/Kconfig | 1 + drivers/platform/x86/lenovo/wmi-capdata.c | 120 ++++++++++++++++++++++ drivers/platform/x86/lenovo/wmi-capdata.h | 4 +- 3 files changed, 122 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..b5e2c16d638f 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, (struct capdata00 *)cd01); + + 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 e0a30f2c0c87..0df3ae534ed5 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -38,9 +38,7 @@ struct capdata00 { }; =20 struct capdata01 { - u32 id; - u32 supported; - u32 default_value; + struct capdata00; u32 step; u32 min_value; u32 max_value; --=20 2.53.0