From nobody Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f54.google.com (mail-dl1-f54.google.com [74.125.82.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6729839C00E for ; Mon, 6 Apr 2026 20:14:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506445; cv=none; b=cCxHBKU/cG1jUI5kgpm0wYbmX7/eh0z+cKryANGMJ6WA65xPXsLbtn0qZ+5/+pWH8WxnxsoR2Qnm+9tkh3ZFh40EdEcluFQ82NV/RJxKUy22pUpJEeIBTnTkdM+cN31Ckr1KryIOxUD87Lx8XkY3tkf+1ZYcLeidSdogjs7BquQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506445; c=relaxed/simple; bh=QpvEj1emH+D7uyjHFu5brDKzkv5iOsNgAWo3QDRZ4T0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TyZRqtA89UddkuF1fG8KmPSLByBZhXO8psN3fw3mcVQSbFCxaq94lA/ok9yPKs5Rlyurkxg0iunchwzGxgzK5ctfajiLe35PMvdZfTrH+BqIne2SB8HKAMYqllxclxMWi4UZ1uqN7Wf853nzRHjF14bGusQuUsPqCGFma5JJTGk= 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=PB9uVzGY; arc=none smtp.client-ip=74.125.82.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PB9uVzGY" Received: by mail-dl1-f54.google.com with SMTP id a92af1059eb24-126ea4b77adso4786827c88.1 for ; Mon, 06 Apr 2026 13:14:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506444; x=1776111244; 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=Hj5KeLYeiV8K9ipCUKl33iACfT1+nJcLiRAjRSTKr8k=; b=PB9uVzGYA6vJaXCeU0dy9dKynpZCyKgtvtBDZw8hD+PfdYLZl5zxKlKDWkYFeV3Zol rvZ+l14i/o/F1wJy8i2C1JgQfIMwXQe2aDS2velbLC1x2iG31grWZmO6qlpqm/kmfsof cF+NalFxSEoSKGuCvBRjmTQ8iqYOJOAZEm406kXQYEcxYL0P0+cAkuBGpMz6pG2Ze8DW WGqFXZ1iMW21AUBOgcYh9RrJWDKnhASs759bbq35sY/xN7uLmUaTi532bemPBXRrsczI SQjVDtSgTo2lsXzKb5WsmRn2Tjp80Md18KAfKTynDp2N+T0gajmijdCjueeb2af3Xdqn EcJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506444; x=1776111244; 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=Hj5KeLYeiV8K9ipCUKl33iACfT1+nJcLiRAjRSTKr8k=; b=dGl8vqmps8QMr6HU+2kNO2zA+ZIVweYrXskY123bjJp96BvvJkvkn3x+PHXrkyidfo WofxNRivDJozzTfQbpcKg5l2ftXzs4VkWuHUbL6cyVr6dRSfuJYzj/S3g96q84OMsqeW ll7W1jBIZrN+sHOaHRtLMfGxEnkO3g0tchYLN9R4G2NFCYnPPFm+fHOuXWd1qpLTwTlX YC7gvEON0WjM0TxvlgkBpX+iWWh5vTSgFxTx+SJdp4H1/0lKgak12dTmCAUMupKCjmsY CCRDTZEnWXFW7igtVSh/FiJdCsmYZh7NqYMWfQ/Ta433qlnynlrDE6STiAxn/BA5EXep NfIA== X-Forwarded-Encrypted: i=1; AJvYcCU79/kRuTRU9EJd+/NLG9BYA/2/a2Ad3YwUsddHMKuP5Hk1y30VYiFGKB5Pg73Qq3SDCLqiPTF+z18xRhk=@vger.kernel.org X-Gm-Message-State: AOJu0YyKHaWASfw8uY6CM12ZOMWFC4RjBha6pg92Bx6YMzenXvfQlOFB esehosOdDgShQce5c5z+Z+pL5FPVZd7dt2CNUEzN7CgrnduSs7mnDH3r X-Gm-Gg: AeBDiesJy3HEruA92LMaig27GevJ1TlFLmgZ28oXYhh5o+L4XJwxCNGJZitmD+r05iY +kEwsf/G3VeXkjwDcZIvjx27czCoEFMG8jkhAME0PHI5oPmJ4KpZYZYJx+6uXLCLYWAbKjS757P KOWLQk05okwYLk8LH9F6j50ftSEauDuidBlkM+eylARTNYzM8nMVHMd6PfiGwRvj0zqGTGHBW7T k/fwAMMaPwZ4M1jAXO36Bp1E8Pzf2wfWPZxi4rOhjMhb+4VlNLaNxM7t1ZJT7LHHdr0jm3J3RX9 NQBVNZ5XPskcv+pgGxpapQ43S6GDmDlKBqM4go5gT0hTt2DVxhK2MwSkdaSEP1agRHg/ayNHbje 3CwjjF2ICIdhyFWj7P2VF8uoX4X03NvIrUOTaJ4KVe6MBvMcJNm1Dv/hnLxiANuCcG2NtCLb/UC dIsqg49zq3G3IEs6doSTjUeanKxk3bEsk6EReSY+he29tUruWm4hgFCJx+1VbSXK85E+kJjLbWF PHm X-Received: by 2002:a05:7022:f30f:b0:12c:43:839b with SMTP id a92af1059eb24-12c00438781mr2653107c88.35.1775506443579; Mon, 06 Apr 2026 13:14:03 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:03 -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 v8 01/16] platform/x86: lenovo-wmi-helpers: Fix memory leak in lwmi_dev_evaluate_int() Date: Mon, 6 Apr 2026 20:13:45 +0000 Message-ID: <20260406201400.438221-2-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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. 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 --- 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 Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f54.google.com (mail-dl1-f54.google.com [74.125.82.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C78339891E for ; Mon, 6 Apr 2026 20:14:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506446; cv=none; b=OfGeWBI/sfaXSqcDwhxyE9U7F8qrlt2gIfGXKG8z6WWQQWNh9mGgjbsvycHfyDSda2AJS3amOwEVpcfZKE1NlDmY2K68EHir3i04U/5mzXlEqBGsVXgXr92P1vGggjGvEvasFXD0hLrP0i2uG9iwjdys/x6h6XlH7RbS7RG1evA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506446; c=relaxed/simple; bh=WAyuXvHg+IDaHK96s8SFan2J1QbE5G5c5VzthemtNBg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s/5BUn2X/+mCnxU7ZOuNfJqmZrfdoTlgCxjtN7ncRAO/VUPUbBC+vPhGoxcf7F1nPDA7lgc1+zn/wXLCNg1J9McX2wSIgbusObeeO5b9a2sU9k1QewfdyVGnSqgq5Qs9tBXgwNBaAdblTwDHqP1HPFKkmQQR1gUEYAN5yz59zR8= 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=PzF24vC+; arc=none smtp.client-ip=74.125.82.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PzF24vC+" Received: by mail-dl1-f54.google.com with SMTP id a92af1059eb24-12c0f979c16so560377c88.0 for ; Mon, 06 Apr 2026 13:14:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506444; x=1776111244; 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=dtWSJAsPoNeIGexvUzam2g4A6bay7wxoWEXeu9FJabM=; b=PzF24vC+vYWCfIvwd9U5wFTsDs1cYnKBwsfqHYD8CQJxYnRujtA/UWbEY6j/WORXiO 5Pn0ohyRJsV/iVjnhAjQV7SoDg6kdBDSHcLOVud6oqRww154NsoS9e/m7rh6Uvstye0C 1M+vtCfikxA9hoK3xTo9Le/NckovI5c6m+Ya/RSI1lFzaF4BUZAWEEB+aUM1yOyltuPZ gREFYh+j0vbFMsxhEGDXGhn7t0e6ske20+y743qy9Mir7BKKEwHYHDTRE54sMyrHRv6i WO8b6woSfv6AO4guer3cW3FTBrRZyQGkW3cdbwsYyuqtEV/6tcJC/DpltJa7qExfZZ7f bHYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506444; x=1776111244; 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=dtWSJAsPoNeIGexvUzam2g4A6bay7wxoWEXeu9FJabM=; b=S4VnkOEVTVbnkxiIj94hI5QEytM9wrkrhAYzWeYiwOc3pts4khwgZlSl8fSrbmgthQ 2A5Wup2dWv1XqskKI++ChyxAjrBiErz7tGFukQ6X3GY330lYy4oODHRzJ5GBYgf2lKBv wnofeGc4b105SSi43tE6oyzKaVkz7xpgT7828gLMJ0fPt63HWWzuAkR9sHZQneWo6okW pn+GSS1CRrVW5KdShZv4aVPU0WwgY592jWVy5q/4Kk8YOApucjs+vluu+YDIjYCVgt/V +IJFs7uPNHwflMcQkbnCpk+D1+cbfgxyIN+bmeBagTNZfcLGAmiGhHx6Dh/h/ajH57xR qpAg== X-Forwarded-Encrypted: i=1; AJvYcCVFZnc2B6mpwuIM+5OgyWnV13T/+wODD9wIRMZ4frbgMFDFRD1aSnoFpJlNTRjLahpBmdSpQvFOF2HoP6g=@vger.kernel.org X-Gm-Message-State: AOJu0YyueWlTbBmlUDyMCWUKwVBqz7+B3+ftFCTMdk2WHPlnqWRyha5F E3jQ909aawO8t+SpeEnRYn2Hzpq1Nnrjat6iBTj0TkHHdInquYYfaECe X-Gm-Gg: AeBDiet4ZRMwmKLbld7uB70vaCcRjfNtHL32h8R3MpcaTgTEV/lt1Q1OR18J1ascraL /IOf5ABsRnSVpswo2JuswvJ9lgdhPNzrmfuTGTprod2cggAfQ2i7zo/+EKc05uq9dFGpU7K6/kQ kULrhLpOvElalTMxSkkG6ArtxN6Q9ZJToV/kgzvd6g+qlrArePXDVsQs5hvCb5LZYw2FdUwUyOF A7weYMVEBQzxD5mz7fIAd+Fpm8rE/b0XlwA1l4JeOx9aexS7RhpTJ8ip7SDPzNn5rN6vZezVWzQ koOLgI89ipPzHg19AQtnBwB+y75nMKh6nb2GuscZVqORC+oEpB8yGnkpPNRHXgfjowIEySsopDP bHqy3o3x5PstpZtdwGBvqZ4LKws2NzPzOD3w0+EQlFwFqCfd1zJ9ilCxjRd21fYoEiFX29JOI4u Fu1NPS1vo2rMLNwtqojV6uu/X0vzucjVC5T2LZUfYOkqkLfdFT1o5znaNciw42NvJ8cYxkB0vyZ NAw X-Received: by 2002:a05:7022:112:b0:128:e6d0:d7c3 with SMTP id a92af1059eb24-12bfb73eec9mr6480840c88.20.1775506444250; Mon, 06 Apr 2026 13:14:04 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:03 -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 v8 02/16] platform/x86: lenovo-wmi-other: Balance IDA id allocation and free Date: Mon, 6 Apr 2026 20:13:46 +0000 Message-ID: <20260406201400.438221-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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. 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 --- drivers/platform/x86/lenovo/wmi-other.c | 34 +++++++++++++++---------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 6040f45aa2b0..b47418df099f 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; + if (priv->ida_id < 0) { + err =3D priv->ida_id; + goto 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: + 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 Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f54.google.com (mail-dl1-f54.google.com [74.125.82.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A54F539C63A for ; Mon, 6 Apr 2026 20:14:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506447; cv=none; b=J9okWQL2qJ6iiYK8X2tuXvU/jWHGo4z+FzASmgf7fI72pQNPfZtW0Lz5uWR32VHE4OXpKvuGoHHnTHIUfX3Ma2lIe/3nw+0mVGbd/C8i5w9QmFxBuecoNw2LtC089JkOExzbGE/tOWfIIGsI7OAPPAfM18YucrgQ/RBr8dH42dU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506447; c=relaxed/simple; bh=A5nBMBkWkafHNY7USWwQbGA1Gg3Rjn8l3CkT7z4RWhQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mPVwICMvL6rNmftqVURSN/mk1ISTvOXapHqsv4mU9HB+iE+r5jsXbD0SBewpXdjC1lxkMes/kr0Z9tycujOPnx+MJV0Nyn8fQTMzYbqIJUj3Y29lv9inx7Yacxmramn4fA3P8D/0C1K7FYWAU9PnctV4p3pJs6T2dkJlSM0l55U= 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=NYqpV1Z0; arc=none smtp.client-ip=74.125.82.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NYqpV1Z0" Received: by mail-dl1-f54.google.com with SMTP id a92af1059eb24-1271195d2a7so9286221c88.0 for ; Mon, 06 Apr 2026 13:14:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506445; x=1776111245; 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=c2sfsoM3eXXD/i3TYQHRzXUhUiniPGPfrTop9I4lCjo=; b=NYqpV1Z0VZog+MsPIJfogi+iN5OKCVUNF08wCZjx3SuwuKNIfPPI4CJjj87jt1yMY1 RIUXB6gg+2y8/MMVxHZgegsWDN4y2i0kpzGABhzTWwzltiUIOOyNCZav3dwizLpQNTPh wzL5U2NstNyM7UHZNp4I8K1k/02RNq+SJY2unl/louZrW8RpHSRyY6dtU5YvUWqIpZeF LEPCRuUbYduWe7fvWViPdg6FoKNwSA6OGiMf7s6E5JPs0GnzRWeiwmeUCrFMPysLnrly lrgunZVPn4CXszLNqvKoH/L8Wwze7f6oRpEwMbFfgnQk+glcqhwqPoLgN8K+kWgcVxSb wgmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506445; x=1776111245; 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=c2sfsoM3eXXD/i3TYQHRzXUhUiniPGPfrTop9I4lCjo=; b=m9Q2SxuqJRnVq++UQgiqF1nbC8u5sMB3sfrgyfo9dVUWY6yHTtLj/teMSPV9FWG+5G 1YVpyqa/I/QR0i0HvsEvA4+QSezMpFhTi+BImY6cz4Hm3FQI+Gh5AS37/O/ePSXx23Mw uJhltOdRkWofsoMNuaHfh/VFfZhJTwtisS1eNnS5AqTSCKjTsgT4UeNmJnvlPh22BB9s 6CfvWWeduSQavUZFbLP1Ph9svEuB+3y0SBG65KtNjuADdEpbRn1YYzwpdDO3QdE8n8hp f3Rqg0wgYZyn2EQF63w/7JccRvaBuy2Jlgy89xAP+gKqQizi1+XUTh7g/4vJZsfAlHHV KIkg== X-Forwarded-Encrypted: i=1; AJvYcCV72iAevXefOx/cAa3kfC4kNlp7qP6XVg/WFk50JYrCEIsYAPBDyVG7QySTXNAh36Ev45SaixB5XsTFVyw=@vger.kernel.org X-Gm-Message-State: AOJu0Yy843s9MEKnBjs4nQeoaz8SSptz9TPXdU4V5mjt9sCjRdqUWcsR SyErcXfuMjFD0GZqoMUNm6MVj0Bl5/bJTSzy0KBYDXNnzE/MJcAKCnG7 X-Gm-Gg: AeBDietr2XXMWYqikhbaDFpN5Ya1L0BzHI82Vf5YwXt5a9QNQH9c4jd84xEMO5pEabw ns0A3MLHAMm9ddrajMQcXKsU07jK2dPW685gqobDHMlXJtXR322BNTSyvGX6S53PJcIRDNDBfSF 68+UmoRQ4hsZeBnhH5ZXoO6oYNNsJecu5rBZw8+PJjMS6u6Qw6GXkWg0WMUItlXaQO8j8Nr//+O 8VRbG6WoGYFtYoYmNYS/TASWswYnIDlB7Kxk5u86POXsgq0arac5I66qQHGjNT8V40IjNOnQlsJ U3b5PxWkLBkvvO6mSKIVMpAnZ/YJcCC6Wy9T2mhrfrV9f3O+NDy+I4eUsFb9Yx243OY58/urlCm sDcdzjiViOwHLNKaYXBxx4TldDt9KRqKtVw793X7ALv/AccDbihDr6Q+zNeue/Mcx9OW6PIFztY w3XX/Ap1/v6YhlE6u9E3xWXc8OmNpbHPnNR7Qz31pIveaZdV1zAJG/jV0k6KgEw4niN975kEvrJ QYm X-Received: by 2002:a05:7022:1603:b0:12b:ec96:c936 with SMTP id a92af1059eb24-12bfb70bfe6mr6740371c88.14.1775506444895; Mon, 06 Apr 2026 13:14:04 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:04 -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 v8 03/16] platform/x86: lenovo-wmi-other: Balance component bind and unbind Date: Mon, 6 Apr 2026 20:13:47 +0000 Message-ID: <20260406201400.438221-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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 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. 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 --- 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 b47418df099f..4b47b5886e33 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 Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f49.google.com (mail-dl1-f49.google.com [74.125.82.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9446C39D6C2 for ; Mon, 6 Apr 2026 20:14:06 +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=1775506449; cv=none; b=QnmokVcWyxBO0xpBu0DnHVnMDll0OKy+ON2QQk8cG3/ApRiv6LiWkrUyTDB05d0RO/9YjoL9A1nNWGuGvlHaLb+xunUUpCmYYmUsMi43T10Ug4DxmYuYaikREnu5aGiHCrgRFdSoHO2mU3sovy1Z4l6zsI3j5yCTaWKC7sNaN6A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506449; c=relaxed/simple; bh=fqoWirm15gyR2T5vILMgWW6g7wMD/2DlfAbl65EnpPE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jB57+Orw5oW+8uShSbrWCMtxFqzXfq9fq+qt1db7kyT/EoPtne0gt4DO2bRDbLL4WRx6yukrrBe9yh0ECguiSanS7OKcMPoLS4j47Rx9n1Urj5ShjrQW5gQDDz+Sp1vgt1clqAUDl9JZV3KPyzrV+rM+KwSUN21ZJSnlEBZcjGw= 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=K/RcheTx; 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="K/RcheTx" Received: by mail-dl1-f49.google.com with SMTP id a92af1059eb24-128e4d0cc48so4442238c88.1 for ; Mon, 06 Apr 2026 13:14:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506446; x=1776111246; 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=3yX9dP9ip8JwFkjEQDaOaU6XeU3b97kM6xm6qGhhPLg=; b=K/RcheTx2d8O4ifahcV7hgMBGOgCHzWlxHex7CzdSB7QdR8pOgKiCB5Sv2osj5k8kQ BrhIgOBzZSMoAS2l3JeUtdnIX62jCuiImbZmuaxvVg0ylsFezQCw+AGS1TlkD8ZMdiHy /G5lJgns8NuzXgq3Qm+uWnt1SiSqo3C8EHU+rlrkFSShD4VABfNMN9p2fVyFrk7NfSqF 2BZYI0WKnFY0X0W/etmZbKBeUE5LGaMvskFDBveDE/YZrIeKSIb1DB5yCVYgKWkR4Ep7 xJ9F7ZzVB3pPQFQsYobvRfvUzmBj+hLLWBrL6lIyBQ1UBKX35puNw0KCjLJTGQlwvyq3 BkFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506446; x=1776111246; 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=3yX9dP9ip8JwFkjEQDaOaU6XeU3b97kM6xm6qGhhPLg=; b=sGzYS6ubdrVMhtiDCgF2GMSQSOSbZfmAw5e2aBz8ERiUoXcxQo9dkAWzxHi/tJ0aJs X2YmATDrZsFXiMZNlpejXmKKpkIjZnRJpxRLYYreicO/AdUslr6C5QGry+3kzCBqkndq kSsnuXmR7NzTX41RCWo/pReMJrtmDuitViIqloNRj7lYSVnlS6QEG8lLa8JHLGzR1vgN GcZ/E18IhsQSAwgDR4FvCfH54Ohq+S1xZltOCFJ1eN7qlWXPAxfDHs+RL2GOcMqxpR7e IIf4zT1i3wCDqNeuLDvR3KTHmzclNPoLSG/13VUrS9LYXaMsTv9PuhkGbVNOcoiPDwZc /beQ== X-Forwarded-Encrypted: i=1; AJvYcCUxllhJzZ1DUGX5iJgynEDQrUTbDrWSSYQwRRJhMr6YaCNOMxds3t3FrR6Q83qcFEZY1NwdvhjgMcK0CBI=@vger.kernel.org X-Gm-Message-State: AOJu0YxA0vm7nYqZbCRXZu0f6lPmujpdfqrvIe3w/dP1yvzo9WQ0Tmn1 6tyOTBvalkP39sOvnbP0xtU31nIHUaClH5fv89xC5S2GiTjzDE2+3dxG X-Gm-Gg: AeBDietqjZy8O//f3hABOLSsAGs03/t+iFgsiQeQvf7IAq7YPmP6gBsr/70EkXKIgSz WHhH4KOrYNRCv0vXaYHpKppLprhAgotn2VSbyK2pPNsx6NbchIguR50U5ZIhbikadwP4BK9v3Lq kwrudgcHT/pKPgdoeSKEy7dU0IPofyYFIaAjSaxiDulr9uI4yiajhjFsJOM3hQv4sE91YNIhGoR SfMmdmNeCAqyvIWpXSFH6eiyCV3ct65Z6k87UgSalhvkf6Q8gcu2VbFz8xAZ+OtyhHqxiRryyYP 3AwvCV8AMQW6vlce6lcKdNAg6Pc9LskB6us0tJE5r12MPiY80B+BVopesXd9kRhVYUNz1tzm8IL 7OpyOnp/NgsVuO5+PmjSwuV+tZdyWX7oZAGNbjMh6aagzZgchALbnCbY8GNpzg+V5MZBBZB0f1N YNw97AHT725E6KPgoGAXNVx7fealJyiuCYhgpH58sWPsI4Z479hRn5BgJMfDKvT8N3q3Ylvt/mQ Fl9WJjdATXrpyo= X-Received: by 2002:a05:7022:43a8:b0:12a:6f8b:36a3 with SMTP id a92af1059eb24-12bfb6e7d0emr6729839c88.6.1775506445573; Mon, 06 Apr 2026 13:14:05 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:05 -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 v8 04/16] platform/x86: lenovo-wmi-other: Zero initialize WMI arguments Date: Mon, 6 Apr 2026 20:13:48 +0000 Message-ID: <20260406201400.438221-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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. 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 4b47b5886e33..985cb9859b44 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 Tue Apr 7 02:54:32 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 1593339D6CF for ; Mon, 6 Apr 2026 20:14:07 +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=1775506449; cv=none; b=sEy0eBU8BpozayEA7fP7VevRjfY4mKNhyDtbHGk8gP+gSgr3oeFIQJrDukbNNXz7dlqgst2+CtMJ3xnF9A9WYHukQDLimioU0BmR46ledhLoDJTcT2Qz1ZcJn7yseOXyXtNKRBVG7VTP5UM7YYnOYC8FLh/ddjCPnVRjgl23qcE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506449; c=relaxed/simple; bh=rSDmCCEiDg6H2odhJiDoxieO0TKl6hml/thK1WrMGBo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mOKT99uESHf+yYVScenGHlqqOh+2kV2ZMqnLIwJpB4jTJAnRV0Z57eQCImvE0uR17fAKb39SOqFcTgcDVax2qq/q4JHP3+I54Dey8g6UFxUELqxZ+zzgC2s65vzl/lxVcy1lRSaQ4bLkHIB8kDjcxXIMD11WSJyLzY9xfW4Wq94= 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=HWqkZ8OX; 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="HWqkZ8OX" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-12c080efc1eso1195546c88.0 for ; Mon, 06 Apr 2026 13:14:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506446; x=1776111246; 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=VN+fnLwvwAoWFMaejyWO9zQ/OWEWR+6r67Ac0CIVd7Y=; b=HWqkZ8OXLuCwAX89PyH0UNW1dSsOeI9VjKb8cyR9RvZb9POP6HWGuWHCKA8Q6cm7KW IauvlkU3Rhk8INyMl9nKyh+Tn6gARv7eWdc+5OlLqJWtaG/DkUa7toSl6hiVJm3SDuOX Be3LvgvYfdC+FXaqXcjQHs42ltF/hk91Q8HZASX0WnEZaJJ6Rgl43BtV9DC8LlHLNiiZ wfLooP/NxOB+jJ+34VtdqvTDE+viKOLgavanQMqAILt++h8dDLplzxPDkr8f3a6bInRP texa1aaaSpo69OYTgU1bLc2XwiiB0FGJmGhw9/p5y/kiCYeQ1L6e4zTyCWFOfBS4lPNk iiZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506446; x=1776111246; 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=VN+fnLwvwAoWFMaejyWO9zQ/OWEWR+6r67Ac0CIVd7Y=; b=FIyJqAziFgolfu4ksEVLB0VU10sAsLmyWomFAMBZI8pXhnBFLp44BUasqt+u6Rj0yu 1yibtLEai1NhFgBef5TpEnAXFLyJnXJNed4jIMMz1P3/nqgPiVAaPavpTT/dfteH4MwL sTlGdVDB9XxzkOeqEs8m0NTPapTFopuTy77A+bqaX2U3T/gFz/Kw2uAhs9MouGJZF31f ke+pKr+EPByL28R1qXIgeIjbLaHPe/v43AIHcO4srlS0Egm93DdXUV/rgtGAZ/iC+jjb sf8fzLOSd6/84tg7s1C6Zq3Egg8NOzrzqkAl4lrrnMRJRuCZFQL9ZF27/ak048RGbwlo 92yA== X-Forwarded-Encrypted: i=1; AJvYcCXhev2Q2pUikyRLly9Q0k2FKE9/kfNoue3cOcaVbvnhCzen4jJrtyK8WukI/S8zAnT+QEkJ2j6GlAlCCbo=@vger.kernel.org X-Gm-Message-State: AOJu0YyQkOWMZKDWKO5hmNW6vZjCCj+GOZQNZ7Nkc7RjZOfHMN6BOZWR Dwg8QEdTtWYXm7APrZ0u0uOGubD6/VMlwJOrXn2xevVHA4+2odtFVSMV X-Gm-Gg: AeBDievZBCmxGvaHVo3Tu5evkNIj16IbTXYArRAptiTXR4y7dkCLCzXnppKNTg3fX3m BQ/U9JFDVr868+nChgpEpKMGSYZVBJFYLQv4rDaiFLE6TQ3QwiV7+D2BdpiF6fE21MmGbQWFhGb 3p3nI+jxJcoHLKgJHhqnLgK892r/0YlspbviKiY4j9+GYCluMnznnQGrrfhXMDrx0O83CzsrNu0 viFMq3e7ugadlCaaEiDZu9FGGc7lOGkZmkbNntcJ+IshzbXtgYBOzyGjSkonTyiiEdcBMu7dKNC 1muSsQA7kvvv4ZQ6tkjt6no3Wai+8eSkjiHamU+qhh6O/Tg4ZG56D2wu3o7DT3UNRfygb8jXXTA fcn6STSUaa8LljtgWtgKlwqmGsBNcOL5Kt/f2zA8IJ8k40xvssPVML2ALGHqCY5a7ZZ6emnvWyR PYie8KKDyj7TivI6aRc8D/5XgdP5ahNj3fnWxM/89n5H/+ZKH5S7enjws5zbLCyAQXrJUFg2oet Ddi/IbpTY3MsG0= X-Received: by 2002:a05:701b:220c:b0:12c:839:7462 with SMTP id a92af1059eb24-12c083975ccmr1603169c88.12.1775506446333; Mon, 06 Apr 2026 13:14:06 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:06 -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 v8 05/16] platform/x86: lenovo-wmi-other: Fix tunable_attr_01 struct members Date: Mon, 6 Apr 2026 20:13:49 +0000 Message-ID: <20260406201400.438221-6-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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. 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 985cb9859b44..0e8a69309ec4 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 Tue Apr 7 02:54:32 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 3B01839C64C for ; Mon, 6 Apr 2026 20:14:08 +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=1775506454; cv=none; b=JaUoVa9wuUF5AunPKGaJfC4D35ZxvtSaC8ZKOg6yT1YP4iAzs+rBwtD+Yi/MRhKHQceaHSx6TLslkI/FLrqtzYhyLidVwEakSGJhUZi4vI96youqSoryulEAdvqmvuhvzzcQiTlVvIQ7e0tB7opoUqa9dcIx406HKWsedYeFiog= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506454; c=relaxed/simple; bh=G35PK13KIPRFYTqXY6BjmGuXO4n6S4cgmcfM+gl3eHg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Zb/N+ptD7FH6zQfg5Fye4+ojPMxnacaNtizVKbT2/zJflS8v8RVJc8DrMJYvv+E86scmAYuLZs+2sBYT5CwtOwrrgx0cHp7i2sUQiwTdkjncf+Wh/h+Obf5tIle+1hcFpvcrodNm239ITnJ3pce5WZ2HKoboGyLAb7BZbKqDnBc= 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=fZL/QJuG; 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="fZL/QJuG" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-126ea4e9694so10169799c88.1 for ; Mon, 06 Apr 2026 13:14:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506447; x=1776111247; 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=bjy/Htk6Ygl2OJNIllJv8e1Fqpi7jxNP7rb3Pje1SZA=; b=fZL/QJuGkRKgbt8ouSOGXDvSP6eyTbeTu6xV4igkvod63WmlYAU2x69jlOcaH6Hddr 8YHwT1t2Dd7PsJxc7kKGuoIDiu8BwXRCDaOgMl0sYrerR+4HoBRtQrpqEb6c2NlvpgnM EiawcqokjAN+hxvrFcCGYS1OO4JcUexRz9LVNfTwwAyMjSFH/6zEHRSxn5SF/obhkFAV oR4T4+WcAmlpxdVftgmajIaPVAB9oTrydfDm1et449oQrt378LX4K8a4BLnNP+eawHB9 MGgsh5NoNSkkeP3AerVu8+K25KrEVtubiwyqhB3RWICgjJPDpp5CZg18FAWlyBsdQQBM 5Dxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506447; x=1776111247; 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=bjy/Htk6Ygl2OJNIllJv8e1Fqpi7jxNP7rb3Pje1SZA=; b=C7bbuqkPDQa3wWHG9jwU9bRdwdSrRjIrz6k4IPqfxqqDebne9qnQUJwMaNpfl2PFfB Av3NxM/C2slYATC3aBijxYosqYjPYX4hW7xCIPlADqY9TAiah785zzDgC1thEuggRslo 3PJC3WmB0Zs2C/udSh9RuT/Q6m3JOmnce3cZ9uSW5Wwo5lzkqEhs0CDQT97eroej7omH 1gqiftgLYfd80ze4+CIwZ4Oal5Hju+xZz31D+JCGTi/9aEP4SnDdItolXbewYqEu65jo Wj2wQI1z38IyVLe6oPMdz2i9BAq4aSk0KwVXuB/4zZc991p+a0G6DhMmxa77KfynldSW D3UQ== X-Forwarded-Encrypted: i=1; AJvYcCXvyJ2O6VN8CKzUgxOehQfLSRQ6Tlm4byiVC/pWHglcy/X+CjdRJv+X0qGrPwVq2b16Dd7NAg+nJgh8Vz8=@vger.kernel.org X-Gm-Message-State: AOJu0YyQW2YEtQNrlj7DbCFmcwQHcdkpf31W+gxUx/cZ4qruReHN0Nts lA9MPhLylLrdZuysHFDpyh/ikuN2KtLgoG5i0q887jLJFTTzBENnT4VQ X-Gm-Gg: AeBDievUpgW14o3OzOVI9DROIZcSwEN9li2Vf++XaHLgy14nV9TsbC5cx6jzDgNgnjC C0pHrjpMnGZJmmskYrgkTbspqrXjjkBaYCmcqPDtENuvcpB27a0i77V64+AYRamSWaee6nIAgPX naZF3f6F/vgH4DI3TMDT1sPLH3cJU2KVCSpMsFY24x8xmQugAcKf+R4XJZrYrR/XsNaRbM4X5B1 K5LLp01vxHDQWFSVVvFqWqgHLgevtMOs2mAqOIXjS9njOTZUloiDu0q4ztDDXQhRNuEOtHoLuBp XwF/xAOyhSSG+TwuJ7OMGEZa0QeDRs5AnYEgCEexbLCPk/HHH0LeDl7i3+seSBZfOkAn4Xw3JiI Flly1Jd20xYavwyHOLnd4gxfpPMq2TYnAOKc/XdTym9OUu37ao87rsZ4164rWAMe8gzYz1z6OfV 234qIUG4oT9MmBttha1Gx767iAxiyHHJnn1ZtcQPJ5aqCjCeAk/kBLsTycb9xzoIhKsaZmWKuO/ iix X-Received: by 2002:a05:7022:90e:b0:128:d714:3ca2 with SMTP id a92af1059eb24-12bfb6eb3d8mr6404214c88.2.1775506447066; Mon, 06 Apr 2026 13:14:07 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:06 -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 v8 06/16] platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices Date: Mon, 6 Apr 2026 20:13:50 +0000 Message-ID: <20260406201400.438221-7-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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 0e8a69309ec4..728681766b6d 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 Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f41.google.com (mail-dl1-f41.google.com [74.125.82.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D557939C64E for ; Mon, 6 Apr 2026 20:14:08 +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=1775506453; cv=none; b=s3H3/5p38BOokG4aomHH24ehSoz5zDHcKE+PSVZALZPdi0WAuUfoWA2RTVpZ5ExVEzivvRTbtugC7NKmJTOH7qy7hJpfl8gNZpAc/KNZx4z+HdDexr9EJnGCgYAOXKIKHwWGQeNdOFKjhsTXahLTQtxyYPPQC2MfBXrrIX78XS8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506453; c=relaxed/simple; bh=eZ9MzcRl/wmdptcMFZlgsgP1TtoBtqsYKmdDubypRYo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YRdpvuN5jTBb/N8lHnFRoWNtaYbGG6NfnhV82hqwLA0zYqKlMysXH5Hx7KDG/ZzkUf1fUPso31/m5c6NmEeBj6RlNskddEClxlF123D9aReiNBOH7Ix9T507ANhOiScZzY5/kkVq0GjBnfuC4PhlAvG5vidssYhgk323M2z2KY4= 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=N7smJu4c; 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="N7smJu4c" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-12c0b72daf7so3255087c88.0 for ; Mon, 06 Apr 2026 13:14:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506448; x=1776111248; 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=su0Haxh/rilsT+Dfzt/Ksuei/+nctt9yQaMH/3DsD80=; b=N7smJu4cNp8e2UraLxb3zsYcBcIzo/bKuvzQPlCB692P+ysAC3Qp8e9c+Qkx2t2FjO TRt4KJCiF535vgz13XyU9jHuF4fWdyUTbkSXzpOIdl/YJDUoUq6Q9+/sVfKeSlQoIymj PX3b7Lj83Lzu5hVvc41vkA4fwj2d4f6DTxyPECHedw9aMhvO30CNggyKKq9Oq+q97Exd 6CVl4x5x5HuzrE8EfPwtACjtAJQ4iaHfY7XbRpHk568NN60Sa/wyNf+x9uk7NVkUpNAj lgkCCK/87did33Uyu2ZZhI0ocQrjSKAg4b1o5PkxabddkIbsbEwg9okE0fLv6cixc62A 4j6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506448; x=1776111248; 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=su0Haxh/rilsT+Dfzt/Ksuei/+nctt9yQaMH/3DsD80=; b=LTTErm73sKRSXXQVLChW5hd99zgVSE1StaBaVL/CsjFvg3dy0KCovnIm+CNWqDFwk5 ceCQ85D3O3+iLqb+42uONpS9h689xOv/dyfbx/8q5DmUqLQHKYxjYsGSUwoB6tnpBA/Z wC0tLuJZmh7DqIK3YOe6Ct9c16s+mDG7SoOaj1RCcQ0NGD8Vbzkd1AU4foJFQJ5RiuBL gABs+O2+VaHa5/nJYQZu3fOnIhjj4I6p846tgH7EJuN1GSsJW6dVqM6kIT1NBEHBheDH rhRQJ5YCKhV5kA7cEKgS/vAX5BgfS2a2V/jafdFGgum2ahYn7Ry6XR1eZ36j4ieB50ea gEUg== X-Forwarded-Encrypted: i=1; AJvYcCWB+iCxlVxKXFwlesG1gPICktKwZEHiL2MEQH4hJoLN8kHy5+Hyflawl0hwrqnEF80mnl0StVq3h+bqeZE=@vger.kernel.org X-Gm-Message-State: AOJu0YzkHUlKZh2khzB4V4vMXa1Nw++EnqnJwTjXL7wJwrrZmnnlQ0P/ NKZwDPSybBIcD7KyGua99QkP6WqZF/3dxw6aKZdsUV0wERuFaLyUpxn+ X-Gm-Gg: AeBDieutpJMJAPKjFHSe/hv9cBRsaTK1hdmsf7n88BnoicC1L+H4If0OQwanYy2m3Iz Dp9URSuVr7IxZEDZCDQ4wI7dDGragTxaU4feZ/yIkNQDd9CX7u23j1PV8719TMf1k1/htW2XhjL jvDyUu3BB6llQx3Fb/FzBmtoa88HvP/+DngG5RL5DqSmhGNYD+9zXOTAHU53zsOhlwuzgxawZhw gvyR9qujgf/EoOo7jEujulmNDmPHSWFWrDT6ec+nq/P6PdwW7AVuPgBHApRjS0sEhR2I5lLwoS7 p73JblYB8KrAWgxgCZxI2HJu4HutBZqbwOYhStur1jTvSAWhFCdtOoPxGsaj0ZmVU9qXjAU0ykN Q2pz0wWc/CP74V8y+s91QRJO+aPeAHi8cZAYboff4w1ujycvEQW/wVgwpyHinoAVwcAkNbIYzIs LMrfQO5M51KxM9BWlMjhOjDlncRqYIpzU1CBlDlYRV4pAs5POFOXXzkmBH/AyD+Q9XX5YkVtjZp AVH X-Received: by 2002:a05:7022:f503:b0:12c:8b9:71db with SMTP id a92af1059eb24-12c08b97498mr2033861c88.21.1775506447815; Mon, 06 Apr 2026 13:14:07 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:07 -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 v8 07/16] platform/x86: lenovo: Decouple lenovo-wmi-gamezone and lenovo-wmi-other Date: Mon, 6 Apr 2026 20:13:51 +0000 Message-ID: <20260406201400.438221-8-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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. 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 --- 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 728681766b6d..6d0ed13a398f 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 Tue Apr 7 02:54:32 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 28F0839E166 for ; Mon, 6 Apr 2026 20:14:09 +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=1775506453; cv=none; b=fMzIN1pwo14oXAweEXCvcY7jQ7Ov6e+YvZjC/PEQNiKxhjESvlzkofioKaw9Jdru48wmkapTAqWFrBwXyfEwG71110Ll1t0AYdoKNYJkiG3EMrIhIHn2uf4uzsnmvKVlOgKe5piLGfPhX0zHGAsZdYAbpoGGjOwP54eMWdjaCcA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506453; c=relaxed/simple; bh=xrnxjixb3S3l8mpznGesR4yLaVTk0m9X+cefg/WMFwI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TPdmt/ZtcRvCXLUragkVkVIn/qwKwjJyXkoBRBo89JfbuqsouW6b+DylkrgCZlvuyT6Er1GaxVJWxWIu0qi7MRjX0CYPVIH5nnfiwHdVph/OqXaTkGfSMGYKtMjDhn9g6wBuebKBOKKsZbmf5pHpSc3EmH/YhOMBlZ8aMvXs0M0= 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=hl5ekIRr; 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="hl5ekIRr" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-128e4d0cc48so4442302c88.1 for ; Mon, 06 Apr 2026 13:14:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506449; x=1776111249; 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=XtwIEh4sPKHPhc/22oqRwsWU2M6QFjOoMGMDxlUemrM=; b=hl5ekIRr4UR0GJdtRIreiWlvENtT6YlllBgG8wpfEnaXjPHsPDDIJRRFH2L6Xj0kYc Hef+5M37JxzxMtJU3zVrYS5WffxK2CziYuPp6ICn8PhIpCkaq2TTJmulwI9IKyWMw5QT YM/XQP+ebZCIDc0rv7hNfA7LX8M8dw2SVTwEUcbVvBK0ySL5wwoS+epZXFc9eEsVJLDb cAxLpR03jy8N97neYa3LA3X6eAKBu2zLAoHIuV+ZDujGCzMxIEgy+OS+Sr8myDbXOBmf JHXoj3yX0cqzn4F39YRMApTcVMpdZ1CTUQoDTut89rwFSACiD6wHeY2+JxlxmO9h5JNL mXiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506449; x=1776111249; 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=XtwIEh4sPKHPhc/22oqRwsWU2M6QFjOoMGMDxlUemrM=; b=EaJV+MlTcBjpM/xHOJ6LS5Rh2OvDDMtjn45Bf2qCRg2aW6XBok/DYX0o7d6OjHIj6b poVzQvaNYooBkmiKcinnxq1Jq8n9NaCq/IYqtNFd75fn4v7GM9NzPeNm8oYGoEUdxNr0 kSOXxAXsYKbwtIm/SIHfh7RtLT4lctQuqfK5CSdVrwelBnnmRAj4ob6Tv/6Qtxhc0btw SB39ee6pqyfMUWo02FM9ga+lUko6qdHHJpfOP8vDsr7rwuXY6N3WGPdh7Kw58qd1Yt68 qxNrNxTdiz7nxQawC57NW+FjEQj0FTw6hGjdEqbzxCMIoDxSAvL8vXgRgCBnrf+NtLFF 3YLQ== X-Forwarded-Encrypted: i=1; AJvYcCVpPuc2/xJi4pGR9r+ICPZVvnuTokpKIKUoOfHaDFUKC9oAwnt2x2VIlxE9QjNW9gE2Q3JT669DiorScDw=@vger.kernel.org X-Gm-Message-State: AOJu0Yyns2fPSCRkbkQE7eZDRWiqYn9VeKnq4NLO4/0AS96m6Y4Hi2dN +c3DbeVXyFFTtHp43PyO78JP+xMbCXIp9ZN1bEiDAkDHVzmjHKGNGG/u X-Gm-Gg: AeBDietsZKHS0Jngh6DnDQch6ZBZuD3PIcAZF83OwyFrBbAB+tMu0OM8YPWUx+PtcIv t3X6G4zhKy3M7El3Ba1hldUvAdILzBIdGcrzV0hoXh+/PyxbxQeEhbtpe4BpMDFPjQa6dS64ezH KbmZ1hZUZThRlJa7/Na2bnFmw4VUSWXoyhK/TPZBuw2eTwv8SzuJpL7QKgSTSNAmya8+KI2SmS9 22HqJJ2sLWOYTywazExkgc9UtZFkI+GvWkB6gKXA1Sw7F0lPxtZl2Ys7wsy1KgpKI2e9NNuV6vP s1Zbx5CX044mLN+e6Mm6L+9dhwe89MGuY+kU6znPn5HRG4eOmZW+xf+nQjxTMlbWvG017mhT3zn fyBLUeAprFKWb4PBZ7dkdZqfHaExZ6uesfM5KtP9IWigUDHKXoQBQBOnQ6YGpXS5KGg/4P+gnvl YHvQqqN94K2o5Zgl+2bmriGDa9zi0faSfy/wK4Cm43QU+kTtDIPeZ5OQB7V65fjvR3iI3ffSqp/ oKN X-Received: by 2002:a05:7022:68aa:b0:128:bec5:1b37 with SMTP id a92af1059eb24-12bfb709448mr6882013c88.16.1775506448549; Mon, 06 Apr 2026 13:14:08 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:08 -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 v8 08/16] platform/x86: lenovo-wmi-helpers: Move gamezone enums to wmi-helpers Date: Mon, 6 Apr 2026 20:13:52 +0000 Message-ID: <20260406201400.438221-9-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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: 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 6d0ed13a398f..e475d1d8a5a7 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 Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f54.google.com (mail-dl1-f54.google.com [74.125.82.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94E6139D6D2 for ; Mon, 6 Apr 2026 20:14:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506454; cv=none; b=ZWJyT7jFIKGMOez/fIIHXXbpDEzBijQWPrI/vYLwpyC9GRDbNIYZB7aD35tjfu1UUSucSdqFXQtM01M8In3ldfDqLWFomWwLavGPQjjfybLaVtpnwLIIdyuCGGjkSCyGC571FdJtYQfNG1h9EeHZyCcJ4GsECbP06VTfUsxvfik= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506454; c=relaxed/simple; bh=xxnFlZyVLrmrwp1Xx7rKUBbi8dKXcSeqhsmT2hnuuMA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EIe4AkzI/toyN9AYmoG2j+V2hOTgYIgD9qQ727gzFzEKOZ8Sd4DVFR39Mnf+75ShbdxpQ2WnUyUPcaGWM2zl4fpw1tRagdNTtJeYBTL5CMHYEXul8XePn4GLcWDVGRB3Z06B3194gMxfKTlFGFq+avpwFQvQFNYmAJVfTP/29r8= 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=dWNbqlA5; arc=none smtp.client-ip=74.125.82.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dWNbqlA5" Received: by mail-dl1-f54.google.com with SMTP id a92af1059eb24-127380532eeso1877873c88.1 for ; Mon, 06 Apr 2026 13:14:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506449; x=1776111249; 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=xrqXPLDhLUafZCa8zUH8XiTLuTTy/7459nn79wC3d+c=; b=dWNbqlA5lHQkWpPX0MxJNmZlbUruDjG1ice7WxH2MlESR3xcpQyPIMBQ8nPhxUdHPv d+XaA2ZCG4APHWxTyozvgu0ESoDcnNMh8suBay7e0lurjjAj39WalZuIjuDnsRPPVCSo dL/AXsTYJYKWepPEmsmAAThe9cI3ftCFicFzFWQtaoHymY+JohjsvvUudxAfswtzY2PY 5IUvtpzx86A0rTkaiLgPuNu70IbmSt63uYtl1bFs9UFdOjPsDam+pu/dR6j1kLWDZ0aS 56MP9julvTNreN19VWnA5pxWT4HWACD3cEiWOkLOxk1JXNTSeJnpgKWmWq2fVgaiqAjq J7KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506449; x=1776111249; 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=xrqXPLDhLUafZCa8zUH8XiTLuTTy/7459nn79wC3d+c=; b=R9cGxN/GL9/cyuq745ggCNDEG24F1byL38BFQaCVKgEBvW1pJKcvSlYq1ci3aoJLKO wDF0KmOYyzbRfyPwETi3TvIEx12rhr+BK0PrKCQLDiXS5XAHXVqnLw6KhMS5G44apuBl ozwne3TdU9jzupK28DIhCBDlxLNroizzrVIcprQetKZrmox6Bz+/JQ69VkKphHWEk7j9 6VtHmfgZvJeGLIR/2Yqw7GkBIGlTm34R6OT4rXG6gaVNgcjUQUI47XRotMsdmdeo1Lyv Ct3SBaZk4dlcw874BpI+S9kFiefz+zaoX8p1aXQxySFPIRqSAIb5g6VRsL6UMZ/RDquv Fo3w== X-Forwarded-Encrypted: i=1; AJvYcCX4pF6rPGPIP9xJwsKrRuRK19Nz/XZ9+qQqynfK8XGSeBDGxuueAJx/KNKVc2xjU4lsnht85qcdV+xCZ1g=@vger.kernel.org X-Gm-Message-State: AOJu0YysX8WTIdwQ5qKUm7Xts9rqwRSMRFlhfcphqOizcT3rgjF2Grge e7bTCTAbDhAqcAL5Y1oUV2VPofZLns0h1SMc2PDEsD1TGN8H/i855Qt/ X-Gm-Gg: AeBDietaUFUbr4m7/NZikFBHby4FIG1KT+QHA9nvoExKYTptSNMJxVrerwodbbXXdPm ++ToW/EPOzTCVglQ6euEN9N3PgFX87vP8t3GHv8rqloc7QkJzzJEWkG/3go6mY0oyP5BzziyWVR t6UONbDLvwWzdj9QC6Mo38U9x8txh+wlZuJe5GDRavYmGRaTAwgZkmxZjpDr1MGQ8hS9rQFEY1g 31owyRJWuQSfeTLy8hwlf/i4Zzu/59Ho+BPz2csZzNHhGis35DNBlzECwf/l3opEAQDlaKqQc1s GT3/qRb8nVC+YMmOmn0+L4W6ocMoYF1yNs5R57luaQlXUBEPTWq1wHy0BgBAyJC3wvmEonhmfyc Fo9NHuRsidzLLLFB6cU/yMjLdUICDehceVJzQMbZSn77IDKis8UHDSrWhUulryMG4/9bp30lC/k ShulKbk/4OSSyTHCxNOXOdF1JfuuXH+unoJ8nXoP9Svom3C/GQ9PZQsmUvM52eJPyDOLWMVsGgh i6W X-Received: by 2002:a05:7022:b98:b0:12b:ec67:3529 with SMTP id a92af1059eb24-12bfb703676mr7335982c88.14.1775506449515; Mon, 06 Apr 2026 13:14:09 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:09 -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 v8 09/16] platform/x86: lenovo-wmi-other: Move LWMI_FAN_DIV Date: Mon, 6 Apr 2026 20:13:53 +0000 Message-ID: <20260406201400.438221-10-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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: 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 e475d1d8a5a7..25ddfd54f692 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 Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f41.google.com (mail-dl1-f41.google.com [74.125.82.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A0B039E6CB for ; Mon, 6 Apr 2026 20:14:11 +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=1775506456; cv=none; b=qxTPcX8rO1t3Xa9d+EvrRhFCkQ29mbWovDGQpqD2lggFkpHodG1+K/EW2kjwUYzQtVvvPfUJf+K4V8Ye2lmILnmrUghahD2dUoWcX7VpOqxNsQN3BdGm/OxE+RL+1oSSqhpoSvznsks9utz/caXEItcNmJlng5vqGp+Y44PkfJ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506456; c=relaxed/simple; bh=bPryRTTEH+Q2w1E1N8JH2TQcaWKQ4Soh5LbEk2u1sbc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uQZl63s8NzsFBCMIQEAK2pqnJ/FzszbBOgecdujaq10TiECULHk01JZIro/m/rFqZOIVh5YIAcxgqDZPOFctl2IuJJFMd8mMbmsGbPX+C4NhmYSXuHUVKYPJQy2t9AbPuhb1+9Ynistgl8uUaXPZ2hSSrt7B5tsx1ielcw6jAIU= 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=fG5+oIk8; 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="fG5+oIk8" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-1271195d2a7so9286381c88.0 for ; Mon, 06 Apr 2026 13:14:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506450; x=1776111250; 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=T7odj6rBktOkCaSzuwYo02uinsQt9nFQM4fAXGo/q7k=; b=fG5+oIk8mMLjTnJ62j47wL+Ws/NsQwm4Hghsj7nTbRCdCyB5TurIObe/wqnsPrHXkx uLhiJe7XUe8yvasHThv/k5mBfBxrLlvh7LQBSq0muo+LwcRZ8ZiF/e4PiQ6g+H9Q+FCH weNhgYfZGPPeK5jlWKK8knmUeGD9KcOZRPaWHtVQlKTI/wwej/eO0P3lN7Pj41q6Rgvf LBB1Ce87OsQtNETP5290f0vpSCLQtWpOKofoMDLKZa1a7IcjtfDjEb7kSzbClb8+vMQE GUHtjeeHH5ZFYrYWMxoAJcxj0OA5/h43I4ErKcv+Mdw1gbtbAaNsSjYIXRidgKMrNQ6l gwMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506450; x=1776111250; 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=T7odj6rBktOkCaSzuwYo02uinsQt9nFQM4fAXGo/q7k=; b=r5eHUhmWGeZym3Ljim+uBNq94Kc6a+klAHg+Bnn5X0A3vG7PQRDh2V4a1viENRnTjF EMjDYUG4TQHpIsbCbuHxHPOfUMRfPbQs7hAJucrOlq4vYSCPHTDrM7ZzWEOr3WDF9eT0 bTD8UVYRaQKU8W79xRIpz6yZie+WAbCWj8gjT7DgE/pAeR+iFv2RmvxzafZQhEX27YIp CN3Q6iiUOLz8TC3dIAu64tmTGgCJ+mwnuJnzR1yzItx8SGr6v8A7A6bMNbGShssMXIjy 7GfAojpteuW9MVcdJVqis0dUxdy8pzsK/Ue/pPPgLTR+5OyZ1HISI82AgHnhkYaSzbJ4 WaAQ== X-Forwarded-Encrypted: i=1; AJvYcCWsOHDUJH3I248CJYTt9TeDMxRcV719E89GlNXYTo6OcpyYc9uBV+/MfZAzIeQMzqOdqIL5JM8QXUK0Dy0=@vger.kernel.org X-Gm-Message-State: AOJu0YypSeZJiPp+EYOhXM2IQnMxDLLtg9soCeDXH9oRSPYaTmjEZP/W i21rApi5bbFdOluVtZ9cOYnnYZzWr8zhtuSZteMmwkWHuhxZEblMkI2K X-Gm-Gg: AeBDievTPsKr+thlAo0x0peGhIPHaKwm0MjhdmRFVXf3cQFPAy49waiRoSL44GzrBhZ kx7ykCspnjXsnf+zPpDTJb301+Zs7m69AkwdAC1eV44zhQCiagc2t4ndAJ7PB7b89nSlRCQr7Qj As/CVx5b+4LHbGzvdd/yokUfzb8ofJxnqzoaE7a0pLgte0aeZncscU1mq3qsJasnV7Mih3EFUfY BW6NTsRaZHLk6hh2H51bCWeKQ8HewrkVjLg5M/EnB8oKhZRVcjD8DpUwHEJjAFEkiHjYCGB34to ykH/UotJuDinFkddRk+kTa8oFeZITJ6BNFa4z8G8vkKJmqJyxg+AWkSTsXE+AVbche6Rpfs0CNz Z3CUWaPriwKkBdjHje8t8+K1ESdnBmKuL8ffoBp2KmBu38xL3XOHWYE6T23CRtS7PzaHKnAcRCc /wnCRKsTJgTCyMrOV6OSuFaHH53TJjHDlL7ZZU7czCqG+pP/iXrfjl2bsclF/RX3nhAjbPysN7N 1IV X-Received: by 2002:a05:7022:45a6:b0:128:dbbf:fd35 with SMTP id a92af1059eb24-12bfb76607fmr6511116c88.28.1775506450200; Mon, 06 Apr 2026 13:14:10 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:09 -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 v8 10/16] platform/x86: lenovo-wmi-other: Add lwmi_attr_id() function Date: Mon, 6 Apr 2026 20:13:54 +0000 Message-ID: <20260406201400.438221-11-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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 --- 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 25ddfd54f692..19a072bea2d4 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, + tunable_attr->cv_mode_id, 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 Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f49.google.com (mail-dl1-f49.google.com [74.125.82.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 39F8E39D6E4 for ; Mon, 6 Apr 2026 20:14:12 +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=1775506456; cv=none; b=sPrgFA3UMVtrXY1EXv7yc82eDlC1JVS2xylbhG1woYfR/uf8Zy7G1mmA+XnxehrLx1E8BJ0za4Rxwy9eWvZ6+nX1ts4HJGYITaTSNDOBEGihVWCMUGytIEKaaE14OVn3HRNJ2dOcalH6b7gmvEZK4jkvtGmk4FepL0Ld5RCHwmQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506456; c=relaxed/simple; bh=JsqD6brbqzCpEzrS+G7rAEJLIm0pj1uL+2eA+qaNvGI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hwx9F18pXQHVAr5N9tCB7d97Ln5yg2KUnczDjGQm1olpSWmrPzQ8bF5NOMUY9pluLrov6kxdWQKMRkrkWVnSt6YmehwyUFJTLpYUWS8wNkbj623NFGx4cOO5Q0fzVN9T1m8uiQG0d1QirI6KXf+iYi0wB4zukZZz9xl22j+M7as= 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=KGSx55p+; 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="KGSx55p+" Received: by mail-dl1-f49.google.com with SMTP id a92af1059eb24-1271195d2a7so9286416c88.0 for ; Mon, 06 Apr 2026 13:14:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506451; x=1776111251; 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=HsaOxFpev1lQmsc3vPTVQ/+KxnqwZvCw8sDgDlpNyfo=; b=KGSx55p+CjKM7S43BuPLN7pB45AEqokylSLL6t6e3bFFv6+tj2TAocOiZ4XBLY8XV8 MYcP/h9WtK4ZObB+jio8cD6bN1TKCgPpEgYri08xQR5i3DmQnH63AFaLnfzHSMoxyBOf CvZwM3A8vynYxE5DM9oruXQO6Qu/wuzhYafGLG2ABb5LDwcx6MRX1Id9hANQwGkjIn7B tBJMFCfglD+XNNJqbOZEK4W4DOKyLpHRgCjhRmj8Wn41NKQ0NTYQGXGfH8MoB6z6UEQo QotooBwoCTRovdP6FM/WaB3lJHiQ2lFQsF//2qDN7Zt3d1plhR7z3pQjzrdUQENUADCm /OCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506451; x=1776111251; 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=HsaOxFpev1lQmsc3vPTVQ/+KxnqwZvCw8sDgDlpNyfo=; b=LGBFjUHYgqPI/+5Q8pvpGt8qtCFlZTm4FQsa/YmrSIbtmGyn7yCg8RIlopPOgSOD3K UYurDQImhbvKFfDvw9zpkROciXed/PgItTWNguRMTV352kGS5nwqnTNPYsGyLl140lsv pjqkatvVcAsytZJbyTfSpOwZ2iek9RbewottPguFpcQkiXUUD8j73Z9IBKUMTC49ryzC vGvzfaUvUA6+nKjC74Ma+9hH2daDgrR2veUMd7xbDia03B33KOvsmtIRlIKAB1VvhBS+ ScW5xgMjyNFL8+alLjuoFOsXrFebRXi33AMcXfatgUkjeoBr0tckRXjuh5uBdbaFWY1+ KeZQ== X-Forwarded-Encrypted: i=1; AJvYcCVyz/PwnO/1Btz7txnengV5ifJ0r09mpwtbY8Fw+d/CEcOsXMosgUK3/Xr2/1G8qPVgn6DzX0l3Q/dg974=@vger.kernel.org X-Gm-Message-State: AOJu0YygYLD/cbdSG8fRQJuIVcsbLVhYEWS0rYoRPhjYZYr7lSuTiupp NertoW6YZWf22bS2Yhc+yHDhaxXBEzsaz0qnNQ723pogyufSBH7ZZcgq X-Gm-Gg: AeBDiettANhPxKL21iz+85aWeBc6mcnUqonxMKAKqs4bVIeV5FWE8F+CBNsUns/9oKS 3A2ClMTrDmQYi36qvRmo0WBxfvSpE0bxkJIXOQ1Y02c9G0gR+dtKO9ZYhQKuCWk23FSI0BP1+cS 8FI4F4ZSarpLJ4x6f+OKunoGztUrvDhrg2uRDGGpz9VZ/I2HtJOI8vKHJ5MoDmJ6HMx0rfueHLt CbFWyOw47JpNdjmPTUR2URGFgdH/R8UIdWn85vnilD2c9NAHVPwu47ImayiO2vtgeyAdc6tsW60 furWUTSPiisFKSh38GicrIUEJe/+nmnMAnNZp1PdCC1yOHZB9agjHKzsJujKYZ9zmvM6UooDfcf NAiY1y3X53Rs8CC2yK/Dg2DXTutUZoct4Abtxi/6qqAncv7JEgQBxfOb2s8QPe+dGXTwTHj+NMT ua+mJzgdVE0cQaG42aERjqrbPapVIPTDOXyaIxgkDWJ9DCD1MxzgZv8zkL6Ntqha1yUKgWmbeXt ZPCeTvr2gHtjhk= X-Received: by 2002:a05:7022:6b85:b0:12a:72af:83d1 with SMTP id a92af1059eb24-12bfb6fbc0fmr7310013c88.11.1775506450867; Mon, 06 Apr 2026 13:14:10 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:10 -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 v8 11/16] platform/x86: lenovo-wmi-other: Add missing CPU tunable attributes Date: Mon, 6 Apr 2026 20:13:55 +0000 Message-ID: <20260406201400.438221-12-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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 19a072bea2d4..56c8b84f306d 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 Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f43.google.com (mail-dl1-f43.google.com [74.125.82.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 98ED839C638 for ; Mon, 6 Apr 2026 20:14:12 +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=1775506456; cv=none; b=iVYRtNbZQ98bhCErwXaKXxZkvs7fVNZyhVMq9Wy7UTG0P4GSKjwTdt3VzcEeIs65s+9I2s+AJWz90Hh88a1oqL1iSu1Jdhx968oL8IeXus82bwuV4NKozuM8S7I/yDQJwanyelykBQ7zxukUUhM/VvuoD29BT/s5s2JFUedk+ec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506456; c=relaxed/simple; bh=AGNSJWHk6rHEufhSyPVS7Lzb46s2YrzKEXfMsYOAge4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pgVAgml28m7sYEGTq843z3weyxayWx+LX4GL0lqvNnmlVDkbIEUBfMVUwQTwIWwdB7p9A4P6iOoT1PM1My/os4xS+rYZwzZpX3Qs2leWigsl7f6obUDXpCtz2tbm7mi7ppp3ez7ejrD9tAHzlXVJfWLFkiqjCuD/3VFJj+FghVQ= 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=kfo9jQCa; 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="kfo9jQCa" Received: by mail-dl1-f43.google.com with SMTP id a92af1059eb24-127380532eeso1877960c88.1 for ; Mon, 06 Apr 2026 13:14:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506451; x=1776111251; 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=c4teSSDSZxadJncjuE0P+g4FnFzukItSRNmCV2eTIxU=; b=kfo9jQCax0Qnm+8gFSAnfETVIn9L4G2uRUAUHGHm++XNoiOo+Z1ZHS6NcN0z4HXjiz uCIcWGzagQIu6QqElMECkmbNc/zc8ehYKP/7RNDw336ZfetD2lkBmgXOGMkOVQeQyahR NL8Gr6DVZIvLuRu4kNFk2jCqmAr4Wno8CHw5fL8jX8Mw5i/ZBBkxreflcqgou/r2+Oid wbbH5VRR2hJwdMOdhTPhHOJXW/aww7PrvEBAE2LGF3pU1r0gasY0AJqyl/R9Uj4AFz9v m86HC3HN6+ITPNGndLrwnihoZuIvOmwvwTCW5hw7BLTRD+mJiVjcJqmPi90mYG0CtyCI lH1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506451; x=1776111251; 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=c4teSSDSZxadJncjuE0P+g4FnFzukItSRNmCV2eTIxU=; b=m9XkyoemZUp8H+RO/waZ0OgVA+LL1wYejKMG5tTbdfNA+tqPP9bLYmopqQcEgXtDOg XwsIqD8cNGIEuwHy1We8Bqh0s8eL18YtX7g6gQCfosFTfIgrm6NdMvC3V9gkbK7FpuDv hNIk6OuurJ4S2zl8Q60bl0MirYwOpDhiKxxCib8D8IWDs45uRJ4/rTYiHdYNb3myyhrY vXdnkUKI5/JjjKIDnZ2f6HOCVdH/4BSyvBKvC06/1wEp8MAESgQsbKymycw3uXstCxL2 5nwP5h++JfOkRtvc5K3aeRpXTXDPYMnw4PD4avMNZRxPUucqBjoft8KHtyjHnou4u9NJ vV/g== X-Forwarded-Encrypted: i=1; AJvYcCWbPk1uD2QQmQQcJejnvMHWq/ST6RCsO3RfmI19HBHx2TJdn4ShyWsQLD59oXUx8YDxjXh5A4GD71qQd0Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwMvdbL139kf/0kJET5i///ZoSYtWlTT0dXSaX4IOPJBm41KYbM RaIlMXZe0CG6W8qJj3KAAWmpExxNFtec+kS0GxjqMv4xPV4n8S8olu8U X-Gm-Gg: AeBDiev2TRf/GIDwS8VLr91dlHKnCcXG16302F9JZq0c+Xv0ENwtMqTSBmwKgELWrh9 7hlN+g1TJsaBn5k1Zxrr1+N8n+CanLeRG/wMbENSxa+0rBxXvV+bw/iIehhpi+lmx8dKh0LA+Ei BXnu2FVdKDkGoHdgc/+6GXGEplmM+OpKG89TRI/dvpV1jPQLq3kWeBnLQsFIYZv/l9Lcc8cR5Vk OELISEmox+H2EABxp7YctSJpmg7Jw1tEs9bd6883e4AFT5eGnAFR8uGtxJF6fqfUGczsakaDZW6 eXzYg0aBlps+/12MlEUHZbHJEUhmE2jpp7s1ein6eBFwQytgIq1sfw15YIFAUrYCy9D7sQsbhdJ gYAdtGILFi1W2k24PwbsSKwrjEz6v8MotSet88WyIZsfxaY67bpPawD4Jsvj1WbY5VAnB7qAJFl 5iIXcukiy8F7yiJ5dx0tZNvtDFqRUniPulPVrdDe4g+j7YiYQGQV+lDdYIInwcqBA2Q0Fl9O8lj Nbq X-Received: by 2002:a05:7022:6097:b0:119:e56b:c75c with SMTP id a92af1059eb24-12bfb76a3dbmr7031113c88.33.1775506451527; Mon, 06 Apr 2026 13:14:11 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:11 -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 v8 12/16] platform/x86: lenovo-wmi-other: Add GPU tunable attributes Date: Mon, 6 Apr 2026 20:13:56 +0000 Message-ID: <20260406201400.438221-13-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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 --- 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..988ae04ff724 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_enable: Dedicated GPU Enabled Status + - gpu_didvid: GPU Device Identifier and Vendor Identifier + - 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 56c8b84f306d..57b6b6f17f33 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -61,6 +61,19 @@ enum lwmi_feature_id_cpu { LWMI_FEATURE_ID_CPU_IPL =3D 0x09, }; =20 +enum lwmi_feature_id_gpu { + LWMI_FEATURE_ID_GPU_NV_PPAB =3D 0x01, + LWMI_FEATURE_ID_GPU_NV_CTGP =3D 0x02, + LWMI_FEATURE_ID_GPU_TEMP =3D 0x03, + LWMI_FEATURE_ID_GPU_AC_OFFSET =3D 0x04, + LWMI_FEATURE_ID_DGPU_BOOST_CLK =3D 0x06, + LWMI_FEATURE_ID_DGPU_EN =3D 0x07, + LWMI_FEATURE_ID_GPU_MODE =3D 0x08, + LWMI_FEATURE_ID_DGPU_DIDVID =3D 0x09, + LWMI_FEATURE_ID_GPU_NV_BPL =3D 0x0a, + LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =3D 0x0b, +}; + #define LWMI_FEATURE_ID_FAN_RPM 0x03 =20 #define LWMI_TYPE_ID_CROSSLOAD 0x01 @@ -624,6 +637,66 @@ static struct tunable_attr_01 ppt_pl4_ipl_cl =3D { .type_id =3D LWMI_TYPE_ID_CROSSLOAD, }; =20 +static struct tunable_attr_01 gpu_nv_ppab =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_PPAB, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_ctgp =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_CTGP, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_temp =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_TEMP, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_ac_offset =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_AC_OFFSET, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 dgpu_boost_clk =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_DGPU_BOOST_CLK, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 dgpu_enable =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_DGPU_EN, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_mode =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_MODE, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 dgpu_didvid =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_DGPU_DIDVID, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_bpl =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_BPL, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_cpu_boost =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_CPU_BOOST, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + struct capdata01_attr_group { const struct attribute_group *attr_group; struct tunable_attr_01 *tunable_attr; @@ -959,6 +1032,7 @@ static bool lwmi_attr_01_is_supported(struct tunable_a= ttr_01 *tunable_attr) .name =3D _fsname, .attrs =3D _attrname##_attrs \ } =20 +/* CPU tunable attributes */ LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp", "Set the CPU thermal load limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl", @@ -984,9 +1058,40 @@ LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_i= pl", LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl", "Set the CPU cross loading instantaneous power limit"); =20 +/* GPU tunable attributes */ +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_boost_clk, "dgpu_boost_clk", + "Set the dedicated GPU boost clock"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_didvid, "gpu_didvid", + "Get the GPU device identifier and vendor identifier"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_enable, "dgpu_enable", + "Set the dedicated Nvidia GPU enabled status"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_mode, "gpu_mode", + "Set the GPU mode by power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ac_offset, "gpu_nv_ac_offset", + "Set the Nvidia GPU AC total processing power baseline offset"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_bpl, "gpu_nv_bpl", + "Set the Nvidia GPU base power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_cpu_boost, "gpu_nv_cpu_boost", + "Set the Nvidia GPU to CPU dynamic boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ctgp, "gpu_nv_ctgp", + "Set the GPU configurable total graphics power"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ppab, "gpu_nv_ppab", + "Set the Nvidia GPU power performance aware boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_temp, "gpu_temp", + "Set the GPU thermal load limit"); =20 static struct capdata01_attr_group cd01_attr_groups[] =3D { { &cpu_temp_attr_group, &cpu_temp }, + { &dgpu_boost_clk_attr_group, &dgpu_boost_clk }, + { &dgpu_didvid_attr_group, &dgpu_didvid }, + { &dgpu_enable_attr_group, &dgpu_enable }, + { &gpu_mode_attr_group, &gpu_mode }, + { &gpu_nv_ac_offset_attr_group, &gpu_nv_ac_offset }, + { &gpu_nv_bpl_attr_group, &gpu_nv_bpl }, + { &gpu_nv_cpu_boost_attr_group, &gpu_nv_cpu_boost }, + { &gpu_nv_ctgp_attr_group, &gpu_nv_ctgp }, + { &gpu_nv_ppab_attr_group, &gpu_nv_ppab }, + { &gpu_temp_attr_group, &gpu_temp }, { &ppt_cpu_cl_attr_group, &ppt_cpu_cl }, { &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl }, { &ppt_pl1_spl_attr_group, &ppt_pl1_spl }, --=20 2.53.0 From nobody Tue Apr 7 02:54:32 2026 Received: from mail-dl1-f41.google.com (mail-dl1-f41.google.com [74.125.82.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 55A7039C62D for ; Mon, 6 Apr 2026 20:14:13 +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=1775506455; cv=none; b=OrndL+PZhCrBYK7bEuhmSqEG6BryEQsKWOlPJruMu2q18fN43NtxM/Hnx/FBR44mMJ0JcOY+sN9m4Jae928EHtZN/YmAMQjUMzlJxuTj6iipUXoa1UrsrbDtCkWT7Dn/Byg+X2IyoEmufd9bzjabNAB/oDoSWgaqT/jS89pyJlE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506455; c=relaxed/simple; bh=iFh0kepAp7+CUCWbukOagQfE8oUi6Sg9g6FZBrgbTWQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I/+TgbaiLI5SSX/CmS4RTzbLg1RTHf2H8CINBkG57VObXaJVK4kyroYyIwD4e/0CVfKYd3AWXP3xoJnwwtWjLLQlWwx2A77UuNQ+AzhtMFb3OCNzWcoakDxquisKS242DT0+dR7pdU26rZoef/q+ZsfRoSWPwm6/+Gqr6LtqysE= 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=FBJuVUdS; 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="FBJuVUdS" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-12776bebe9fso9870954c88.1 for ; Mon, 06 Apr 2026 13:14:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506452; x=1776111252; 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=qOFchhR6XmnD1NBAnpmpLdo/GO9fnq04FOmJKxWkKNQ=; b=FBJuVUdSP1VwDuYvaskVmnwmKNj8eJG43r5JCV/eSZPfNh4b2DelBogMIdkfTnPEXu URaYlSEcOTgEdX2HSIUpbvA/06/EH62cXaOmBn2p439jTzurCFCwqCW9kEkJEOSlQgck Qjvp7ayJKzF1WKzGFThIy/EQFPxOS9cqLSepl6vctHDTkB7mN28cy6+wGw85FD7JYvOr TTssRiJuapoygNP8BVu3quJnjs+Kcwc1Gc/jIa5GPraI0U1YYRFZd03a8kNsjrf3CYVK zthk9AqBZqwAVVDly/huXYzBhwBWi2np+frBxHaYP4nogCBUfuvUAk2V4BmCHanLFbIi SVSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506452; x=1776111252; 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=qOFchhR6XmnD1NBAnpmpLdo/GO9fnq04FOmJKxWkKNQ=; b=GsTFExYyM+NZd7DfkcVjksdJyehBAVt/7BowaC9CvY+7FtVfUKkCY2dHcDOhCufOnx rjZwDHvqiP8AqqGXU1vC4jJ8o67xicdrMMSgVW4H7DCnVdxUcUJmxMBz1p8rGbptTBlN +gmce6x9tZdsRgF72oPmHErkyt2kNSJt/y8QDN71vhwIZGZpyuO3AF0eFUW2dwtKncXu J/MwYjAsqB+h7CzLlWF/FLsr7B/hNH97Y+baweLfTY8Kl6Wu//GAkTiZH2VPPLH3w1MQ KqpY1NCT0JySmOf1LN7CHqt2o1KOvL7o7a+iMKdS3PxbIElK9wQ+LUOrSJ6CsXA1Ohrl EHew== X-Forwarded-Encrypted: i=1; AJvYcCUD588E1ktepwrXNcoTfyP8HO60qpCVmahD7KZvTWj7QOeoVF8KICrmxkEbubdqWFywwY/piUoZ5SrsMa8=@vger.kernel.org X-Gm-Message-State: AOJu0Yy4rtBoZeaaFiXAVA9UuX9LEwrIYbT4WcvlhnLTZ3l0TBz4g20s rin4rTp3vM1TijByd2KMPvU3xL6YHQyPLeBeAuT8t8s//g9tVcLPZQdQ X-Gm-Gg: AeBDieswRzdzqHPR18bcyNKRN7T1Qrsivgs+9ORvokQPJotDMqOPwta0IYYmzG7k4fX 9x8O7Hi+sdqKyS02SCyIBGuS2tjK/wCaFUVvkRG0lIJ15VX1cpIkmXjHI1tJw1qEPtS/fsbbA5F a7CSeg2+rBKg7kPxgEwvBFM7AmX7C+Mk3lSESEQNOkqU6KqWnigCh4ZwC9Toit1+Q3IDKuzeebj aEEX0zBeP4DgCB/hV4LBydeG1C0O5JS51ga3t87kU/7+ez+zjJp9hjIESltQWf8pJ2WBJ6HlYnA hrYX3aoOkkfTILmFU1IiWmBpYfhlKZSM77V/g5b0w9l0D4X2myo6EjzcDQSr3XPIaw3CKqcFhvM 9uE9h6QJoY871dajpJhJktlBnl/KmIJhoSSy+SbZw8WL2HhQRcxGwtWffVed2mEBlq5TX90KdEX IpbB+4aE43Ue/yimYJIr7kwolfEzXEYDBBQ0zhQc0DcxxM8mqHhIhq+4qH+rc6JWNzrzU2zC+Qg VZ8 X-Received: by 2002:a05:7022:207:b0:11b:f056:a19b with SMTP id a92af1059eb24-12bfb745a32mr8011160c88.18.1775506452150; Mon, 06 Apr 2026 13:14:12 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:11 -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 v8 13/16] platform/x86: lenovo-wmi-other: Rename LWMI_OM_FW_ATTR_BASE_PATH Date: Mon, 6 Apr 2026 20:13:57 +0000 Message-ID: <20260406201400.438221-14-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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 57b6b6f17f33..3ff7b9680f3a 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 Tue Apr 7 02:54:32 2026 Received: from mail-dy1-f176.google.com (mail-dy1-f176.google.com [74.125.82.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 272D739EF38 for ; Mon, 6 Apr 2026 20:14:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506457; cv=none; b=cJIZD3Km2Zu1pmxGMk5m+ATvTNoR8lub+PnxIdHJ2AHTkGEMILax3G+ITwIqbbNZZxe8hVEktEX9YQTEerZn7eolgaN0kCzPkKZzaFuYwc7JcxsWRJbvN3BlyCtvnQHZMJpl9uqZ0x+sswIhGsbHe5n3iBa5HiDjGa9p6vS2jRI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506457; c=relaxed/simple; bh=2LSdcxqJsCWQ1AwIqijG7hIMgUiL2V2fl9wnLV6umgE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jjdd+Cem/UhJAW7Fj0ZtkRrbIZFf1AzB8nwLVt9oMiA2tEQfrv/VMsJQnbChuoaQvMYY2VituGw3QWoj767EcINOpWeRVypjzRqp8Y7mtys3P/FQln1Eftl7htWpSdF5VW1dKj2GcKuE3jhHlr9waHulpeoBSDGJq/aj6Afq1gk= 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=Xc9WvZoE; arc=none smtp.client-ip=74.125.82.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Xc9WvZoE" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2cc4c693d59so7463147eec.1 for ; Mon, 06 Apr 2026 13:14:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506453; x=1776111253; 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=zbl1hjC6LDFHtdiwozGoivNuyQK+LiMguIHToBzSjiI=; b=Xc9WvZoEqtXTMiYbX5F8qcGLvKgdvQgyAn7Xg4+dJS17bdP2Js9F5gcFdhKEqqoOsg ZM7fMcXGyCzZMz9pp6iXEC+pQksvmEHW0/OtgxldeXDOVeBpJQOGErc3uiZbpuan2YhO JZJPMt3ViWltkwOgpaf+NwtOawoWQrFQLI8ym6aPDdETlJFvnQOe4/POcV+c0DzV1wgs 1Av777rGuiw+opQVKm//CKtx+vaAOEaztYs3pyG+PtBHUFQy+ExIssF9Zo8qDJlu+VDS GJ7KWyK6eZ0s22DFo2HlttdvyvtAnXpoUiHJM+Y7TULkcVmb/j7AtahU/CEji69nJdRv AJyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506453; x=1776111253; 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=zbl1hjC6LDFHtdiwozGoivNuyQK+LiMguIHToBzSjiI=; b=jzR1XvdZnPZ0kdXuve6pSSdInDk0HZMgIfaUGcSPZSzxau5UPwJh8agvPmb2eI/NV/ 9Dscj0yzh1zhW0/xw6JSQeXgzh8FwoQyFMwPJmc62v+whWq0Ypovxat01f3ap104o/44 9Rasw0iqXNzWgYCuRoZz3Bz/dYk67NYJ1xMBGvH6UVUrhWm4ryInHEmKWfkDfuaquSjr w6cq5jPKE6ZegMeBB/qxQebVBg8hnpOcIqRYAnvawhXZBy6Lb1bnaiNFB4dA/zOH7vUb AXgdWZJGbpRksxsuAE5QL4KmNJwwr1VV9Q8eack+4EpelK+TUeVzjsE0Nz8VPXkRp2Sm kJDg== X-Forwarded-Encrypted: i=1; AJvYcCX04oY2h9gh4+CLuFyYP8ennHxzXMiTiRDy9cwp3e2x6NHXYT0Y+RecGPJt1RZcQQ7mNeSBHbxLC4SZffE=@vger.kernel.org X-Gm-Message-State: AOJu0YzxzQhqf56V/t0VkQ5E6DklE7gW4bT5DIPjlSEFTmuOEdO4CmQ9 bG5+hJG6xIxqWpvcovCGtZcM05o7CNp+D+mk5QpALcA6SZ/5nLslVHno X-Gm-Gg: AeBDieu3mkOuqtk8vPQ0OivjZCNeunoc5gzSed2fxDsMhPmz35T3LSmqM9ZWk2gRn69 dkGheI3iUvDBjN5lYhDV0RgXb91gH/vkICMX4F/ihnJZGC5OCrP9x9A+nH/kObYksiMmU1zTGZf qQ6biK1XWCZZP6Z3K6PXny7TsTpYtn+T+HEGfsJOn25BATC5S2mscUffqjAClWP/gnlqFfD6g7e fpqRiSBPDFy1txJPL8Pfq1dxwRVPCjZvdWvgysm1ypYOtL6w0F/sMTE06qbSwlHK6rYRZmQz6OC XBiXIB+at1uA7tFd1e8UJI8WZ4RDv7iups3Bmjdb2ZtnjgJ7AR9goD7FY9XT266XZdx2k1nUQTy 6oV/a+KqhbtoX8R3n+8k+8Jzsk7PKR9iwh6g2QmFVZM3xt/ej4PSW6/Bj4Cx0eXWiOAVkaYjhEl gqpdI24gNbCmV6LmfB1WM7inJgsWoBIcta8jZsbX7rYqecji96gCjuf14yulT9I4sNS318Myrd6 P8Q X-Received: by 2002:a05:7022:e09:b0:12a:6902:ddc6 with SMTP id a92af1059eb24-12bfb63ac8cmr6364925c88.0.1775506452846; Mon, 06 Apr 2026 13:14:12 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:12 -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 v8 14/16] platform/x86: lenovo-wmi-other: Add WMI battery charge limiting Date: Mon, 6 Apr 2026 20:13:58 +0000 Message-ID: <20260406201400.438221-15-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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 3ff7b9680f3a..975f0e5269fb 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 Tue Apr 7 02:54:32 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 BE07D39E17D for ; Mon, 6 Apr 2026 20:14:14 +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=1775506456; cv=none; b=UpYQKRPTGeZYZwWblZ66UPwG8jsEVRjpH1hHi+PngDAj/Tx4sb1pBgS5gvJHOA/2kpEOcsruiUW5FVt8SBcbcNOq54dx0nucq7U8eVVdKJIHE9TR8mbQy5RgcJwxmrb2I6Aez7oU2LM6GxxS7lHXv1SiwKwlOZX+BqwBHDdnKks= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506456; c=relaxed/simple; bh=nw7kdTs1biYqcCyLBgFFjUVOcmzqKE/6nPTRSBdw19M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Kx7y+Q3ggB1gI3IwsF10vjlNNoqFIzUAbkDbRtLNEJV89nj5HLPSM1SALETCE+Rj/rux+hlqZ/bNICbTatrndFS2vm+SAFTjqg7dqMRDGmqnU7P6SW1QnJpO/QHhWHCYhZSOmMAv3xIp79tbww5pzAJP4/ghr7vaIASKF1x0H3U= 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=GjB2Q3c+; 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="GjB2Q3c+" Received: by mail-dl1-f47.google.com with SMTP id a92af1059eb24-126ea4e9694so10170101c88.1 for ; Mon, 06 Apr 2026 13:14:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506453; x=1776111253; 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=GjB2Q3c+2JDVui1uAzw8VobU1URLeJFABidtiPXFPSGj835zEJ7JQk678iksuBhZEj UAb05qOUdV+HwGx9dEGIfyC/mH5eeUkMCyzJ7f8jTyDcRzITXUJr2oPs7vEwYRPEoUaE pw4QUrkaUVlNRMtj/jZCaxnf2bUyyC0mmlEbkfh+pAP/07FClsjP/CyX5qFNMFuAQuE5 xinZGVKm9G0RdzPfBgtq06ldWziQL83LTegHwTHiRpnw88gKEsjgwGStGoXLQAsPzrqD j3BlDt17vm1uGgmJXhx3tsObH0jkaMzzbjO6DWq6BCl5IEe03Wd/zkAiedN3TctVlUXQ p47Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506453; x=1776111253; 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=BTiL3BjZt+ogRL/UbM4TF+foy0poqRQxzqii0t9PjEiDMB1HyhJPMc9nFoGLGClXSh iYDlkpePkDXL2yySQf1h/WDCx6qubIXB5MLxZPqQbCsYKKlGkceaO6B/uG7wxoNTJlUe jfslzqtwc3KmyWvwdiKGCDfoOfDRSCS45ZYKFy9QVHA4niVoj0q4sngIoWnskOztrJuM 7j1GBWNHB9HSLM06XxG6NmIK4xDSZr2XBnHbVfk5R28xcIs00ixynaytTS71rkERHIuA bSZFZqAkKTaVzM+S7BEIJsbEF9AaVIIUVfMAdbnsSUtgPu7EayPijEW+8mEFdVCb4ugr KiWw== X-Forwarded-Encrypted: i=1; AJvYcCX/QmoogZjQcijZ7FSiJFrGul0MjsYuzz3eiNovshmSb/KarlzamJsk69UuBHVRQOA6WppQLqo8A1aeDUw=@vger.kernel.org X-Gm-Message-State: AOJu0YyXdAPoY80PooybbmsZwM09cjJaXSIimenwScXJAs+lOTCwMoqd tPjGnTWB8p2PCJXkynrsg86GeoXtqPoMFOXKhDtLu5M2/+3xhIXkDUKv X-Gm-Gg: AeBDiesBGBsFPOU7tV+mYekOKTpuMNwF4pJciuX/6uawGPjPRiWyuw9wvCW0xyTR6oP azRmVQ+Iwegoh3+1bgIlPF+EIQxZ92EfajfsT19CyS1JHndxrTO/zXS/lp15Ce9+VrOefVAKn3S HtiCY2EKNpdr9ajUm14lXmlrfAa9UkAOwsiOl3oREjty6wI8hOUiwTVd2VF8VcMVNaESO7q71Du B3TW/DwqOF5LmZIYgK7qSeABugVfLNS6yd4IrvqyaN6dW0nFLhCImo5T4gmb44OnrD8m43kpfbE g69sHdHUVh9PFaMYHg/Wiw3fOiwHiXTGPiw/ycjRuam/qwO0pzvpCH9juS0TFu9BNyHs5HTJn2M 5EKULwMacjPPqiZDpWzD6s8Kz0URgFbjNGPIpArLjS9QkOyp1e2lnL9KjWvucM2XNavJ2fJU2KU VRqoKW+77f2v4uuDXRNTix4edFqwCshim9zHUcLtVxh/lFYmTbLnqWVHvRhC+RFhz6luAbA3K6f Ybn X-Received: by 2002:a05:7022:229:b0:119:e56b:957b with SMTP id a92af1059eb24-12bfb638cc7mr6781613c88.0.1775506453454; Mon, 06 Apr 2026 13:14:13 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:13 -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 v8 15/16] platform/x86: lenovo-wmi-helpers: Add helper for creating per-device debugfs dir Date: Mon, 6 Apr 2026 20:13:59 +0000 Message-ID: <20260406201400.438221-16-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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 Tue Apr 7 02:54:32 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 44C0839F18F for ; Mon, 6 Apr 2026 20:14:15 +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=1775506457; cv=none; b=he5UOmtssvqLlf1nkSJb7yXFoOnjMV/JI4LXxmRCx6T3dUhJMZ7/SxXuTNytBJSrBAPtws+rGv+4uIwAw9gm2NEHJLldkbogbwYfYDP8lCnrjQ88REseCnfatnXfQv0sPnz9gm4q9NX8Gy96B78wK8UsvGvFvGrG7hRxKJVZTPQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775506457; c=relaxed/simple; bh=cvE6jnfJKB7PyqI9IxmPPiPq9P+SLWPdZ3/G/ov1JPg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ONfxpxrNabp/EcVDzvKRHqfMEXC5FfAjwlui+vRDgtwWenElFBCieY7mlFXrPxivWmqfg4snixvLYBxT1sI94Kj9RHQSyexseGSTsGdROj/e8jGZdCd/v+/YqFGbxUYg0h3MRLGc5iZUIhi7rYuP5Nv1v807n3FrLPLJ7xYl9wk= 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=fHfPIvQr; 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="fHfPIvQr" Received: by mail-dl1-f47.google.com with SMTP id a92af1059eb24-12a74039dc6so3095039c88.0 for ; Mon, 06 Apr 2026 13:14:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775506454; x=1776111254; 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=dYDxYM+Wzx9ftLc+PRy/V3d4RDtxf8o4zddjc5rqdI0=; b=fHfPIvQrl54CWHaoheqyCOSkNyY6DLZD1HEsZhkrNLc2tZvnE+Yb35hIzKmjiF4dZt GxHisw4QbioS6qFwM6iDQ1F1KyRfWzY56BEClfyHiwSQcCw/fFyofQIwdQsSCdeWLpSp 9rLJJVyZVBv+hInZu3YkK6/XO2pR2JC5DZakOQ5rS7vxN0gnmYhsdpA4KAQO2yRcH4fm SW8J7aLUfzBuQm/mUt6hOLzQLbIaUI+d4XFUauEs9s26/zqqzmiBQNIKnH8PKpaNTebv NRozNmCS5hFaM0b+PNTftBcv9/A6M9DpA30uZQYDSQFtXSO2coAjf1gHNuVkrInAr7AQ SOqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775506454; x=1776111254; 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=dYDxYM+Wzx9ftLc+PRy/V3d4RDtxf8o4zddjc5rqdI0=; b=rEy0rexgVPBH3lV5pdqAZ2SRdaA3uCYnL96OFm7Aw+h+rjMPMk57jYVa45rR2wSZUx ycPLsF+jKieQsft80kCKPx361pYpY+KauNAzkO5g6a5dZ9k8pHdMhnPpzN49reRBbxs7 dzZl3V4e+ebVPDoOd2/yvA+KqAxP8IgYRD/ReBxBYvD0EIH2QB15fhDPLpXpRaa9/sxz cjzccK842gGAOWduiUIW4nsKWsMv+6CIwkg4UzmFT0eBl46Uw7pgnpniWnnzLMWMBqFc s0Y65KR6kTQ67AluHQl1/QVhZWxX2BcNBHpmqjfR3gfQetaBZ61UTSjjQIYrFGgqJQOY MxhA== X-Forwarded-Encrypted: i=1; AJvYcCXRi6jaw9YBsA95quAysSHB0XSq0jlnPxvgoflIa4TlSPOjBGG19ilucM8Jqr93hj4awzlNzGQ6mgnB9Qc=@vger.kernel.org X-Gm-Message-State: AOJu0YwOdlorTr2I8pJrTlLHtw807jvt1PaPmZbzgLk48Bz4FYbdHfRh So9C5AkUt77+WXgddWl0Aw8roIdCrGF9nCkFJoZKimGvuGp+VqL8P2mU X-Gm-Gg: AeBDievy0il6XH8JhnghsZ8Ezo8PLbFZWAqPzc7tnTPfXBCNYJ7Q5U7IWXHYm8BqZS0 2jS4m5CorD585XF4U4jrhJnTWVHoXFQBC9/8QukCbeLXRuGZ3mafGB1ZPMciX2o7/P90IaZGYaD FlK61+Z5wA5n8nskq64ravzG4IqsxWv/FvMPTokrJJkn7/uPNFCkv9vsQevlHC1XjrIdbYdMZdN +gt7fTAz7eMSk+/mn19x0h1cjpzxUEzTYqTv9yC6cf4bm24StLShJBwk9TOS1/w+VFw5LxHZ6w4 2PvqBQqYzB33ojSm4Wem84K6+gu7Z3r0Kd8mSvYK1CpiJyXQFlgdzL8XmscwLzz9UulzTjKhz+u XTVWtyX0IgHutrjmXYPNB8A+b1LCP41Qq8/3Sv0Tz3aU+pTmHstAfed2fGb+24fplbh6c9/FzYf CGTA6TFbjVVXLIjVYfGsiOVrAcSAzkoWujR16wgOEysJfpoy4jFMrgyLF+swnsqmr+I6vN8RRhm +b1 X-Received: by 2002:a05:7022:62aa:b0:12b:f899:7185 with SMTP id a92af1059eb24-12bfb711224mr6681225c88.16.1775506454096; Mon, 06 Apr 2026 13:14:14 -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-12bed93f861sm17022333c88.0.2026.04.06.13.14.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 13:14:13 -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 v8 16/16] platform/x86: lenovo-wmi-capdata: Add debugfs file for dumping capdata Date: Mon, 6 Apr 2026 20:14:00 +0000 Message-ID: <20260406201400.438221-17-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406201400.438221-1-derekjohn.clark@gmail.com> References: <20260406201400.438221-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. Signed-off-by: Rong Zhang Tested-by: Kurt Borja 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