From nobody Sun Apr 12 15:41:52 2026 Received: from mail-dy1-f179.google.com (mail-dy1-f179.google.com [74.125.82.179]) (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 BCF4E3A7F5E for ; Sat, 11 Apr 2026 16:23:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924622; cv=none; b=pYdsz+bUY9Mx210EFGkhovNiO75+h+WHnV908SQAjOsn6UUk4LUiMpGK7wcQXm0MLkMnb7vV1QM8vCVnMa3aGDCXKW94hPbfVKu6OJ4M91GivcNEChD6Cxv/yzoDa3mm08RWqCp1vhGMNK17+2LU0vCtS6eHqQRaG3Yzw3mxF2M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924622; c=relaxed/simple; bh=as/Y6rgrCLbxvFJK4woRt4WCiXpZGU5Bmcl75dpz1Ic=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FHFup8ToOKL1jeX1muquYc6MCoPYmu4ljkvA7t1jAM7VMRI/m/qH86yy5nihFfgf60mcFrDzyXHB2OIbIrBkJmFroPJc1g+TNwU2Lqxhflqu3o/FCLzkVoLLHzO+3M9J/og+KyyFXO3IB1ogk6xYdCnlkcH4Wr+mGkHTpNMfzJ8= 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=nhA+C8EK; arc=none smtp.client-ip=74.125.82.179 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="nhA+C8EK" Received: by mail-dy1-f179.google.com with SMTP id 5a478bee46e88-2d7bdb5ffffso718439eec.1 for ; Sat, 11 Apr 2026 09:23:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924619; x=1776529419; 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=nhA+C8EK63vA/lCT3ei+/e4Iojle5HzxgZoPE9+317fXrJyyVzVVDNsfj1V+ROVftI FYpmeRbjVWaU+2fXDGfcEdHYzAGHcQDNuHApB0Iy7hXvTqQT2fWOdp7Y2kjk+8iM3Gun ng45l3ssKI2dKiZTx0bhKHD+cOuQloaYdZaOh7amDnB3SYlx1nHdAVL9mynfieWFfvDt QWwF/bWR0Aw1z+gkUqI3B1pF5q2IwoteVS86yoDE+nrUVplOB/i6MMbLtnYTqG3SnItl cWVjRSH/zGd5YCGOOKDCKaqOZMU3PKdTJ5M7Br7UALiv+F66mroK/DeoSUGTdRx4GPAU Gy0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924619; x=1776529419; 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=YpISq+uitg0nNheTqPbtEbW9VWHOkMyh0fSv5fz4dcESH61y4kck8Zyrc0pmsQyPv4 zTc5UrNXCZ/TWlcQy74ZE37XH9GL8Xgw7OSrWyVNOEwBozG66Ss1xAcBoOLtYDjbrwV/ ykjy1CvtZt6hWu+aHEtW5ITR8OloPEDPkCWHIopvHA1L34L26jUAZbzD9b7Vl8l4cjg9 rH0O5wtDl0F0nkUZLWn+/P5blPXcCN0Spc75GPr19UooAkq7dj29MKpNVzpmZE/Kr19/ XLMgLaMT2juc7NPAD7e0zHOO9bS1cevVOOZtbGqTlo9NG1ojKBL6qf+rUDYR4Fah84F1 A06Q== X-Forwarded-Encrypted: i=1; AJvYcCW6jqjUtBPa8rcONodTpXxxt883RmXVHw06MBP5oXj6Ove/Eeqnj0AD1dlCMl2mb7Pqn6PYQGB/502hGw8=@vger.kernel.org X-Gm-Message-State: AOJu0YwQOrkfU/P+04h6QfDnooGJsIhvNT6IkZCvHQVI9vQyfdxHcn5c Lwf8h1xmKK3QZUwxrheEfE8cIH4UMUJEQOe+DgutGwAmwI2ucr0h+w15 X-Gm-Gg: AeBDieuQJCEqLdYMxRtjWD4rO26/y+oSDtC4fdNE68Fz3yTrW5JZDYLdiKBFTTljS7Y CF7Av+tRX3H81Nvxj/a3nZPHZErY7hWGm4VofNZ9TJlwrY8Wusz8TPA+3J+0GFmiEPh/I3it3OQ Cc1kzUfhsliQ/6otxKBdjGlhQh32JQuBg2/Eb9khpCA7z2xZ+7yzcxJXzMNN0i8pKXUyKQS7G5l uLs30a43AhEvoQiP3lfQZ22KzyWGq+P0vAShXKrXh15SmuEnALXZFvrlijrTT5JUORfWSJhHcUZ HsElt92fKYK+g0IJsHg7wzfCeUcLydUps851vMLzsVgdsBCGQasQWoJXoKApmDeD9EwM1Xk3GAn FiVcVRetJuMrxf3+9FKSb4o1qi3eI242i2BjRzXOmz64ULmcGK/2RBHrsUdNaRKeo6+tnVKxBI3 P7g0UPihujbk6Dkqu1S/zBYT7I9xKxoIeAbRZe3lFmxx9LdDRUoxTeMLW/x6IsrRlmG5roJH+cT sv9lMjcAY3HXlA= X-Received: by 2002:a05:7300:8c9e:b0:2d3:d3f:2429 with SMTP id 5a478bee46e88-2d583ed5c11mr4689989eec.0.1775924618851; Sat, 11 Apr 2026 09:23:38 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:38 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v9 01/16] platform/x86: lenovo-wmi-helpers: Fix memory leak in lwmi_dev_evaluate_int() Date: Sat, 11 Apr 2026 16:23:19 +0000 Message-ID: <20260411162334.25682-2-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 Sun Apr 12 15:41:52 2026 Received: from mail-dy1-f171.google.com (mail-dy1-f171.google.com [74.125.82.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6ECCD3B52EF for ; Sat, 11 Apr 2026 16:23:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924621; cv=none; b=Ie2yCsLB4Q1M/LinxGmNfBMA7W4R8raAIOuOJsiI86h8M6r2A1/HSsOSnDrmaqI4yLTea0TYgmQaP/Ajrg5EAdSBfiMtUHDZNXWPKxGL3Bl2UsmVui/frGTI0QY6U7PF41vXyjHBq6erpHLR9fnIDv5ggVIXr/CMMsKvyUyzTrw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924621; c=relaxed/simple; bh=8LUDQtMderd6djIBXviEFlt08t4GGAhmClar2YVACLg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VFBk4rcN4b9h/W3IQtUVW8YLkXKCEK+tHUg4LxNZGf2MIpu0aSUfAVREsb19NbR/TRySgJoDbeL8mv9ie81cCDA0Ieq8ydqCxB3tmDxRsZlpJksRUEH/65AJA/Cs/fins2y4YKZ3ESF829YMm6XSs6cVbWGXHl0L76ZOxDKVqvA= 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=IAojLqQV; arc=none smtp.client-ip=74.125.82.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IAojLqQV" Received: by mail-dy1-f171.google.com with SMTP id 5a478bee46e88-2c156c4a9efso4348184eec.1 for ; Sat, 11 Apr 2026 09:23:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924620; x=1776529420; 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=IAojLqQVk3e0TxMkw94hA0kuPHdmBQg6zMhNc9I1VvAJ4FzySm9LHMcA1qdzJajc1s 8SIPZm2KAt9jNzjx1tdjf9iWXlMdfzKpoI9b2vFhdtHcjxKyCMib7pkz/v4TE61ZLZ4G K9apq2OxVY4AP798Y/QuG/VXMqXCszWGx556uonRK2sAYAmw0aZabVutppAAYRoVWLiV 3sjTNPVcv3nmbiIEZ7HgfZFdJ6IYeM7P2Z+Uzu/95xsiTwkAJpVWNs4QHjuDhrFxcS2g gKn2vY2VpROlTrxR5kzla4q809VKQRVEKDJEz2UAtQb6nOhRWr5JxDXVV5thHmprxNub hqCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924620; x=1776529420; 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=Zpj4Ys0LokBqo/jAfPFDe60n+6nDn0cu7O9MGBRqSj2JdFqXfOdqqoq8Ae8kf+qlrC D8obFlZ8KPVFPrlKqOlR61PqkX6gQDe+OwDR2+rxWn1qbXcmOuFO0dbknUw1rs25WVwX qdqKebVCxNrc06WexT4SBZwB7TrD4KhvtrTHFoHDBOanNoQqLgYKiAxMimrnHQKVbe5X A53m22mYuZQCsfTwAJ+1Tt/2dU2J4lLQlconXRW49t1BWSBG6KG8C/zn12yHjc41N866 v9WTu1EIdUBwy76CRriV/zYHYiTBUZDxA39EPZvxH8OMbAAkuzwTfxZJMDQ+OQ7zaRSM oywA== X-Forwarded-Encrypted: i=1; AJvYcCWIgN1bJ6boduqGUkdGbYab8eUmVl6mEQBv4P868AOAFDbBSd5BPuIRDBAdDA+wJmIthKclBd78bxqnIRQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzkpMrH3ED7eFPm6OtTm6xGB1CH80i72YSMBufPruR/+SWf9YZx nH0JBrDLao5xS+Z5IuiTcI+ZfjCz+O+XKe2oVlO8KJ+vAbd0waBPhNWA X-Gm-Gg: AeBDiev5xFIJkcyumA28vIg5Tco05JPHmDcroOW4TezTF/HLMQncbccOOHbuPS4u1kr 1Bd4AZV0UyMvZxQA4gURxHe/lvCNABsVLjyOlr1gCU/+iWWCthBfCtIprdegQG8RWJ+RIu1LR3r c0SZby8LoXC2Fj9U/cI7d1tQiJLmm6Z9O4lds2juxDFiVdMnh06OF1RffFbH5cHq+KSU+QJIf5u uZTeG84Mi+n0qviIjcObz7PWiw/Kx/zkHutZqA+DgVilG8zxSWEOydiCVGuALgqfb0sacLv3CKN oAiqOJbjgh/vX7FWLCRsdosubKfjmQvRLaiDUsCHVL93f8PvTgESQG1z05NQsIlY7V/UpCTijAz 0VGvbSoW2LNka3qNNEKAd+sYOTU9nhk13HObG5R5FpERQ2xym1b7gDRTW6iontn7ZdIBJhZYkrQ I7Of66sBjj+GmEeM0LXjZ8iqq3NfeVUbJedWpVE2lxKSQ9+6LO9qXWW54C6vrWwWkDx+Roh06Ac ltP X-Received: by 2002:a05:7301:1e87:b0:2c6:2bac:8b1 with SMTP id 5a478bee46e88-2d5895690c0mr3446728eec.24.1775924619510; Sat, 11 Apr 2026 09:23:39 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:39 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v9 02/16] platform/x86: lenovo-wmi-other: Balance IDA id allocation and free Date: Sat, 11 Apr 2026 16:23:20 +0000 Message-ID: <20260411162334.25682-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 Sun Apr 12 15:41:52 2026 Received: from mail-dl1-f47.google.com (mail-dl1-f47.google.com [74.125.82.47]) (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 2859F3B7774 for ; Sat, 11 Apr 2026 16:23:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924622; cv=none; b=iUJsn9+nGE5TiOR6NW7gbbrk+eq1ff+THQZAHKqZnCDFbQwCJi5OSoxS+cuJQpDLlBLnqMd3/oZzhuBxtZHp6SdA4b5o5FDbZcMF/iOAWVNn3EmQUpUAXH8PXTZBg/q5TbX1POfOJ8livSTAT61twE/3hyJWiZSyQOMK+7y5ZKs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924622; c=relaxed/simple; bh=6uvm7kxcoZxl4SJop0VuYLP778pizJEeCY5iHUnRujE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=fwC60ocnRDTJrx5ZrzvBY9EjHDerSSoX6ygIplpFPI6IxDdhlRlUwitmE0rmYLdTiJFJviOx2npccU49nQmYAEcyp5TyXYuB7rCCACk4XppKMkZMbWva+OSLMJXdbWQtY5j0JdraN69a2F5NO/y8FWC86X+R0ecyWh8kKPes7Kg= 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=KUzk9Ifn; arc=none smtp.client-ip=74.125.82.47 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="KUzk9Ifn" Received: by mail-dl1-f47.google.com with SMTP id a92af1059eb24-12c45281a06so254359c88.1 for ; Sat, 11 Apr 2026 09:23:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924620; x=1776529420; 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=KUzk9Ifnj5+YJOpYGDqwGAvQAtvvSO/BeEaFOvino4nA2HIAsIsBc0q6Hcni0HHUvI +gXxcOFvjzWSx83/iucAP1KY5j6kUybhqBA53NOKdaCzk14pGfpu4mxNxNIUeZxEH9Lp 0E6wb/lZDrH72UJ/5Y7l3QQnNh0EtNmZf9D2mQOIcknOWIPMOFqjd0tmyIHQGefrVMYq RPDRAlnqr9torRjrDTA+0U8NiEe88sAn5xmwaF2DL4e00xo4qNqn+SHWBOxvJeZT27W5 v5MLRrQBdmBqHF2gUBRaucOV/Dh2FnGNiaXRVP/jpsWXbtJKXHi7EOguB+PyTnuP8cNM e2Qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924620; x=1776529420; 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=TKTm17mcN2L4fzTW8VAPLJknNXppwy0DoqTieDR97bpQUtW3ipPSMCCjo5KA992YI0 wF66JHFgeImd5MFfCzChF9rXLWaIEC7TE3eLswsAvrB2Ao2Ipg3gPcC5xb2a6Ix6hVRW lWbFkQnDsDLhxxXE2crl3xGkgDv277lI0jTLVH4r5UhCEyikmdRJTj158tySjN6D/Jyw BGCulMJdGkeYQB8y+foNuHSQgDl+pEOc6tzisHopDtgFzEtmGDm5wLdbBmT8QSbNQQYy pSEYaZInsF0OdFRuN/RB+r+9XL5IGRJJ0y4D6CcwR52V3OwuPIDLK8i7p7oiZrhB0HLh l5Gw== X-Forwarded-Encrypted: i=1; AJvYcCWqFXjTqTZWwczUBGJSm5BGYC/vCpt5V1mHR2AKwFS2nPvTalh597EmUvIL8tvH2YirUVGV4uHskyKqQVQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yy2ETnuNgegQ7i7eHIIqqmq4zfOiK6x8AfLb7SWDFgIJFUP0enU uHZJYAKfps+8BMJMP7hnBMQm4q7qxfF0GLtImf0e0clUOxJ1selky6/V8pyejw== X-Gm-Gg: AeBDieuk6pLKgyh3CVoFq25OUYx2jSI6odQzrh9jLvUJts33NUeABf29GL/zg1cNpeF PDP8wnRnEeoxS5Z+ejTqLhCv0NUfvIiS7lTho73bS1yNd10Xr0GPFf3cIjljAkdSDwohPGb5zr6 1Ftxu3zAq4yxBkl9aSU6PY5eAML9UF7PP/iN9HwgAuJNwtVvQq0poru3wDdicWp+cV68IoZMoka /QT/boQO7u6SIV9NmPItw9HE4O0tZtpP8Q4JNrlbf7UEH0NChqjOl8NpdFxRnsIQLEWibv9nJUc 7wSO7bf2ZZhIZvhV1yopcOnQhbKvPYaeu0igE2Ykn81q24LXpSm6FhSd6vGMzrskYj0NAVy3Ums on/UJirWNMAIrzGN/+nQWnPbOkRNzawRQ2BNdMObeXFRBvdOlYS0TFvIk9lMaCr2VHVRn6MCNwt JQf2imH11sRCncadDgHx9gXU+CDF4rA9HiHoAUU8d7IAIy/VNK5/Msa/aSewemwJ/vz77KyZXd6 XeV X-Received: by 2002:a05:7300:d183:b0:2d6:526c:55cc with SMTP id 5a478bee46e88-2d6526c5736mr2258532eec.6.1775924620224; Sat, 11 Apr 2026 09:23:40 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:39 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v9 03/16] platform/x86: lenovo-wmi-other: Balance component bind and unbind Date: Sat, 11 Apr 2026 16:23:21 +0000 Message-ID: <20260411162334.25682-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 Sun Apr 12 15:41:52 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 9C17A39280A for ; Sat, 11 Apr 2026 16:23:41 +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=1775924623; cv=none; b=e/TD65PFp28+3aow6jgL6QCjp4+X++0R2KWH4NDsA0fKPwFYqmZiRuivzXGaS9JR5FXNomeZRRH3E7qJ1UTZ19fvtA1Iv8OmiO2NAd+I0U+B1HKwpibgFht8o1GLHDkcOyUrPnaYJ9e3euwLE3yIuPcI/2NmufQJf/f8p52pTyA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924623; c=relaxed/simple; bh=Pw+ssuLutbx3g6u/jM5PMxxasbxx9jVlsAJtmVGQOkk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qg9Lx3bPZLB60fYrUf3MTMliGPkQfepaS6W2sc2RsAO4H0tdoE7qO4Gdp5haUrn7lX7x5pMRdkv3IPd0PLfez7aevWJyvm82tNqBtmEYVMeGBPIicknST9wCbReb9ZzGb/eupNRqkEvw+2vwoJtJpNuEytUCqTF+Vi7QFVslEVA= 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=FRS+yS5N; 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="FRS+yS5N" Received: by mail-dl1-f43.google.com with SMTP id a92af1059eb24-12c42a23c8eso375909c88.1 for ; Sat, 11 Apr 2026 09:23:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924621; x=1776529421; 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=FRS+yS5Noj9viJTBLP7ou/JlZtvxKpHBVIdcBJVoYFLGjGLknGjAlVxaQQiOQ1P6oZ dPmUqMqHGTDl5onAIFv8zZFysK/0w0zUSJ9gzRyadKn1U+kzzp4tGDlNwsapyMCFhBBe vPOB/KtxZj7JSVPnageol0iPRgOvB4gKFEan+kl5lLk3s4kFUeVA5P27smjrGv5gR0qA sZnauBv+V5+ccwwcvB7EmCFoSGgJ0C02wXIH0ZNupkRQbt9WvcidBjiP9/lo/OqUNlNp 6zvhySzI0eBNqNUB2lIXPbLDrIzAj0rC5zVP801CRV1D7Fw5iwc4PBapimGCXK09575t ilag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924621; x=1776529421; 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=bea5iohxJIL8aMtu1ZJ76YA9cwbHb4Dfo0vR6RhgHvGYmfbiVZjfbVbEzBJnCTYNB6 u86sH2UZXTa0G727DPR/uvjeuk5Ldt7kI9c9FsXLqkBJ7aa8M4F6rpRgClp/78EHgKOA sKa3r+Wp8HCQx+reqzqcBK/0KyS2lAM5qmhedyIHDPFH9SjNgT/U34Kw+zHZzwODqOHD Kk8ExOiwTYLRYJRGqm7NVJRQRI4ITHPnANcokCeLtHvPnqp4KelQcycaqOltF1ELs9ig 7+NTu0BdqJVLKwHDz/1t/a5Pohs9XoLnWcVjEoXEWHAbAsAoMMshowbuukfHPywJplbk u3Ng== X-Forwarded-Encrypted: i=1; AJvYcCV9peo9IWZMom+mQPqdmBRcTEa/24ImS6mLAp7rpoWlxkTsQ9RJuzNcGtipbBBkoRMad67A7WQJdwPQmBY=@vger.kernel.org X-Gm-Message-State: AOJu0Yxd4LoGUVfVWcZwgwGiB55kZPbbPbu1dUBGxrqod4oVCPRz5hlA Nf1ockOm2N3/9Ud01J5tQ3wxMlEvT2QzzQxdhg/6mATiOaPogtKrD8ZprCpZBw== X-Gm-Gg: AeBDiesBQNQjEBKcYsILTlEowXK/MVwFlHr/RK1krvA5iJ5+f5CQltAKuo7WUQLnOFj 9U9kK1MVmDnoQcNvIW4Chg1RgxXbdTpKnKiEk8ARXGWkHmgJcibL9/ls7vriFi3dr4EOVQoa1Fk 2p8Lq5tl2+uXL/lYE1eFcHAASIGLEpjBXr4HSfG6TmqD64ezgPjxWXJDscLdQqMRnJt6VzAQtK7 unLiSN4p3eUVFFzX//mgSsMEQjhXw44sEbMZsZjZBYXtKSBOZcevoOOkx23LemC5UQF3wphPYmB d/RFqJuFsFo25cqzc+tW+U+mJqJCt5BAZOfzYBq2CsrdWk40XQa9SQXfCSXr8Rn5DX9qNwc9rQT CbEjNtZa9bwDoq+brHV7wa+pKy4CJHy+N0HkwSWRBDhvNpulfmuvIjh9mgPz7yGB6I4NNu9o4UG jBMIKUrKZvetppylqOopOKXLlLNOo+JdNe7lm4xrZPCY30ivzPFV6TKLvLybvU0B+ohAQKgQlOh zNmLXFqIB6IDlo= X-Received: by 2002:a05:7022:eac4:b0:128:d967:4673 with SMTP id a92af1059eb24-12c34eb6a86mr4884060c88.16.1775924620861; Sat, 11 Apr 2026 09:23:40 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:40 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v9 04/16] platform/x86: lenovo-wmi-other: Zero initialize WMI arguments Date: Sat, 11 Apr 2026 16:23:22 +0000 Message-ID: <20260411162334.25682-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 Sun Apr 12 15:41:52 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 644A13B95E3 for ; Sat, 11 Apr 2026 16:23:42 +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=1775924624; cv=none; b=q09U5AsFDOkpre5COUk0aUn1+c9t+SEXllx6mF+WWh5Iu0mQV3V1OcTj5sM2WNmi4OoTvBm8dLwda13Q/uLFZduuw46nU7bNwMM7H2sNaObLQU5/k1CQgcf3crJTmG+r4rrDHEJAyBnyqntt17zTwQ/dNQYfBdb6SQSyk5QnlmI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924624; c=relaxed/simple; bh=NlwwelYA8uSHgqW88Xvl+l0Vc3NtEotDqvYvC1ZDl1E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VgP/B+gKwE+ES5BbgWvNbxebUChleTeMEIijSpFvOe3MM+Z7jD7vymBjhsV1IapPeRz/wRGa9pTgDuR7GR58Zl8ipYUxZIJHFV1fFpZJbShiSedTfXW3equTiiLm+EuR2ygamCZjGE7flc9ebOib1S3lZSrJSnsBLXukoRWJmO8= 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=cXsOSalR; 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="cXsOSalR" Received: by mail-dy1-f180.google.com with SMTP id 5a478bee46e88-2b4520f6b32so3283803eec.0 for ; Sat, 11 Apr 2026 09:23:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924622; x=1776529422; 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=cXsOSalR/AtZARKLCtogxlzY9wPrC4paojkBgAO03RvRgMgHfqKmcfM5X7pz1elX8r J1w0LLATrKa9OuP1VudKHingH2xdbQKEXqNCeOV4UgRi7ClUI+ldfxRQzSHMLgvPSYj9 Feh9SyJI60es/WLQbr3PHzKJVGbQcVwm+DOI15e53QUuz8hlvamRumrhXgt4vr1zPs5m uugBq4BLlY1XkBq1oUWu+UpK0uqbsBWZZ9yfiZ6J6jrfCF0qgyd8djD+XDzqc6IZxokj lbJRwu/VSwkAOtmDqNh0I+LEMj1wASiD5qL5JuO9VhSJ3Ge5C5rLvPXHeMLspEhWm0HZ sY/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924622; x=1776529422; 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=U6/dg7dU3rhYIYEqS2R6PppVnOBj3Tju86EKKjnh2+BEWmeNsdn5t1TcTi6R0XzVmK 7OaAPFlP69IkqpFXobJWuNZzI/EP8fJzKEQbVOp3dqp8Rd1WSLosT3rv+9wHFBcIVjDV FKeks4ryuDUVbQy95CMwIQZWqJDKIOovTVMBT9n8pwgZMpigKR1eV3UbGtImOfx/TwU3 Cw4NlM0NRcut5IKHuLyP1g1YDMGzaaB5qPmF9xi1OhIJhyeKXQN3AQf/VhFLAwYBAocu MwLeU+F9M/TaGr2wbnHnWBy36nrbpFZFC0qZqF05ASSEzB/RxLcJ7NxiA+uZJxz2MLXz LqcA== X-Forwarded-Encrypted: i=1; AJvYcCUsf9pihM1bQFRi4FHrYioB9KPcksTSnrb1ah3a8OrZ6SCta4K0Ot/YMuJXPCfyXfC1vPI5p3p2aaE48jw=@vger.kernel.org X-Gm-Message-State: AOJu0Yy2qEijER5YBeARhyjXuCRtizOtYVikdZPUK2yqrz5hu/r4LLB3 IjcpbBUtdUWvDUyH1/DuT3b7naoEI/v8xcBjcTlc6SwhSwzPGWLhqK6g X-Gm-Gg: AeBDieuhH5d51xLPdEVc82nXlLJxfdqbTXytOTfAdH08Bj/FOYRqhnoKybR0ZOd7HVj 06b6JgN94eSwFiAZKm0xfkkgKzuQZU9tU8sMjlqV8+UBeX5SGYWowbARon55bVAd7MXsMFvB6k8 qjBfq0U3UR3g3faXZdZiDbNXTQtCNXVZdad6aOlJPTyq/tfxf9BW2judiOXUOUCGnzOalX3TMbF Tqqt+ZUo0Ri053Y5b0KOyGz0yxJnucOutg0jRaPh+m4Nuqi2Qmi+3XiHjO5Z587KkSscyCKYoYn kJcp3OiXCNlm9/ELTRcwe+5NjPOYIe3KoJo0aMGaT1F7weH5VBaXEbQJA0qWaEa8fdxHEFSuNMY n+UctV+UjOdtC5lNzOTieh7zdqsKSKY/nybZ0Q1TOe+oU0smvPl7dISOL+Lnp+1i/Cyn6k7qCTt +dW1MHJ6csZ/0IrIwcEqAdQuqZdWvNcRS6MV9nUl76u1NKf0P8vuxkSaS7P7ZrJ/qWP76hlFW7x u/m X-Received: by 2002:a05:7300:d704:b0:2b7:fdb6:ccf6 with SMTP id 5a478bee46e88-2d5890795cfmr4238650eec.14.1775924621592; Sat, 11 Apr 2026 09:23:41 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:41 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v9 05/16] platform/x86: lenovo-wmi-other: Fix tunable_attr_01 struct members Date: Sat, 11 Apr 2026 16:23:23 +0000 Message-ID: <20260411162334.25682-6-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 Sun Apr 12 15:41:52 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 1FDFC3B9D95 for ; Sat, 11 Apr 2026 16:23:43 +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=1775924625; cv=none; b=IKnChzoroxw0j1p4O8LA3DC+r/0nMto9EMIyOvRmQnIWHdynEmZkLpTvLqwC/Gqfc5uri/e+AohAiz3vyjz+x6AEqhIlLVPCDQ50/AYCvUKKCj0QCaD9ARyBtqQKuPswn0uTfyg4nu0fKjAxiiG3P39q50adZ7hBwIMyQm7kxNY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924625; c=relaxed/simple; bh=pN1yjE2cBEYcybWdzxunrFmw3Cw0pusN0YscySUs36g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IF+tlb8zZyNVJfaDnY1uQMlo801FSRoINEde4IyIT7+O/0ajZLH8fQKvn4BWFqOv+veUOjxlriKyL9FbTZBf4gaaIpTcBp7orXLcp/z+54RHdvlfiUsemupg89ytwx+/7qv9MBPyCTSZzJMpxlyy3OXEZYnysViKJwYyCn2D7k0= 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=W5kHNkmS; 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="W5kHNkmS" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2c156c4a9efso4348222eec.1 for ; Sat, 11 Apr 2026 09:23:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924622; x=1776529422; 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=UfQOCoKB5lYfrfkkF4VJeatKmJP+97QjiuQLqo/O5Tg=; b=W5kHNkmSCRdiNC1LshvXdYtXanDI1omc7TQCPN+eDUq4lqR+0JU/5rYKxhvk1B1f1x y+jaiNsO6hhfG6n4TQsS0Ug6ybVcILHeIFNlnNioGWR0Ymm3Gk7hO0mYcBq3Bjz4QcgL 9R5eI1YGa/Om860sjW4aFzv+vxzGTMm81yy0JzXJ8JJXt2PRJjNoXiJsGV3AfhoGvu84 uy2kuZjZsFxFqcn/xnUp+uYgs1qEMnDoC/Fptd+xy1g9PnnBhIFIxSwk+4+23+5gYBYG Dmdx7X1Y8bWu/QYWyZ7BaIQOGz2CU1D/5lP/GEO/QI0z+KbA9LVUxhaj+8NWhJUq2MXP 6Bow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924622; x=1776529422; 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=UfQOCoKB5lYfrfkkF4VJeatKmJP+97QjiuQLqo/O5Tg=; b=bPIgEn6Z+GDHkpjJViquhtJ65/Av4jkor25L2AkKioFugWeWfrw3/OTXx85rf8f9DJ icgLhJciy/sp3cYxQwjg2ZMeuhfS1bEwNQ8cOXYM6wMZXUSSe73gITMlcolh6Vcrol+C Sbnpuz4U2Qwktq/gzAIp1fQUsMbYnftzZlAfvLUGrll/wocTVPwtgPYcOQKIQ9qEicqr KF0SuvgIuz6jWPSuKgsCM6XGrVQjPv86NB5AQVBXyYXmBcm/LXCtA4OfKr2X4wXPuTdZ OaYe25Yu6J4xNsb8hYlTJU9iaInbhleX063QNzaEhNOfOe0WFC4xn8StWmA04lsOV4F4 5j3A== X-Forwarded-Encrypted: i=1; AJvYcCUfcsbyMFon+5cqGdPSqQvOC7S0G2+sThcEoi3LI/9Kl/5UejYDj+9pL7oFrDbkbvpMy3KXCfeEjgfH4PE=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6mGgBk9FRjdhnXoWPeRQTp2USpuM9cJsgOBgpQm4Jk4RTg4y7 8iYOcEZPI13CaXMB1yuZ8bYI2vUeUjeakyuSpRxp0JC1QXruIIsZJMZ+ X-Gm-Gg: AeBDieu6dIww3XTOVLynD2QrdzbTEYp1pr6UV7XWCwNmkNXJf5fRQfaUoCbqYoxd+HC ojWYoVv0hVxlkNlBZwB5EG080DUdPM4OmSxtS39zZL2yl9+4if0EB2/dh09goJxT75MW9IzSrld JSDtRvVIGSt+C9uzpVhFCYCqEXzEMPTHRNdqCHk7dl6LjXYOfdTZ/HqjWi1SP9EWvb7TVIYPaH2 HSyrAuA4kwVEzFfx4YqKlffSIncdHKK6Uk3V3QRUS34IXc4ypKWQMJ13shhOo04JX6av9X1phVd zFn7PHVDAk0BY5S8Cb+UN5JWxgGfhC9YtWpztEN8fQV75MFXjkJMU8VFKCRes5BZLHM4pMgfgoT V7kI3Dad5gLnD1TXSQzvHHwJ3b0OhxjvfjSm5b0tutZhsKq81ZP9RhtDjHxR6091pu6tzdB7mNe gCcf+HDS/3Uh1Ri7tU2r3B8YcycFYGeKNyPxsclX+DnxUHXCnEak048GPmndIUaUxfKdEyzigD3 axT X-Received: by 2002:a05:7301:1f14:b0:2c6:2bac:8a8 with SMTP id 5a478bee46e88-2d589cb572dmr3858365eec.30.1775924622242; Sat, 11 Apr 2026 09:23:42 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:42 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v9 06/16] platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices Date: Sat, 11 Apr 2026 16:23:24 +0000 Message-ID: <20260411162334.25682-7-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 --- 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-gamezone.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 114 ++++++++++++++++++--- 2 files changed, 98 insertions(+), 17 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.h b/drivers/platform/= x86/lenovo/wmi-gamezone.h index 6b163a5eeb95..ddb919cf6c36 100644 --- a/drivers/platform/x86/lenovo/wmi-gamezone.h +++ b/drivers/platform/x86/lenovo/wmi-gamezone.h @@ -10,6 +10,7 @@ enum gamezone_events_type { }; =20 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, diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 50a03f5fd6ab..29d062a1c6dc 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -550,6 +550,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 static struct tunable_attr_01 ppt_pl1_spl =3D { @@ -775,7 +777,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 @@ -786,13 +787,12 @@ static ssize_t attr_current_value_store(struct kobjec= t *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 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, tunable_attr->cd_mode_id) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); =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 @@ -803,7 +803,10 @@ 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.arg0 =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, tunable_attr->cv_mode_id) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); args.arg1 =3D value; =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, @@ -837,7 +840,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 @@ -845,13 +847,14 @@ 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); + /* 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; =20 - args.arg0 =3D attribute_id; + args.arg0 =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); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), @@ -862,6 +865,81 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, return sysfs_emit(buf, "%d\n", retval); } =20 +/** + * lwmi_attr_01_is_supported() - Determine if the given attribute is suppo= rted. + * @tunable_attr: The attribute to verify. + * + * 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 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, modes[i]) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + + 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 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, modes[i]) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + + 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) \ { \ @@ -985,12 +1063,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 Sun Apr 12 15:41:52 2026 Received: from mail-dy1-f178.google.com (mail-dy1-f178.google.com [74.125.82.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE9193BA233 for ; Sat, 11 Apr 2026 16:23:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924626; cv=none; b=ShwXbiN023Fq886Z9Fwv47zEAl4jENddKBiq0IZEI6ECkuns1/AQN5yrteXTMClxGv6G461zBxz6Qex124RlD42qE0h/djB7jV+rOX1A07MwdiEP9ZUdV9SinEcVBdXUrU5STp9EQYj+4MWSQ1mrX+84pD027qjRAJZ0lo8NK9g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924626; c=relaxed/simple; bh=epNgEAbOTwBUpTsXkpBr5phpz7PYDoqt1DNdf166hR0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=c4+ooxHy5UYkj3Zes8oo8uemqbavO6bJcHfcsqFe05itEpawgEWFaTP7xdIwNrW39pbPIO3LCChZTChlg8Uh4wL5oL4W8JqrCEg6XQSc6yKIrfEEVLYVXm7mIqsCibWm8SAXWADg8rSvuO+0iWsG736kRNc9VZmCbKtp48FesZ0= 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=T/r4K5TT; arc=none smtp.client-ip=74.125.82.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="T/r4K5TT" Received: by mail-dy1-f178.google.com with SMTP id 5a478bee46e88-2b4520f6b32so3283826eec.0 for ; Sat, 11 Apr 2026 09:23:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924623; x=1776529423; 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=EAm4Rg/AfX4n6gnjxAUnQ2wLvvjZ9qBHkok/vFSlFKY=; b=T/r4K5TTz3g4EQvZEtsLKqf14niltGQHeHfZO0JL/wJOK/YdtDVkA56gTHMtA6AtZB 5e/tXUvE74+B/GVBFIfsmRM1Tv8n5lUPoWo4X6G9wLiOvleA7cdkSgaZOID1h2QHHXcG tmnTpWcJuwChL/CnwDMRVr/Zt/+zPuDX3NYPohLb2eba0EjL37TPYL8ao4dj68eStx68 XSE2hLR3qv6gNutYi0wk3rH2wRrVqWnKTEL35AMh/SxIY1f6X59toNVVxRaNiNu+DrKJ K89swm4j2dbajcwIEQKgFMSvQ3kvqCYJr6k/Wqcz/gd81j0+rY7yDZlsb0ZoO1QWdHZa uICQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924623; x=1776529423; 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=EAm4Rg/AfX4n6gnjxAUnQ2wLvvjZ9qBHkok/vFSlFKY=; b=YTZSkBxm1tiknisv7kdtJXd8tsLQ5kjSngsYL6b7lfh5maj8Ul5aw89rPUEAaNnER8 5A1hXLegWf5VKm0nFcL1GY5ShA0Y0C3dvnVCirpPV4QfQ/aTkI5/S20QIvSnNcLpOBeE ehIj4SaCellWW8wlhm3rM0eGUkHFmSOMBfg/ei/PSt7ytglxx2AsRsWyO6k0Dwzp3Ltu 0zcyxPLSy+Scs2xA2sOw72P+u+nSGaS5anKOtnUORFW8XORvvRGEKa5MDEOkcaoYFQEc Y4B7/BdFY8gxyrlGSvaWkuFs0azV9XqU6h7vzf5kU0PL4PW26z6hUJaYU8Rdy+867+Fw lxdw== X-Forwarded-Encrypted: i=1; AJvYcCViiZ/FtrGxRFo8Ov09li7TBrmGl/XGMRS/VywKEcSGp0RtE723bwrasHxvS7RIDvlMay+3Q+65oYJDn44=@vger.kernel.org X-Gm-Message-State: AOJu0YyDEgDfwyvvIhY04KIZeGVCXm3yzBdz7fEU2ft0aH8qevdAXCvU 6wPx2NnL6R3DCAa9DTKOl6GtA6jFBU7Nn0C1k4s9Hg8dCkqIk874aMDp X-Gm-Gg: AeBDieui5upRWxN3qHxphg1CYbDpA9DF/x5fasi0N//WlVeILo1/mLJW4tXmjDsYGV8 q2G+xf42fpRFW8Ny6Of7hsyMmA6oCv02WgK6IW51Tp0Xv+l5ukzK6HMEBs0vT/0X64bGGfZd6Cc m4npceuBJPD+x1uHF4AuT3WOqxCtGtxoqZH4/vL7esmsXrF7yNimfDlnCzXgBWeX+ZYAz1QJkfl wSFCKI4uSkOwCly5r5+0EElNR++xHhySTtPfTDBmOrYt732WxdwH2eIzyUwmBi6NxCB43PLX9zI Z/g2Tebs+AyIl8l/D68Xj8BWjXbqNEyPb7QRyOmADlU/4syAhqjQTKxAZu0wXfVZrUVbyr1+FCv cDc2UDaSC0yI56Svc8bbZFjg2I27Bk69XXWd7qxmv+3K5InCPKXDRrutP3HnZ3+xAWOWKQNKM8U 0mbA8NFT37FFcf4+3mGWkflS1vUOIINTFlEywDT2Hs1ZtfK5GFjTutlyWGIlU4pi7mq7rGKUjR1 X6qWElK6ei27e0= X-Received: by 2002:a05:7301:6086:b0:2c3:9406:d574 with SMTP id 5a478bee46e88-2d5870bb7eamr4393011eec.4.1775924622938; Sat, 11 Apr 2026 09:23:42 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:42 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, kernel test robot Subject: [PATCH v9 07/16] platform/x86: lenovo: Decouple lenovo-wmi-gamezone and lenovo-wmi-other Date: Sat, 11 Apr 2026 16:23:25 +0000 Message-ID: <20260411162334.25682-8-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 29d062a1c6dc..4e88d6bee00c 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 @@ -577,102 +573,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 /** @@ -780,7 +680,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 @@ -843,7 +743,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 Sun Apr 12 15:41:52 2026 Received: from mail-dy1-f170.google.com (mail-dy1-f170.google.com [74.125.82.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E5AD3BAD9F for ; Sat, 11 Apr 2026 16:23:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924626; cv=none; b=oMCYpk26RamjBUMYQV+/py9oyfVuF8dG6W/gPwEgT+HVzsxbw5Q/6U5JofE+YXwaSyNePW46vqSVaLf9Rjv+zK4po2YADmSKtFojRgSWoKyTdR50Ws1VwbB8gbaeuc+EZooKEmJqJgBo2ZwCcYnduSrPg1i5UcCDJeQtrpaaDBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924626; c=relaxed/simple; bh=+KXtC06mzNgF38OJ1B+8or6FVJD6/rvwb8q1tr9zf4I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iBtUNgYVjioy7SRHCutDxfBKCvuXiXqd01JMxV81T2cZc8CR7FmCFrdaSw/5s15V5VKwGVLNVcYgg6km6vShT0dNP8GDszVGsKm4hxIXV3g9jI7eG1R+ElkBvlQhhs1S3jE1PJEHsF+/5+ENJfFpl3pxEWOivOs21qnNC+04NjU= 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=s61RsE+S; arc=none smtp.client-ip=74.125.82.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="s61RsE+S" Received: by mail-dy1-f170.google.com with SMTP id 5a478bee46e88-2b6b0500e06so5294484eec.1 for ; Sat, 11 Apr 2026 09:23:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924624; x=1776529424; 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=0XP4KTURjqIFpmNlMgeAkPBqee0a4J2NWU1VmqP1JBM=; b=s61RsE+StFXNsTJ+li6JvUvHclvhCXC71cM6oGaoCvcMfufANQLGBra9ZaO5S15NhO qeU+HsUTvJrowsbu+GylyQKgnicIC5pr2LSxAWk7izdceTyMAMwIseXF0qiwvymzSTmj IYfVWEdHRDvzKpmZ9WHW3ja+7GerhX/d/sZghXaxSW413sFgsiSuk4qxrmLVAyjy9Jy4 Z6KaJQQw+YAJeuFVEk47bIavFEvawdgZQEou3yVt5Mft4pEqo+wup6snEgXl7i1Baj6I 1SiQObU46KK4CXYziStsDEs6s1zZKNBOuYacwkp2B+da9HdYJqAOdW1ClMTrH63TBY8H vKnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924624; x=1776529424; 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=0XP4KTURjqIFpmNlMgeAkPBqee0a4J2NWU1VmqP1JBM=; b=jJTQ1W/TSdy+cFbzytM5a8v5pZmsLDHEf4MvpmZkZBxkCa9MwmskBApioB5FsFOycU jO2pXujFdZCFJkHjbEDRhQI7L7HPzS1XdWXO7q+JCe9lTeq1HKYsSlB7atdkv2DWC4QV 6B9lNpouDrg1dLVvzoCxGMItsjdFPGI9QjB+zDyOVkcC1HFryQGKrR1E2XoInNrwdjAi hJEZBkDyGv5RxpXYQwhVZEt3+GL3YMspp1x9h2OtvmyNvpA5UZwDrDG92R5Xl3oBWmAa WfWLjH9K68gQN6BqpdcqE5KLdw5wd8ScvR77/tsSFWrsDacvBZ+63AzH5I+1dz+KgYt7 i/BA== X-Forwarded-Encrypted: i=1; AJvYcCWL8dXlq1TikR1Nmh8dPuBbXml/Kc3FfRY1wKKQb8pVFpDKpdVpj2BQQ37kXIe5zcIGbTcoRde134rg9FI=@vger.kernel.org X-Gm-Message-State: AOJu0YxBzW8CsQy2LFeXUpsxDQBVBuJAjpLxWTlz49NINGXp4FGZ+CpA raoSMdOpp8Bjsd8V1C7gepUeaF8va9IiGZ+Sptb3MnCFKdzQlLpwmgZp X-Gm-Gg: AeBDievUJewetvxgw49r9+r28FaQXi/35CbrFBF6y0kG+Q9bJJuzjp1RXtrZd7rv9eB GcD44zpPo6i2dOqAOHe/sbF6cwqFmGzfuLr7pKGtvFv7V4zbci/ip+tKMVyOHVpyLoyvE5neI7t a2LbkJlVv2lILK1T7N4UPGuzR0h6BwLaYPlcfE5MrX+3VQQDnB1xJ7GCA2gqV/YYBQiKT3Kmdng uyVksK+XXuoReQUa27zeyA8QM9wMu5Tf4NgZ/1KTbcBjPFON5JXMLSYwnw/vs7Lht6rsTChlHl2 r7doeOFiz+e/ZRbl9Zw+dHNEJODOvx9k9JY6670gruCfLr4HTUViFPwYqEh6UcceWm7N5sCaats h7T7fgHEu5kwm2r6a3L7h1nNmBvakB7EnkvaXFNLSwxtMw7xx/3Dbd5aLatuWXRt7GlXYwhhtPo mIlwYI+UWlXZT/hYsj2TGCBxaVF0fZ95mU88064Hg21rF/siM/FA3zn+Uw6BWjy6PMhARmxnQqs MkzWUBOjdBHa3g= X-Received: by 2002:a05:7300:4627:b0:2d7:6cbb:90ec with SMTP id 5a478bee46e88-2d76cbb93a9mr723344eec.4.1775924623558; Sat, 11 Apr 2026 09:23:43 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:43 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 08/16] platform/x86: lenovo-wmi-helpers: Move gamezone enums to wmi-helpers Date: Sat, 11 Apr 2026 16:23:26 +0000 Message-ID: <20260411162334.25682-9-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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. Reviewed-by: Mark Pearson Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-events.c | 2 +- drivers/platform/x86/lenovo/wmi-gamezone.c | 1 - drivers/platform/x86/lenovo/wmi-gamezone.h | 21 --------------------- drivers/platform/x86/lenovo/wmi-helpers.h | 13 +++++++++++++ drivers/platform/x86/lenovo/wmi-other.c | 1 - 5 files changed, 14 insertions(+), 24 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 ddb919cf6c36..000000000000 --- a/drivers/platform/x86/lenovo/wmi-gamezone.h +++ /dev/null @@ -1,21 +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_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, -}; - -#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 4e88d6bee00c..960d2e0f0227 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 Sun Apr 12 15:41:52 2026 Received: from mail-dl1-f53.google.com (mail-dl1-f53.google.com [74.125.82.53]) (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 243D73BB9E6 for ; Sat, 11 Apr 2026 16:23:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924626; cv=none; b=GRdE3nRfFZqdntcecnf5nzpVDOLXBBp81aoBCrMDYhuszCYl1gZ6iaHig3tEouveOrT0nEyOajfbuH8usRsEyeo82U9k0CQ02gkXKHKSKhqUsvlrnQySdG8yuYVWk6KxYsP1yK2Ja7xDqIcesvzK1ef83SRJPyZaaiN1MjvV+4k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924626; c=relaxed/simple; bh=0AbQz3lWFcbXHNL+cEsqvTqOl1uqt4LYgRKMjWx1LGs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WssXXhJDpu94uFKUaIoqxV31OPYFmKA+M9y9aiVb4i0ukBl9J7EKqCtqLDPyMMIljmuC+/CYpkfo5XhNGy+MeiEl5NAmm4qz+d1JmcDtVSzkvOPTohW8/XbsPbOZEs0UYloZ9egHg3UWI6I2+bPye0sL4DD/o8hP2EkP2t52/TA= 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=g+p1ZPfl; arc=none smtp.client-ip=74.125.82.53 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="g+p1ZPfl" Received: by mail-dl1-f53.google.com with SMTP id a92af1059eb24-1271195d2a7so2786822c88.0 for ; Sat, 11 Apr 2026 09:23:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924624; x=1776529424; 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=9c2ZJ+MOfT+s7jsvqHxpUvMKxkora6YPxRww/bSijW4=; b=g+p1ZPflgCZfGBYwFtUNaHe8ofyhiWXMoKMhcrYsXZiRjxWqsxDo1OL6m8hQif8ghq l3BKJMGqU6LSqsKdls2PgvDXi7cx/6PD82LOv7yg/qBIoXENymnMV1KOTE9+o8V4F52D bAWsC0XrmTqCBYxnLYjW5fWyI1TXj0aLAbxn76ge+OG/L7mK0bRXPBR2J5ItEArBwqo1 1U0GwQZd+9RggWRtojR7ZxThhU+v7feVAfuRT/vrfXQP0gEHEPV9YHEGtGgpY/+3q8Q1 P7Rk8DtfG8kdfrX6ghY6/1n7lVoGsAwR2lFvMgteyv94sM/hbpJEPvpKdBbAhncayQiy U6Mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924624; x=1776529424; 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=9c2ZJ+MOfT+s7jsvqHxpUvMKxkora6YPxRww/bSijW4=; b=Kx+9/uMjTp+jhS26eWLDnCo7WFP+9tfNqHNxVM+z03htxfAhwR3ExYZHPlAk/eLZ2R ja9LeK2uPI+tDaA1JUI3O/nAuNbfZkAPIdzydJUoNhN+8wdmm32HfYuCvapC+RUnO1Zx qBQ32sn8+y8bgEneMe2AFPdE5usWmmG44QC36cURQT0BJrG0J47D6zfFE/MbT1Lkiamx t6NoPgL9kQGc2BSa2m6tQrd1bzJ7UlFlUDo3JgDgXBiiTls/IKI8ipriCl9xMDb2tSe0 FU15LycOy7/wvKpKPXRq25JMxsF6HjmNDAGTqQl4vKBUDuA6rxnspJ84Nca6Nh5jiIOU HAQQ== X-Forwarded-Encrypted: i=1; AJvYcCXFVMOShr4mo3K2DGDUHgZmYfEHBY78OH9d7ejsOBGrb2HWQS1aRMTwARyE+i+pjGXkmodK7ZSB+LAx1Ic=@vger.kernel.org X-Gm-Message-State: AOJu0YzkLSj+Nf+wqSaWnSxYohoXC8blcSxeyLXLNXsdTCdtov5gzsHV qABqasn9DNSImW09floyezJyypJjzWEljGPp0tpJGLO+Ef6lw/oKZtdY X-Gm-Gg: AeBDiet99cLYptXxGQ3hnxk+vDAdNvx7gKGQ4zPxeoT6dV9wfcu4oaMoqWtktVexeEB VkWJvNCzf7U2PpYbQL3ZML/euJTXeNIZXojVHjXoS2nEk8txwDUdrncM6JFsnZaQOh10I4C3sH3 MfRzM4XkQ/b3uNj6N1JpSnj2zrTKtOhcaC0ecY/tf0JPghw9xK0rE0Ud8QFn+lYnMEim6XzLuxF tYuXhRIltCrwXvRy5BTEaEX5FPHdbNOSZRBLDMiEwWd2wRtNyeHj4OYFkw70LXXizIps3dhLrwn /rscB5AfbQ6ZzuH4tg3wb7RQteawp2fYngvI8CF+KzgO/BPCXLjyBshZI1v2esBibV5nfNkM67R 4nNPvQEudXyQ5FDTOkdoqRXZK8GcadqzSFMF6wXE66Ijxm82QOQMEiBaGgIDOT3pviaq/0s863U enGqQ7cklcpVT9TBM/sQK9fL60Wm7fn0nL+F0FvAMKFSyT4LxEtluoQFncLxgfse7UKIFsxQ/9X WR1 X-Received: by 2002:a05:7022:41a9:b0:128:d7a7:5261 with SMTP id a92af1059eb24-12c34f0cc5bmr4703957c88.30.1775924624177; Sat, 11 Apr 2026 09:23:44 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:43 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 09/16] platform/x86: lenovo-wmi-other: Move LWMI_FAN_DIV Date: Sat, 11 Apr 2026 16:23:27 +0000 Message-ID: <20260411162334.25682-10-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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" Later patches in this series will add additional attribute ID macros. Keep the fan defines together and permit attribute ID macros to stay together as well by moving LWMI_FAN_DIV. Reviewed-by: Mark Pearson Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-other.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 960d2e0f0227..df197b22e1f0 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -68,13 +68,13 @@ #define LWMI_FAN_NR 4 #define LWMI_FAN_ID(x) ((x) + LWMI_FAN_ID_BASE) =20 +#define LWMI_FAN_DIV 100 + #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))) =20 -#define LWMI_FAN_DIV 100 - #define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 --=20 2.53.0 From nobody Sun Apr 12 15:41:52 2026 Received: from mail-dy1-f179.google.com (mail-dy1-f179.google.com [74.125.82.179]) (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 B8C4E3BC693 for ; Sat, 11 Apr 2026 16:23:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924629; cv=none; b=jOXwozhB/7LNcrqZHiUoSGy6Kem80nA1I0IDE/WdsQpi8+IraoiruBGCA4HP2ulD0RTUPtZppo2ZyiO3bG8NnRCSiw0rHwtlEH1BQR4K4G4Fe9TMhlfwdIT9+5l2Q5FWF1Riu4V6ItjXk76quJ0eUrQOnQL0C1Et0AZ7Zo2wuio= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924629; c=relaxed/simple; bh=bW1K8Ao7h8v4TqkdclQgTeLPXLeBW6bC6lUyeTm8FdE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k7GypmEBJN1meHcNkqm+KCTtVJFeFBda+sV8tH32mlCel099Zs1ZjIyIEu7npn+sdbvP7iBr3VMuiZj5CvPNX6MJvBzIbL34cImidWxL77MsMwYzKrf2/dNYAMf3sCy0awTx3fev1t/omUOMXk0MZCIOYKE0rVsGRdfsd5LZl2o= 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=WyGldPYt; arc=none smtp.client-ip=74.125.82.179 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="WyGldPYt" Received: by mail-dy1-f179.google.com with SMTP id 5a478bee46e88-2d7bdb5ffffso718603eec.1 for ; Sat, 11 Apr 2026 09:23:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924625; x=1776529425; 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=aBQBgMtDy9Y0+HOZlDac1PwVnHzTAmblzE1hAXs2aF4=; b=WyGldPYt/2C9xXQa7+9n5sbL+XSoFgF3ct9QXqWVTKAGLOJ6VXzrWODIPmO5PsG1pE WpKkXUsZPpczHngxS3rWgPwGn/fczl0A0HW7FhJvRjFrzyPdQvQTv9L53pnIVmwJmnlh 4b1VfxEbFIWqWSUTwwEma+da85SNHFqZzWfq6lHWEwMF8y2ASHCWqYfL9Eo2O/5VG0gx aAX1lIyFKBzSyOOKhMdD/O2DFZH68ue8H5rROyAUIE7OeIacBWZZPHNghnfvM3D4T/+I wj4jJTeijCU0lvPM5YwzAB2dy4SoRhTSO7SAmeZXpkuwBCt7R6LgNS6E1NjHLTK9VZ/U Ny8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924625; x=1776529425; 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=aBQBgMtDy9Y0+HOZlDac1PwVnHzTAmblzE1hAXs2aF4=; b=pImTlLVaXYyxv9t8k3JlbGGd6QXV8yhmvFyhUhVT92l5wioAWR2z1wWecEKYSlEJo8 ULEWfiv3aL4R4Wxm3XrRVoxDuAVcqDBdPwaFrIKMAggEZXIQ7bVYXSksROHhkoXK7zyF T3TJi1dQbASpmna+Fj0VXCu1vsudDIpqr6mjpJJOVLrMP8P4W4LnUR/03T6kpNQl8Cc7 uCCSe09ZPeqxCN697NVgamsRmdNErYtNA/AuWA6DSAzWoiL0ZdEd99kLnhfi+f89GAV2 FmEodh5zLDy8qQgIq9Z8WHW0hiZR0E563esjj9qn69UH+TNtosMv1RzmsPTTTsD81OPF 8q4g== X-Forwarded-Encrypted: i=1; AJvYcCX0me7nN+RJza9QYF4b1J5cyryfcVttw1QC5ge54SGJpgBHnMeUQbg0s1nux/nLA//8lPzcUunZZIdbDq4=@vger.kernel.org X-Gm-Message-State: AOJu0Yz4OpNnA4/8V+gq/JNlg1vme/kUSoVy7L0IbuMZf8sromQMLij+ rIJhnUqH8CT/d9hqPakGUQGBnVIw0HKlxVdvaXMP0CWxDyeSMYzePyr1 X-Gm-Gg: AeBDiet59ob1QA/JPQ/cK7x8rF8CZY357l7yIXFrEBG5CLQMaEI8NwzoU2bjJG55y8N Kqwe9OWedwwYBI76rF6wL2lqoqsqkUmrcp4tSF8leh/FmmZGjZHDX4MHE3hPffUI2fM9JRCLQBE uyU5s6AkFqVMDqWzuu5fTVjOP8mRYwCo87W5BNSsLZKCaLccCtbDx4yT3OwUrGqQTpPc3Q98/rq 9ZDqD+ab4XqG+1QzW/MBnuLzCzSdOlwsNoTV6JzE7Op0POp5yeSBrVq+mNXU2uiRQflP8J5nrc2 cfdFQiXp7PVHigXOqM62XufLiOMTwZ8DIA8QkRC3vslREwyUlKCOfD1iLiN6pmnEbbhXIk3XGzV 5sWoP4Mw34VFq2/3REjaCI1VVWolihZi1n5qEKzAoXrVINRdJhw2x+mahpkK+fa7El3OY2utqLJ boHKif9T1t5m9vg0PYaoZPGTiv0CxkdOmYTGWJXqKg0ErewCwr/c5RsWIBKvCkvEQIRjMg8qWOR E3S X-Received: by 2002:a05:7300:8606:b0:2d3:9c91:6c49 with SMTP id 5a478bee46e88-2d58ab831acmr4009514eec.30.1775924624786; Sat, 11 Apr 2026 09:23:44 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:44 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 10/16] platform/x86: lenovo-wmi-other: Add lwmi_attr_id() function Date: Sat, 11 Apr 2026 16:23:28 +0000 Message-ID: <20260411162334.25682-11-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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. Reviewed-by: Rong Zhang Tested-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- 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 | 56 ++++++++--------------- 3 files changed, 43 insertions(+), 41 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 df197b22e1f0..3805c4cf1d10 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -27,7 +27,6 @@ */ =20 #include -#include #include #include #include @@ -59,8 +58,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 @@ -70,10 +67,9 @@ =20 #define LWMI_FAN_DIV 100 =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_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_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" @@ -616,12 +612,8 @@ 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 lwmi_attr_id(tunable_attr->device_id, tunable_attr->feat= ure_id, + LWMI_GZ_THERMAL_MODE_CUSTOM, tunable_attr->type_id); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, attribute_id, &capdata); if (ret) @@ -686,10 +678,8 @@ static ssize_t attr_current_value_store(struct kobject= *kobj, if (mode !=3D LWMI_GZ_THERMAL_MODE_CUSTOM) return -EBUSY; =20 - args.arg0 =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, tunable_attr->cd_mode_id) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + tunable_attr->cd_mode_id, tunable_attr->type_id); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); if (ret) @@ -702,10 +692,8 @@ 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 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, tunable_attr->cv_mode_id) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + tunable_attr->cv_mode_id, tunable_attr->type_id); args.arg1 =3D value; =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, @@ -750,10 +738,8 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, if (tunable_attr->cv_mode_id =3D=3D LWMI_GZ_THERMAL_MODE_NONE) mode =3D tunable_attr->cv_mode_id; =20 - args.arg0 =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 lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + mode, tunable_attr->type_id); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), @@ -794,10 +780,8 @@ static bool lwmi_attr_01_is_supported(struct tunable_a= ttr_01 *tunable_attr) =20 /* Determine tunable_attr->cd_mode_id*/ for (i =3D 0; i < ARRAY_SIZE(modes); i++) { - args.arg0 =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, modes[i]) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], tunable_attr->type_id); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); if (ret || !capdata.supported) @@ -810,15 +794,10 @@ static bool lwmi_attr_01_is_supported(struct tunable_= attr_01 *tunable_attr) if (!cd_mode_found) return cd_mode_found; =20 - 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 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, modes[i]) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], tunable_attr->type_id); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), @@ -833,7 +812,10 @@ static bool lwmi_attr_01_is_supported(struct tunable_a= ttr_01 *tunable_attr) if (!cv_mode_found) return cv_mode_found; =20 - dev_dbg(tunable_attr->dev, "cv_mode_id: %#010x, attribute support level: = %#010x\n", + dev_dbg(tunable_attr->dev, + "cd_mode_id: %#010x, cv_mode_id: %#010x, attribute support level: %#010x= \n", + lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature_id, + tunable_attr->cd_mode_id, tunable_attr->type_id), args.arg0, capdata.supported); =20 return capdata.supported > 0 ? true : false; --=20 2.53.0 From nobody Sun Apr 12 15:41:52 2026 Received: from mail-dy1-f178.google.com (mail-dy1-f178.google.com [74.125.82.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F41B3BE155 for ; Sat, 11 Apr 2026 16:23:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924629; cv=none; b=c3gpEfFacEJZUaYRi1GXBH6SFUXjyUpwnNiOilXl5ZR1ZY5TRBUVVdSoHd3Ew05J3Wb8ucMPy3/J56PUJX32jZubhLg18s64Ak1Qr/HbAr4gL2JsBEIOHelZm/KsZeLPAfhtW7C+q+NNHlI4Y7sa07RlQBnKXxptTo7bwx9BkUg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924629; c=relaxed/simple; bh=/Q7L+5+s7FD7yhR0fw+A3SxzHEisnXuLUd3mmroUUyM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ahKff2WjCDYmmWMQsiuCO3wL7iabhFt85JrKl9bWWgrZkowub4tHE85axFUXdlgU0UPUrzVnseMWvGh97WwvKweTZnBmvjQS4VQGBEmDNwZ/e1tGYiH0hrFtwKQMbgvN4fdn9Z7d5J5aAEyjm/nlyUWmEzxJJCHj3qCajM9tybc= 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=PF08y/ZS; arc=none smtp.client-ip=74.125.82.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PF08y/ZS" Received: by mail-dy1-f178.google.com with SMTP id 5a478bee46e88-2ce102afb0aso3983236eec.1 for ; Sat, 11 Apr 2026 09:23:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924626; x=1776529426; 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=hgaYqy2GOTziDDZqh4ttc9SZITtVwJlVJItti8AOdu4=; b=PF08y/ZSIZelDb0416Im+O5rJmSWqKvpP3jWchd/XBiHYf+xkwFjGDK73MQOzfN1lT E0R0C1xXHA2Bp5uwY8Ff8i+kDEOGCYWiEPHEiGEpqi70i14tIsoUfegB8b6keZLL9n7M IsYjFjezNwaGG3oaSgTrSkXE5Jc0WgndG57Hq3XbfxT49QQDNgkcn1p/eVdmki+571Yj DzeGfhcnpSzOiiEGatrKNY7GmhDV7Nuo7D014mbkB3gCcuULNNPLsCZQI0+TGOPfvwtB 625/5g83V75T6uPV/r+6i930bRjgOz7NpDte6rM2bcuUjqjm+YRsZXng2/5Pyx8sPjvs bYAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924626; x=1776529426; 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=hgaYqy2GOTziDDZqh4ttc9SZITtVwJlVJItti8AOdu4=; b=E6hl6bEmpiiYfjZ4O/mtjR2Sbaw6WzvpXNOC/Rtaz4PBrCVUVpX9RBaMsvX7DUTHNi RJwZ4bzrlZy+TQiUGkWd+xb5DXa92kELEZOdHIhpH95+2r2tZvcfQCnTkpk9LWpvZ1oe fQik5RuCC7YfbfE/0UhfZp2sBps8HGHXO52EZyJ7/ESIWqc54EO4YoBmuUI998fMgAUm rJ1l3TFF7xhCRTlA+t28mI0KLdiucYSHSonTvBn+wXhBKbi4puPOd2/SOwsQuHxEc98H FIUkv9xTSOiHd5Rz4N+5/ZWc6qSkJ14WOULmlPAr8XjAL3uDsUDzQDM3wmcvJw3oN4r5 M/0w== X-Forwarded-Encrypted: i=1; AJvYcCVrEAxOMfNuqKnNBC5akXIhCeBH7P//QGhZ6BPaftSVta2Xw9ngy+mdMrketp6anTPzEqjtua2r212v2sE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5l2f3JJNNzaOBs75yudRUAHMxSm8nsTZkxlsfiMmC+roGVvBC NVbbzuTOgUasRgaEo6dZS4m4qBgeCLWe4nzi0SrLBOfxoqPaYu44EJ6U X-Gm-Gg: AeBDiessF+lUFEKVx4PkKu91Jr5lgNsflOa4fwyiUn08g5BX07Uz/GivmiAZV7GaVPk 3YXSDwtsPEgAyt+XER5zZysakq7YJjhrN6gCu17x515zr8M2poc8A6WPPu731OTl6neZJ+n0dqc 7l+D2JzyHJkdGW9UbJSip3+6VBRAfeC3AoNQGGZptV3qVs1+mR1XlvJfm7YiM7lHotQf1YUTuRD zVe3/lSDgc6SpBZaRklslSaw1HipYdPNMs/3+85HjqcbXQxhzKPmghP6jnq3LfTyIKDOlzhgYH4 pryLEwpOoo/Ue7eatSkZ9IaOltYt/RZ0GVLOGhJXQ9PVZrKT9DsmTlE9By1myhTSRtEUIc1lvMT aKTXAJwaXN8331n1YoC9pqpFNHEHD4c27T3wfOe+e5E1ASpTa+BsvbnKWkOe3lezxoTbDWcFWZx M2/+0C8tOJGv2L4vIdx9jM0mJiBTlFJ6thDIMDRj3QHhaH6ScDZClypyjRKBRZq5hRyT9evYnjI zhE X-Received: by 2002:a05:7300:e2cc:b0:2d3:4252:b127 with SMTP id 5a478bee46e88-2d5898a5246mr4835471eec.26.1775924625530; Sat, 11 Apr 2026 09:23:45 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:45 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 11/16] platform/x86: lenovo-wmi-other: Add missing CPU tunable attributes Date: Sat, 11 Apr 2026 16:23:29 +0000 Message-ID: <20260411162334.25682-12-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 3805c4cf1d10..adf4300415f8 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -50,14 +50,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 @@ -551,18 +558,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; @@ -898,17 +959,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 Sun Apr 12 15:41:52 2026 Received: from mail-dy1-f170.google.com (mail-dy1-f170.google.com [74.125.82.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1A8CB3BE63D for ; Sat, 11 Apr 2026 16:23:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924629; cv=none; b=ZRGupD4jSnGp1otEpfiZRKHGT9I6t3a0CWw/LFeUkhKZ3lnXHKNSV0MqBRorv+OQY51CiTfaNa2j8Myeel3vS3nD6HP26E7itKvefBuW4RxYVWib6Jpi7D7ODPvbORhgevhviTVeq20Zl/X7hZHQsqpEld4xIYMJttGjVhBoh0I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924629; c=relaxed/simple; bh=SKGcGxrsxKU5GL8dGyr2mucIHC8dQD0qXp2lJ+XdYac=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uo6C5aeg3AvjNiVjnLy+6ax1/QuZhOFFJJV7FIK0jkyzrSY6ZjPYQkAODwxDhzV6XSE+JLMFMRuWsGKNKpnEbKBT1z7wUyLAaNi60yNZdgl/3PsaLcaxGbYaEjn+XvuzFOMs7j66h7um2eKpQZf/VQHJYTbUwQYre12xE7uKZAc= 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=Ia1czh0K; arc=none smtp.client-ip=74.125.82.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ia1czh0K" Received: by mail-dy1-f170.google.com with SMTP id 5a478bee46e88-2ce102afb0aso3983242eec.1 for ; Sat, 11 Apr 2026 09:23:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924626; x=1776529426; 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=Z/G3KLcTQpCz6MQsSVhLSc4Byf4VR8dUBTSVLHLGYZY=; b=Ia1czh0Kc4+HHupDT6ZjBfubgDHaf2UMhAmBktiR5ogc5Y1uimmjlaNpFfhwbnPAig CNfORG7GCRxcQsP8ToJg8W9ENj07baSsVER7mF4HLxb9FblpTgYZfi8Jk9QbE/ilIOmN RZgUdWO8xbvm3n0iTnu9T6AKAurtFy7u35Gkb+sVMrJc6dTZcQ/eD2oYs20/gssh3bYq jHTcpJg9obzTBc37HoueKl+ZXL6jGlZEgP/eGKEY0kwEb+Mfi6Mjirq4uAeuGcKGo0Sc ccKgwO6YiPnDI5VHG985hmWMfXAUKtCaeLVCXWuvJcaHQ/SjhTQk3TMLOvFES918h7Ge BLzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924626; x=1776529426; 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=Z/G3KLcTQpCz6MQsSVhLSc4Byf4VR8dUBTSVLHLGYZY=; b=HO/DXTGafULMJOnd1eZhI5t1jsCzmABGHBe5SjfMc8xtJxj55MwYexCz4kb2jZc/7F eqhhHaCq02jSdPD1Q31Eu0MnhTrfnKw+738axBGV3stVQBhczxPDbwJV/XEl+ZBun/pU fEZ9QzTjjAj2NHyw804QWizpOyZs3e/PfJ3K9zTJLXWBmP28EB1XYSy/vw2JJP/cFYhz cPcZScqx4CRu9lYAYTTA+td0ne2h5NIS/x5NUJh1kQRuP4EcFOaGiiif/YzAlxJ8iFD/ peHpARCFvhwP9IlmrAZAFjcnLyJFKE2ZBLAuEdbPTOBNsff3lOKuV6VcEsRkZ5Z3Lfea SCcQ== X-Forwarded-Encrypted: i=1; AJvYcCUijEE7/l3rQASjFfW9KYu/zutbfHGBdn5iwpqB3wKgoXZ8KJxb4Od65jvjjs8xIeFUI9T+7qjKzhItmy4=@vger.kernel.org X-Gm-Message-State: AOJu0YxpfST567167x4DbV+yOTXI2LHQ92A13o1TRQ+ajk8BFg4KzEHm 6sTOnXCCZd6eCtG87okmbtCLTpX70/rWDW3GIwu3AoWEGOEzDL3EvU3YIMCwnQ== X-Gm-Gg: AeBDietpSpJLFks8AHWuzYm6DA2TUFEnNiTcOj4tQvR7fa3FWSdrQsWNdJynTQ7+lI6 S5afh2c70Mhe6Zl+r/f/nF2Pq8WzTnD1G+goG7GDSSBsQip6lupeYOqSv0jNevOJ99MOneX/xU/ qnDrba6zqs2cs2ZTaMOc4ScxxUwITgXRk8fWjyoy2HfQG4f3sVy/zB2Vey8dmEvO04fnug+CiGj 6/mHXbR5NyXuoA5uilHUfDy2Le9/dOMDorf8CfpQtzzuh3YhxbVYVkmjIIQl7Cb5N+uqgQwwkcp 574mQ3xtCIcXKqjGzzXKXtsvLSPJkIhao5dhtHnMHOy1w+lheIp/U5baxfpM0K0QFEN50/7Mm+t /WZYi7/iyf+21ZsY0hH6063upl33CWOpDPyqdiBTLTO2I0heoaaIu3D3NY5pem9uoBLbRVaBRsC 8w6SzpodOItW2JovSEOn3RI1US8nDvpN5MyMIzcjbCN2kSvmiUXZlZ+F+91Jza2LXx/vqpkOXov niM X-Received: by 2002:a05:7301:2b89:b0:2d1:e92c:f7ff with SMTP id 5a478bee46e88-2d58678ee67mr4582804eec.1.1775924626145; Sat, 11 Apr 2026 09:23:46 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:45 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 12/16] platform/x86: lenovo-wmi-other: Add GPU tunable attributes Date: Sat, 11 Apr 2026 16:23:30 +0000 Message-ID: <20260411162334.25682-13-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 adf4300415f8..8abfea8c308a 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -61,6 +61,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 @@ -624,6 +637,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; @@ -959,6 +1032,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", @@ -984,9 +1058,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, "gpu_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 Sun Apr 12 15:41:52 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 897A93BED1B for ; Sat, 11 Apr 2026 16:23:47 +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=1775924630; cv=none; b=CR0laqsn3d4ZdXlgblPfTOtxMlSqFLvPP8Op/JhONcPwocpKwJxwmCUzK37FdLhBkf/HB1JzLNvv6BbFaAFV3PsSTF5lqkWVs4B08u25vxyHTKyfCaOl1iCK8dDiSMzzNawXCKXS3kqxv30H7Iq76nNChZk+TJznvUBaHGx5cHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924630; c=relaxed/simple; bh=KZbMws+RPhqWUp4VZ4fS/BumWh7r1gSCSaOAWThv/5o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=snju/SEtAw7uNRyuCxTTSWp4wFR/vUpVW4D6w+GV0IsajTL2Hj7wpdWmgTEECI83i/tY9SEevW2BS5AE9ziFHVFBBNuV4ZaL6/0UfEo/ZYRNGX62O9hCJETQBT5A9iyJnK/g4dgTnnWJQlZwh2OtRhRVgqexAS+6q4ufE4APEqU= 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=RKeGjJSR; 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="RKeGjJSR" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2ba9c484e5eso3346274eec.1 for ; Sat, 11 Apr 2026 09:23:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924627; x=1776529427; 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=QrbdI59tuRDPJF2wdYJHVTWAgIdn3RqYy9PDRQEvy5c=; b=RKeGjJSR7NQll1mzZyyB8F0rGKIro3JG6rqeVIPt1hGRzQa0ask09BGRWerGNtgX5Q h7e/7aRe5Cgq0QxhYTzYV57RLjaL+9FgCYhmlN/peGYceghj00oAkRRvdhGDdZtazsU3 JiPhKFFyqqOi0MxAmN3ugpOksEIPFfpQ63CWOeFKmDA2Sr6J2FXHs6qdz6ZMsU/3ffx2 IetkzKSwB/NUvm9N+pYibchadKMKYRDuSHimxo/oQZMUd8DXWUMmpILErVwhzuSNpcHl H4HG/Bs4Gq9y4Cie0RbuuyHRPZbzgkKpbTaXxSuVACfbU30kPrf0cDKimiIhCI/+34kO pXiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924627; x=1776529427; 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=QrbdI59tuRDPJF2wdYJHVTWAgIdn3RqYy9PDRQEvy5c=; b=H4fBYttefqRKu8amcb9DgqIjwCImMvOPQ1Bdq/PlHFT/bfJNLukI0RoyH9/fLPHvJD HURTuoE3XtFrcFtoxpwVq7+2enUS/+Br8a6kLRSoo6CQiWNCKh73++V2VMpjy0HsyC9A 6f9yfH37RVrKZVlE7eVz1IPMcyP1mStgdwgh/WHh9qq3qup5mmC9zpM4qtts112Ka8p3 x13JF5FoEoxewJhr1mPE/vuIzlTTjlfwaLvU0mMaRE4kdseSsgY2U/srfbJi2FpGavjO XkCT0C7Ax+GWGdZ0v8vQ+p9utdJDBVy58QRAskmei2JoR3OBajl1tAn4oWd9mpem+e+c 2y2Q== X-Forwarded-Encrypted: i=1; AJvYcCXu5pgaYWprM83clcAGEYq35D8A/l4N4xdwdiermSEzkk9S+vMu2IL6h7cMOQs3UVF1Jmz4gPjBLEj3xrE=@vger.kernel.org X-Gm-Message-State: AOJu0YxTfNJMqovPNnAngwdHp4Bgz2VAyQK2nq0nNv4CWBrXGC1hLNbc kdvQDhiazGUm8coC1yVmNb1bKnMxk9tjoxeMEDaMKUDZGPuldGIRN1gn X-Gm-Gg: AeBDiet0yNeYweUtfrul8PTU7Ugw3ss7GVbJ8SdU0+TOi1s+QJpeablHRtqMpbtyOeC m6UDnrdwTw6wanW4pmSkcPgLoBBnTVHKDNTBy8voIuNp+SbSJcSMPXQ1rDFK2flZjwExh6tPWmI 7vdTLWv6vZe8IgAwhiRxbj4rGgmXrOfHig5estE3KzzxXMMJCLgHTLJbjq9j4m2S+833I/9g01W Jgfnd/EGoV9xTRj543Acv5t/raj4P551X0WLzOCcwnJm/L5lID+C3FTSAJ085RkYLMjPz2PVeRM 7UxRyYhiTV0eZWbn1UXaXESjx6K9w14TsM9AHZKyWgZcIPLNo+y7KaPoLk27QiOYFdzl1TpdBwb ysdNFlAMlsTEpzIbvuOWzNyGbe+Gy5zCWG72HgZgEADTZDvJAXOVWwT9NR6ZVEqlnUjk6UdDMEq eJg2rRgyl38KGv6a0VOnXC0zmg48YLC3kfeVDOo66Ur1QJMQkQgzJPByHEH4CCRqBln7J9LO++b YyISlPSP/Kzsb8= X-Received: by 2002:a05:7300:e82c:b0:2cb:990a:b5e with SMTP id 5a478bee46e88-2d5881acd8dmr4127723eec.15.1775924626769; Sat, 11 Apr 2026 09:23:46 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:46 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 13/16] platform/x86: lenovo-wmi-other: Rename LWMI_OM_FW_ATTR_BASE_PATH Date: Sat, 11 Apr 2026 16:23:31 +0000 Message-ID: <20260411162334.25682-14-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 8abfea8c308a..0bc9122ee4c9 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -91,7 +91,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); @@ -1123,8 +1123,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 Sun Apr 12 15:41:52 2026 Received: from mail-dl1-f48.google.com (mail-dl1-f48.google.com [74.125.82.48]) (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 733D33BFE25 for ; Sat, 11 Apr 2026 16:23:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924631; cv=none; b=lx76ZHHAae8q2OZCCJ6pcjssEsdUJD3OzXuHY9TRTeWxGMHeARoYJ0PZczlfsLKg4JxhnCZ4kltYML/zuxd2Kzf3xvRGL2KoTwEZJifHt3pbaTzhwsuU1RlGO71BdA1zTA576ftYKAx+e/QzyxfGrvNwyY6+ONinpkWOy2DIzM8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924631; c=relaxed/simple; bh=P/6/9yEoYxtpvG64CTOosJ9v+2HaJ2SiEj9kcTaJ88U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ewL9lchBANSk/OLnvUhY3eYSXSTJFMb/bUUqDZDvsEImgURk1xC7+yY3rFEqB+OBCPfeRxnfhOyLPZX0m5aqokM0GaIvZ3X1e00LoBg8oPziFlrhlXnitErH1ksUjxtW19tA6vDnrtfQ12BwSM94bm4TZ/qyNwP1Ycrd5kXeRS0= 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=A3KeP99H; arc=none smtp.client-ip=74.125.82.48 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="A3KeP99H" Received: by mail-dl1-f48.google.com with SMTP id a92af1059eb24-12c20010f10so7746959c88.0 for ; Sat, 11 Apr 2026 09:23:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924628; x=1776529428; 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=z3dXAhVxmLyejeeby60t9RRJ6wP27YUUCnrGsXOS1xw=; b=A3KeP99HbUAvPnlOidXlE1GOgGPhS7KuRbKUE+I03zXROZKiiOZKH606oSrzKVscs2 cXbfS4ZvSACVRf1W/fH3nGULqzh2v6BUNHQQt/FLF6l4JCYJdt8xdfuCi9ScLMP3BVxk nzWdVOMqUMYHsqa8oUCR12iJyPqBwllR+XqIfJnHpS1YOSWdoo3LoWWgbWvF3ufSMFlO wr3GPrWoJuXgKaKg2AHisfIZ2gBz4qCRjZmF/zZLRQuHgKW4FvSOZ+QvD4+WMbFOX/1B Uw1d6DZymt7Ir5/2u2dnGkrONtdprMpf4etVvF9F8vawECt6n1noVKLbOVYvGasAEcm4 qdVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924628; x=1776529428; 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=z3dXAhVxmLyejeeby60t9RRJ6wP27YUUCnrGsXOS1xw=; b=MfASliTJ+4aLPI5F/o2ZWqNwNulxAAQRVxgoYbkbcgZHHtczpdaxHGivXWTkg4r6vM ZkVXXBr3vev0uTFKzIrRb8rqlkDRV2yjD1T7biVA0MfvUXb5QZpdvlyk5/ByYFaD3TVP wnJCESMiKO2fm9kfjB58jycAgSoQY8itntA6GzcKSLQylj1TsmyHKFsDGcPxTJfgtDiP esurB0IaXo44EO2SqI7nDVLUYaURXldnrANDlQAwogzRgWTrOyiYT9av2evMk8PhSF/G Zzsf1UnffbT7UwJ9ZMWOTMjorSNdMtqmu2g+T795Vy5Znw9gWQqWTA83w8m0mWhubTvB BKCQ== X-Forwarded-Encrypted: i=1; AJvYcCU0dWsGN1BLxS5bYNbk26OUUsebsShqzr6uXHKT6fM442wlxLgNqpZJu30qTxrIifFD8EsGeQHopqESGpg=@vger.kernel.org X-Gm-Message-State: AOJu0Yybhhtkzb7FrJPquQIVtLVZ7jHMvpLIi4KMbhzfscz6HyAkNcRw RfjGGoKyyNySXa9dZYgB6u3tmtKn1dCEgMgB7ZUHg9wLpIKRfq3PW069 X-Gm-Gg: AeBDieu7ikzNyOwdH3q55jzODDL6tkUKAyX4mTARIRFtmzCcVWIdvxjbx+XrvKJ8fGY Rcuf02mvCvF84rXA8HQNtJzl251PnqiDQgLANCP5LzcjL8Z7xW9DtloqXxEN0+JDnEBHgorK0FP O8VMtdsazNEHi3y6d/HvnQo8jXKxP5fv2oAtbZ7Gt0cgjVbVPnD6z3wGyKmrnscz/1J090dIN7V pO6rD1oX/HbjUiRsTdwY5ziWr59U5930dKIcAciLFNVLkh/Q6z0fMSLrI+a74hRpaB279JPbVib wu6cjR2RI8gQfo65SpAKTbQMF5QG5OuIZuGRVt/3jXtWwrZv/xXKmc7g2VNi4LACrYceeEFTPiW uPcKiFwMFrz6dw0W8gi9H1dzb0ho0yAsPj4HckEEYG6Z/3m9h28idR8n+n3puHuh6ktKUu1Xx4c OCrMv/WaTkFlk28TDOuwy84FQf9gQWomX7iVP8kLQzaIRpS8yPIZwiWJTBPzfWPsHcfwAk7v1lK knSPbU1bleUbKI= X-Received: by 2002:a05:7301:1003:b0:2c5:50fe:c795 with SMTP id 5a478bee46e88-2d58a788298mr4676905eec.29.1775924627426; Sat, 11 Apr 2026 09:23:47 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:47 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 14/16] platform/x86: lenovo-wmi-other: Add WMI battery charge limiting Date: Sat, 11 Apr 2026 16:23:32 +0000 Message-ID: <20260411162334.25682-15-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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-type 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_type power supply extension to expose this capability to the sysfs. The ideapad_laptop driver can also provide the charge_type attribute. To avoid conflicts between the drivers, 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, if desired. Reviewed-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- 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 | 293 +++++++++++++++++++++- 3 files changed, 294 insertions(+), 1 deletion(-) 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 0bc9122ee4c9..f1170d987cfc 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -40,9 +40,12 @@ #include #include #include +#include #include #include =20 +#include + #include "wmi-capdata.h" #include "wmi-events.h" #include "wmi-helpers.h" @@ -74,9 +77,11 @@ enum lwmi_feature_id_gpu { LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =3D 0x0b, }; =20 -#define LWMI_FEATURE_ID_FAN_RPM 0x03 +#define LWMI_FEATURE_ID_FAN_RPM 0x03 +#define LWMI_FEATURE_ID_PSU_CHARGE_TYPE 0x01 =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 @@ -87,10 +92,17 @@ enum lwmi_feature_id_gpu { =20 #define LWMI_FAN_DIV 100 =20 +#define LWMI_CHARGE_TYPE_STANDARD 0x00 +#define LWMI_CHARGE_TYPE_LONGLIFE 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 @@ -130,6 +142,9 @@ struct lwmi_om_priv { bool capdata00_collected : 1; bool capdata_fan_collected : 1; } fan_flags; + + struct acpi_battery_hook battery_hook; + bool bh_registered; }; =20 /* @@ -554,6 +569,279 @@ 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 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 wmi_method_args_32 args =3D {}; + struct lwmi_om_priv *priv =3D ext_data; + u32 retval; + int ret; + + args.arg0 =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_TYPE, LWMI_TYPE= _ID_PSU_AC); + + 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_TYPE_LONGLIFE: + val->intval =3D POWER_SUPPLY_CHARGE_TYPE_LONGLIFE; + break; + case LWMI_CHARGE_TYPE_STANDARD: + val->intval =3D POWER_SUPPLY_CHARGE_TYPE_STANDARD; + break; + default: + dev_err(&priv->wdev->dev, "Got invalid charge value: %#x\n", retval); + 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 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 wmi_method_args_32 args =3D {}; + struct lwmi_om_priv *priv =3D ext_data; + + args.arg0 =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_TYPE, LWMI_TYPE= _ID_PSU_AC); + switch (val->intval) { + case POWER_SUPPLY_CHARGE_TYPE_LONGLIFE: + args.arg1 =3D LWMI_CHARGE_TYPE_LONGLIFE; + break; + case POWER_SUPPLY_CHARGE_TYPE_STANDARD: + args.arg1 =3D LWMI_CHARGE_TYPE_STANDARD; + break; + default: + dev_err(&priv->wdev->dev, "Got invalid charge value: %#x\n", val->intval= ); + return -EINVAL; + } + + 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_supported() - Determine if the property is supported + * @priv: Pointer the lwmi_om_priv drvdata + * + * 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) +{ + u32 attribute_id =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_TYPE, LW= MI_TYPE_ID_PSU_AC); + struct capdata00 capdata; + int ret; + + ret =3D lwmi_cd00_get_data(priv->cd00_list, attribute_id, &capdata); + if (ret) + return false; + + dev_dbg(&priv->wdev->dev, "Battery charge mode (%#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) +{ + u32 attribute_id =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_TYPE, LW= MI_TYPE_ID_PSU_AC); + struct lwmi_om_priv *priv =3D ext_data; + struct capdata00 capdata; + int ret; + + 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[] =3D { + POWER_SUPPLY_PROP_CHARGE_TYPES, +}; + +static const struct power_supply_ext lwmi_psy_ext =3D { + .name =3D LWMI_OM_SYSFS_NAME, + .properties =3D lwmi_psy_ext_props, + .num_properties =3D ARRAY_SIZE(lwmi_psy_ext_props), + .charge_types =3D (BIT(POWER_SUPPLY_CHARGE_TYPE_STANDARD) | + BIT(POWER_SUPPLY_CHARGE_TYPE_LONGLIFE)), + .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, +}; + +/** + * 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, &lwmi_psy_ext, &priv->wde= v->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) +{ + power_supply_unregister_extension(battery, &lwmi_psy_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: Driver private data + * + * Checks if the ideapad_laptop driver is going to manage charge_type firs= t, + * then if not, hooks the battery to our WMI methods. + */ +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; + int ret; + + priv->bh_registered =3D false; + + /* Deconflict ideapad_laptop driver */ + if (force_load_psy_ext) + goto load_psy_ext; + + if (!lwmi_psy_prop_is_supported(priv)) + return; + + 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; + } + +load_psy_ext: + /* Add battery hooks */ + 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 { @@ -1228,6 +1516,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 @@ -1250,6 +1539,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 Sun Apr 12 15:41:52 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 1B4C83B9DA2 for ; Sat, 11 Apr 2026 16:23:48 +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=1775924630; cv=none; b=gJS3KIN+YkHgToquVFiHbdBMsWaQhEdMmBSCGVN+QdN/O1BgRca47ZIkFi5yzdzbjQNzVc45CoOiMyPn/WRU0QvWUwNzjjpEcjqf+kdxx2KsOA5iyl0zqOu1aMHoEwQ/ODSmO+7K5SGykN/wNNF0Nlmfecil3mfUv/KrCF84VjU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924630; c=relaxed/simple; bh=nw7kdTs1biYqcCyLBgFFjUVOcmzqKE/6nPTRSBdw19M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k3Q+dpz37YqHTdqzlhql7TKnuPZKIWL2pSnD8drFB7dEV+tdMpO9xkQje391ZWaM4hjY+ulgbsH9EmkqgGZAl6jeggrJ3NvIom6btKLCZPRcVnTe8v5ZemdYBBI/OV+hA7Rm7QR0U/S+Jmm0FV2bJoCm1a7+qGtfUPDPuntloHk= 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=ZP8luJlb; 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="ZP8luJlb" Received: by mail-dy1-f173.google.com with SMTP id 5a478bee46e88-2d78e5d275aso851945eec.0 for ; Sat, 11 Apr 2026 09:23:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924628; x=1776529428; 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=ZP8luJlbnRM9UbA61NFldvLVadf9xb7rcn/vhpJUYild6hB/Idg1VY9MpbBhh+FaM6 82QnQEl5vnR1cZjkLZL7t4M6beKJEa2VntoL2G3i/lHPA3dvfpdzhQow6Vq2ofPhcI5Q wMTFH/ePzREBcaKdr9T+fgN+JWCncdHtUTATIOme9mOi/hhw0YRE4c6hgZbhUF0pClnu KdPdrOzfPZ+38CcN8MOgs9/EesoqNR3oG/T6Gdy/HxcCmg1SDu4m8cl1jdz0Stbcljt+ lxKvDn0MhWGy3WHRNTG/vlhVOfYU3i3ab0AYoG/GdbJ9Mr5KAdiS1ncsXCWw/LaJadBM Qntg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924628; x=1776529428; 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=i5X9P83b+4QjiazVnEl0qv4AVbmGZMnYta0i1WeJDzvn9cOCCNnRbXD3TLpxkO20cz iLKm+wzRMxD5Rrn2N139vDSezGqzkhiVTdqhltK8W5mIlK7EAaXMX5qHWzAwSSOgI/kJ +/3s6Kcf6627gWI96IZJXUtZs6ai9AR0BXuAUeeueJp8DRJmnN34qETUuTn2S2ezCzwo OwYEeZ+mzmL5l2vR2IhBf+bgbZ3QqtvryJhDia5h/yeqONbhR9qMhmtpL933lm4unGI8 fnzJ/3RHOqufW56+GAGb3wHiYwZEZixXFwZVonnW+m408qjIKNRU00evqZL3Jh4HB7UH n8Wg== X-Forwarded-Encrypted: i=1; AJvYcCWodfkdLulM++GmFIVsYjF4xqrO5jM3ZgxowHZVimYmqWmfkbWN7iMa2Ij+zOawC/5xA8/InzrnZnqfxdQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yw48MNJGaLv8kYeiGTnuHA/HpRDjO7SrOr87cIcDSMt8NkkgU7X sZ0Qo4fHtwFmdiw8UFP8vzbbrmWTb0glIWXmLxocUKZWVAzmwH0kR+XN X-Gm-Gg: AeBDieupEeL6QHZ1oKLCLTaXUjW0oLFgq5WQXSzPOEkP3ZIS3Cf1sznmJVkAWw/G7KA YhsMFQc/8AZcL3OaWprD/lWA1GpYOKtE4qjzfnbZBssFVH2bBSCfJozMyRaBG7X/ZxmbsqJrBGe i7TCsVcSRMehjUtgtCtPRxugcLFAQqkKssGsGn+T6dBAwafhMfNjPeJdNqhHnk3uw3CXk6LaS2K OXZZLQf91hGdxaYH8i33mezmQnZRtgshHtcu4uqge9EDEHX0PEmYPaqt6cnJ4UzhP1D3yBbGutB +F7ETbiWygGcAQkUb7iBDRjkfwjVSQSkqa4ivixrbUFfh3XWVym+pP93zhJDSU+QxrhKcWb9iET fgdpN1fkoPCCCJv/Lae/0iCnUB1B3sdstzphtXk4MShyqlKkReEp9fmyKZ8R29+CnF+lGTVsTaW vm7Z7BGW6u0efLQZNm5ZiZI7sF3e807Ld7HygVYn6ojUGMTJjGLJNdI6Qyq/IPIlzPvYpLJdlM+ iYI97adwS9K/vE= X-Received: by 2002:a05:7300:df05:b0:2d2:d7b7:5c70 with SMTP id 5a478bee46e88-2d5881b0358mr5154606eec.15.1775924628184; Sat, 11 Apr 2026 09:23:48 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:47 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 15/16] platform/x86: lenovo-wmi-helpers: Add helper for creating per-device debugfs dir Date: Sat, 11 Apr 2026 16:23:33 +0000 Message-ID: <20260411162334.25682-16-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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 Sun Apr 12 15:41:52 2026 Received: from mail-dl1-f42.google.com (mail-dl1-f42.google.com [74.125.82.42]) (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 AA3643C197F for ; Sat, 11 Apr 2026 16:23:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924631; cv=none; b=Y8PLYDR6fopZkNtnvW3g9IdHVXUPHtGnNKfIu8unzW89v7b+o2wUMTMBd1fhknnGKJFrx4lxHBFLuTw+PozXBd0daemU/d71JKVQjJAj8YEI/L67bl8uu++YS6lTia/ufQgQLaHPR9rGJlKsHlGaRuRwARqYPMGjxRjduvFP/lo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924631; c=relaxed/simple; bh=ZmXhWCRPkzi5nSZOzkOVzZtTzDx5rrOdANioh4FSUb8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JHtpbwr1FpVchRQ2Z5PPhWW/7448NyUMnjjLgv+A5lwDXnx2ATOMiizk9DxgIdbHvplcSu5T3vpJ7S+rsG/nbU0J8VlUUpCsDDihJYjS83jHjDlKv2hb5aiTrSRKwJXYqrMu4rM0+X643aPTkThaB0ommqEIHjHpJizfvXobnCw= 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=pcJGDRYg; arc=none smtp.client-ip=74.125.82.42 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="pcJGDRYg" Received: by mail-dl1-f42.google.com with SMTP id a92af1059eb24-12c20010f10so7746991c88.0 for ; Sat, 11 Apr 2026 09:23:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924629; x=1776529429; 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=pcJGDRYgVauD6ZSqyf43XN4YOHYhpIx3KR2oSZ/VR/TkJBcygNC7AQ/6/QwcUklnmu PqCkv9G/ZHmC4w0DKv+WJ4tirSb82TT1XSFn7V6Uh4B8rLj3dmH26adC6JUuVxK8shOI dfxEmuj/XmFIWAXqfHt+WALSirQSaXunjnPM60q7z/35qtBAhnNyrgA39fnIFBcXxnUh q2gfz+G6LIQJRvpXPui4htGI6LlmB+Q0xIX9TOtvYOkIKfGqDa+kJdHxkpG+NPvENxcJ /vjBvANV+w1oe+S7JkA4gG/p8oVK9zV0IG4bOcmsEbbpaOjCtoY+gDgXxKF9Tdsf09kV eEoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924629; x=1776529429; 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=QoBoIlqeW74hsMAn5ESrqTqMVvBaZVzvi3l/M6e85svOdexH894wposvkFFrwRuRX+ YAsXmBD9MgY3vCH/cLbUBzXTpT2fPnxSQtndY+M39loaBZPiKnJAftka3BlSdfXWsOuT 3r8DZ+Mjf6buNNd4qgZsw0kABjz/+YgiwUtBer8GK57i1Ch/MVqseb3q+Ph59t41JPIW LyUHI9D31ZnQBXKNqqq7DxWntnLKoHpgkd23/8dtjUvQC12dxrNJZDuZPEkgPTi2Hwen A8b7xgZd0ipSmmslwteh0DydnTieLyFr9cRXdWuZ7rEO5JEE65tytTGrSUEHaLCPfqaL 8sqQ== X-Forwarded-Encrypted: i=1; AJvYcCVjEnE60C4HhqTCtihyZ54VCVEz8W4e7FtosUc3khCvd203Tcd6Z5ySIZ39XXG9wRnN7TWm7aVGiW1AXEA=@vger.kernel.org X-Gm-Message-State: AOJu0YwIRQPKA3TQdAFufE6Sr/emjH+YTtN3YNJFexg0Ztx1Q0rCQe8E uLIYuCifuo444YVokh9QVNRZ9i/e6W2vlxpu6VHGrYdzDpGrNe9hT1b9 X-Gm-Gg: AeBDievzy5HFqEFT0wcDC1dVqTfZMCfwTh8bFAZLiBeH8QG8Qm/XwL5XxU2nDfN0bHW h67mAGa669EgRLHaYdEnLy5Colbp6a5Z+bakX4/i+rogmHW1O9jcN7jrKz5r9oTssPHO+DU8BR8 SZiHbbsa8QUJ6Exapx/v0x++lJ7lPEgXbbUQxA70g4mMj3A3+jrX2UHhYsfE541PmXAFwvVzxtK ct3rb/TlWBEwl5CDw21Ok+E70oOuLNXFyOtCgV81Fyuhzu2lSLvbtAKvJkAEVoJWOqB3fycgYp5 fPSojMGyFh4VLesyu4HX2+hyWknRGIjqRC+QMlIRc+P7FwZn+aDTsezYzZrB+1SfSVaUB92Fu94 q2lzYP1si2h92yiJLts2XUNtE34lJMgxrKOhVA9YpBxnK8lbb3kXyeOk+i9CQ0Jus4SXjUspyC6 v4RtRHL456VxlVFIRvkJe/G9waAKiZ4D0JrkeCKgPIK12Khp5ngrjXy7frXPa0VDWIkb6Y7e1qE Wh7 X-Received: by 2002:a05:7301:608a:b0:2d4:2cc8:68e with SMTP id 5a478bee46e88-2d5896611e5mr4482993eec.16.1775924628807; Sat, 11 Apr 2026 09:23:48 -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-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:48 -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" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 16/16] platform/x86: lenovo-wmi-capdata: Add debugfs file for dumping capdata Date: Sat, 11 Apr 2026 16:23:34 +0000 Message-ID: <20260411162334.25682-17-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-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