From nobody Mon Jun 15 18:01:46 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 7B02E3803C2 for ; Sun, 12 Apr 2026 21:11:25 +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=1776028286; cv=none; b=FcQYSz5NJI6Eq3KvB01O446f8SpDk6PG9Zsd8q2T3iMyod4RBB5DyOP+uLw1UsFgA2ooCSyG8EL+yOuTC9xxxJg3ntSBTgxjCQw2a1TrDNg5qsAoYfXhoBoEGxXU9ugTXAnqv/M2M+ji7PtWSnOIN4y9/XOq1OjnqUX8xF0ahuU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028286; c=relaxed/simple; bh=as/Y6rgrCLbxvFJK4woRt4WCiXpZGU5Bmcl75dpz1Ic=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BW+WL9rMF5AgRwFWje2nBJ990HC1hZVRqGW3npGwJhVisQcYhdgIdvEkmLcNvTcPkT65BW/8kqzs1m9CIsYhOr7RTVyH5p5WNZBY9PXznsoAnIXVfbvUTNS+d9RiXSF02RGD5o21g5rqCLzpo8CH6ab978wbjAp7HyJd8OhbtwE= 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=UZhMmfqY; 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="UZhMmfqY" Received: by mail-dl1-f47.google.com with SMTP id a92af1059eb24-12c1a170a50so3343272c88.0 for ; Sun, 12 Apr 2026 14:11:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028285; x=1776633085; 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=UZhMmfqY8i6TiedDCEqOwCLh2DM0mNU9tH/OS4oxpi25wxqkZZOQO8OmOsw841YD7/ N6eQOJIabg8o3PiEQGiUyQaokyoPWZLJ6GYBjDI9XcmUMNgJIK/e35RibHnjpqkbFTUm lqxQTLBIcJrhvdAv78FQfewRZ7kMtUs43jh2tnoG948HtEM7T7RCFNUlc1/oU0lm2vgo TKCVM5P0owwxe9XpUR1pw81veIZk6I2IwUqY0LGR/c845Mrh3YDQjTAiXU4MUruIjBQ5 UBVRu8yIEq17KjsFreW9KFpyVwStkudfzUK6+Plz5jzGaPfxOTEEmM1opmjmdJa3bsp5 dKYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028285; x=1776633085; 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=TWbA75ZIt8NNfCzUnTbRtz1g3v/iWTLh+pS2I+EPKmlA4oyErNm1QfA22kFUt1XN5A g20liR8cxWQJUHyvcEx4M5WAKflzM8Pva6m4YXasKQXK9oUAqpItbMZIiYGlnDOdWD17 YOoWmvjKDnF9aBWm7/b6ru/eKjY0PcaLEQw3a4pt7jsDf4PrTGazdbrxObzBL5vm2s+y 4La55CALbVr7ZtHSq9pffEzskmnm90Y/Ebv9vocp/D2mmxCh4/NWW6LER+2EVtDxngW+ wY2mgOhlH6UbNyRp6xCC+2qNzdWDSYvRC4fSZFQr9nwW00xGpdQ5v2WrKaOowU0gKfZu DZGg== X-Forwarded-Encrypted: i=1; AJvYcCWt+KG3YR46Ioos6huIEoP2MBSZYtX5G+lhKwMnsVQyG6ubwW4btHR/zen5HW2OW5HiQNAOgFCByIAODJ0=@vger.kernel.org X-Gm-Message-State: AOJu0Yy7c8ykSn8dv1wf1uRE/KWr2AJkUmhvqJY0PxtDvY6bHeqmq7fW kHWG9gUj7aAaG3npHvfiaL0ApaIJp8+hRljQrq0xdTNY+gyof4v20i/d X-Gm-Gg: AeBDiesTWU+xBfBb+wmwtUhlmQxlyidXuqen4jWoluW4AycOX5hjTdmh0lm6717tbLD 8HbAzqiWg91IBuryXMhT0XFydwPDUJw6bNRA1kndxNtuOzsk7qdbvPA50BnOUTlxGqYyf7c/I85 3aSNJDCayTway063iFZ7Amwj33brYdv57JO1zGeqhT3YvNOBqduwdTN4TVJTAy/LgYNCXxtRW4B 7/kFW7H9wSHFYxkQ2xXH+FGy3b4afdawLGMP7cfkRCecHiowHw8LkH6NX+mSKEZKUcrDhmBV4wk KGrBDQg/KsQvMRaq7fVk+63bFJQ05URbzPuvHbaM/gEQdqWH6CHz5F2QumZeyFxGpx7VcyAo2DP gTQxWdAXPuV9H1qAg8lKJIdELIgAe5ttw1SYZYrYgblLec0RXwaTEZYuZbwKx+O4PWHihciQ3WC 2Iorym7vsN8v/CPnujx8nhAYU+wdwoVvF1LEs2T9oOWmAe3GUN98B2b84jZjauAcEOrJQiJyd2d 8Aw X-Received: by 2002:a05:7022:ec07:b0:119:e55a:9c04 with SMTP id a92af1059eb24-12c34ef9715mr6188284c88.32.1776028284605; Sun, 12 Apr 2026 14:11:24 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:24 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v10 01/16] platform/x86: lenovo-wmi-helpers: Fix memory leak in lwmi_dev_evaluate_int() Date: Sun, 12 Apr 2026 14:11:06 -0700 Message-ID: <20260412211121.2220556-2-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 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 3A508382281 for ; Sun, 12 Apr 2026 21:11:26 +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=1776028287; cv=none; b=ne8LL5HX+p7jdzPUzT+HXXnnfeq3HH13/+rYI9Wl2i5O5aRswKUBkIRIwMmi5kR19pKz0XR5DptfUsDUERCts0vxtXtJPhgkyIV+7AMg8UjRrPHdK4vAEB3vyjOju8Kjdn41ZS/IW0CGL0r2OlxCZBfroBwYEFMXSbgLKCczMN4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028287; c=relaxed/simple; bh=8LUDQtMderd6djIBXviEFlt08t4GGAhmClar2YVACLg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=e1hmh2Iv+13g3sfz+2oZ77RImC4XmQ3Ojd6TPqnXHXmsAM6tqoeI4MWqDzkBtLcRij0DwofAZp7WatzPYv18fG4NxAEH7fRhVS9BIEUo90yEICuyETJ11whhMSOGiBF/fg5gqaGZ+KoXuIX1oT5Bb3E1oPRYbYGkPh6dFWVHP64= 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=Cek/NTrw; 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="Cek/NTrw" Received: by mail-dl1-f42.google.com with SMTP id a92af1059eb24-12c19d23b19so3719150c88.0 for ; Sun, 12 Apr 2026 14:11:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028285; x=1776633085; 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=Cek/NTrwj0gnqNy56kJ0w7TIKVANFl6GBb1SjPx5H2SsR4UPpIriCh0LjkVCsAELZn 7fYKBWxAVn3Oos9qvdrebals4LjHCxDgPLe43Ck8uPUPCGWeQE7d/vFZActRdtTHeopO ksdQSepVZuQKKIYIeMXgqdhBifnN0KyXf3QzyvAM7cjKR7q3bRb8iCYcKvvV7TS8Ro3d icEY9DBSoLFalAtVdfdLd6N/8bM49M6h79qiocUUvB1z7c8yGuK6aezUfY1uqSLu03RR MhytgPpNCWDczuv7skkRE8pMr127CfkZK7zEgP3NLDkF5y+WZ5MWf3RBu/bUUaUh/nKT LuXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028285; x=1776633085; 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=AZ+CaSjXPqhxW2oKwRX9SmAQUeVltGquQB0bvMQM7/wEN59oHmjSeaTzrqYxtcvfoc Q2oNOi0aFtgsg/0Ipze1UuhD/frUguuVNYeRmZw4LqsyN301b/3FFXd74KJAinmsMr4B lSeoafaZMGHXSMbbTHQbxMwY8dYMhjtfqniakvJpY2G24i6cUc2DwJC192Byyfd9/3ss dFw29IyyWZ47VuOdCp9v7FlVDbyIWyAzeYjbwxbktkIf45t6eTGXCZnt3b92iqQdgSAC TC95Zz3Ly+j9nauQycWID2pJh4K+5A1rDteaaVQ0xUbu0Flr9ztwWbziR9GI6EvY3M/e 1yjQ== X-Forwarded-Encrypted: i=1; AJvYcCUQ9xRygnkieSRG5u+IfsInG1F1KI/7oDWQEXvuNLyS3kvKUjNzkAJG3TwpLppbzp/SMMaw9YHQ/x6HS4k=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5TpZYlG1x6TFQey1crfkW1XY+WfBBqu7af27Sesf0+Dj6mlUI bWg+INqFc22AuhndfEkgNhU4sHQOpD3k8+C+b0sZQxncyoRhZ6RR5Llh X-Gm-Gg: AeBDieu8h2Acp2zpT8SD+bleo8dUB3AGcccenpohOI9hBHQ9tnbP1YlJafgAqRqqTUb 3KKMFPqjdqT1BxN1iOJwINk+1sLSBB3rLbhMPhFKsQHcVKuDR3RY58jMFQFgGjJ9xRAwLCA0C/3 cuoJtntyEz1D+I5pzfqMgWt9ZzzbQVGXamipB/L+ypbTF90vfgeZRMtifaC6i2BKl983xCFVV5B crn4VzA/itexU1+W42CebmWKDfEHTKDRF5RrtQUoQ939RPAj4Dgw7ThE0MrDGN6gPDS3I/i3YMV Pwy+Y2YOklf7yqZuYnBVmE734qBfHuLTSmfoF0KOzQLXWlXctuSzSaefga+j0XhCYXrFT+NgZtq P1PVk+izr0/1jH9n+qS556+6n8a9cwG+/w2/Bap0FYMy8NeFSp5spc5SqMO7GHTKNWX3MykU9AQ G5w9e0VZ6rtowAevdEtogOYG1Dz1WufF+E42YE3b7YlW7qkwmVpU6ijYFKAd21y5t9N4Jo1RwdT bh319MyxFr34O8= X-Received: by 2002:a05:7022:622:b0:128:df80:1852 with SMTP id a92af1059eb24-12c34e55bc9mr5865117c88.9.1776028285266; Sun, 12 Apr 2026 14:11:25 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:25 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v10 02/16] platform/x86: lenovo-wmi-other: Balance IDA id allocation and free Date: Sun, 12 Apr 2026 14:11:07 -0700 Message-ID: <20260412211121.2220556-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 2026 Received: from mail-dl1-f46.google.com (mail-dl1-f46.google.com [74.125.82.46]) (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 C182A3822B4 for ; Sun, 12 Apr 2026 21:11:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028288; cv=none; b=Wj/ZjWB3kmNfGkPXG8O2hSTjnQAXesac1BeEbNhhHlOoAD6Ie+XL3rsbHH1hDIkOs7f2UPPOhePlrUWDb7CxdmuGcE3yzqpnz2IpBAt9py5O3ErPlEr+CNjkYBG4tsAJXg8nLxrWjjYHUaLrsCbo/2iUECXHZN5JNd2CEjxe6Ts= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028288; c=relaxed/simple; bh=6uvm7kxcoZxl4SJop0VuYLP778pizJEeCY5iHUnRujE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OS0LBlRbhxAJvOTUDOv71gMbianX9j3ipTucz7rVzbBeg+w0wN5M7JsxPGmpeKruu6YEbtBrLw26mWeSZvbqtrkTOJNlMC35EfIZMiH3OiekZNJpeZj8HiqApGeG8veJgqHsqLJk26LnJI12r8GPc+9v+W+HOa8XN/aDToyY27g= 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=XlDBPag+; arc=none smtp.client-ip=74.125.82.46 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="XlDBPag+" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-12c42a23c8eso1124599c88.1 for ; Sun, 12 Apr 2026 14:11:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028286; x=1776633086; 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=XlDBPag+crpA0I4J8yPdJSXHpcmpVRVrPr5wixEHYBcaYrTSjJ5BokwgjaSbZLkX2u d9iAwUS5ywUnDV6yOcyUcEdJGLogfKAXbZ0VDn9lPQ/omWuwAKUanr7T3M+kJfI4ml7J QPXgrHiqPVhxa9H8VVEfCoKUIddvFu6G67izJeJGWf/m3wakhgs+y53w4h8efiWs+An/ t1r4u7Tv5+rxYH/iHt40oJYWDKukAnvdjVrcj5sgWPxBM4SOQ6s4SkHUcj6k3xzzqJVn LxRKxgO54x1642ZKK8aRaIhChWGCWjlYcMDwUy2X5yfsYQO7A0j0yZEvDe+cgX+3diOG n7KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028286; x=1776633086; 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=biKWHhmLYUyB9+yTpI5a4GxdpnwHTTUZ8fkIiZcm2lFr0GIqT8GLvm9ja9TgY2PZSM xsBRgbLtVEk/+oTTBl2jndspCng/fzace6lpaXz1MDOZozB/D3MGR8xQPh6fnEDmoTPg u5mVl0uDeXoXBU5zu9PsFDf7uPW6kgPKIkT+nqMUe3fYaHgIFyR9cVnFk9n14dSqlO3g pHvHNaLsDausnuHOZn6g7DOi70OxjjwesV6G8Oi39yXgXWnC2G1AWr3OaW5+qtL6i0Dk QXzd/OJXgLm3lUq11MDvTAhwH8Rb+uuBIbDeOJXEwvaM0boCzRmGVPPhtnWudMKbv65a f6uQ== X-Forwarded-Encrypted: i=1; AJvYcCUnutk8uanPa0uzY8jkeL9tLPCg1Ju4Z0iaIqxPfocczJV3owzF6NGLTdQjPjdAT79bhLVGdfrpu7bB070=@vger.kernel.org X-Gm-Message-State: AOJu0YylnlkMGgRTASmerikIgXtu1VYZi7FsvUk9nKzkt3187gFyL/H2 1SMA83dUEVfeyiMjos+tECTuGzD7rLXeHTSF9AuYXTX8iMmDxQzEowPn X-Gm-Gg: AeBDieufabYDwQLxHWVrt8FgqFuS/V8XyGzx2e71iZV/cnYskcjYJJylVkVTdGYr6KG ssYvFOI0cwZtanZI+bw1f4tXyKlKFN6y6f5l67qtrHD2+4vSobM/Y1RJ7V9mfzaBAfxbODti9SO 8b1Pnu4dvrVwyJ9NQaYkbMXy+Ec/bp2gkxg77tdjIOBRgHqrxDmeHROj56ZczleM2VMMWP/5SJV U2E+28nAoOgQ5R6ifFCi8H5vETnza5ovuq0Xr1TPtVU24Xyhx29KICrI2UOg9WB3Klvkc3PAXrb gYrqrjjfRlUre/ncF21UROr130XPIf5+cZUC0laidsMJggqqk9TnFy8zzKsp0qwBFY5mItC7Qlu ETRmPZQJfiaWo8btdmQOSx5w54GsCyVVgrh7pfTumQdP4hzKSb1oByVyFjcodw7sZwmEUgOJBs0 zIIuGlVbNIHd6gKeYYuQSRrovTRRI1aEWdOSJIBTCGbrQ01h7j4l4hovGZHpuiqZaCgFm8ysyCi i3pkLE3JLlNEG4= X-Received: by 2002:a05:7022:4a2:b0:127:9ece:c47a with SMTP id a92af1059eb24-12c34f160e8mr5235469c88.36.1776028285938; Sun, 12 Apr 2026 14:11:25 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:25 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v10 03/16] platform/x86: lenovo-wmi-other: Balance component bind and unbind Date: Sun, 12 Apr 2026 14:11:08 -0700 Message-ID: <20260412211121.2220556-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 2026 Received: from mail-dl1-f52.google.com (mail-dl1-f52.google.com [74.125.82.52]) (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 5E0D3382383 for ; Sun, 12 Apr 2026 21:11:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028289; cv=none; b=TB7vTdbZkj+ZOisi7jM1hhgHEsLG4OzhhGSetW6axWj58Fvqsw3NlmPMZ0LgccFHQ6ipQ6Y7X+V1nE0SxZJ0kqR5X5CwyNpQCLo/PfmRMh9zhFLYR6aAzJPadrDaCm/3nTiz9orEhZRrawU9XQbzdKHIdcg+fkFXCwGMErO//7s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028289; c=relaxed/simple; bh=Pw+ssuLutbx3g6u/jM5PMxxasbxx9jVlsAJtmVGQOkk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Pjj14juXJiJm/CILFH3Z/YyzxG8fQVGE3h5V6wprUgmhc9MdVlpNNOre3h6RxyTY8QCcnZHm03HWPLAwTcDWbd+5jMC+s5lh28ayMzf3XrPuVMx3rsrDb6Fej+v4KL7bDkoV8pxQLygFFkw2wuYCJs2DVJTeBOvtU0pXF1DqJzY= 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=AHcdvFbo; arc=none smtp.client-ip=74.125.82.52 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="AHcdvFbo" Received: by mail-dl1-f52.google.com with SMTP id a92af1059eb24-12c45281a06so1167837c88.1 for ; Sun, 12 Apr 2026 14:11:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028287; x=1776633087; 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=AHcdvFbop7/cmhffkByBAgOryuY1Vf03jk/LHnquOSl/+gs1Os2uWcVx67P4jO570N YL8Anzww5xo0cSZrhoHlx1sGJzvXeYp9oUgxrd8/QBp6kq/0DjcKGxl+3jSrVyWggdmp HiBkRzFVSmQ/ciZsJzjFTC7JAHp+kueUDX8Fyjyxy0AvuKg4XkC4HRh0J3Q9Hwo5lCj8 XOZdPWSAO7m1929vOmvOQzn6w3FFmvmC+HME1wprwZcWCTE+mIialMFV5W1CIBv6VC94 gezY3l2qPQPE7xNvM4vnS2YwHz5No76fIWXykPMM/1tfO4jjo/OL+xQcnR3pzRycFbUt CIwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028287; x=1776633087; 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=eHvYpf5c4Tw7elM1CkvpzFilqvSnki11OMh820Moeey3OjkUUw1vBtcsxLCp7Dppf+ R0mVhG94bPk/XF+xRHtGlaDQj4xStG1QO0KLTLzSTz1t13XLy7OiIbzsaZKxFsMwpWa7 dpRVHw+sc0jumwL64v8+q++1x8ot8zRo/lBmlb3+xK/oYkfaPNqMzsOiunnL9bpXoCyl nBVnDpmZfznj2JWdfgH7bZjNAJZY/sogzq7RfQWRtNFPAxuSP3kmLIpiChYdPb+isanS lNVkXPjjBPXrdBD179e2qIXIFI80f5o6ak0zle+1VqB7BqQPm+/U06TA9FbKpEig9m1F bkgQ== X-Forwarded-Encrypted: i=1; AJvYcCXhdaAMCCOu3IpJBdC7wc2FrPdpfiM27lNd+3dR43d3l1QygWd3eH0gBPXUWUgHM/25lMLfCiivn4fg9as=@vger.kernel.org X-Gm-Message-State: AOJu0YynJHtKhYbwgI5LaRt7IxuAeeoX+kV/6zRW60jtsCulnjufyVsR FKHqcyKOi/g8zteYIpH8hynNnlzGUJVjLh9ByOnfFzoM6bhbQ5WgLh/4 X-Gm-Gg: AeBDieuJsfjiTsSns2SqZViSUHKmN9Rf8tuTfT40Vgl4JjZVhRhOLA8LhGsrXfa+IG7 pigT6BYr2ub6vTT0xMeZwRMNmvURdngheU5U9dCH4oTG0ZAK7Ni5c3Y1J5HDrr0+vQ6dXEBAx21 6bMSLb9+bGNafOZcCEWBI8nedxMhGreEJTUhuaGzpXAqNob9iUT4Iaf7oW7MH7VEomyoT+SfMr8 6eaCWUY/z2zI4o/XLWBfveMQNyWbYjRmLgKiyuLSKdWuAQtb571r8BhDiWNQilL97PBNDBo+G9E fdRGxDRWSn7N95z0jeAj7cs7UEknFqslMgfZE4ny9Ix+k9thuooYEQgsmf+yApkhMZFfisSKolY gn0zb6aTuwHKSM5VaRMUn9dYGMFvsNkJazjxg0z0fyM/kahlCt4gL4KFmeqgpktLovErJzk+Mh8 xFO05Vm7bz57AlKwtiUyMU4Oz4S5QWAuQ3WT13BLrGgKz+2GJibiHnwkVrQkn/qdIKFLvv/kW+c /ur X-Received: by 2002:a05:7022:250d:b0:11b:b3a1:714a with SMTP id a92af1059eb24-12c34e8f8a4mr6821180c88.12.1776028286579; Sun, 12 Apr 2026 14:11:26 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:26 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v10 04/16] platform/x86: lenovo-wmi-other: Zero initialize WMI arguments Date: Sun, 12 Apr 2026 14:11:09 -0700 Message-ID: <20260412211121.2220556-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 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 162673822A5 for ; Sun, 12 Apr 2026 21:11:27 +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=1776028289; cv=none; b=fip1BKFBzDQy17TROrpPYQrwjCVwkIg1g18iujzZT+PFtdB09a9E5MW7kbCzqLwtHgS+JqgMDccVGL5qxIvU56lT0LKIApZr8ADxm1PZhmihfg8VEusO+1uYl/hs4fSD3+f0cJK3jmP8CD+cIjPDC6tzLmYb0LVqmP/18UrPM68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028289; c=relaxed/simple; bh=NlwwelYA8uSHgqW88Xvl+l0Vc3NtEotDqvYvC1ZDl1E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P3feq5w7QSEW+3B6hliFxKAJcMBxyJuDqrLDSw6FoXRYkHeU7Q9Vp3sg7acpdtSvCjxQ3w4vyOe7CPK2FEGbdFh8pLTQo2f0/Xi/UQKSd1kXI0Iux1ia5LmODraii869D1L2zzwqy4vy44pBZuG9qAbCehWjsnOhBsz1QGoMdcE= 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=q5QnWk08; 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="q5QnWk08" Received: by mail-dl1-f47.google.com with SMTP id a92af1059eb24-12c287eb77fso3223300c88.1 for ; Sun, 12 Apr 2026 14:11:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028287; x=1776633087; 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=q5QnWk08pxUh8RrwESnSPYaFeJLQO4wnd5PENxDPbRSSyaccQXe/NO+M79pp4ZnwSf VnKueaY52ChdMz6klUNk5ZdZSDlAzejMUqbUMPWOweNx7s0Oj4XMwon6ZuXOEzChT4w9 Pa3ubqmrxkCXxTVkfNaZbN8+BGj+DRkKv73BwiPXETGqL3MP33NdSWs7xM0TjBLVLXSk +/RM/epXOa/Tr+c5iDXnxeCoLdqr8IHgfiMMiuc+hIcleUY/nuRdmJKf9cO0SSvF4XBN LH2/yBHeUSa7v7pIE/JuRdN0cJf/WhoH3T83uzadwMa7CzUROAwYyapSyu/pVHcM0Vsy SPIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028287; x=1776633087; 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=jgUK0tDQXycW9bClpzLlnyikHhPDz2qzcxt2zXivBOTwCQfyi8zJFu1XYBCMn+0E0p BmOpkDT+0x/syxHOEZ5xsYtwRRPiz2fjDYW5I4mq5mM/wyPyKfSy8iykNyh5ASkFLBhE k92ddLCLne+ZxN2THHGmhrltUU67ylD5kCTv+XCYc7jW84P3uYFd6NLSfwwm/fSUzxWl k1eH7kS3wErG66wBeUFbC7h8ZGcBFopJGQVKJNxwRJ+4Qr10MR0a+E2+uZdIuz0PdjK4 Luivt72ARqGlfgmCavWUMFlJwHSMjc5Td7tJvcwt2IRvZ0bD57eB4r6vZxsXXpLuffl/ dHBA== X-Forwarded-Encrypted: i=1; AJvYcCUXM7AWhZm7RsWS6wKHLYKjX6fiQkUGzdEF5zRhxJaARjI7dkOqUEtorN4H1OXcx0j5KkZq03bpx1FJAHc=@vger.kernel.org X-Gm-Message-State: AOJu0Yw7HespaEs73aLNqEPsg+ikmXkjxDcFhFJwHWu0EkUYkEV/8WDj jyy0kpgChZILgEN1WvTfyny43LQYVUOIQTbNYYZQoDtaFqHs8xditlT2 X-Gm-Gg: AeBDieuSL3isBBoCTuMQeHnqbGtSv6lB92lO6QpCbolCoy3jTTm2+aLia0SveEBGVbs BMZPynaGVartJBAuq8cH9AMe0wFNOwgL5+QCqswabQmQ3FDp2kwaOUzUBKntRDbF32kuaAK6miv 68PcPnjw4Q7+CqhvqpeD4F5UTe6Tezw8VVyDlP9n+HW3W5AZKVJNWTbIv/+w04J6DR/D6NAb2os dpBUesvmUMVmQJfmTTo7Be4kB0o2wR5z0a6pQEKmp5yJDvrYmMO4mM3WtdEiyvus/8mQcHlCtAp vHdzkoOrbt+cHlmMjeyLIwlg4RntV+2Fs/+jSfi03BtacPLWZrz4mFN7kmOE8aj7TIJwSaDADcf 9s4HKy6FxZm9XWxvrKzgGWHiDM5KeblWPGJDqHO/iS+0kby/7kdPAogKOWCtYCBaKbZfV7IqLgp WDCgOWu8m+OyYWvBuICx8h8SN4mOgtKVDw9nGs+z8wy6raDq0hE8GZpGOcR1rkcE6awWmWZ7WLw 37O X-Received: by 2002:a05:7022:6629:b0:12a:713b:896a with SMTP id a92af1059eb24-12c34eedc16mr6821236c88.17.1776028287219; Sun, 12 Apr 2026 14:11:27 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:27 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v10 05/16] platform/x86: lenovo-wmi-other: Fix tunable_attr_01 struct members Date: Sun, 12 Apr 2026 14:11:10 -0700 Message-ID: <20260412211121.2220556-6-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 2026 Received: from mail-dl1-f49.google.com (mail-dl1-f49.google.com [74.125.82.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B4ACB38237C for ; Sun, 12 Apr 2026 21:11:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028293; cv=none; b=niUKwF1qIDnZKRIL84NDt1teRHgR4hIM/CxuPP8a4njpbUlJ5hhBb3DU0JZCzyCWGZHL1QqQqK2ozKavC0P5mBy2kf/UrkWRty9o5AtvzUuGI240kOy4hT7kUBMYtHxwN8HXWwEEz4mRcLxZNC7ICL/Ey202zMfq0jXpkt+Fr/w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028293; c=relaxed/simple; bh=pN1yjE2cBEYcybWdzxunrFmw3Cw0pusN0YscySUs36g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=T6P1S/HO462NGSUGG1BRjuUnt2RQjJ1Nr0pyRP46r1XJQiYXRpD/Ra8BFXwDCz76Pei3xQ/HyiLe1OgoUF0ybuAnHKf43lT7udp+NcmuBlaQ7Ci1ziYvIyNNWYdhKanHsd4NjfVl7sEKDNYpTZXs+2+S3vRzAAmEF7lYNjeSCfQ= 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=sdbutbZf; arc=none smtp.client-ip=74.125.82.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="sdbutbZf" Received: by mail-dl1-f49.google.com with SMTP id a92af1059eb24-1271257ae53so11097384c88.1 for ; Sun, 12 Apr 2026 14:11:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028288; x=1776633088; 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=sdbutbZfRt6wBvvEx0/JmQ5ovk+7ZVU9G7pHBaCR30Cxj+DgzBZmdaqkOOo6XEoYJj 9A94J++ClrtQzyuZpfqTT4Yi/ZDS7wm+KiGuDgHoGyK87iZf/wKv/8lpASMyQnqzG7FI spjYzn+W+ytbvZp4tpkc1cnJuVAgkiyIXbQ0dC0YLaftjog89IBIfWwXeI0E9QlZryua QrihDRjxJ+22ho8IIn0wQwmJlJROXb2tQtoWhegnG0p3InaX0Eq3kBvuLC4X3I5Tbjrm IUv69TaUN7W1f7YV4JZdQIGm+zHkSrmqryAlMURre27aezqXRpUSmiqXJfNOiIiAIcM2 QITg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028288; x=1776633088; 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=Zs6eCrfw/xcp4pjhM9VRI5XFu0RP8qwEwcqWwgPVQbU/eTwLElOEs8/ogXVehAKHEW qUqHP11WYU3v1U8utKzl3fPG/9NRvdc49RaEH7Y5Du6bhoEMVXjsU8woP3axB7NrQIuU 9aE0IEbVO+xGGiBD+Y+dv1c+HzLzPZK0rn8Rb8TZQDRDvQO6xqv93PrryYJWbrIfFjRZ TQ819eYZ97LdsMDQrWTKsrCrp5iBHFZpdIQUo7Hc96EzckO5i3sV2RUVk4pN6abNO7eu wdH2QH3+mF6vx7eTY44NYb7lLKpY8dph8kJ59WPyHMpF4fOxChBLy7PiMmKvubbNlJbg +AUA== X-Forwarded-Encrypted: i=1; AJvYcCVCFZVdRCyYEV/avVD8ie0KZlDvlXswxEiegE/nE7pkG8AL2i+s1korBji3RHnaIy+0spdMAUm6wdLZOIk=@vger.kernel.org X-Gm-Message-State: AOJu0YwuaGeksbGgApKG5iVst96eY4nXaEiKofQkNWaqQ08Lif9ULse/ jWETvglaJfdAzdbGa0tg85b9eaknZtq0sZcORcAqBGnYxWAnmvD8hi2e X-Gm-Gg: AeBDievN5WWszj0aB4NAPI895kRtZ9VSuoAKYA6nN1BNqsdnyFNxawXE3adUPFXD58R rKvyVxuQzkom0RoNnxwL8/zLuRVHLio/xQ9BhU1XG5HYEa1B8BGZYDll9GmT3j2zK1IzgTDDaLs KAhsqdHgiki37Hqfzun9UBsQfp2BDMLoRnVpP0lJ5nUb/0d2ntdFtNHO5PIs1s/1hrTRXsXmUaD Qz0rxWUBPOfwRtKq/lgl5j4XOzOzdv2PWbw8AocfvUUVtnfMwT37Cth7xyfoMmtMvWwzHQT/K1g Xo8AqsF+evWshhW6fNwdDzp9fD8TuBZsENo2pGFaVVUgnUJXeMHOxFRbJ4TujD1BhivuQTww1k6 aUOqHslfP1r3xbc+QrfBA8WJviTBbO9qLP+x/B7C8v7m3f3G+4Vjsig/VlArL/eOb+xTmSag+Rj FwaNhFRuwuUzSmdRzodmOHcdUk6OmBu19buckXjiD6wzU8/bn/kMVGErljYvDxQMLqqsD2qekkl WD3 X-Received: by 2002:a05:7022:618:b0:12a:85ef:1e50 with SMTP id a92af1059eb24-12c34e899e2mr6462352c88.12.1776028287857; Sun, 12 Apr 2026 14:11:27 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:27 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v10 06/16] platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices Date: Sun, 12 Apr 2026 14:11:11 -0700 Message-ID: <20260412211121.2220556-7-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 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 83F75383C60 for ; Sun, 12 Apr 2026 21:11:29 +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=1776028293; cv=none; b=mLuI73KDsoYHhLzVvps8if4HevfgXDDoWOgr2kOOGcn8jjDokuevQc83hgll1zvVX0kVH/R9YwwDfl6YuvybyptpqD5ymy0uHn38DLqI/2jgPsaue62iwDe4DdCq3/g7RIWLWU5fQ7hxRJbm3SZ2OIZSMpX46exR2MSILp7hY+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028293; c=relaxed/simple; bh=epNgEAbOTwBUpTsXkpBr5phpz7PYDoqt1DNdf166hR0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PF64Q+LDMj2temYWUSN6HUTQNY0RqYb8USyOpqxIP1SalLGL7KaC6iBFltYU/necB6m+LmQkmXdAF/1RbqDu715YQf8DTSmrvNPIT8mySNmEDEXY5HUYLQbk25WkA3Gzsc+9l0OmR6oNG0EZmFjywFaXr1V/TI9HRccSm+jrmTg= 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=s3W/VWcQ; 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="s3W/VWcQ" Received: by mail-dl1-f47.google.com with SMTP id a92af1059eb24-1273349c56bso4804456c88.0 for ; Sun, 12 Apr 2026 14:11:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028289; x=1776633089; 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=s3W/VWcQa09+jhOHQnsLhWUw2MC6he0U+R1TgSdEjf6+IOFcC4/uMNzMkOL1j7bnql SqyhDJjCOULR0vfrBs9sgnCUrjkLldmVxuaQNLWunCnPlvIxrAhA55CBD994k6vVv0RY +PRLhQiFzZbNi6OQg94dwnoP0toZ7vAquYYe5QjV+hNYOmziY4REM+ln7B5mOneg3lx0 taD93HqK7TRfxz+UUZLNmrr7JyrilpW09P+gIgcFsY3aEmhWxjka07ENZY6HalwxyFop A342dou1ThARm/IS4xSnQSBsd4yDFZNHBEi1NlYtJlHWiyRwjKlfQx6oUPBHmYBIVBEL Iawg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028289; x=1776633089; 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=G97iDO/F7nxKLvF9mVtWwbTMB90eCB8p89Kk4W5v6klCJiZAXtys41N2Dpwf/tJHvi 00ETcIT6+vQ1HEX2rQTU/uWDY43LGhWvYjn8KP7QN2DT//NrOM/Od+8afYuYm/2aDjgT DWnPehK5ri6hQG9VzuLGBD6djbEqUkW2S73KMpOpLuUb2RJptW6XYDP8OTD5CoTQQ/Ff 6Qf96DSouFO5Ucsfc/uEYk3v4qsuPK3jUqvl23molSpl80dFRz5ZSfAgL1usfTwZqWU4 n1rNirwKU8HSXPDBYhymUAa6UbznCEz9aQ1r2gXzDk02YztOlcg0ZWnFtNNf/Krb3lQG ai1g== X-Forwarded-Encrypted: i=1; AJvYcCXkPy3Pbjj7FeP1g5fWolU4+/KycyNetGWdKa1MsrMAfPDVTnPRs3RB4rEaUYBuxdmrQLvyM9Hmtd7Gp1A=@vger.kernel.org X-Gm-Message-State: AOJu0Ywfgu221LgGXjomxhu9uQNMzBjykaZN/tJKfXDV+0QOcMrIIKqB OQFmNNezRqESF7u0YJDm0CAYtWzxbd/dfbZB7RMfu0c0GKWA6IFYB4NG X-Gm-Gg: AeBDies8rJEGx8ylkcuMRdjmPJ9Rk0btvlwriLIkA6rP6xaLdXGRC6/40eZrof2Eujo VJg2LJYMXsp2B2PToV8SdMbnk/U8kwvkaRP6gPAviiHcV+ukYBL4hJnD3Ta3d0mfhGh3EUmhLVa +5lIhv2TLcJHZeAkaV4uNv1dDrFbwJgPr9ogR0GLHtvswJXZh19rKsdSu4VmTO7IjyFjfW95PgV VCspHfmNkxnptd3wKUlRA4OZVRospEc77QWljFnBgbnjC7F8e/zuoB0eqkBRo3HDC0Aum9yW7oW BfvZ5Y6sm1yA4r0KPg9qFX2L6MvCxjVzeAtKg2ZmbqppQZVnxisY+xaYISGFGHaNE0iSieHG+hF 0swoxAUHmu6VEOkqErjFDG0/HEtR9qXWQsSrWmWUlR7hqUH0Wot4XD09qxtEcSsZsPptHgi1d9w HOrUSnlUtCYz1HFbFctJbqoSW8RLEmbONrtgf4RQvwlEXoI7MzrSPzwNaeJUXLSK7b5R7QGL1bN lXvknUB5Gr3YX8= X-Received: by 2002:a05:7022:6890:b0:12a:71ab:8235 with SMTP id a92af1059eb24-12c34e8a138mr5125042c88.6.1776028288546; Sun, 12 Apr 2026 14:11:28 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:28 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, kernel test robot Subject: [PATCH v10 07/16] platform/x86: lenovo: Decouple lenovo-wmi-gamezone and lenovo-wmi-other Date: Sun, 12 Apr 2026 14:11:12 -0700 Message-ID: <20260412211121.2220556-8-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 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 347E3382F08 for ; Sun, 12 Apr 2026 21:11:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028292; cv=none; b=jzhpJj8cNfdbhOpx+G5tIxQk58DRm8ONZH3zlW2JjAa3fiwe3uUY7u9s80w8X72rJb5e9hhbiCVxNjMo49K+94vSisaF40fOmLyzXEVOpkvb/ErCdzJ7wJfSQQYas9iIO4CZMp4Lk+D4tQjZU/I4ceKe2OQV1tkI2wlf10FQBLE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028292; c=relaxed/simple; bh=+KXtC06mzNgF38OJ1B+8or6FVJD6/rvwb8q1tr9zf4I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=or1sPMZwvOrGp59ld/ii3xDIaO5ld92JGCZYh1+kNZ2xys+ojnqkydwAYegWbZ2gpVmpJ/KrlKnBgkebivfOUT8+d1dXBR7AcYxka3+AyHpkoyQaYym6HRad6YT9mEFX5yWzO3pv9aaBU4/iPjud64dsTgT4f3nEPi4u788nZFk= 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=b1GxU21X; 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="b1GxU21X" Received: by mail-dl1-f43.google.com with SMTP id a92af1059eb24-12c287eb77fso3223343c88.1 for ; Sun, 12 Apr 2026 14:11:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028289; x=1776633089; 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=b1GxU21XRluAQSPdgpjLYppS1htVTiGwxVJWNIKOBkfz0Ez/qDmZH65ZgzC3rPzQoF KHjl1WH28/6NaLnMy8UKFWkc7AUllYQZtNQRczIW8m2AD7QSscFyjles3OhCUB2Rn2hK AChj33+PLR/YwaMMiPhgal/4o6tq514l/bZ8yDe3Xz7HFzVN2j42eirlUdf5smFRp8Ia CI1osYHi0KkkTO1Z8irmE67raW5zxE0Shc2Xll2l5UbMkeeHoc+4fZom7jOrAeZ2rWMl MNmLpNqDlrVhiq45I+7Ouz98C55gdD6XtkhoZepeCDoo7bMvEx7GE0z8jbZsVKuXdDvJ 4aJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028289; x=1776633089; 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=d0p15/HSMrCE+zx5cIMQ0amwK+PUPLyjnhK/GeADHJLoUbqTbNaQIHKfLRa5lOZCzK NSo/XmzQwyibbUldvzhLGZvkoMm1lerVHk1zbqAPRWKWCh7/+AAxxlb5dbx6f9OFoGHt Krtq70pufo8VrpZT0/1DSSaSZEokMw88+Jkk1VwqrJ5wEtaSovplGceW98VN2XEIxmZu 2Kff3nJwbxH/rXGfllTgtvQ48WOo7+qDA5V9ZZO1cFB2OQtEcvwtx4xjzxAZIvFKZBf+ MhurVgexUpN7+DGyVKN9JFfDsg8+GPFecd4Lmn4h+134sng1Mf2ox+kbOlV55WgFiyh4 Zwcg== X-Forwarded-Encrypted: i=1; AJvYcCVssjJojZojDYGBJEi9I30MnwEYABFL0udHxTkXrpbC+5X0m5Xn81g8bzbin+Qw19VMFhnZI1JF5UPTuQA=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5uznvhKZbK19AFtrC4srtBA3hbt395+n9l/XxCTBnB0Snyd+0 MKN9J/QEeQTEcmXq73w/z1NSRZ4NYEZkEy9Oj48Z0fanA5cNap4D9MQr X-Gm-Gg: AeBDieu6IcLZCMvij4ufNR3DUKKWSraP1WITRr4lPNYAqF+vnwibvrqPSYmHdJCdrnD uT45zblfZ/UxwQC4Tu6vF8boeoJ4JxUku2ObLsC5jtDrTHlV16xqlxZLpwB6HrT0UgQa/UN3qZN E6Tc1IyVOL89+qoeB9fSljdokKhvp33Ulc174MQuOkSrnEEVbmkHxJadwx3RFrVEYL+JRcnxu1S Eu5ViLeJWRYWE5xOhyCi4sPewyUBUvuhLk+EJZg/nfN/Ci45ZFmJ7PBVlMSDTF/E4Dy9gJVDfW0 3ZcVACAcxfQiDKmF0bbzHd1gTsymbgIgT8o/56SG+FQm6w7jdaVosxQAGwNsYNQxi6ukWJ2AaC8 M4Jud1tce72154gJqEjg/Yiuh4imSCCJWKGevUSD1Nsh3fZXY5LdFiO30tElMj4JQ97ytkE2uxv gRtIFekseHTu3hqa7d+Jqb/0qKicLFwvDJ0EUKcg8n5ky0/sSkaRovJ5KRouIEmsMmFmcm4ux5k oOo X-Received: by 2002:a05:7022:6a9:b0:128:cf86:d1cb with SMTP id a92af1059eb24-12c34f16faamr6935911c88.31.1776028289245; Sun, 12 Apr 2026 14:11:29 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:28 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 08/16] platform/x86: lenovo-wmi-helpers: Move gamezone enums to wmi-helpers Date: Sun, 12 Apr 2026 14:11:13 -0700 Message-ID: <20260412211121.2220556-9-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 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 E9DA8383C92 for ; Sun, 12 Apr 2026 21:11:30 +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=1776028293; cv=none; b=tc+ek2BNTdKf8+UToOZbaIdbUuaNTvJARMKDZ656zRLdAu/U3qSVO9mg9DBv0tN0vRdboet9WTV9UBliTvl+c+v1avTq1KpcOPtR+L6W1uMo3g3Y0YhC46yawbSQnwTmHCuwKwkXCaM4Ov4eunOiu6gQwmaB+1zmh3g/FS07If4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028293; c=relaxed/simple; bh=0AbQz3lWFcbXHNL+cEsqvTqOl1uqt4LYgRKMjWx1LGs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jIKwCntNaWCl1eYtDMA0Q5/UitJYB8x8RlXDrLsnU5zp/nHbrpVJx51M5KwE00zqYD6SGOMcTV09j33wCr+WpyXuSNK9tLT8v4WkEKOGhsYYMyQ2t4VHlFt9EVBALUAQaxOQ5bwpF4i0MidYP+iDGODXx/sYzniKypID8mZJDRE= 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=e4IfYW/E; 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="e4IfYW/E" Received: by mail-dl1-f47.google.com with SMTP id a92af1059eb24-126ea4b77adso11490952c88.1 for ; Sun, 12 Apr 2026 14:11:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028290; x=1776633090; 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=e4IfYW/EZy6tIGc3Hc1ZxzDZHEKg6isAKy5nLXQ0vIx8jNYB/Ldk7fAuZ+ub3dcJ6Z 5hL87w3pjVsBCynH2dPvfizTTkLCo+5NaH2n9HGKy2A6H1yyAlm62uqzFzMSyanMw6HM d4hhP2WQU2XXUSGxQGcNB3owQMq2vuGQeYvPrIeNCJuTugydhMujWqML+RESJQ9CnawX BGP8WT3vb2jMbIpcNR69DEseP4yzTrlqU6QU7AocGMFBeYy6C2Tvl7djR5UWm0oL4w9Q LbCdUs2hkbT1X6qTeYpdpyeqSaH/9NrVzb1S750JjHrIGgvdqpv9xEDfV/AhcxEWU8ss G9tQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028290; x=1776633090; 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=asEvbHEF0nvoBG5v5VtRPc2HjH0C0B6xCsZdoViyCs3VTT9Fyp5E6NZfmSGtSqWJzX nur9kxVBaHdsJA81xoprNDNbB7cdcQz41oaVMuddYIavPlzMvkpp/nHyep0gCTvArsVk jceWd1k7CVyD5DnxxxLbtju0pVOLbtGT3U48nnr4fXxZ7C0wpRo2aIL6AyYJSoW/4cfl DaCw5YfPMmpd/ahX26XyJEWfxtxFWfIA/sJruJib1DRfEBwBfdK/iTP3DlSDN2skbstZ Ri1dCu2h8ajN8xKFmjdzOYEw8xmSdiKKbSUJ2UN/RiOiGKB4sfplYsyuRZYeq7QvbeCD qYTg== X-Forwarded-Encrypted: i=1; AJvYcCWypdhK0iLU5nwAjYzdGp5e2zcfDu8n2FiHChK8SFyU9pNmtyHfd91E9N3iBYUSemtc9KgExdNATQVYuwQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxkmicVZbXJSPF3AEUo5AP2dCOtcT4EAmKjGaVPL12OwuJp1LUh 1XfPegkywkGWDnWewTnORXNmtIgyUkclUn+/fxZmpk3NxSAbgq5UfFwF X-Gm-Gg: AeBDietlfPnusU4zd5CHfpDTgVtC1QppemrbcWIaICTK0/REsWZmczvck5a3BL8awWS AxW6fxHUvs1zn1E+MsKRexxTB8I9d9fNobfphwLgD6IZGveP+X8SNhPJJa8wq9vsHBHRDqmhdij 0uTHtzdbSMHm++AMG4Vi0ciLQcVRuax4zHKedbq97uNeZE9vX8mGqxi/j1j+5VjFDov0EImHLOb eYSd2ApBZtexlH8FkaKbjOa2GRoeIN3msCvxxQSIA40OvcA5Km80A2WfEN6+dU0tX+UfkpYBA1i 3lrjPmdjGmvK2ZNgKlW06o/7JCTFHKoyu/tbZLpldTzku4FBHeiz5JXQ8lVyX+zvsmYBCXcybcO i429XZwVejwpilS8AWEvnD6MsXSiM4Lf4dmIR33YsghyzEdIhB45z7Mb+Dda4ldWG1iwxWnQPyq VLI8N4ceSAN0qHr/hTa4mjhQfGhIBqlu98fEbCSIhuXS93gaPd4CcU3S2dHyYwQbNT1IPgO0nGU za4 X-Received: by 2002:a05:7022:662a:b0:128:e0dc:6428 with SMTP id a92af1059eb24-12c34ede980mr6491751c88.17.1776028289858; Sun, 12 Apr 2026 14:11:29 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:29 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 09/16] platform/x86: lenovo-wmi-other: Move LWMI_FAN_DIV Date: Sun, 12 Apr 2026 14:11:14 -0700 Message-ID: <20260412211121.2220556-10-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 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 A5BDD3783CE for ; Sun, 12 Apr 2026 21:11:31 +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=1776028294; cv=none; b=rRUkma2LC124EvSjxE8dj7qMNoAhg4lmi7o5sij/wI3fjKq5g8tCidyFAree9lihGw9n5ty7ZBU20x27U6pmi673u15/N4CDeylnD7GxTau017mkYR91ZERqoKJh5hUJIuDWY2GRsIO48+QfmjSLt+BYNrn2ynTWYF0llw3FKKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028294; c=relaxed/simple; bh=bW1K8Ao7h8v4TqkdclQgTeLPXLeBW6bC6lUyeTm8FdE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o7T//kzu3ebktUr1Pu8sWSYI5O7NxcECVCIB07IpkKebvRDNOrtZHU0Kd5jsPjXJvUTA6LbJ3bg6kKI1twhWLSZ93vmG+/X+PDqtqOMj6G8WWM39hhsVhwRRN0ALisIVlYgBTVb7BRYS/FtCm109kr0pXLACz2WAiYjMEf8KHX8= 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=NSIi5HdE; 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="NSIi5HdE" Received: by mail-dl1-f47.google.com with SMTP id a92af1059eb24-1271195d2a7so4543987c88.0 for ; Sun, 12 Apr 2026 14:11:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028291; x=1776633091; 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=NSIi5HdE/VfByVRIOvWLJiV33wUWYvd3tYI9NVjgeUjxTvbtN9/Bu5+1uXiuGj7Hio /g4Tvye5+dctIIGK3oynaGHSKVQZliYPwNl46ZLr1D9QicSJGsSTmXTKOby50KWJS+DJ 1x5vpdpCKiNgZyORelctvK3r0/1BFiRax55DDZSt59OJwwREZS7s94cb0nN58RLDFmWA GYyAx+Vs8uIJROYGU6tISxyHOdy2/0Qo3WtAfZ54cd5kjaWsx8p2MsQChktUaOo8drFN pFxpW/vXKFZSK7Q3SVeTP73mT6+aHxp6RkuyZ1dDgo1JMDhd7g6u4JiIiLQtyGvUAvFr 7crA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028291; x=1776633091; 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=R1lxAVLBrnrGJFiW34LtBGIaEmmT9m+7RtrAtC29+sUDEbinlk1rcVs1YPdYaxgXF+ o6eorTlSJKlZlj9n0ReeCDHFweeAai7Q2CeWSYRkr2YOYYGGbtL879P3xxuoNdA89Irb ffMHSPOyPgbMylvA5X2jsNdQAajcUBmMIoIM0Wt2fK291KeT4nu9FrVYMNALhVKsU6LW 2arx+NWTZoqrSosxDFqRvDKm4G+r5KarYO1mcTz2eJ+lDBJSuTWR74Ml+ZwT63CfIiA+ Lh54A5XJn7TNIpChsBpYgpO9bXIshqfDVro7HECc9hnq+j2kC/ab1STYStoz4fFPbKl/ 2zwA== X-Forwarded-Encrypted: i=1; AJvYcCXXcfFsR6VViimKzLj04HpC5lsh0i42k6Fo+BWkIGH7kSnOfxbQJ43p3mDJCcVmUzGXYRp2h5LgfvfrI2k=@vger.kernel.org X-Gm-Message-State: AOJu0YzEQcMO+K0i+Bm/tKfl7MDKc7CyWALMby2VmFg7WfVps5xEdTGD WMxLdZ3B6VwRC5oYFabs0J64QklgKX8tbVFZ5uNTSmtr6dZxlhjEsbBo X-Gm-Gg: AeBDietQEXo7m6xO9njgGsFDhYA52oee+j8hfMmi383xfWLRDFBibmkiuQXu+DVztHd FHrtZQaM9NU8mr/XDpj5mxyDyaOdi0csNhW2V1NHghdRU5l/Qf/zjh9ezbWF2zmYJnJXaxj8ARg tbYUGEeyTsy0Oywy3OiqN1WIvd8Ay0Dve3Brq59w/gXKEL8tiOG6K2k8teWQ5OAeoLqQanr2lOQ OUgqsuWruQMmkrrGrTgG7ZdRgoRUrodV4iX2edb9OflS/lUss1FybYJynN0sPvbKregP2cAdj4x APu4a65Ik1xcSn4brz2IefxBuFvGhJNDuVd7i1S/6dcA7623JjcOei16TQjgBxNmnE3nFsqpMyk fOFGcUjCC+bgl2ZSOhY9g9Mq/2ebOvLp1d5SmEYG7kYDa+MbwO2Ec9uMx989hAA7kKwDl+aLCfO oNcccCWgTarLUGUxAN7PI65i3qBnVhu0N65HpUzq3n/Fgi5DPkeQZHM/3jiQQL+Qt2oVwKBSKNN IMl X-Received: by 2002:a05:7022:ff43:b0:128:d30f:c017 with SMTP id a92af1059eb24-12c34ea9488mr7654602c88.9.1776028290668; Sun, 12 Apr 2026 14:11:30 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:30 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 10/16] platform/x86: lenovo-wmi-other: Add lwmi_attr_id() function Date: Sun, 12 Apr 2026 14:11:15 -0700 Message-ID: <20260412211121.2220556-11-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 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 5A851382F11 for ; Sun, 12 Apr 2026 21:11:32 +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=1776028295; cv=none; b=fRyTHdy6PG+It6/WVs7/5Vd+XkPNlR1QKZrkIzf5/you/Zhfpyn9f0GCTZDhvk8TEb+tEv/hSTR5midxacXZUpOntyKl+supAJ7mVudzXLpHYZfBAtM/8Lz5+Ofxq866OxErx7z+twM8ElIiLFitiYbaNGm4ffAgKjWu4mh8DK4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028295; c=relaxed/simple; bh=/Q7L+5+s7FD7yhR0fw+A3SxzHEisnXuLUd3mmroUUyM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NGVW23LYu45v3bJ3sMBFUWVUpWCC8EpBdtGCCoLJ+22l5BOAorz+gWbouu9vXd8Ot/zB9WXUOg/CKIPjz5qvoIo+MVzTm9RNOIPTdOOwDN7hAKO8gpR0oUixW9neB5X79sdCqHET3A3bmqwak3+MdJt+PhixVN0gjGQP8cSwo2s= 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=K4nU/74h; 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="K4nU/74h" Received: by mail-dl1-f48.google.com with SMTP id a92af1059eb24-12c19d23b19so3719209c88.0 for ; Sun, 12 Apr 2026 14:11:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028291; x=1776633091; 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=K4nU/74htxblLrmlwEcoYKTnG9nuf2MKy8S7XgCNC0oUkRHYvO19PnWlM6+kBUgo1X rV0N2K3rhg225HXEALwkFhPX+RvsDn8N4fa5p0+hCB08bq6XxOmKyDscfJvxEReHPsky dVzu0xJXLTLjqELiSFHMnTT7JpVLvexpwJ1kvYVnCrZvPqAAG1Tzwl52TNsBqJ7cIJHs Yc80Vh1PK5zgQz7/cwICy8unDyJ/ilT07Oi6pJECOWQDEqlyk4HGWoIdV/f/Xq/sHYAR ZA8X82/HYUfVkkgxmUSCFPZo9E7mSbQm8gMwM7Lbp81x+u3EM89DSKZRyOrjfXhFP0k2 QZVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028291; x=1776633091; 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=bNAOXoEDpHyX/JkBS/iUZJfPNkLNmZSH06AUPNsNk7V5wmZ79NdiUii2n3r06hnH2z Zf2MhO5+OYHqf4POWOEAIrdYV0CRmKDLzD2aq04knmqJUlD+xbjbxzf3CE5dL/2ZDZSQ QLjIXOYSFWqWxOF5IM0X+So0uVfxCXveLcILj6m+iZDf0afRfKZ3fyyxCujXBkxVqujc ULlpAyNJcAVkEBoHQRWRfCMXj/5e1aTE4G+i3XUazRT0HxKnS8r5kaxWP0unHAqTsPP2 nOEfcf+Yy6VVW3p3jG2OYX+yKW14S37QqKXyaUATyIa7Sja0GVXK9NH2mc9dmhM6aKAR XFDQ== X-Forwarded-Encrypted: i=1; AJvYcCU+DuUmyVRzZVrsEGSWArXvTmI2gDy9eUrimScxuzf8LMEJAUSllFSupSlkg+m/ccA9HCAWSKspdMO4sLQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yw57YueW8eixmtMlOVE5UbQIfwOwURs7QY5LLOtcSZIiBaWkJoP TCQQ9Xr+n+vUXXZlk/5dOWPgNayWaof6b7qkDU5Hw9/q0Tja8llbrkdg X-Gm-Gg: AeBDieuaGlhxJojQ3aHaG+/ka0fLDWr7WOMgkne7i0AtJh0YoKKwAu9Pac7LxsfL5g7 ri2+k5Kez+hWUfyfoO3NQGRubBgJm730HV8/+pmDYh33xjbgT7/jjXRtPp/dVjzPNeJZrmSogKa ZgepdF1GwIM7/cXGjgHEJ/9fmFFuqDccUQmaJqPIJ9OzEPLQ/1hHggQi/VG4R6qc4Qv2Dbv2Oyp 5+au0PwhHMyBGicaRCUP8ajMmZYouq1i1JOmn0i7uqwCRvaKSojtvPbYUqq9/6TwmXP9LUHXPMZ HU3HO62IjQYC/E9uQ/w6AjTrkYZNIUNhBNQXgTXbNP9X9c5tOu7Wd8P3UNbI12A3K+Vc+IFiW9y HRgHYHD7OcQ5Bi6jtOPKcywJFosXJn7HVGD0EjRjocJTBtUlX0LcKX8aicV5S8cgZbNbXIYGhhf DIZmNphXCwKtumqumhTxNopLbhuUGdGv+wL4rQYRSnmRiMz1ko99pbcCU6/pJqSXBS5efSuPu7F AjZ X-Received: by 2002:a05:7022:4589:b0:12a:6902:ddce with SMTP id a92af1059eb24-12c34e6012fmr6162042c88.10.1776028291312; Sun, 12 Apr 2026 14:11:31 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:31 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 11/16] platform/x86: lenovo-wmi-other: Add missing CPU tunable attributes Date: Sun, 12 Apr 2026 14:11:16 -0700 Message-ID: <20260412211121.2220556-12-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 2026 Received: from mail-dl1-f44.google.com (mail-dl1-f44.google.com [74.125.82.44]) (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 171773859D5 for ; Sun, 12 Apr 2026 21:11:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028296; cv=none; b=sdQIlts/KkwHpGKclVn9jP5G2Bi5PE+RoxxKfOdZXebCBSbRyOQodNq8tC9WX/V3CGS7bAVHdnnhOXJJ4cPbOOHI05tfFx/+yp90CMDMxQjliqgk/ghO3GWVxEmKemXNE8Rthn/IZW/Jj5a428qEthZNhKX88ug8tNNXnQv4P5o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028296; c=relaxed/simple; bh=hBvOCtcEf6O/R0Qukc6K4ExfMtKu1/qZASDraDrt6Hw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ocnaBoYTJewuhoA+8m4+v1lh5sK3tHKNZKnd3rjodTs1j5Ak8+J2oU9uODrjJTbJmQTirMCr8MCSJ4z0nflyYyKO6yT1ak+G3z5drHS3tiPqhN9uMnLn6APNktKIHIIJblLmxuIUvdLeZnCiEgwme7xZ2AWOiUhoWPSYD2Hf5UQ= 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=p+PoTTRo; arc=none smtp.client-ip=74.125.82.44 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="p+PoTTRo" Received: by mail-dl1-f44.google.com with SMTP id a92af1059eb24-12c20010f10so9702933c88.0 for ; Sun, 12 Apr 2026 14:11:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028292; x=1776633092; 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=RewIYazFMekxO+8QCuKETQhRJ6L0CCqfWKaHlVYynz8=; b=p+PoTTRoNgM05BkVTistkeyRFxKMZ2h87RI1V0TJPvx/Ay+UeGWLcatAr+fB7/x2i9 l6Ic8Iu0wEsaesR9x+LN+xrH5d+/Wn7AbfeXOHRXgkBidmujTVfMq5WOAKPl3JEJL80S wXozRD+fm55Fm4tE8BI7XCNi2ZVuqoA7VGAA0hnGlEeb7+t96qXKFDMA4zFDgdEhaP7J tT86VoCMxz9dz6fSyHoCByqsEOUg02hMrOY6zTOKIDd5ZiFhB2sXEWtCj+6YKQkSV60+ AtCqv74IEboqC80/7yNMtGHpEKDQWy7l+a8NSoiPONAqONFrxwm3MeRowsvNndrHONbf HEpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028292; x=1776633092; 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=RewIYazFMekxO+8QCuKETQhRJ6L0CCqfWKaHlVYynz8=; b=dCvl9kYXl0TrrPqHhEZxgjuRzF1+JHa3bWPX2Bi/ijBajsnYXC9tNtTJydASMOTl0V BhpCBDTxsVgxjdCe+xTDMXIWrjrQP5D7xnEGSDgmfW48/ocdyCtimTO5zrsiphx4xBPp SSJHtkA0Td6h1c2IgQmszjkhcnVutoKjbGah/ViR0NuQSrFqsmBCqqaWTyAD88uZj2d/ oGnBQIyiOBRpRiu4B7gVBGNDtiViNDA8mEYRKJGymJL06hXOxGDqI2XquPxL61PVxoKj iH7m/z6XluldW0QpTC+wPsqKHpNFgUYLxA7tl46Myt+SBj3u1YCpIZlmAvaaFmYoOk3d C9aQ== X-Forwarded-Encrypted: i=1; AJvYcCUjX29+qVxUmoMCGZr8Tn9pq7mXFeboNLXMXL0TfGHUmfezgF9DbKvNB/3crshDrC7fNTJP7wIS5RWcXV8=@vger.kernel.org X-Gm-Message-State: AOJu0YyPhswGoi7fBpiy2H7MGY4lyz+h5KoVfEXoMBW6cWQbeMmAzLpy 3QKYXcegtssgGXKxH6rmGFF+xwJAOw4VO6g4HCSJpJcZN42jwW9Y+OZh X-Gm-Gg: AeBDiesHRwSzjCrT/B3z9ay3jrTjSvKouqR2idNJCFEzsMaKal8FgaTlwmkPo9x+nfr vot62R4/KMXeI5JnWkK3gJI6kG0V8oxLhxQlNTalIJTfKF2kmBywbhiOKCepB/YH4ElYoU8ZcIN SWzgGZ4oE94BW8nQ/N6SdXa8NMOMZwcJqvt2rbEYvJ03pc7a0u3Z1QOGAW8mGPB22U2d2bq+1y2 jQG+iz//qIK1cPZQ5+7UhROw+kb0t5FaygxGvm7dNUB/xdWP9esod39cGYqGaYqMJqAqvMLqw+B nch20mO0Jzt1J+lUGvBc4MM8ohfy2FxkkjZlM6FA0eB6Q9AUYRc99DrvECCEF08Q3G4BwOM6qpy aGxbvWoRa2SsG2PR/w6hY4IBLpOmdJ1+7gaWc0stYaI7ukqcSJpb77NiIUmwA+NJ6A0mQdDZX1+ rNK6nCb/HGzOytc5q7B2GAgqoxKpQ9kn4AxZlhL98z15LHgV5qyz5Uvt7NACTNccN23i5hjQUhB rha X-Received: by 2002:a05:7022:6890:b0:11b:f056:a1b3 with SMTP id a92af1059eb24-12c34e7fe53mr6061725c88.11.1776028291972; Sun, 12 Apr 2026 14:11:31 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:31 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 12/16] platform/x86: lenovo-wmi-other: Add GPU tunable attributes Date: Sun, 12 Apr 2026 14:11:17 -0700 Message-ID: <20260412211121.2220556-13-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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..47554a20d36b 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, "dgpu_didvid", + "Get the GPU device identifier and vendor identifier"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_enable, "dgpu_enable", + "Set the dedicated Nvidia GPU enabled status"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_mode, "gpu_mode", + "Set the GPU mode by power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ac_offset, "gpu_nv_ac_offset", + "Set the Nvidia GPU AC total processing power baseline offset"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_bpl, "gpu_nv_bpl", + "Set the Nvidia GPU base power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_cpu_boost, "gpu_nv_cpu_boost", + "Set the Nvidia GPU to CPU dynamic boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ctgp, "gpu_nv_ctgp", + "Set the GPU configurable total graphics power"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ppab, "gpu_nv_ppab", + "Set the Nvidia GPU power performance aware boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_temp, "gpu_temp", + "Set the GPU thermal load limit"); =20 static struct capdata01_attr_group cd01_attr_groups[] =3D { { &cpu_temp_attr_group, &cpu_temp }, + { &dgpu_boost_clk_attr_group, &dgpu_boost_clk }, + { &dgpu_didvid_attr_group, &dgpu_didvid }, + { &dgpu_enable_attr_group, &dgpu_enable }, + { &gpu_mode_attr_group, &gpu_mode }, + { &gpu_nv_ac_offset_attr_group, &gpu_nv_ac_offset }, + { &gpu_nv_bpl_attr_group, &gpu_nv_bpl }, + { &gpu_nv_cpu_boost_attr_group, &gpu_nv_cpu_boost }, + { &gpu_nv_ctgp_attr_group, &gpu_nv_ctgp }, + { &gpu_nv_ppab_attr_group, &gpu_nv_ppab }, + { &gpu_temp_attr_group, &gpu_temp }, { &ppt_cpu_cl_attr_group, &ppt_cpu_cl }, { &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl }, { &ppt_pl1_spl_attr_group, &ppt_pl1_spl }, --=20 2.53.0 From nobody Mon Jun 15 18:01:46 2026 Received: from mail-dl1-f41.google.com (mail-dl1-f41.google.com [74.125.82.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CFE1138643E for ; Sun, 12 Apr 2026 21:11:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028296; cv=none; b=hesxQYWiywvl5iW8p3xzoQom5s/t7JLK8PRydY10GhLh8HLs98JaTj45eR2kRrtn7EfRFC38sLpUlVtqZtciywPbsA40y8gj+mk2+Oyf/zmPV+6EF9t4VqSPQcJ2khfOI6fBLHABC/hf68IbFenX3J5c5MelzE+BFvVHfjFkF5g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028296; c=relaxed/simple; bh=NaAktuywsVP8xVPWdr5Bfl6Gk6ztbpjWY6fnVSe/yx8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qmWi8zwmLfJCt3ftfDFhL6dLCVnebtyrk6MRudfnLTwVie55jYhyV19rStvsSIIA1prUgeRG+C/1rVuuJMZ3bilCInlZkp/0jorwB6ApuOCWQO/siku52+pYMY4ugw0Z9Fn0RYXzmFVZ1cmlCUt1QiiOgy5n/xNMQ0trvuVDBR4= 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=ce5LczvQ; arc=none smtp.client-ip=74.125.82.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ce5LczvQ" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-1279eced0b9so5152537c88.0 for ; Sun, 12 Apr 2026 14:11:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028293; x=1776633093; 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=W+KtPnYD4kSOm8bUxA0Hr5Fh/9ElWR0RWD/pn4KfFXg=; b=ce5LczvQnKK26dNYwcmhu4N6ODjhokLiAML0xi/h/+RkhbYJRaqlLFgzkGmxNKkX1m A8A0YCnttXwgWu3ZvXXY20TeoIGe4Wqdqxqp8u+MKboD3+P/9v12cDXfkKdxMZ1880Yj YPjkd8XRIhrMqDtWnV0VwWu0hlDydQDdNFAMVXLmfNfFFRA33aYoJjUmhC0FQ1xTmgD5 0yw3td8W9eo3EgirmYxbfUYcIcnzfYdIDYmb0bqrYV9EcTkRzRotDo5ZrmNaX7njDvOq XB9Rlh2Jp8qWTESd9ZwU4tZLY43Tglmu7eVEIZ6Fre4Y3Bx4atbMykCnYkBKuhdEmVbM e4Og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028293; x=1776633093; 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=W+KtPnYD4kSOm8bUxA0Hr5Fh/9ElWR0RWD/pn4KfFXg=; b=tBaPTI5eCJ8dCkz7Kl8WQ5UOE4UWWAZfZgc5Gl8t/kWDXeNaGMnO5Jdew1441U9Nvc cWFNyUfXOfTqx6kAL3w3r5p2Kc/sJZRbvSJjTx8c/91nLePsKxRhwYzCSzBU58tkQ6e4 JTlKAEVtg3Og8m0BCaT9Q7sfFEy9IjcT5cK7Zh94gexYt7P/S2M8DIByINcyO+Ud+lEV n/kQG23A/ahH6iiPj0BM7wwMFz7mBPCP4HaSymiwaFnhykqBDaJ5DCRepUlmQFN+zFAK 17PZrtvDOpe8wCnKY+CS0eFf5cbwlvRlwNEYbmH68fTMbbIeed80z9msEEjwzQmpqwaV xtZw== X-Forwarded-Encrypted: i=1; AJvYcCXI22v0GVJp33stj4hfizZ6den91PubBEETeqdlD3hkZYlT9BczU3LcjizQGBbphGAYnFUoj3rimB6KOyA=@vger.kernel.org X-Gm-Message-State: AOJu0YzmghAYKL/YkiKUBkXsl+vok7SLI8cSNPdGPAHNTSYtps3dwAcg nGZ/r0DJqeZ/ZbXR0rA58HILH8xAnIllnlUyNWrCZ//3xQpkezs7dOeo X-Gm-Gg: AeBDieuHUZjZUcVUHrQpzzoW1TL6/S7CdVG8ED6LKy08/WuToyEw/VjRh3Fp2coXFsu SILDVBKSLkMKZ3NoKwX+Ttvhdl+fRO49YN+eW7Wwc+WaxR6sS3W8CaHpsauoN6u9fns5Un+mpkM XiQ7jKiBd0pO6EszRDtvKLTdueArlRXAGRMZ1OpmN77n11/ExkdMymOUkfBRzIACTzZt2g/oliI npcnuvhCQXDLIy0jiCc+VJFPXovOsxZ5uH0UvFZ6759eAYYE48bD0GAeQwV3LBvIq8dq49pwiU8 I4EZ8gUI9VOzfKHuRYl0ON0gsHKXfzEe+UMEu9hbToMgO7ra6vIxwWu1J9QmSUbt6w3cmzzdFh0 Wdo6WH67EJjHbmY6juSbp4Omgs1ywzE1++7m2Y9POpLY3U//84FimLHxZsN+5hp07V/nK5A1oxg aZasrFquno3Yj4CMiK4qKCqwO3eAnR60gwxTU7es5/oETrqDnxTmxL6ICU9O6ts9SrhNgk3uofS YZn X-Received: by 2002:a05:7022:439f:b0:128:d715:b717 with SMTP id a92af1059eb24-12c34e92e3emr5467551c88.13.1776028292616; Sun, 12 Apr 2026 14:11:32 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:32 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 13/16] platform/x86: lenovo-wmi-other: Rename LWMI_OM_FW_ATTR_BASE_PATH Date: Sun, 12 Apr 2026 14:11:18 -0700 Message-ID: <20260412211121.2220556-14-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 47554a20d36b..9636a3dc0788 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 Mon Jun 15 18:01:46 2026 Received: from mail-dl1-f52.google.com (mail-dl1-f52.google.com [74.125.82.52]) (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 34976386443 for ; Sun, 12 Apr 2026 21:11:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028297; cv=none; b=fs5+EpaveqOHjnZEb8ig+D8kPZztjtLfvmtQpsTus1Wv9MEdF9bQTG00NBFQI6BXZy5V2mDxSDn6DJt2Uc3wFTfbPu0D7TRtMR0BQwPXJUkp4gQsqKi5sG/hJoHzulMG6U6MAFkmTIleiaJkBVi2TK6ucTdLnCjOv6Zmx19348I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028297; c=relaxed/simple; bh=zmRAhMCgRYWlFKNoPMMBWDBeg7moDqKzkQS6CAEp3MI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gQZCdd6EPw9/WDGZwGD0YknTKoc2Wuh647WwIKj2QWFsCLm2AWsNGZGAzG8NTo4WxUjTNy1tl8svzmmB0vk+aRV36Tp0IM+Wwo9j/B7dekKsdypMzMmG0Lz4N4dPc6G3+JRXNSGsn21aLtaIVvwE3Wxo+Pt6+62DrBJnlC8jNiw= 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=Uj7226oA; arc=none smtp.client-ip=74.125.82.52 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="Uj7226oA" Received: by mail-dl1-f52.google.com with SMTP id a92af1059eb24-12c3d30564eso2831718c88.1 for ; Sun, 12 Apr 2026 14:11:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028293; x=1776633093; 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=vwZokcEODQRhlAhcUfPMvItSavV6p3ptGFjauBi5XnA=; b=Uj7226oAjlZDkutieUDw7EZRPWsRkZMRCjl1dA//asfGSIcP4mpNBVze2ILxEOdqGK Ij54fpxnR7DttXHZektqhzG3emcgGwsIdRluHBx5hhCThWk+nLINJto8yDZBH1tGbHQ6 JlLpH4t0/CpexboySnt17QrDfR9uzqvhIW7SRVhRymCxuStRz1r1DcJD1KiCSP9+9i9r wjkV1/3OUhA38kNxDq/OsejkXr7WEmYGbEZcLxmpyAlOyT0N/XK/iCrJymchwavD6vHE ERXqo9OnjJ8HQ5a+MkmQ8NUdCR2vGGk26rb58xZXt+fdrYwNEba4eptL92nVa9YRsKXw e+Dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028293; x=1776633093; 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=vwZokcEODQRhlAhcUfPMvItSavV6p3ptGFjauBi5XnA=; b=FnMkCD6oxEwtsZDJHykkUF15tKE2IMEUl6lhI6JINzJnEYxcxhbOnfjP2TnL9pbuGm jSwuUdSv823Q0EkU8SMYelcAeMAYaNibcyYGWrZxH1kPbCGyQKhEmEyF5hVd+SWhyGw0 wYcatp9dIsVGALFRaGRdlNtyqKG++pqV8Wuj+w2+IM/e0luQc8K4sO0yzt4WdK0yzWOL KB4HgJ1M3gK//DvKJuPZt4nNbyMO/W3wv7MTwx6B0JX2b1V3QnYOqooRrxUdRQjtmWkh z8QQcrZzoHY1J+K6XcfstV9Wo4DxjdVh6U/Xlp1dmWzQaTTUsI1eEVSv+yTUcXJcocta fIRA== X-Forwarded-Encrypted: i=1; AJvYcCVgLRE1fFh4xCkE/1YJVuheiC47EODdPx9EQQ/4IvGpt4lRQ95K5u5PFFVZ9wIO/4+Z0+GMNhMflVxzU/k=@vger.kernel.org X-Gm-Message-State: AOJu0YwJE9bNF8RVvwgZhDnVCjMJiqWIzYX1ZaAcxBL8NX83DZYjN4ic Ap3S9p/vXlIv7Ryf29gwznlC9D19OTJtfe9LGKF/DJyw86yWk1E0ezUK X-Gm-Gg: AeBDiesGJQyW//E92RuLCYi/OrQQmtEnBuTh0M+R9ZtSHBvY5NZnV4LuQZWEeHjpvwO 7KUsa9TBjX891/LBzyaahnfIn9rUOZVkmzLDCB+JXXFfpVBl5APsgvquvFIWyXlc95O7ib9nswg RTdNeSoRoDWAbz5EOyu2KSQE/GZUM5T7wGYp/4wmuPFpdHYkSMIjsKarKppzzCZWn/3LX0+3jUp N8YMN0gJgnlio0yRlPuyDv/OSCTzM8/OqZ5tItDcBNXOjV/Jm58/XYbDEdZeLifKaEgr1u/6Yx+ M3M+pZZS+R6o2RC/0i7S8l/N9VhRZg972Jzfulf2y7Nd+EIFknCp5arxVXzQNQ4REhNtcOUjFIX g5jurKpBNZJb+a4svrdgnHmKM20hNoCOiP25g3mFefqWfIsQ8i/YTGr0wHaAMMEUyIpY+Uz5iSk epevMemptnc7pFByx9ZaQ9rzHtRa/vedJTNlV4yK46aeCnv75wDbg82aZjk5LVo0Ppy9FpVpjkO 7pk X-Received: by 2002:a05:7022:4a4:b0:12b:ebb9:1c18 with SMTP id a92af1059eb24-12c34efabadmr6852818c88.31.1776028293308; Sun, 12 Apr 2026 14:11:33 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:33 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 14/16] platform/x86: lenovo-wmi-other: Add WMI battery charge limiting Date: Sun, 12 Apr 2026 14:11:19 -0700 Message-ID: <20260412211121.2220556-15-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 9636a3dc0788..712c11b69b45 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 Mon Jun 15 18:01:46 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 47D0E38654C for ; Sun, 12 Apr 2026 21:11:35 +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=1776028297; cv=none; b=lrIPyab/EM/LN1jKg0D49ITdhHdglHY1AuNUbPu8DafwQDqBDKVudNs7KqB98lnVzVI/BZc5dvWi/Sr+Zl5RzHBQr03rFu9vMKfqpn19T+ieNV68FLlUYbjKiPTqqerIenacuYnQBFVY3ycC0O/z4KW9gwxA8dBsaZCt9wbfXf0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028297; c=relaxed/simple; bh=nw7kdTs1biYqcCyLBgFFjUVOcmzqKE/6nPTRSBdw19M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QVzM3xfZ4AaV6Dd+fmkFfhkLCOQus79tXNELJ0mIdCL9cGM4I4ckS87Z8o3pudJhrjaMU9reLOnG0mmvqDPrX6yD4THWFC2tZs/T/dNEYC3FxYRmsiO6QX2m1kCS4yfwWf83hA0BptDfw9XFALUhf2ma+zfybcf8xmDdEm4TEeQ= 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=Lr9qewzt; 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="Lr9qewzt" Received: by mail-dl1-f48.google.com with SMTP id a92af1059eb24-128b9b7e3edso4689170c88.0 for ; Sun, 12 Apr 2026 14:11:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028294; x=1776633094; 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=Lr9qewztfc3uwjueYDuRk/DWOvcDt1pknRIzDVLNCoRqqqme4nEyA8I28d46N2+36F 69gr93A8F1l38P6KIF+gH0/joy2GHYILSzlH4+d2pJOR/ytqkrL/YU5CldsztaZJrwor jM+Xh9fuoBtkSTp8Py129U0H0jb+Uk5HRCsbWMxsJMv8bFptRIAmtwrGc4tg70NxnlrO 8mCHhxjeCNvNrdgyUiRcOOpBCHFuRkUcMFWvSKwj64kDD2k6wmoCWoDbg60jofYimFpg 56tSxsw26oml1h7vInjr1iDUsrHxE2HBTVI+coxS1NZzuuoWnTW/bBjfdnNAbz5I0kKG ybUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028294; x=1776633094; 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=DZnJdDnJUAooQOv2UBInBqU3Lf+wKZobEVg4Yg2fCwOn8khdnh/+QrWxcG/1iDq7/Y sd7PjvWJDILJNAm0heiTOKlA0aSEyuWVdzewFYvbVmSYE6QMn6DSs5qRnE5Sou1H4sjo bUkg/JMHNnezs+NeqthY3TJrc43ySAyCnoXWqxgXF+dP4Yrwn7KjPaY45pOmMxQU4PEY 9ILQS7wrsPnYduJfI8/5F2Qx96opPVJCQf3RBQJNPTejAHDnzOF33ZeKknAzbmB+Ium0 3z+ZUPRhx7tsxrpJOOyIz1t7dJ+ob1pMc8Y2Y9CrU2kI0y7eN+3Id3ffPvu10Ul19nM7 1f8w== X-Forwarded-Encrypted: i=1; AJvYcCXMjJDCYQ4wMAdQpl1HU2CXtYGglp9QMKCP8j603tg4usCYaH6BvU3QhqpxMfXodjKCr5yEhvED4mE5yMY=@vger.kernel.org X-Gm-Message-State: AOJu0YxjV33GzNTtLB9Xk9YtU1OAJbiKWgilgpFRVaM2c1oEJSMyUI8r 2quofPB8w/IArVCk4E1M9xWoUpCYmpkH4wUqJ3kkEmQ4il+0nmz29ncnLLRYmw== X-Gm-Gg: AeBDietaO5CTaDmizjVNY0zE6Bm1B6FEb8ZziSNHM3x4JPjlJEUa7JVtXPfd0aXvDmP ueJMxgzAhSu3xvKqGv8CCqq0elPMbLpljQ8gt4ipqYxwKGJiJxhlS2oSSZrNTa7PfFdeUsf3wQk miEosJPpyQTTHCpIQjNgOmWtlqYVG7vUfKZ6FsHc3Ev3d4p8aFiV04ibMJMGDCqVGpnTv0NnUZm c5A78exl/fWnfONNeigO8Q8WWNYCSOU8Ahax3Ws1mmRnZZpluzN4XVOHFsKWI1FxdMmg7nzsnKZ hNcMyyVf3BO/rXCH8oZNcpYYLHPcrrfRmVpW3d//WCiXxs8vqhRBwoF5p4ycwUVYu1qyaGZtyIZ XiomkTElzN/YuCkYMqB/2gq/lC+G89gHSntY+OyAxGiRIIB6IE/G8PhGrU9GIIgw5Ljhn4Eg4Y0 vyGEigfScTZYQNK+tZQfyWcmgEcEnBsO1Kt4EB3O2KEn/5jsq3deRvx+luErM4FAs18Tb4ze4fx sJi X-Received: by 2002:a05:7022:b97:b0:121:dea2:d54d with SMTP id a92af1059eb24-12c34ececbfmr7373550c88.20.1776028294281; Sun, 12 Apr 2026 14:11:34 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:34 -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 v10 15/16] platform/x86: lenovo-wmi-helpers: Add helper for creating per-device debugfs dir Date: Sun, 12 Apr 2026 14:11:20 -0700 Message-ID: <20260412211121.2220556-16-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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 Mon Jun 15 18:01:46 2026 Received: from mail-dl1-f41.google.com (mail-dl1-f41.google.com [74.125.82.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F1CA6386C09 for ; Sun, 12 Apr 2026 21:11:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028298; cv=none; b=Wcn9XNSRLrHPqlgomV25FlDVCur9sAwbvgXQTeTwV36O/zxddo+In81HPH3un6tD87xgq6DbKm3045ZvaPDXTq+YhZTPtve9TI1/5RxA5/fzNg0k3AZY6Iy+u0xS2pQaFVvnPy6nH15ifhD5C8rrJIvlNx7vsaoWG5or53ymY0M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776028298; c=relaxed/simple; bh=ZmXhWCRPkzi5nSZOzkOVzZtTzDx5rrOdANioh4FSUb8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ctDP57KMFPrWzbxqSYj/HJJFCkLS9ZUNdAPdmd3Ht2TJZWKW78Oo9YsF8wgJEfpSe/GErsnCuK/J8Hli1dcOvou8pclYR3w3vvLG5u91ASraSJ1HY2z3r4xjhjROgHZaBNkVL4khkl5BaiF7SVGAZy4GC7zmyq5inX6FwuqTKDE= 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=oiPq8lwT; arc=none smtp.client-ip=74.125.82.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="oiPq8lwT" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-12c45281a06so1167896c88.1 for ; Sun, 12 Apr 2026 14:11:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776028295; x=1776633095; 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=oiPq8lwTvoS8ysoSLUPMHblGCDXX5ML7wf3ZEzM79wjNOAPApJqc+4V210Uw1P79WK om4CL6W2vXKUIdZLi2u8sveCQRDh2xWLYyWeImqU2upXg/+2wOqUvEvsZ0fU2BHRBQiC xWYiRZ77Yq8E30t7hI5IxJDXXX/VTOJ9hWQhs8pwt3ZeUFaYOoRk/MTbkqKcO6G9I6xu WR/LXSh4CbXK8cASETdjfr8ZgiAO2d4q/neQ59DFzSNfFk0vHQDW/HuHqOxj43Slgb29 lUjgd95FIiSsJXkayvkJ13s0hqAUin1pXi4/GnsjFeRNi8DAmhsOYbYan3gQ6kN5qyPs dzLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776028295; x=1776633095; 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=WYlaS1UaNj1FCzzyJlO7eC7ZOmjWspM/loqxL23qZ4HFzePkfNxbE0czHtmMMkUkv4 BbDNrhGlqmtJ94/03TVHR5lT81de7CWsvVQFQhYEQjS2DDS9GxhIpoNLjf+LXYksUvhT WwU6nrmeG/4x7tabinG5V0FJkTNHGhnTKioXO4zpeA3G0Ch8lfaI7jS1PKGiY+BdbCof SX7UwF3TOiigj5uEHE/0EwwCG7LDks4C/3NQ6e8IrYZ1U7UVZ/P28ZqswzXQ2O7eek3C Dn07R6sI00a1cy5v9nDxClXp2iL5qERnWmeE6cLsvMJaRzEhEXCY5izyivrBnh0UcDIF OpRw== X-Forwarded-Encrypted: i=1; AJvYcCV1qSNhXBTjzftBbkd8t4u8MWRR9Hh5pp5e0a0+l+OwcbkAJWNY/wtM95s+lMNQvL2oajPWOejc8ZcH9f0=@vger.kernel.org X-Gm-Message-State: AOJu0YyRepmzL59q4lNFINjSwWgHvHNBzCLteUj7ZsgSa6JawlSDOnMy eDR0oXtvzA/FR+0Y9LAY4z85SEsieBDdoo1PqhUor1WaSacTeRFI0RbW X-Gm-Gg: AeBDietWXaZ1Qx23d3Yvdf3QTV8LRofOpLyywGUoWg9SQZ8C6Tx/KcJT8R/mxhHcZjt IUeHDiXix6YX+S1Q+cJ7gt5T0kYEKWqXpjMJfrbSeLcruiRvEg7dmQYoui165cBPHACP5O/qQvI H0klofx+32ms3mwL86fhg3aVAy1hsaL08gjf4Tg21Ztr+jhipYeTXQVMzRv4mcRIvHjT5ycPLB3 8S7JPDXmp2JfGzyowFMlVEB9I2pjvIlqIdeO9HnmwbZRDrxGhsOSaEA1DhJHYhxA/+3eiqymQZz w47Wzq5JPsJccZo6sfghhhlL9fAHuoqMDXxR78EUT80l39Ky1A9a58QdplZjQvIMQLt6z2T3OF1 SEaixXJ80c7H16SzVv4gyZdLtQNHm5+dDdIy3EovCxVDp8o5+2cf6FAzKyi8OTbXgyR7ch7L8Sp zpv4JOi/BwMSbGWEoqgVffab8Mu0C0umf8C8G2FvLAfKkOq6hRtn9TSJaZ454r6q2o5RZneXCD7 tly X-Received: by 2002:a05:7022:eac7:b0:11a:fb3c:568b with SMTP id a92af1059eb24-12c34edefddmr6502600c88.17.1776028294886; Sun, 12 Apr 2026 14:11:34 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c346fb141sm11520856c88.12.2026.04.12.14.11.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2026 14:11:34 -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 v10 16/16] platform/x86: lenovo-wmi-capdata: Add debugfs file for dumping capdata Date: Sun, 12 Apr 2026 14:11:21 -0700 Message-ID: <20260412211121.2220556-17-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260412211121.2220556-1-derekjohn.clark@gmail.com> References: <20260412211121.2220556-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