From nobody Wed Apr 1 08:17:51 2026 Received: from mail-dl1-f53.google.com (mail-dl1-f53.google.com [74.125.82.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3768644BC94 for ; Tue, 31 Mar 2026 18:12:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980738; cv=none; b=VZQEvJP1iN+LXdTkL0vjbBnh6f6In4MFEHh78Zjes6zoWpIzEcp0innecyBY5oTrWE3Y9qV48iKKUgRUw/H5cMrFvdguv1LgojeC2uMmqjaU66CQOkq00OMQzc2LYUAtFiaeD2d8rNTLQFmoUSqBFLqzqVyKXdKUZw0FIVU3JmU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980738; c=relaxed/simple; bh=G76DP5seIcGoTT/c4erU0FkoTNIAYxuJQD40WNenpGo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qk3dyKGBXHRWZt7Uoce6K3jgToOx/mPpnFVDKL95dFdvR4AGWIAUHAh+AjO2dR08BBzSlILNRF5pGQVnL/Tyel95l/55c3syMokIOiEwx3Pqp99zcKKviab2gB5+hfodIkvpKPMmGJaRj+e15bhX5mLfnXQDkN8B/NcWms3norU= 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=ZJVOEnuG; arc=none smtp.client-ip=74.125.82.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZJVOEnuG" Received: by mail-dl1-f53.google.com with SMTP id a92af1059eb24-12a695044a4so1010374c88.0 for ; Tue, 31 Mar 2026 11:12:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980733; x=1775585533; 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=HVJH8MWFZ3aEgYtrADH9eHvO+I+mGApgyOe6gg7oL6c=; b=ZJVOEnuGRsM5JJmg/kebx6DSMJj7qfYvXx+gtr+/jLAPSfERxZnQRlZbw1nMzdUM7j zmPNw/v+4o/OVNI+I2q4C/GH3jdcuNIqUzzoLXYnlvge5UlKTOVBVGfFYwms27lOdIDn QhEoO2FPd+KpOC+AUCO+wcG/ssJdhlKTdEo+sCvMhAwTsdf1E+He67oyCEDnjv7KkaHZ sHIQmUKBg+03aiNvnLAgmpWv30MZ/iJ+qWwN7RT6/MfL53O2/98xvizjC5fw65hbTr6M p5eb34JLp8g2qJvngEOWe+2u3eikiGapcHXUVj239CTG6rqs4nZfBE4rE9K88DICBRcw 9vaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980733; x=1775585533; 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=HVJH8MWFZ3aEgYtrADH9eHvO+I+mGApgyOe6gg7oL6c=; b=KRz7kf1uxTVgSfZA/jRRzgUuZDRYtca+P+kf1Dhiu2VdLXKkrPyFkgGG6rZuzP0gKo 7vN6IdlG1vN4CP+mi6SQSvIURt3YNu7uUHSZNNJD4wMfo4ew6Wf7TtaHhVVWxTy6bNXd iMpWl3gL7q3Y4epcn6LNkxAuj1kZ4u7Fd+GpVlweXnspg8ZW8e5olk2UCvkV8JBooOgE CMgMC6fQaUJ68kjbdCnRHTT4GkdKuOlMxdvNApY1zO1rkRjol3zKNcfQBbq1bCfWIltV EiM3ZdowXKzPjtayK6Z0JE9YNlAWMJBND8U4279F/5vKsGnrm2NpGxWHZ6iSWMd8tnnk FF/Q== X-Forwarded-Encrypted: i=1; AJvYcCVcnAne55bWyFVOt++NI3FMxVmTcy/NJ4Jl42FrwtUkWyrytQV+llD+gcKGMUZ+mg87EL63AL1vElw4zhM=@vger.kernel.org X-Gm-Message-State: AOJu0YwXfvfptuPHn297CWSCJnSbCLiJ8orZC7rBeF+0q4lIVwtxwTZc XSMPBtHOGHCwxb58jsk0BT7N5aRqcGNOXLNKLsC+UXKDbxpf4dGxSWxV X-Gm-Gg: ATEYQzxnXokpY9j+yJbMY0uWLAaDzPfuHRuCCiaLmwHzWIbiRMd3k2w+n7HHncc+RQ0 e+6lPvpUgAlW6GnBe3vRdqyS3B0dM3NTL0DhdWtMD073IOKWk9BS/7nvmYbeapKx7jqyrFIH0gx XZ8VKiracn3UjI5Zxdpj4dbMq0j/CbhxKC0VddueoAvxxbx92Ctf9GeeAOTpN947R0wATVBpzbH a9XPbBqXb1n27q8ayw1QypD+S7qF5qy0OQDSzy/5grYSEfqdTl1FyWPgSqv8/Lw0yTVy5zg0t89 h8M3pPwe4O/9CI7dpng0ITMbVi01p9jjOES5j/Y2CTNeb6mxixkXVDn/Jhbh/ZKXsoERfjacWlh aPePea3y0CaaWQ0ClyDeVB5292/VcTIn3K8Mj0EsU700CPjl0Qp94Kb7Sy7c7u0tBqF1b4aaUTl MiSrvFpKS5yyLjt/4712JM3n+WsJneSLCLuTq7fL/UM6rMXUT3h6G5IqD/bHHLuR7/LhjYw+EQe uaa X-Received: by 2002:a05:7022:b88:b0:119:e56b:c74a with SMTP id a92af1059eb24-12be647c6demr278483c88.15.1774980733335; Tue, 31 Mar 2026 11:12: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-12abbe21787sm10769272c88.11.2026.03.31.11.12.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12: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 v6 01/13] platform/x86: lenovo-wmi-other: Move LWMI_FAN_DIV Date: Tue, 31 Mar 2026 18:11:56 +0000 Message-ID: <20260331181208.421552-2-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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 6040f45aa2b0..caf360b76fc5 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -71,13 +71,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 Wed Apr 1 08:17:51 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 3666144103E for ; Tue, 31 Mar 2026 18:12:15 +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=1774980741; cv=none; b=u2OikLYpBkA8gLMc53S1YVfm/ssKZXE0FbKdvDdfLK789iXNPT/+DFhuZeYJ8rPQyMxWvlVNr8yUAXoU3473cmp8CkVFcGbLEzm5QH61ys5HLGwer+muXCpTNLFa6ZGnldcKeD3CVfogNJpmqJqyxgCRxrIEpXjvWyK8SAyhEkc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980741; c=relaxed/simple; bh=J2zxJ7C+GNkXVIUXkPrHuyFtscPSA93mW9aVv7nagRc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gUV5JmlvuJ9orwWwc209bhWyM26dMjFFTMfB2XWjhtOUgIiVkQuATCDCAIIIZ8g+3Siom5BeEDBqcrQdJdG9CX+wH02m4/YnQ4XyVzri414lKykNYQ7Q3++w5AqpEB3o4yFCs11RFnJBzVGG6oF3aF4T0UpTCsYrifsnQIhsDSk= 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=J7AuMC8G; 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="J7AuMC8G" Received: by mail-dl1-f49.google.com with SMTP id a92af1059eb24-1273349c56bso7547630c88.0 for ; Tue, 31 Mar 2026 11:12:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980734; x=1775585534; 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=P3641lkktESWwCBSxjQBD8OEf5aGYYIhQ0zHdhHKYoI=; b=J7AuMC8Glh+4yNJWxX/p8vLrJ2l20Kr6mLQb2cEDi7B7x9CPprME5jQSy6jM0VlGlv JMcmC4Vfn8WIyyBMRbv8z872EOFZcBO1x1AZOD49wCm/mioh31lXBbz2IaZYu1r51b4s nO71NxPBS8WCIYueHHVzw6qGj3g0gmwas22/X56w0JyS0Md+ARm6MCGtl4I8KsgXNZaT TNm75af6fZ0cojRWUahUTO6MR1BnxgLbDzB2l9mYE9hx/YsPagkPVDCK///zKJcjRUDe tPFFK64JXhfjmoXijo7WhPMoGM6DcS0gl5doFItI0cw09H4tvo/MZW8IHflJrNRgbTV6 QTgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980734; x=1775585534; 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=P3641lkktESWwCBSxjQBD8OEf5aGYYIhQ0zHdhHKYoI=; b=M4wbKo5h0JTZzfKA54QHA9s9bKBzNJzbIulrmtnRUdlRmyOIdqus+4674xE/MtTFJK up6GChtZk1UlMN6oUlWWLAAxrwjkJb9dAJImUsIi+PfZq18Ilf63QMKWrjndmQzl5edl oyu3vrgXX2U/6V+x6XrvRp/W4qgYyypn853LejdpAfO9sxDlEuQ/oHCTYTuKQG47qlXb +OHxZ4ASInntfGMMrokSAm7dS3eEWdA4AeOh3T7TrPmu7mW4pNuVuKfFqoN18QH+xnvZ gU/T6HDeQtQVXMQAPbAnhOWNTj88haZTovRPdVGQPqQ//AKXvwR2icMEwUBRxTK6QaLS aN/g== X-Forwarded-Encrypted: i=1; AJvYcCXbZRaFBSBJYYPq0jCH+Lcl9G0WlIBtINrfzm/wMinAYTOHUjlELOTAmraeH67bZeMuYzG+lOzFwtMjj34=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4a5Di069LzeOPXv1DKivVGxtV7HCL5LYPAvsP5yWFK4OUZ7vs vsdtEe+WxuUOm6nagwg0TmB+yYunCoiPV5tu4zClZbUHhBOCQXU84gKg X-Gm-Gg: ATEYQzwpnIEliBI6Vx4WNLpQmUsgu+EdGapvYpv04etxetEoBmnDgntX+dADqT6k5ZZ 7gtKTbMJHQZHbC6WFX3dUzFOi1Gttmxr9MAPw7A/9UEmKK+wAU6oa/0fRTG+EeHVjZH7qnG4M9x wEQYX4Vsu/vgMBIQJypUcccXE8jbUc6zW/wLchnTHTErJoYTTpP6PfFNF+mXP3cWaKHrHSH2Wgb wpPu3H56IOfDR33/S4x4sSva9xrIM0BFyNef0f2CY/2RbjF/QL3ophxFBs71VNhi8iV6ZwRG+4w gy/cJ3mT9hAI45S2XK9iMncNPwKJVQjTrbmdXTMs/vO2pQEG+RKYQG5SxoSg+EJcJKKxYvJt033 M32LGR+50F0oxmQqgUbROfEdtADNKohDSeQvb5g9c/ZyuL+LpI9fmrmK2cJukM8LJCIx7FY/NHs i8sHUpaKn025fI6LyTxcVassqvnRebmkaeTfO21IKmBt8CLpAqTBmPbzQfUEMKrS6RHzivRG3LG VXw X-Received: by 2002:a05:7022:684:b0:128:d1c9:3633 with SMTP id a92af1059eb24-12be6438028mr305733c88.13.1774980734014; Tue, 31 Mar 2026 11:12: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-12abbe21787sm10769272c88.11.2026.03.31.11.12.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12: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 v6 02/13] platform/x86: lenovo-wmi-other: Fix tunable_attr_01 struct members Date: Tue, 31 Mar 2026 18:11:57 +0000 Message-ID: <20260331181208.421552-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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. 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 caf360b76fc5..c1728c7c2957 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 Wed Apr 1 08:17:51 2026 Received: from mail-dl1-f50.google.com (mail-dl1-f50.google.com [74.125.82.50]) (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 42E0443D517 for ; Tue, 31 Mar 2026 18:12:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980740; cv=none; b=fAvAGHNdPi6bsEurARJOz57VZBXrbdLrLau0QOeZaIAoizditvEPNUkufvq5ZTiEyhaPm6V26VGD2yCphLhPYv7xjjPjmSzQ5Ix8yLVgj/LbX0aLmHxpN5cEukVq38OBPIuyU9etzxlt0jTydCfEPvi4/3WEOaKpz2iwZ+zWTKY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980740; c=relaxed/simple; bh=rG0RQv2MuPbBhBFZtR5wdNoasAYFvFw7xH1qvGGsPyk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WUprR1TxEWoQr/D9fDDFVaGSfphmfgSPLl83NUnwTprNIpKo3rlz+u4tliWjNUX+1MkhsxWWlfSKNbp0wWuK07gBN6GFoyDApWTFOwfWHEadEDGLHOq7gghxcx2vqbQM3ERf8maq3DyhHtPsEOoo1SW81iJU4ZaJxAf26sQbhzs= 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=adm9+2HZ; arc=none smtp.client-ip=74.125.82.50 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="adm9+2HZ" Received: by mail-dl1-f50.google.com with SMTP id a92af1059eb24-12a74039dc6so4834050c88.0 for ; Tue, 31 Mar 2026 11:12:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980735; x=1775585535; 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=lnQ8hDDXDr6abxthuWEWU6YIYcBA9dlKD0mrsjPgMY4=; b=adm9+2HZMXbJ1AXq8LgFteWfqCe4CeQSDMJSMfKgi2x5a3IMZeN5I73kkRT8g3BePJ UF7M/5kHSSsRUTitE0U9HpPAl+4RpZbYnWLijA05a9jRX0tVAv7jA9FKxYzCe/Agu8gP lA1uIhifRFESyOEBqC9H+CI0fYX65YMkZ++oAKjCPGxpcM4msqhHLM0I5dgQ34T4jp9k saC10fver18GcV9I4DkSCujK+t7ADc71diiBAwLieLIhCmN65V1EiBSGgpyBsxzc+KCo eed8Pz4GOeHMv/N/owlisy7S9Knf1uFuNER5+5AalxJ3yCsrxKUWPL7m1HnV2gOAw6WI ikPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980735; x=1775585535; 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=lnQ8hDDXDr6abxthuWEWU6YIYcBA9dlKD0mrsjPgMY4=; b=K+qcdZDwP/D6xnRumvQ/GLEaqj31pLGYJwniJYF2iB+TwHUq4VHVe0J2REe/I3rwPk 5W1lSG3Mv2xRaV2lX9jSOzLf9438Q+Yd4m+wSpc9+S0yN3qU2sW2Exwb6YNfaMgt1lMQ 53WnR+CzrIg5KBwbt9y3MgV0GhDaPS1umEOpSYa2kMDMmQgjTiqs6pmzGA0BHL8gujCg AkmjGz80bDfOoTjCuVv631pExt8KfdEYi1B9+uoBSu2hokKt08amVGQtDag96/AY8ZHz gz0eKEpSSR91lFHU+C+SPCHXTlU2GVk5TShyEyFSlpqJl41pJjA+GHg3mM2XD0hznYty YO0A== X-Forwarded-Encrypted: i=1; AJvYcCWTlZtsqZzjJvzSjKveNwARLz9pZgj2o25gt0TBKdjEBEdkVnFdR04fTVSuGk8k0wfEVXjXUUxN4hFch4U=@vger.kernel.org X-Gm-Message-State: AOJu0YwhwYiboKDLeufQrLETcZDULOZ3BUk+UJR8Zp1wEXeDksDqYpdU uJX4ebp4hZJn/R1LALM/jyh9U4nbnt/Sj2skZdrAf51e3rps5vwI3sBE X-Gm-Gg: ATEYQzxHhEQarkKSQ1qOom5LRDnGSthY9sjgceATEUhHgTCdVPS4I4MqllqdOSAfYWi dwcYeJI3FX1myE4Sio8WwEFESLup6CJtuZTqZpXJYNXERQZfxIDXAwg7aRDzN+6LTUGHD/vIZAV PH7eDCzVGzsvyVHQAFk6gDuv+ChaUZ+IqRwXWTLDYDiHpkAcMAItVvN3G4RL3adAtkrD0eVQTUX dt5a6ZUVNxZXej/qvYCkrp5FKI5SI/00YjCoangz137Elp4vmX/k2413cH3eHwPKatgWKcQQl/a Rp24Tj9BL3QD0HZ3H1iqpvLscegPTZ0L5J779OQisyWPyewPzhjdRApRticE4d5IQ/iWXIamRmm 2nTrvgo8dJZk+WTqj1FpJAjRJIUTq2rDpdd+0eamARKaRuhs30SvIHX4x5Vjpg20vcOK2FRvZ6O CiugI9YgVedtiONmXtE3ZQ2A86SkQHrnHPKxAu8h2L1QY2VMv8XT7VTzefzSkIRuhQb8vj8ZtLP /uF X-Received: by 2002:a05:7022:6288:b0:128:ca83:5aa3 with SMTP id a92af1059eb24-12be64552fbmr301829c88.1.1774980734977; Tue, 31 Mar 2026 11:12: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-12abbe21787sm10769272c88.11.2026.03.31.11.12.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:14 -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 v6 03/13] platform/x86: lenovo-wmi-other: Zero initialize WMI arguments Date: Tue, 31 Mar 2026 18:11:58 +0000 Message-ID: <20260331181208.421552-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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 WMI device when passed. Suggested-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-other.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index c1728c7c2957..c3614bc4f90c 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 { 0x0, 0x0 }; u32 method_id, retval; int err; =20 @@ -772,7 +772,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 { 0x0, 0x0 }; struct capdata01 capdata; enum thermal_mode mode; u32 attribute_id; @@ -835,7 +835,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 { 0x0, 0x0 }; enum thermal_mode mode; u32 attribute_id; int retval; --=20 2.53.0 From nobody Wed Apr 1 08:17:51 2026 Received: from mail-dl1-f44.google.com (mail-dl1-f44.google.com [74.125.82.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2865E401491 for ; Tue, 31 Mar 2026 18:12:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980741; cv=none; b=IwkherLLHnCxxvUsgr37KhLEHwWiI9a+ZKSVksdVdHH0pRH3o0VFaYZIQDblUkKjiDBomvsfyCh+0jqocMxieV5/+rGblY5rNXyiaJ+I0JKOzCtDSB2NIrYoNnH8wbFmRDc7kTiUVzFZZZNyjFCYTGFBZ9A+r06cESlkYKb0Y0c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980741; c=relaxed/simple; bh=RUF6t4ksH3+nFjNa/ECg1twJPUBbR5LkFCNJ/uLZ+GA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZiP/M3fMjMI54tTpkdSKZIWesdsS5T+pze1pjKOW2dcowL6S4xQt+6GPSgVPNNoHny1DyJC52J3fy5rjKqnBi5Nh8I0G3QY4NGiP2O99f9CpIKYa69ol0aHyUbcQIzdpPUTvo4hMhAniMcvhXLbQ5TsrZrnMYYm6ULz3BEiHJ7s= 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=Y9BGbJQD; arc=none smtp.client-ip=74.125.82.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Y9BGbJQD" Received: by mail-dl1-f44.google.com with SMTP id a92af1059eb24-1271257ae53so6080310c88.1 for ; Tue, 31 Mar 2026 11:12:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980736; x=1775585536; 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=FYDZZUdXHQOIG413+yyAPDGJHZ3/DMXcsJz2jll+0Jc=; b=Y9BGbJQDpd/ZK1efkA4OoWugvOUTo4nPQ2jKCq+wp3D4hAlc46ytG7rSeCt11F5bnO HnDm4lYR1MX2CT0tNf0GasAYpQkZn6Fqd4RHI1Mvt+pD09D5dSY4/DnZs0C7JlQvbYAy 7hqmXzeRfKL88MHdzaKkV+jcTw2bIXZEIJ1wEiBn42G3asC20yhCGlSQ9DQqsPE+v/cz zZSY0UXRQXbJodoeJyIGnWVe9XOF5xtEGlRtTIDoLRNlnKvbAiJQMjNCcTuaKd41RoGm /XtSBEwz8tje5U6FOrVqgEhGi2oeTfHoCR6CgXlZBrheJQEv4+d0V18Vhuxm6rjpZE+o Az+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980736; x=1775585536; 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=FYDZZUdXHQOIG413+yyAPDGJHZ3/DMXcsJz2jll+0Jc=; b=cAAfBCuPK9IlK6MY/GI7n7MnrcRiGodUOdLEHBIDtLbdvehPrEHTVgF4cNl8jB5nHc HPikaow4oAlEXYzWodq5N527Zl9gdB8uTBoMqlKJjc48Efm2kWFAv9eZlk7XN3HtpQFT eipXmuOXh9G6SCPtsm1AVXN2VAXOnPnx8LyYnb/0mqLxBovflxhPAiNcThRgP5ZyIB7z SIqUIMPo21azDwbuOeKcqbxsrrn0Gdp7PwSJA6TzebfHpEQSv7+z87uPfYRx0qhSrkHD qsOvZDYS6rRSuZ/LHUxYd3Id+vKHMFm1iHmDTcU9ZwksaxHrAme5xpLXlWVsD6x08sIf e7vg== X-Forwarded-Encrypted: i=1; AJvYcCWe/Mt4QG7gQ6fWDfE2FIstivEhfmP4jH63LZ0t0dAIR4AgueltcHbR712u1eR7qTwpCoVL7RIsPFKoFiQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzMvARe0zm5AC3KH12X28DXGEp7xmi8vs75OciZxx+9jlOWA5kn WYvD8DmRTZigEk8mWsP+lfoOu8bg5hFAxcpxLVHgPwirqftyeeHHPI6+ X-Gm-Gg: ATEYQzzl86+JZdgjUiFO3bDPNzbaShu/EvF30DRN8XfYLfdRBM3hWIqPxGCUqM9Pjeh MxrDEFVt4uFJeyVNjDYgy083TwYGNlDgPHwyFBRTYRFTV3d1cFWIIauPU5E3GqNwps31dYP+cQI BQw1560pIA27hiWZu0p7gmRgaesN6uM1nLXLg8Ecw2JoAzvj/BQHckUtJzAoYX7bshShPxj8wj1 widsvRbSasyjVPKA8D4GdPuL46NBq05bJW2yIq2GeGLKBrDG+Sa0I+rQc7lxt7rBiXlx9t3qWHS bIpTG4jbHEVW7891riAuMAhfJJirBLRMuNF5Xtil08ZNDo3h5IedtrQBDWdp6oAk8SJMSbMnj8M ygbHvJ2+u8Hlk5c6JShF3QH+QE/jB0quzUcMMuDe/1rPky8IGW0CQbgOz0nqpdWV3tj4ilNt95h xW2Sfn52HhDGTLNlK9suHlsU5iAr6x9aVW+7Z7Z561SbCn4fKrKtewJ+IiZkK9VGJxWnNl6AJvC J5q X-Received: by 2002:a05:7022:e19:b0:128:d4db:447b with SMTP id a92af1059eb24-12be65952ecmr235849c88.38.1774980735729; Tue, 31 Mar 2026 11:12:15 -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-12abbe21787sm10769272c88.11.2026.03.31.11.12.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:15 -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 v6 04/13] platform/x86: lenovo-wmi-helpers: Move gamezone enums to wmi-helpers Date: Tue, 31 Mar 2026 18:11:59 +0000 Message-ID: <20260331181208.421552-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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, the thermal mode enum will be accessed across three separate drivers (wmi-capdata, wmi-gamezone 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 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 to permit removing the gamezone header entirely. 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 | 20 -------------------- drivers/platform/x86/lenovo/wmi-helpers.h | 13 +++++++++++++ drivers/platform/x86/lenovo/wmi-other.c | 1 - 5 files changed, 14 insertions(+), 23 deletions(-) delete mode 100644 drivers/platform/x86/lenovo/wmi-gamezone.h diff --git a/drivers/platform/x86/lenovo/wmi-events.c b/drivers/platform/x8= 6/lenovo/wmi-events.c index 0994cd7dd504..9e9f2e82e04d 100644 --- a/drivers/platform/x86/lenovo/wmi-events.c +++ b/drivers/platform/x86/lenovo/wmi-events.c @@ -17,7 +17,7 @@ #include =20 #include "wmi-events.h" -#include "wmi-gamezone.h" +#include "wmi-helpers.h" =20 #define THERMAL_MODE_EVENT_GUID "D320289E-8FEA-41E0-86F9-911D83151B5F" =20 diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.c b/drivers/platform/= x86/lenovo/wmi-gamezone.c index 381836d29a96..602a48de1b4e 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" #include "wmi-other.h" =20 diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.h b/drivers/platform/= x86/lenovo/wmi-gamezone.h deleted file mode 100644 index 6b163a5eeb95..000000000000 --- a/drivers/platform/x86/lenovo/wmi-gamezone.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ - -/* Copyright (C) 2025 Derek J. Clark */ - -#ifndef _LENOVO_WMI_GAMEZONE_H_ -#define _LENOVO_WMI_GAMEZONE_H_ - -enum gamezone_events_type { - LWMI_GZ_GET_THERMAL_MODE =3D 1, -}; - -enum thermal_mode { - LWMI_GZ_THERMAL_MODE_QUIET =3D 0x01, - LWMI_GZ_THERMAL_MODE_BALANCED =3D 0x02, - LWMI_GZ_THERMAL_MODE_PERFORMANCE =3D 0x03, - LWMI_GZ_THERMAL_MODE_EXTREME =3D 0xE0, /* Ver 6+ */ - LWMI_GZ_THERMAL_MODE_CUSTOM =3D 0xFF, -}; - -#endif /* !_LENOVO_WMI_GAMEZONE_H_ */ diff --git a/drivers/platform/x86/lenovo/wmi-helpers.h b/drivers/platform/x= 86/lenovo/wmi-helpers.h index 20fd21749803..3364d8e152ca 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.h +++ b/drivers/platform/x86/lenovo/wmi-helpers.h @@ -14,6 +14,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 c3614bc4f90c..b24bf98c19ad 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -47,7 +47,6 @@ =20 #include "wmi-capdata.h" #include "wmi-events.h" -#include "wmi-gamezone.h" #include "wmi-helpers.h" #include "wmi-other.h" #include "../firmware_attributes_class.h" --=20 2.53.0 From nobody Wed Apr 1 08:17:51 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 9C21944D001 for ; Tue, 31 Mar 2026 18:12:18 +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=1774980742; cv=none; b=l6aeXbUMML3G/A9Fn1fUzEMcZN6h3w/+a+c0JkYYDh3b2P7Hm0qkednP6gNdndV1O0bgaDn5tHcoGqdpMQaWFUtJorIQ3+4u96fOjKnHeBR92qM1gUzqRn1q3egyixdIhLsW7aTD+FUL7Qdz/IUS+lMhgkQb96xIjFRxN5PUZAM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980742; c=relaxed/simple; bh=Fu/ek430KADbRn8h0UGr5ypTmsSr0+phA+E5WxjUeEM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xlq/ZyECxEOJfmq/9BfLBMaDlkPMXScc+F8qK9nYwJV1drahT7X+PuKNhCZjI9isZy9YSSfkuxj9Ksk+fNMqEwF2oW2Zuxf+DOq5scmj1Zusp3SLSIKXnR5Ah614IOzNXN2sqAD2ULHm8de3vFUqn9IYTniNrCifxABJ3/pfml4= 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=iGsar7lW; 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="iGsar7lW" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-12a695044a4so1010505c88.0 for ; Tue, 31 Mar 2026 11:12:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980737; x=1775585537; 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=hGJIgsgDX1kdBRC+1ZlZdZ0WISHAWEUEuDLIUw0+Dy8=; b=iGsar7lWKJ8W75mk/y8qVGFBPz9lujJZjGbwggJdtgGw9n1rFByGQzYPWJbSn0GYdR UnnaYABbiN0NabQ4LJ+ZxrcN3upBiIcCp1GBQYK2/ApQ0PO+OoIAQc0YP4ccD0kYifzO EFstqoO0LH8SbS1RFmRjeVBCdAp0BAC4E4qaKVgdIHOt3Dcy05Dcmu0TFoO/RodI9iWX nC4xa/PeDeIX52Bd8LrhEY24O+hDj6TDMVdESsQweHexOs7Dd6Czkeez6oAOHQq6NDY+ qeI+ugcReB4toLMATysoJzFMUea8MskHMEw6s+fP/J4KR2wSYs0jOoC5PqPAZMiJ3LV2 Ic/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980737; x=1775585537; 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=hGJIgsgDX1kdBRC+1ZlZdZ0WISHAWEUEuDLIUw0+Dy8=; b=sxC2VIgBksW9xuaMRlJlNlBjoD31/3NrUVfeNgo6cGDzSo/pcKba9oGRhDqC3GYQXE JLbFE6vk/k/kZgQi+TYAzdMkmyehx37/kunfTur4Hmu+jcAh/U26kcilhVQk8ajLraSY S3164jzp8kE1//ECEcIerAR3siruqO/fXWN7NWGAj8xozEYn/mXbnr9nBfiUE2074h0l Df5YVxprfLKO/2dSKeFkykew+gOIsMZkHzPQOh6QjVreCQpLKYT3M7q+FxXRrK727H37 OClEsDMFVB65TS5mbvwz80mJbBO0bFRFB29Gt6GnkfGtNpF3mgCJLGB+niDONQcPM0K/ qjNg== X-Forwarded-Encrypted: i=1; AJvYcCV5Z8rWhcutMZ/tDLGDJzdZy5QkeJpH7csj18bth5VFELT/aGhaKzRfRUXXpLc9FSDQnTYFujdrdQHCBek=@vger.kernel.org X-Gm-Message-State: AOJu0Yx1PGk7MBEMXKIImD5V2eVNlOKaZDSMNVecqX9kCJhYAYWpwI++ 8FSd79U/pAChO/V8JRvbvSjFzI9psbDwoWgX1qBozWlhMROAltCBJHJ8 X-Gm-Gg: ATEYQzyFNc+GEQcm9Q1cLGxlfbU1AYQ05WnHCO1GZXDeM4vxtf361f6oxevI1ewI5Bh PwGNWVXh8jFCu7UbWbM6kAMZRAU9L4n6/Q2h7ZuQAzfiwx3vqHIrQ0sVl98u+SnHg+5HldhKcok qif1O/oNTz9TDB/TktJkSCVgUE4DvYPUsfya+l4lcE9/KG2KVDi+6bhxFUdvoS+xctxXCQbjKWw f6wvKn52pBebMaOwmeqWQdw+6AMoI1CN3lxL7JRm66X4IiKvPlPXUYl6dZ7rmDs1cJ0xfKfHV9F fZe/v19+/UrqnoWcHuXl6bEU53IirigvRt9f0HP1yEk/9bVcjz7937jLwLP5AxXHy5kOnpVMcQ3 p9xKYFYMdAtagCIDZS2FDq7CZ8nrr7ihBJtcsv6vA30NkJTF0DZXiyW/KDcsn8E8Bd7BGzAtpyG PpI38Wd/9n5zkqVj7bwAJDd+Fey7pa4DKTFnN7mO/hUMVlXzdZeOEmxkXXsk/zW1dexZ063H8kP 5q5 X-Received: by 2002:a05:7022:ea22:b0:12a:713b:8961 with SMTP id a92af1059eb24-12be6470479mr303818c88.14.1774980736554; Tue, 31 Mar 2026 11:12:16 -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-12abbe21787sm10769272c88.11.2026.03.31.11.12.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:16 -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 v6 05/13] platform/x86: lenovo-wmi-other: Add lwmi_attr_id() function Date: Tue, 31 Mar 2026 18:12:00 +0000 Message-ID: <20260331181208.421552-6-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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 --- 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 | 39 ++++++----------------- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-capdata.c b/drivers/platform/x= 86/lenovo/wmi-capdata.c index ee1fb02d8e31..169665be4dcf 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.c +++ b/drivers/platform/x86/lenovo/wmi-capdata.c @@ -27,7 +27,6 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 #include -#include #include #include #include @@ -48,6 +47,7 @@ #include =20 #include "wmi-capdata.h" +#include "wmi-helpers.h" =20 #define LENOVO_CAPABILITY_DATA_00_GUID "362A3AFE-3D96-4665-8530-96DAD5BB30= 0E" #define LENOVO_CAPABILITY_DATA_01_GUID "7A8F5407-CB67-4D6E-B547-39B3BE0181= 54" @@ -58,9 +58,9 @@ =20 #define LWMI_FEATURE_ID_FAN_TEST 0x05 =20 -#define LWMI_ATTR_ID_FAN_TEST \ - (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) | \ - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_TEST)) +#define LWMI_ATTR_ID_FAN_TEST \ + lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_TEST, \ + LWMI_GZ_THERMAL_MODE_NONE, LWMI_TYPE_ID_NONE) =20 enum lwmi_cd_type { LENOVO_CAPABILITY_DATA_00, diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index 8c1df3efcc55..1388eaf4ab4a 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -6,6 +6,7 @@ #define _LENOVO_WMI_CAPDATA_H_ =20 #include +#include #include =20 #define LWMI_SUPP_VALID BIT(0) @@ -19,6 +20,8 @@ =20 #define LWMI_DEVICE_ID_FAN 0x04 =20 +#define LWMI_TYPE_ID_NONE 0x00 + struct component_match; struct device; struct cd_list; @@ -57,6 +60,23 @@ struct lwmi_cd_binder { cd_list_cb_t cd_fan_list_cb; }; =20 +/** + * lwmi_attr_id() - Formats a capability data attribute ID + * @dev_id: The u8 corresponding to the device ID. + * @feat_id: The u8 corresponding to the feature ID on the device. + * @mode_id: The u8 corresponding to the wmi-gamezone mode for set/get. + * @type_id: The u8 corresponding to the sub-device. + * + * Return: u32. + */ +static inline u32 lwmi_attr_id(u8 dev_id, u8 feat_id, u8 mode_id, u8 type_= id) +{ + return (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, dev_id) | + FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, feat_id) | + FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode_id) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, type_id)); +} + void lwmi_cd_match_add_all(struct device *master, struct component_match *= *matchptr); int lwmi_cd00_get_data(struct cd_list *list, u32 attribute_id, struct capd= ata00 *output); int lwmi_cd01_get_data(struct cd_list *list, u32 attribute_id, struct capd= ata01 *output); diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index b24bf98c19ad..d2838ae5934f 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 @@ -61,8 +60,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 @@ -72,10 +69,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" @@ -714,12 +710,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) @@ -774,7 +766,6 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, struct wmi_method_args_32 args =3D { 0x0, 0x0 }; struct capdata01 capdata; enum thermal_mode mode; - u32 attribute_id; u32 value; int ret; =20 @@ -785,13 +776,10 @@ 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 lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + mode, 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 @@ -802,7 +790,6 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, if (value < capdata.min_value || value > capdata.max_value) return -EINVAL; =20 - args.arg0 =3D attribute_id; args.arg1 =3D value; =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, @@ -836,7 +823,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 { 0x0, 0x0 }; enum thermal_mode mode; - u32 attribute_id; int retval; int ret; =20 @@ -844,13 +830,8 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, if (ret) return ret; =20 - attribute_id =3D - FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); - - args.arg0 =3D attribute_id; + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + mode, tunable_attr->type_id); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), --=20 2.53.0 From nobody Wed Apr 1 08:17:51 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 5246744CF56 for ; Tue, 31 Mar 2026 18:12:19 +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=1774980745; cv=none; b=b+nuCuf6FhV8dr74aJx6aMxSViqcbd9eL0GsPgwOM4zVC2TlKZUTSUoONVuw2X+kesiZaomBWT81w5KhuRp4PIUy0jFifN8q0XANq8EyWpSuDZAjMVOZZkb3hysPzz9TnIi76E+vx9ZSGOSgc3tmX8xsskY1CGUWFZnNCZlNLp8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980745; c=relaxed/simple; bh=q8JGrV6KJhUSwiZjgl2CUSRkfrDMU1uKkcj3HAJzSbg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PTx4Fr/NwrTOqiL7pZXDlk3kKt4B4p4GKyI6zC+K8nr1zohxCjXmysYijR5ACr+vKlY3N/SUG502YFfk7P/ef+k+0m7FcDwXBPRYpzxK2quoR11MBqT9rscZBU595hfXn/4hlVT1ifJLX45CDV7yJhmrj41eDAjG0ZsQv6i71F8= 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=Ubc1LTMW; 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="Ubc1LTMW" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-12a71ade78cso7162125c88.0 for ; Tue, 31 Mar 2026 11:12:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980737; x=1775585537; 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=ko354mo2jPZFUuDoRSYAuKC4SLTQth//Q2eyF8C2Mck=; b=Ubc1LTMWgG9l0ZuLUYbP23BMJd9pDGEguuL6Edwn301LUtewZmLNsNtRwu9sZ0Uesp xt8Aj9O4Pcr3IpMO3nn+tqScE2PilotObDZkbwYozoHWCrz7BykfFt2sCGBnbwdz5w5f 2C6Al7xuqkxKUYfnYbiEwCNOBKBt5TkJSoD0W1Areaw3myeP4nETmej9L3UvZjtCHiQK sz4qftX7by0Yi5GYfeNIhKjET01Qy9P3Fcf7C9jfOII/S/9HzU1xCkDU148Lo1SUeCNs S9wjUL9eCSctZgq06SxTtr9V/Qa6nTHLUspOudUtxfBNnKnNJIeCrVztCtTkXFO09KGF A0dQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980737; x=1775585537; 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=ko354mo2jPZFUuDoRSYAuKC4SLTQth//Q2eyF8C2Mck=; b=pWvLnkBVEeStZJcqq36DDLDDXMhxhnEhLwyxfQUF9otQyKmJkY2wAsw4GmVqbGBrnJ 8tHNJw1nO+pr5XGgDkb9k1mVh+zQ8TmuHjmFi2Vwr3sYQzAW9cSuFvCdRETKJks8aujz R4R+6GXW9bdnD4BV8pBPWC6EHMXA1pT4Z3XHqw3faZWDjh6AgLvf5/fMztcVbJsbIK0i J23mmQtgmbpe966znU1BaD60H5BkwrUdkFQEmb3WKArHPNWszRfuyNKKoYk4OaZnvRl4 S64S234azM4+/lfZoT+JiL3rYotaJmfGMuxmCtMcVysLyK0sXWLbme99QRriiSANX/Aq S5Kg== X-Forwarded-Encrypted: i=1; AJvYcCV/ofLSLGzGrqPwp+hKaF0KZzP7ypiLnIRwVh7nbkZKU2EpY4W5YA5kt3ywCR4ASu0E6nbg+FeeoIcaFxw=@vger.kernel.org X-Gm-Message-State: AOJu0YynGUyyUHsteGwhYIBPzHCsQiCSxlyKBvR0QxV35Ek1zcH5KH+0 RO6DeqzBUvv2BJRkLGy7SBLGsgGjethX48nz+HXzKy0qB7jsoqDXXmFkT6xaWA== X-Gm-Gg: ATEYQzx+xaWZofLhFFGO6Q/OCLGXxPPRBc5W5/TizljRq9j9xmmu6CwCrf2y2Ln25z5 Dan201NiAehuS88vbdZuTVA2dzYIpCE1TFu4TXiLuU+y8NAqf0TXRuJdpkPMhZ/QXABPHsQYppI LtLi+7kB3QEbCmpAD6/0ZGK9EI1SzCf2AsfcLCIZJhQhriTWwDb1Z58FDoaKVlq/vORXi++QznJ FbWrJ1crSNuDYZe80Palb3b0sMHdmdHNmHzZ/W18l71nlZnxQ8GDsohM21A0/EkOGANCjQiZSRq rB+KZCdNjBAJ3bANaZ/kYMOy6699KGP66FRU00vodwpwpaVpm8SgNTa12xjmTzE8Ff/IziVozXI gQfqCgNm40tVk1MzHU0VEXXmj/YaZmoOCZ64vaUC9SOu+ADVVDF/ZdVLZxQAZNvafyqgISt42Dz Aorc9gy8VSQedqrk7bKE/v6eF/3Q65Gu/CwSIkdRwEC9RlCVZPrp5tjXlA+P8/1odkXiqOU+vTD dWMFp4YpZnWbY8= X-Received: by 2002:a05:7022:307:b0:128:d450:bc76 with SMTP id a92af1059eb24-12be656aa63mr254836c88.26.1774980737321; Tue, 31 Mar 2026 11:12:17 -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-12abbe21787sm10769272c88.11.2026.03.31.11.12.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:16 -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 v6 06/13] platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices Date: Tue, 31 Mar 2026 18:12:01 +0000 Message-ID: <20260331181208.421552-7-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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. Reviewed-by: Rong Zhang Tested-by: Rong Zhang Reviewed-by: Mark Pearson Reported-by: Kurt Borja Closes: https://lore.kernel.org/platform-driver-x86/DG60P3SHXR8H.3NSEHMZ6J7= XRC@gmail.com/ Signed-off-by: Derek J. Clark Tested-by: Kurt Borja --- v6: - Zero initialize args in lwmi_is_attr_01_supported. - Fix formatting. v5: - Move cv/cd_mode_id refrences from path 3/4. - Add missing import for ARRAY_SIZE. - Make lwmi_is_attr_01_supported return bool instead of u32. - Various formatting fixes. v4: - Use for loop instead of backtrace gotos for checking if an attribute is supported. - Add include for dev_printk. - Wrap dev_dbg in lwmi_is_attr_01_supported earlier. - Don't use symmetric cleanup of attributes in error states. --- drivers/platform/x86/lenovo/wmi-other.c | 87 ++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index d2838ae5934f..f689d19d711a 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -27,10 +27,12 @@ */ =20 #include +#include #include #include #include #include +#include #include #include #include @@ -545,6 +547,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 { @@ -777,7 +781,7 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, return -EBUSY; =20 args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, - mode, tunable_attr->type_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) @@ -830,6 +834,10 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, if (ret) return ret; =20 + /* If "no-mode" is the supported mode, ensure we never send current mode = */ + if (tunable_attr->cv_mode_id =3D=3D LWMI_GZ_THERMAL_MODE_NONE) + mode =3D tunable_attr->cv_mode_id; + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, mode, tunable_attr->type_id); =20 @@ -842,6 +850,77 @@ 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 { 0x0, 0x0 }; + 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 lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], 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; + + /* Determine tunable_attr->cv_mode_id, returns 1 if supported*/ + for (i =3D 0; i < ARRAY_SIZE(modes); i++) { + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], 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, + "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); + + return capdata.supported > 0 ? true : false; +} + /* Lenovo WMI Other Mode Attribute macros */ #define __LWMI_ATTR_RO(_func, _name) \ { \ @@ -965,12 +1044,14 @@ static int 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 0; =20 --=20 2.53.0 From nobody Wed Apr 1 08:17:51 2026 Received: from mail-dl1-f51.google.com (mail-dl1-f51.google.com [74.125.82.51]) (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 D5DC843E48C for ; Tue, 31 Mar 2026 18:12:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980744; cv=none; b=hLYP5lzC83Id0+Pz1vxFpGcu/8gubgcm56ILzrUQtVlyFGuPX0b98eXXKylzY9UQHGDRLxfg1qTS3xnBtipvhC2I1E8+ohZLUeckd8HowfybJyiJdmP7/NWYdLcADpjVbsJyEmlPilDUfwBzcrUsq8EP56qM7Um1DvCMJUa1GaU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980744; c=relaxed/simple; bh=zTRJS9hTDJuOn8NF67uGmslctx+vPGb0VlOu/uWvByE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ukd/70whyWpLP7XwXsDsmypQQq0dCiSgZZcekjzVlIEMtIVsdWfNxqxwJ3A/5VaG1IEjCHmPVDbe879nDv/AI+Bn53GYrEfYlwnOl03+SONjOjwHJcHgZ0+L8T9VhPrG5KYD8I05oeh5EPeR/iq50hDgvu2QZbhEXtg4hYQOrrg= 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=V6iQvdRj; arc=none smtp.client-ip=74.125.82.51 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="V6iQvdRj" Received: by mail-dl1-f51.google.com with SMTP id a92af1059eb24-1279eced0b9so8155643c88.0 for ; Tue, 31 Mar 2026 11:12:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980738; x=1775585538; 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=dyooRgntglIzJaG2Yu3kpByt3RKuyXLi2A6c5xQV+9c=; b=V6iQvdRjb04Yekb8l5d2uzIgpdwpirfFTs8ufz6+YFtNHGLgUjG9lkb2mBZtdmrN9M NI2RxfSM6dSpzXm919gB5FrzSfvp6xB/ngBErYGbjwgz27TCv3GkTegfcqJyonQQVceH BTK8DP07I06/Jmxl2ftKhsCGQJfhk44qHit3jDDVnb2EBPBCHd1HzEn3LKRgRkoPL0lx BDsU2fkz0eJIrQ1RCrrYIRZix/P2erbm3+6mY9NsizOSS5iaqFgauvkBilw6HhsmUHzT EqvZDIQisyh7mFTl3ZbvikhLblk/3MKmHD9SYb8UIfSwMbE6ItgyGF+HuitAP0eiiAHG XSrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980738; x=1775585538; 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=dyooRgntglIzJaG2Yu3kpByt3RKuyXLi2A6c5xQV+9c=; b=apGVhMdVQnxMEOMGct8kuGmNx7rbEmv6Xin+SSFkYNpqTD+uAqeCB0jg6Ftr6WJ9Qi vxSZKaXWzM8mz1/P0AohN8zjSxVkaZbUaigKaZzu+56XmyEs7QtTtAPpDH4Sye1jFSHk 4ujeEfo354oqbJIn07m2rWaZpwveEH/HTQrKkjxUtpjNI97oumzvJKORcVv4Y34yvDmI XF5j8yvRyW0lN2JSUQbvV6Acy9con8u7dNFF8CpnzB1qtX4+J+Dk7MFViY6IXRLSBZvY ek4CEu5PSmfqSpawlYZHp2QftCMdxjx7erAC21FWfaRQPITnRtm0p7H2L+waYCR0NlkT 19JQ== X-Forwarded-Encrypted: i=1; AJvYcCW/PZZHubSEyxbO6I0ayOdZSr21nFJa8MniIkcyXPgaSuIXssied2bPenCHLp0Cr+bnjhrMoEYrvi+GNE8=@vger.kernel.org X-Gm-Message-State: AOJu0YybcL58GSKF615d4VFYNvL4xCXLf3qmGrdwcqk02XgGhMqwnb5B LYvhGifQoq322g+yhuOjxm9zenvyHJvVDE2HRBcsW1oPBYZwGH4kfEt1 X-Gm-Gg: ATEYQzxZaXABqEZdGauRJemluMhgen569CyL8mmLzNdszMAwZQbYteBQy/1lmX+VNkQ iVt6vBaOg2pj3KannI/dgjR+A21qpiCjNhCLPDOcTRf+H1qEH9y5KyWGTVnMCp9SGV2sQ8KF7gd YqNFxMFpnMd1Ct8b6i9w26tmrInKZm7hMWB5hAorUGfJ2hMMgCIt8dp88Y+xZ0GZrlQW23uq14Y P+l1KQPlMaRMn4fVubHQjQY3l8zF2AhcFv6Obsf1ODmgoaSmf16CuYc/gkU82HLEz8lM1Lr5jG9 AGGuN03t/ebrCZ+xiH2vs5PVOpUhG1vfBk7TcJvKp8ScrwA/7xIlzL9MWBZzOzB28Cc+ykM6JEz eQmNfxFYaijl+gQDrTCaDoZfpF8hwBzWT7rjsUCMNowYTAOLLz9AJIwFVk05lsyMJIaS2YpRvSC Fc3arC0sFzzzcmCMSu6J6oN4KnInrS+2b2PNBCg8QfE1K1LWEhmYotNmey0mRAW4a02E45Dphm7 447 X-Received: by 2002:a05:701b:260a:b0:128:cf70:9042 with SMTP id a92af1059eb24-12be64ace84mr193241c88.18.1774980738023; Tue, 31 Mar 2026 11:12:18 -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-12abbe21787sm10769272c88.11.2026.03.31.11.12.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:17 -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 v6 07/13] platform/x86: lenovo-wmi-other: Add missing CPU tunable attributes Date: Tue, 31 Mar 2026 18:12:02 +0000 Message-ID: <20260331181208.421552-8-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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 Tested-by: Kurt Borja --- 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 | 101 +++++++++++++++++- 3 files changed, 109 insertions(+), 6 deletions(-) diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation= /wmi/devices/lenovo-wmi-other.rst index 01d471156738..82c17361e749 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 Trakcing 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 f689d19d711a..508186c7410d 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -54,14 +54,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 @@ -557,18 +564,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; @@ -794,6 +855,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 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, @@ -998,17 +1061,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 Wed Apr 1 08:17:51 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 89E3044CF59 for ; Tue, 31 Mar 2026 18:12:20 +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=1774980744; cv=none; b=DdjUIQUWio9p1yL3q9xSlLa+NU6JeJu/L0J/DEYRcF/n0hQ4RQxF9ettMW8v1Vfjd/RPCEqe9iTsxjbgdKSIwbE1cczHCtks+zCXZpIxGdHNSlgVw6LGd7SfIi2vuLLeg8Svq+dBzqldJX4h/rYYlcZV5pSkLDZoZs8OHqxlEAg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980744; c=relaxed/simple; bh=feZc+w3JkICycdeQtrVgc3L/lRp7m8kG7/h7RrrVM3A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=APsXuk7YSvIT2bGBwl2msKon5l4REN+kdAXZyEaB3ux0xvopfPHp4TWqa82mrEghYBdhGIIMUXWlQKwNhAtvu8YA51O8kKEOePQQ1nZ29PmoXiULgVyrwjOR193L754679Ri/VXEP+iuS6MaL17/uGt8s0xCz5TLaWesF7xWQKA= 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=oZmbybWQ; 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="oZmbybWQ" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-12732e6a123so1705209c88.1 for ; Tue, 31 Mar 2026 11:12:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980739; x=1775585539; 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=r5wB5CKOkfM5PQBq8FCbagovENO2/jh6v6z2f7YXnTI=; b=oZmbybWQZC9tJ613m32MscPwudgzS6HvFB2F7znabw9CMJSg21SQc8S910u4qE8vjJ Pk1A6N/R77sNStF7/46tknXkoOhBeAGYRF+J8bsrJbVfW58pAd/bBKLva+ob2bigLdR3 pf1vXOvKLkH4lGyXD5V8NFy1dt1xO4fj2wuJDb2+9YDQeXYKP90wR0nyKbCGG9a2iAUv xoKaPYSSySOBAHvf7aSXp5kgz9FgjpkAxSIOIPre+9h43BpPbsNAROcNv8hAqD32p7yb TRDB1uCgM31zrlv0Vm7q6O2nnsvKQhbd3QqNO4+yfSG1JNBo9UJ2stBg0Z7HPCXcOaeY TXXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980739; x=1775585539; 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=r5wB5CKOkfM5PQBq8FCbagovENO2/jh6v6z2f7YXnTI=; b=LRnGjreU6sSewH3jDaZR9sLKPH+4qv6c3Q7Kc5Ufr8ny4xQQ58qzHDr+lR5XfIMDRn pG7H+ndZRFb2us9xaGdlsc21inhe4asONrb0NTBPQad9hWsGoDNRZJPiexqIRLr+uT6n A6GtFCejRPHraAXcogvLmBVyIphGxdmE7xys5R7ueAP+afBUN6XB5zCwCtqK7d2rSz7+ 8YY6q3NKcT3lRocQ6gTJ5uefBAKgA2rqe6vFtmyvLlLZxTpVPCVTRP5wJH2HzO5JgNr8 aeeB0W+hxO9TVc9t7ReJbbGFG5J8SR/beHzu+nsZuQYV1U4r1m0KJd58IID39vb/Dzup JxeA== X-Forwarded-Encrypted: i=1; AJvYcCXMwopPtFYyMS7q3kiPC6IXTb+dIZ5rKGXwamZ5D6S+Fw0AHv0yncQJjEG0alVH/QB0D8GeaUtGmZsdUFk=@vger.kernel.org X-Gm-Message-State: AOJu0YxKU8lLWwliuBfJ2eV+MQ46VV/qQkj4arJINjSjWymLc0vD/DKw upE6wrRSkNv4qYnwe99Vu2ZCk74MxPcRuUtvv8yxYBGCcZEGDy3tJOZX X-Gm-Gg: ATEYQzyAFwH/j7m4k7wO+lOvXTX1lqnfQCE2Dq6pbxFUkckWwQ9kask5oXiVzneOyvP nsfFyWwb+CfxmuqFWHU2GPNE3Y3qJQGPFFpec1PxTrzgTpz3Tk0SOM5ZELt7fR/2wmceFXe123U 09IGJ/d3+CUWAjtIiSYeqgzh4T5qm7peluUX1UrHAaOdMvXsuCH7J2Og1abzMMBdodO0YO8k51x Kt1c8bo17wwrtd8c4PG1SOSPz6cJOahUCq7cHzBppp11Ql7UdgLEoaJwZLJvU3E/5E8z4jqwUxH yDAYB1lMkSuh5UPjhkXGpepm8/o3WtwIej4p0Gd39G0ZVuhHv96/MxvAlT5uPXZLDFagw89mbWm Ldu1N9tOCy1sl0JdOIX30Qa8KhncZk5Ay2MWLiToaIzND3mgjBNrLIHJKAynFhpzYybLSmAvpmT zRO8XQNGBEOPrknt9hX3tpxxxbIuNcSXBUfTRyQY6SNDh4Z90GCy5plDIRIGbn19TsfHdmia0qW 2rU X-Received: by 2002:a05:7022:fa2:b0:128:d737:d7a6 with SMTP id a92af1059eb24-12be640d655mr290697c88.3.1774980738731; Tue, 31 Mar 2026 11:12:18 -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-12abbe21787sm10769272c88.11.2026.03.31.11.12.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:18 -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 v6 08/13] platform/x86: lenovo-wmi-other: Add GPU tunable attributes Date: Tue, 31 Mar 2026 18:12:03 +0000 Message-ID: <20260331181208.421552-9-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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 Tested-by: Kurt Borja --- 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 82c17361e749..bfbea59637bd 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 508186c7410d..2792671ac1de 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -65,6 +65,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 @@ -630,6 +643,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; @@ -1061,6 +1134,7 @@ static bool lwmi_attr_01_is_supported(struct tunable_= attr_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", @@ -1086,9 +1160,40 @@ LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_= ipl", 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, "gpu_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 Wed Apr 1 08:17:51 2026 Received: from mail-dl1-f53.google.com (mail-dl1-f53.google.com [74.125.82.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8153D44CF39 for ; Tue, 31 Mar 2026 18:12:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980745; cv=none; b=RGj6q7jRR1c6wRwIKR8GRF6wRZSh52CP+IZWhgq5cdYHcXbHTyCOOQT0sll9pGCSWw9OF+RBaRhLCF93ZVuQ3THy9xigUf6hs8+zJFaJ00cPGJDpjgne08sRWq9TkTLGPcYvsLiUbsoGp2E+cBHi+7iNkbTE+1NlVZ/A78g/be8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980745; c=relaxed/simple; bh=c/P/RGeNTE/h028wWC+cxUj4bTCm1sXFTO7yyTJIccQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d779/POz6KDFj9PUJG5HPgTQTWwLxFLMgDNbH95tYE272OrrDCIRO3jmdWnEThpXRbzj8QKVCRig/j1OECBMcxyseshO994vqqu4nsbbwEWuCdwUbiPVfMOPZfkMfXkGOItJNQPr3ughEziKDql0AR6RjtKeIxx5o3H8DPVDJYE= 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=UIUHufSD; arc=none smtp.client-ip=74.125.82.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UIUHufSD" Received: by mail-dl1-f53.google.com with SMTP id a92af1059eb24-12732e6a123so1705236c88.1 for ; Tue, 31 Mar 2026 11:12:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980739; x=1775585539; 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=Zmuw6txTrzaBR5zOiwWgiTjEomy8i+I/unLJ3hDl42o=; b=UIUHufSDACOy7CnyYBw4PD187t+H+gZwh7tjPpWlLJgz1uci7FvoptkimYNU9bKQrU ZAPYEGReXQLL+z5rFN2UA1N1jvaeRxyN6EnlzJ5j69AKNuzPEtQ7JpnuABU4xEudm3Ng YEKHezw0UrHgAiqtUkm4ZAibhrtsydU37mvZKZjKumnQGKM+M1S4w00mreXjAKsDMc8o wnShrVpky+4g8GDdjNQUfjZG8Bkxxg0yd15pHzqPX1cU3H2gBfraqsGL8/h7r+7rOvo3 P6XKsVseTbisBnSmS3YwDj7hbph8/2HXTlQbcwUAlpT39lFuMcCVIS1gfuFkTduEsIGG dVEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980739; x=1775585539; 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=Zmuw6txTrzaBR5zOiwWgiTjEomy8i+I/unLJ3hDl42o=; b=DwUJMGeFKuIJbcwbRxQlm5HtDoftj3nGF92bfHnu4/y4JSYnDJKhLKfqidzSHOTvXW kDTX/ZsK+SYKGZhciYcf3nDEqpMo+ABsA1OXpknWwJmv1YKV2mAQG5TrRD29YkS6CHWs oUp8pai5l6Zm/OhNh7Cl6CpnjUnWTnJR8UbQNRSp8oPB1JfW0dqO8BHKDM1lL4qi+Jkx AXmvjVeeVeD9g5cbXI6NdPVJr8UPIlxG3ppNCbg6mw4mugHAYgd1tUWOW0oRAfKgkboC 5XF03FXd5bJlNBPJ28TtDfAYy/XXWtUQ/0ZrhYbjOLxHl8u0HuNGdnj8P9gsPGMOdYmU dMEw== X-Forwarded-Encrypted: i=1; AJvYcCW8x342UcbzieM/0Exf2j4gRMtDZWPWJ9UKJUO3DfpCFikPzf+TbxGoEmqUyZ5yS+bR7Eh+oGOvcaPcgp4=@vger.kernel.org X-Gm-Message-State: AOJu0YzzM9wl26avf2OXAx0Rr8lKeT+oTLZOa8sd7QvTOsRVNGw2DR08 z10Mz7IC/3pdyHLy6S7IRKZAO5tK7rxpMBy/zoPBLq2e0Z+xtYIAW+3O X-Gm-Gg: ATEYQzx8CKKxV4HJnF42qmRD0MrLWARWzeLZmM/wM/gaxmSNgTpWhwKnVcM5g6iunXi +RzxU6KLYwDXEjnd09K/R+q0Lb9xqnojnmkudxboXn3ASthE8WSGcIXBQU28Jwxc0+hYsaGyCR7 jp+mNExRUv7neNX6gO4XSS65XW32pOEol1IdEN/rfuKwzsukTPPxPHGSqzOpX+f57MLTMXOo/SO 2SJa7MaMhGa+V3uDNDlRhLFsbd0ykvyN3G30cuzi/NjFqb/2vE26u/DDwU18cQXPrUAh15tIwdg aiRlyqygWzHht95CsOxQRok20xw7n+nQzCVTD6PvXwbJmn2U0cSGMJ0m/jy5036g3nofRCxIvFA A0weQp+7s++1EJDH8T1aU1WOXBeYOqu69nZH3me3H0XHMSgCccIS/YXzlXb94ICz2GJRy4Tzl9F UfaeKWrOWa3JtOGQ8Lmtif3E0g5j5xpWm9OMl16/FouyWIdFTk1h/A4g1Xjxo7fgnEFnILCdTJx Lvg X-Received: by 2002:a05:7022:ea2f:b0:128:ccaf:85d5 with SMTP id a92af1059eb24-12be644a4e6mr334099c88.15.1774980739428; Tue, 31 Mar 2026 11:12:19 -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-12abbe21787sm10769272c88.11.2026.03.31.11.12.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:19 -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 v6 09/13] platform/x86: lenovo-wmi-other: Rename LWMI_OM_FW_ATTR_BASE_PATH Date: Tue, 31 Mar 2026 18:12:04 +0000 Message-ID: <20260331181208.421552-10-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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 2792671ac1de..0366acf04ae5 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -95,7 +95,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 BLOCKING_NOTIFIER_HEAD(om_chain_head); @@ -1225,8 +1225,7 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *p= riv) =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 Wed Apr 1 08:17:51 2026 Received: from mail-dl1-f48.google.com (mail-dl1-f48.google.com [74.125.82.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B571644D02F for ; Tue, 31 Mar 2026 18:12:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980748; cv=none; b=c54F10AMo/KU7e4XhL5nxAbGFgAqef1ciKN9eu/Rt7CLspH55HfA159rwuQiRQinDQVRCSjMoKEkI18W+/x8dyqPA5VRXYI29b0JMER1emEpdfah9zAOvc+DGv5Q+PW0/QjtNtufHsv6QZuftGQpx+lJArxPZsaF/iIGYcIL3P4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980748; c=relaxed/simple; bh=7HycbsaLS/PKgVHoceLIlxdSw8SGNJAi1rpvET61b2Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sGAsnJnTTO2awZKrUGPGIdXqW9yBw4iLxHQJAgGqbHmNXZ+7wRkZ0GqilFR0fuCHwU2YXbB9SW+8C3qwX/qwZQHQKqfA4QoTIP0PL+Ss2FFkF6lTUF9T5BmTF1FcUe05pkqFgEa8Utbhnvk/FSHvrCX4uf9DsspV35Ob+GWl8ts= 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=D2VSelFV; arc=none smtp.client-ip=74.125.82.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="D2VSelFV" Received: by mail-dl1-f48.google.com with SMTP id a92af1059eb24-12a695044a4so1010656c88.0 for ; Tue, 31 Mar 2026 11:12:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980740; x=1775585540; 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=xqwVghcaNo2QxS0QZs2piVcCNzPaDilddcB/rgUaEDI=; b=D2VSelFVL1ji+w245Yfc0z08tT9qW1LUEyiOhQvfdBkuAiewhlyXLO0YKjMCsCGgPg KKHw8X9Arrj6BSTjDVBdecFobXjSw+u8Mgc4vXQ163BURheC3k2wNdkULbLSbp8PLC/6 xD78pG5oWpjnBXsFH791mkIVat94hvMLGDfT6Tpo2e1aSvwKoW3fHiTvZqY+Y+T2KJbz txE8eR0JlJY8eK0N3axm0wrtC3Q8Kibfm9+qK4zDNdEMXaNnc3nPfI56OH/q/CVObBqE PymgWD7SUId8uGpIqYPi4diaH2U0wDdXinLHgcF3F4QRJNJhsuLKhr8EXBxx/w37loEg V7Pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980740; x=1775585540; 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=xqwVghcaNo2QxS0QZs2piVcCNzPaDilddcB/rgUaEDI=; b=VjTIRPY70A0MqCUduPsIWHEhtfL15FcrFRChKlkbw21wtnE4XIb+nbz1QsS/HUb9xM Nk00LFrFfm3rRwPCgXgtCKXDvuonK79D4kizmEYwHJkSTF5gX8H2ELYwXnFTsoFcN+Sl ZaaxvMAJiNx+8SeKTSE4Mo4jZ8FbwE4oHypZHvK0FTU1mtJhU4q7zgC+ejPNSIfxvUFd fY5MXSvZaJ8ntInBD+uozr7pRfHFN6gcY7FaPn/3PpR1pMu8Xy23OaZ5zxzdY0CKo+pg xiOq3CJyuiH39iS/GiA2uRZnvLPr72rFCU7AT5o8P1Ry2hTguY6V2+eASXk/ZDAFzG1u aZMg== X-Forwarded-Encrypted: i=1; AJvYcCUm7R9j9rUv6HWsf45Q2qitffgpGsIrECzec9hX+Ug6ZF3esf7DuBhVc8Cgf5thWSMkfXnW2Z4PBaSJ7po=@vger.kernel.org X-Gm-Message-State: AOJu0YxE1uFVgI8Tm4JyUP90RtaLejKD1QxA2sGTXo5Z+FYd1hY2f4L+ +qlZPLXCGLMcqO0MPWwy2HqYUKstqH/1m46ek0sDAgkuX6PiP76ZOr5F X-Gm-Gg: ATEYQzyXcs0sGa0E0RsdekhyGzoaUEk3BAlT75K6CJfkWI02KqaFMn6iIZ6McXviHkx GAat6HfBQJoxNpX+ra0HOnh1tahCIoJ8PDEkpBPJlxm8/IVd2pQTDqfIggyz9gc551Sf1X8l2If dmnXCjsUdPy8eI/0nFRoFdPU/u4mAa18WOU4RMRizVDtZbz15P74AAlUp5zmh2V4SWLPOvGc2CA LTk02I3xU8XWrV7bvTftu8T6YTE9oulDMw7JJb0BNPmyaWfgQQ4Xj0M6F6ib/3utGILc9UfPqOS qYpfvAftkkx+tt2zkV6d2sPjZr2aC93XUhexIFurvnXFi+1HqqS082/tPym6l6boOO0ThviwC6P Fhj6PhG4Xu+p7GdYqzCa8LyAbgZtjN7XmDkY80ykYHtHilH3LSb/HimAHnbbCWlnIcQvCpc1C33 W6oK5Pc4j8auK7fpy30UjsGPKrLXnxoI6nWf3bbMmPuiFHT9gL2hwR7cH1PAf7eEwPqj4fwwMBQ Hn5 X-Received: by 2002:a05:7022:6290:b0:123:34e8:aec2 with SMTP id a92af1059eb24-12be6420269mr313030c88.1.1774980740121; Tue, 31 Mar 2026 11:12:20 -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-12abbe21787sm10769272c88.11.2026.03.31.11.12.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:19 -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 v6 10/13] platform/x86: lenovo-wmi-other: Add WMI battery charge limiting Date: Tue, 31 Mar 2026 18:12:05 +0000 Message-ID: <20260331181208.421552-11-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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 --- 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 | 274 +++++++++++++++++++++- 3 files changed, 275 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/lenovo/Kconfig b/drivers/platform/x86/len= ovo/Kconfig index f885127b007f..75a8b144b0da 100644 --- a/drivers/platform/x86/lenovo/Kconfig +++ b/drivers/platform/x86/lenovo/Kconfig @@ -263,6 +263,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 0366acf04ae5..e0633c42972c 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -43,9 +43,12 @@ #include #include #include +#include #include #include =20 +#include + #include "wmi-capdata.h" #include "wmi-events.h" #include "wmi-helpers.h" @@ -78,9 +81,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 @@ -91,10 +96,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 @@ -136,6 +148,8 @@ struct lwmi_om_priv { bool capdata00_collected : 1; bool capdata_fan_collected : 1; } fan_flags; + + struct acpi_battery_hook battery_hook; }; =20 /* @@ -560,6 +574,263 @@ 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 { 0x0, 0x0 }; + 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 { 0x0, 0x0 }; + 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; + + /* 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"; + + ret =3D devm_battery_hook_register(&priv->wdev->dev, &priv->battery_hook); + if (ret) + dev_err(&priv->wdev->dev, "Error during battery hook: %i\n", ret); +} + /* =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 { @@ -1317,6 +1588,7 @@ static int lwmi_om_master_bind(struct device *dev) return -ENODEV; =20 lwmi_om_fan_info_collect_cd00(priv); + lwmi_om_psy_ext_init(priv); =20 return lwmi_om_fw_attr_add(priv); } --=20 2.53.0 From nobody Wed Apr 1 08:17:51 2026 Received: from mail-dl1-f48.google.com (mail-dl1-f48.google.com [74.125.82.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7844943C05E for ; Tue, 31 Mar 2026 18:12:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980749; cv=none; b=FbtkRLFqSs6KbJXeEyJCZ6vHKJ1yOIk4lG69kkeciLx6BA+ANX+Eovm35IiN9mD2dI9+yJqyh+vjNwoPqd/mapaiAHw2Xf9/uX36lXaxJsMlsXL/BV+tc++leN2TU8OOJ4VhNUaiQI/NUzsRbeMMmE3c5rxCAeuHOXfeSvPaXdE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980749; c=relaxed/simple; bh=B1LBbhqPdmlHhkPZJzil9YvdVcehWUBIB6Xk5BxbN3w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CFkZ/YyhxSNsTLeLi6WkBezl/BZYzRfrK+jsF0NtEJxxJPgKuV83mUrO9VdH/xuHoWQPji40gXNj41J3oMQWW/FE35VYYRML8kRZhEAtdiVpGMJnN/OpylpMi6xkC6mOWmXz2hjPXCzvPtnqzjLKhzFwsPl21xfDZyymiGYrE7c= 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=Trnom79d; arc=none smtp.client-ip=74.125.82.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Trnom79d" Received: by mail-dl1-f48.google.com with SMTP id a92af1059eb24-12713e56abdso138128c88.1 for ; Tue, 31 Mar 2026 11:12:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980742; x=1775585542; 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=ZbE2H1seNIMYPCC+OqB4YdVVeZgyTGdmDEfXgNXjg14=; b=Trnom79dbn+MeUIBnzNoUFNYe7nrDzd9D/PisMVtygjysTRXUrZOm/d7vBVslpFTpn UkTmxG6GW8mG6ScQETQSOl0geuVEKSH9j7S3Wpsf9ntyrC/tQh/2Geo1p0ExrynSxNKE QzqCMajpCyb8CHWxeUVF4gFpS/qk2k7xb39wxgcJ2CcFANzxe4sJmXjGMHsOg2q2OpKT dgxcunS2Skju4hi0AB1J8IH7XDE1r1wS2e01qljUK2UrnL/0dtJ2Bmr9s8ZUW6ZEFJFi YEZKtaMT1VHk53E0aqrNZ+X8OLlZ60NbO0l8A9QD+4cs9qY2Xu5np58R8LBGLWCkzfi4 Qa+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980742; x=1775585542; 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=ZbE2H1seNIMYPCC+OqB4YdVVeZgyTGdmDEfXgNXjg14=; b=JCcpuhleQa0PlGUe2TN+zugSjY+PJrPszB4eaA9Jc2sARj50BBWcmUwKr1rVOVP/wb MouTB4h20veVprauEkCm4LvjUlgd1iEK2gOzPmVdMY/sn+U5aHfvtNAnHDuvV4iWdJtF X6cG3Npccjq79lijX7IWK42QZlkhX/xpjSyUZJ09Pa+gSvJo+Bi21vbTeoz0DtvYPV3a n6x0f234YtRX9d/koi6uVFHHVKy/iGxv7IVzFfIHj4zpivaj4YzD9GB66llwyrLMCnu+ ZiIqKLLg7ydlA/935mKvSvQ0MaEQoDC2Scn5DW7ZHxwuhKI4BGLHwiVIByud2jwZSbmn ZB9A== X-Forwarded-Encrypted: i=1; AJvYcCUjZgUMjT6opsj77iaG3J+KY4AcZYnBDKHCDwdPnSdsuCSuHFbsuxwObsTNq7WEQdD9dDapo5dpQScu/Uw=@vger.kernel.org X-Gm-Message-State: AOJu0YwgpCy2OAxgDIN5BuamMBwb6eR+ND96scchJphMKl4fUSXU51LE lnWRLPsdbYwSHml3MsfB+JNWvETyOz4Y66Cli50JWzOlAh+ervauMv3Q X-Gm-Gg: ATEYQzwYb+cIGRLHq5D7Yo1wDk2uRzKnDAXaRtif3NNByc9dFmM9DidxFZ7rF3yLL05 NVE09HqbDKR+kGBhw4kpGKPSmDuAt9vLHX58pCV/oi6Dgvvi6oeQmpWPoGCcf3iZyUhtXRuR6kM gk3EUbWQxA3qFqM+UxlNQKzmSLBS480wYanQr33je/9jLW8XfbVoeYR+w9aKaD2Jx1cvTNyYmub th1asPdnD7EDGAdAFL+GSZ05tUZ9sW2S9pmyfIq7JdzmcyEq2aTJgzxjb/yUFuy3sdkI1MmnYoY PfsjaBlnfSBYZ31kEbFY5jKidCwA7oF4cnkwwo/pKr4TxCgpbKTIwyM3zVR13fgeCDuBvBHHoyN NL00UAwfp1C8lZxDdzZvWHKskuQaaSFT2rC8RddvlPWc3GGCYasRqnN6Jz9iHSJ64r88k2EOHrW bNGkmpwqRxcv/uhTCz8d+uBdKwDiGwbEFzrI3RHd9YPCmpsNu4da1bLOluwJiU7sizsa1smn/QD /ct X-Received: by 2002:a05:7022:2209:b0:119:e569:f874 with SMTP id a92af1059eb24-12be686a98cmr157009c88.17.1774980741023; Tue, 31 Mar 2026 11:12:21 -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-12abbe21787sm10769272c88.11.2026.03.31.11.12.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:20 -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 v6 11/13] platform/x86: lenovo: Decouple lenovo-wmi-gamezone and lenovo-wmi-other Date: Tue, 31 Mar 2026 18:12:06 +0000 Message-ID: <20260331181208.421552-12-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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 Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/Kconfig | 1 - drivers/platform/x86/lenovo/wmi-gamezone.c | 4 +- drivers/platform/x86/lenovo/wmi-helpers.c | 101 ++++++++++++++++++++ drivers/platform/x86/lenovo/wmi-helpers.h | 8 ++ drivers/platform/x86/lenovo/wmi-other.c | 104 +-------------------- drivers/platform/x86/lenovo/wmi-other.h | 16 ---- 6 files changed, 112 insertions(+), 122 deletions(-) delete mode 100644 drivers/platform/x86/lenovo/wmi-other.h diff --git a/drivers/platform/x86/lenovo/Kconfig b/drivers/platform/x86/len= ovo/Kconfig index 75a8b144b0da..b9a5d18caa1e 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 602a48de1b4e..a614af8f08e8 100644 --- a/drivers/platform/x86/lenovo/wmi-gamezone.c +++ b/drivers/platform/x86/lenovo/wmi-gamezone.c @@ -22,7 +22,6 @@ =20 #include "wmi-events.h" #include "wmi-helpers.h" -#include "wmi-other.h" =20 #define LENOVO_GAMEZONE_GUID "887B54E3-DDDC-4B2C-8B88-68A26A8835D0" =20 @@ -384,7 +383,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 { @@ -406,7 +405,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 7379defac500..e1cf869224d2 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 3364d8e152ca..ed7db3ebba6c 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 { @@ -30,4 +32,10 @@ enum thermal_mode { 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 e0633c42972c..d871ee02dfcb 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -52,7 +51,6 @@ #include "wmi-capdata.h" #include "wmi-events.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" @@ -110,7 +108,6 @@ enum lwmi_feature_id_gpu { #define LWMI_OM_SYSFS_NAME "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 { @@ -138,7 +135,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 @@ -979,102 +975,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 /** @@ -1178,7 +1078,7 @@ static ssize_t attr_current_value_store(struct kobjec= t *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 @@ -1237,7 +1137,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 Wed Apr 1 08:17:51 2026 Received: from mail-dl1-f48.google.com (mail-dl1-f48.google.com [74.125.82.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6AD433E8C5A for ; Tue, 31 Mar 2026 18:12:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980746; cv=none; b=OUutJqX4TrmwGkeLW4zGOLlUhoTCgahQ39AeGH2FpzI5/0CRBgmGbpoq0/bV1v4cX6SB/UCnkB1DDtnqTpJ8Ar6p+0acMPUwIQAVTF5DRc93gNU/7PB+T1hKUzAAe86QPB+8cpsK9Dqad5lKCy6PCctunEMWgVt0cPnhC0xwjvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980746; c=relaxed/simple; bh=JiWzgDAXej9In4o5iFPkUzYAAXMi/rkmJkGLb7EKJ3Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k6e+/DhZDKQbQV+Z4ornVP7mL+GwlPMmGn+a3MWii3vxSULMLLOqlKM+OAAqs9cMKIF6Hc4A6w9zfStrxDSHexto7p+/7YbL+BiuaDjpqThSMzBxMk107Os18wcSyDYkfN4Q2p/DuYyQA9zDROGdkcFBS+5lTYGI/ZJDqtwpPKs= 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=lyaxuI74; arc=none smtp.client-ip=74.125.82.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lyaxuI74" Received: by mail-dl1-f48.google.com with SMTP id a92af1059eb24-126ea4b77adso8574192c88.1 for ; Tue, 31 Mar 2026 11:12:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980742; x=1775585542; 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=btToglq9X1YRie8VMe5VKgTtvJn2RACiXwu4CAtqAnI=; b=lyaxuI74g8nHkCBPLE5GgbbDStxZEwQbOAGYdAsoAF6uTZap6rkro1wQ3gvQnrNkzI THhFKiAcHS/xYpddSj3ZbK2+sE7HilY+7gefyvpIq6q8seqUv3swqYuuz0ZLM/WhdgGK 2FcuMUdJGs3sU7ZuDWiSEe/LUhyhbjGWJVqgz7lWFXBanJEfXzCYuMixi9N0vJVUPC1U MtBFZLxWq3Bsy8J/rThKhD/CzdLXUJfGkffto9cnJ1WLRE89tWzaL9I8sf78FpNMVOdM SIRQp37j/QKcUuZXOAfOO1sBxP1WFxlOlDx7H3Eb9VWYhp6UR+CDTMo/KelnUw5595BB Wd7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980742; x=1775585542; 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=btToglq9X1YRie8VMe5VKgTtvJn2RACiXwu4CAtqAnI=; b=eOvo3FtIZqdrOvp/6NGXHHB8sEmEv3URl2OTGR5+GDqlYDD3dv7XDMSWXOLUByjas9 8l2Y4YjAvsZq/oWM5XV8aVMCBqE1SN1A66Yn/xFuWL+Fm1/BluBluxyEwZxOgzz9UDYb 2JGRm5Aww+9jM2xFPnM76wtmojYWTunmqaHVz47LYPZOyTFigAHT4nL4kUxB145GnDkY F/0OXeMbgrptnO4ZjcfqXSXtNtRAbjuPjRKd1+holcEqeptOGVux5Uw8kFMQVa4HhsDj fScR6ZMxdMwIpB6iT3BPZ6bPA1e+FEV+lBdBOD//WawCI77nHFfTLKVSspDOSvdhBopA eRPA== X-Forwarded-Encrypted: i=1; AJvYcCXRCvpib3wEIxEPVw/QUq251pxks2Wchi7K0dmevnNvJJgR4wQkWyyEOIRqcBAPNHmfSSFaerBi4OfMIiM=@vger.kernel.org X-Gm-Message-State: AOJu0YwnSKmv/Qw25eirLLyLCXtymom2oNU69ZXSN6+wj+JW+O5U1FiR NUilxZxqzbtXVbpzlu/OWaDVuuCANlWXlCBh8rtRLwewgYm5EB/lvEO/ X-Gm-Gg: ATEYQzy114RfjcTHdiPpbRkbqBqN1W/xfuk5hHNL3MBJhEWgWzxwSBkyd2Vc8JkF3rt C+APUUnD5meI/tycPDvfsjEUYkYSJNY4hDnW1FzRKtpeKImsUQIlHaxDXJh0EwqXpNr/WFyLEkU /BkjvjuXCy9eobmA+xSQwybzzV2jvZGq4Kr09tsh3VWL0/VMmn/6n/clp7rjbcTfH3aR1cw9FBG rofJ9Z1qfYcQJ4yk5xIpQrseWQpoSw0oDCdUNWpWdbH3t7JCLBstF15eRBCMcR/H4XUJ5WZ7hCC b9C/4Ti5nL9tLWOI2rXd4eilaQHdjzvYL5NlhoGo9SHT6z8a5hWMQ2FZQoBSIaKS3er3PgLuTiR TzXH3dY59kR7tkbVkCzXPIYSqVWRljr/o7S+64pZQQUjwLw2BKK0vhiKIvGX+vS4pQMFeFrIHau 6Jo7/hNQPWkt9iMjYuo2zJeWayc2mgE3eyfyEyuq2FY+IZxulEqt+K+rrCZ+3hY1r4S1wLQzrvH 2VL X-Received: by 2002:a05:7022:602:b0:128:d2f2:5cf8 with SMTP id a92af1059eb24-12be6575e03mr273151c88.34.1774980741768; Tue, 31 Mar 2026 11:12:21 -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-12abbe21787sm10769272c88.11.2026.03.31.11.12.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:21 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 12/13] platform/x86: lenovo-wmi-helpers: Add helper for creating per-device debugfs dir Date: Tue, 31 Mar 2026 18:12:07 +0000 Message-ID: <20260331181208.421552-13-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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 --- 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 e1cf869224d2..52a0c6a5a4bf 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; +} +module_init(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 Wed Apr 1 08:17:51 2026 Received: from mail-dl1-f48.google.com (mail-dl1-f48.google.com [74.125.82.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A89BF44A71C for ; Tue, 31 Mar 2026 18:12:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980749; cv=none; b=l3Sgfux7yqTOtkHEpaw1f680Kv7QTSseOoLwWxsJiFskjar7qkqB9B10dgDHGq9lVaXiiXaKGiMv63p+w7uZllXjj6r89hJYqIWlPMf2F+1817zmaSO2gW5ppvbppvjUPrTmjgsd5FIpW3x0YPE4GSOG2Tu0+bO0pGhJaDE7v5w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774980749; c=relaxed/simple; bh=cvE6jnfJKB7PyqI9IxmPPiPq9P+SLWPdZ3/G/ov1JPg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OxD3AWsOW9G9w+q/1XaBP5h/hVyzc52GubLf2hN6Gb7hxT2PAoro+2zDE9lVLW2rTN60V9bNQEj34GD6JP84ISP1T4oeKWQ+eD7guInSckwrBR8R9d2zpDLcC2us3KSHMB9ehLhfGsInIFe208TgcUzoOH7GpklfONQULXIYig0= 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=kqyjvTDf; arc=none smtp.client-ip=74.125.82.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kqyjvTDf" Received: by mail-dl1-f48.google.com with SMTP id a92af1059eb24-128b9b7e3edso2289610c88.0 for ; Tue, 31 Mar 2026 11:12:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774980743; x=1775585543; 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=kqyjvTDfbYty/w8elXf9AlMYCBd2vAzro1oOoGWAvx3jePSEnBxl9c2rnrxf3CzhwL YJqNIcJqa2wTRJH+dHmoLZ9+1ujztgCEmJzMWrVqQEUxcQ87M8ZmNfYQaYDWiM5N3CMq JKkcjfHVBA4hmdaCUkWr5afirvAvb6TYCy/tXbbSE67ksSZjRxXLm/o8k27PAjubzKO5 2b2MJjdEP0Mu3uAW2h2nGjr9aTicWemBVKCqnt66tciyvgSRvOMHhOE1xtH0uaEZSk+d aGpGK2p4KWv5V017hVx/cO24bemEMo9XZn6evGWiZrg7T0G1+snUHA1iFB3yRUKawZWg X08A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774980743; x=1775585543; 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=LGUidYNE7QnRpdGQzTDpY/5jwl3iaQlo1+ay74y7cLipVsghDcl74P42fC7vnOnzo0 3PWu4NCNZHvy5VcFphjrsV9Yt/62CIiu96qB0L88fhu37BgNKvuU2QpTCGGXpz+nxksJ ZwFDqgfpvcx4C/mgYrploEQ/YN7gKwl5Lu2bgj+My55uAUTBCIn1LhMHWYN0lkHGM6k9 wKxe6YKhw9RutxEMCooaDtOWXxAGVQRQG6E32QF546/KE6NDDkyZQW9a02ImdLlOoMQ8 BMd29lJbeR2mrZx+k+9YW9puW28LgylBD0fR3LlUjXf2wc1mnrYN1mshBBzFtmLMmdAH iueA== X-Forwarded-Encrypted: i=1; AJvYcCVn7DkvM6Ofb7OLW16tk8yhveSNk1ROWPdTgJONoxkFkGZ/CvYOxoDP2zaQQAopAenzjOIeqnno1M34fSE=@vger.kernel.org X-Gm-Message-State: AOJu0YwZ07ikjxJCu002nhxrk5mwfKrzhQ/OlCAXBOGa1KlXu8wnNWPW DOLtNWqC40fRKITNLuik++mB9mAgdEDIdxDINFvZIbfXoplLz8v/B1St X-Gm-Gg: ATEYQzznrsDmV/YDjWjGicQXb2mbfuYo9pmCw+tGuql4coIWYFB78kVhDbEljnDAC9H l2AL6kmtssEPqry0zM9k28F/mRfRItGaJX51+9nMk+oNcY3l3M5tvhnbUml5bFrbpLtzOSJre56 dxMmtSrnntjLCj3mhRXvm+37ocv6/DKl4k7JYp0QWF9s//7nf7M0dkJjw5S6j4wyneZnq/41Kgx +NjqnUYo9smmfaefnYRU3ij1A/DIuuOi9cvqjUw3H+m1DNpTwX3mfzJ5Drcvk02Q23I4vUyiPNq dPN+xDh9N5b8RfLfz9ubiuUSp1blmfjVYnb/VPbWi2/8Li9afhd00klcfNHXklHdX2pu4jPduqQ NaKWF0KaY5VIiiKB4xwfaMma39S9ERPTP7o/kJFxjmrMVN5M95+537t1BneEMym/MccB/Xo8iTX 7IOc6Lrdgt5V1R3ifyapFWHdkfV7RLdHugdEVcDvzqUxVm1p1J8H+ZfKsAkn/sBe4Nm5EwDHeZF ff9 X-Received: by 2002:a05:7022:4581:b0:128:cf5c:5352 with SMTP id a92af1059eb24-12be640d64amr318995c88.4.1774980742580; Tue, 31 Mar 2026 11:12:22 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12abbe21787sm10769272c88.11.2026.03.31.11.12.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 11:12:22 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 13/13] platform/x86: lenovo-wmi-capdata: Add debugfs file for dumping capdata Date: Tue, 31 Mar 2026 18:12:08 +0000 Message-ID: <20260331181208.421552-14-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331181208.421552-1-derekjohn.clark@gmail.com> References: <20260331181208.421552-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