From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f180.google.com (mail-dy1-f180.google.com [74.125.82.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E65AD35504D for ; Thu, 2 Apr 2026 03:24:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100270; cv=none; b=sMdcihDKeOx1SoSSyQ/zyglBN4VdzcJcORsO4/Hc+Hvy3YgCa87asp5LdKksXFn7zTQ2jAnNrnB74hPLAac45BbsHoE8KknV0xTMu7QPG1FI9JsA9bcza7PEBi023WQNHMrxactMLUYmCIATa5RHJCWuQq8gRxnKkgcAuQ0l5ps= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100270; c=relaxed/simple; bh=xoAxyd23RUHtYfq932MDE3PcTF7vl72cZnWGDgo18cE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CgIXcX2fYfvJaqmX6p4gu18f8H+6CuN6r/LxgjXYQDmekdMtLcdnem2iUCw2e4FKAv1sp6K9XguhyUn6OVuMLtuvqmCZbXqg07usH5V2yyaSxv4qk06z9c2ynDkwewBtMNP4ohBHO171o4D55YQ24/fNACCPDed+BiqDi/LdeUM= 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=JJNVdau+; arc=none smtp.client-ip=74.125.82.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JJNVdau+" Received: by mail-dy1-f180.google.com with SMTP id 5a478bee46e88-2ca4ff720ccso556376eec.0 for ; Wed, 01 Apr 2026 20:24:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100268; x=1775705068; 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=7lNuuLOzmr03xq4m1O8HQgZGp2bHbRJpd3HGUaao6ag=; b=JJNVdau+RMHXLBNoH8a91Zz51IwaIMqy1HBvhcsaDi1TwTREuROK3cMTAXSMcgHHS+ B01dkgpVIpCyxFHFaHmd5igJAYqxNSK2iVYAtV1nuQCbO/WwAJ8xHKizVGBQPJudOsPh a40bEeEEueyekxgzUaMkLSBhbIoOrHIU/+arJbyzdQ8pREScDY3GTU3IJo8Nx9tloyrB Gx+rHr0LidAYM4eWFi5OmVg6r/Yv5zfyDcKYiY8zWB+grCdTERRgLA/lSYAkT4W0rs1z eHWaS5XvXG2A1WF8A3tKLev3R7ywIZZ820/NjFfpvd4CgQhbe+8dnQKArYoh6tNvFcFJ 60lA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100268; x=1775705068; 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=7lNuuLOzmr03xq4m1O8HQgZGp2bHbRJpd3HGUaao6ag=; b=fgcJuPDgJVtEh5Th1LX4UYhW7TgCEGcBqbeLMSCsTKNivZSdkSW1TIZM7bHhU/OZ7g 2l335sG5PEfe4nRRqGBM3rRcprxpvcpu2z9c8tQTpQWaO5tC0ynUlbYI35/DXRRm+k0E KViBwH2k7UkJx7CHS3g0p6YvZMboKxf60TNedDg+650igve8PX4DQkZylmiTOeka5wUg hMMekHot2B/cdLKPA7gqUpMF53Cie+h+Je77igRubDMDKBPqVFTY5OgpcT4lyUPMimL8 53ukYeNLlhZUvvXYXVi7J8D6d2smqR+NE5iGMXllxA6SrFn+O9HRyJvOKKSqCLm3azQA JIcg== X-Forwarded-Encrypted: i=1; AJvYcCXJdt5Hl+JnXDmUH4uP63T1iQpvFakUXKZlMPK+fPPJ5VtV8TlbfwCpDr2SDs89A6AnO+PximvJCBYXf6k=@vger.kernel.org X-Gm-Message-State: AOJu0YwwVTrcDbD9/+dLWD3FPto4pF+psWsbeRTDwixVepBFOhTrHyiA dyasq9PO3wDp8HwZNZdzXMzKR5gOBCTvxU8XKdsYCvGVF5U6Qo98vsKZ X-Gm-Gg: ATEYQzxEB02TeDmyk1SsOjfQRbpWieXJ7YAuhAD1Y9uPA1aw4e/iH4btmQLmdoLsosM s3lbuGIyW/Xa379cHIFaA0odE9vyk+Do84vTjewSGQCBqBQ58hw6oy5VPwrghaenpbjkOuV/AaG wQMGw80vFW3OH/7d0+IYRK/LmNmiGc/1kxXTwydKHy4K0aaUsmuODygoSHELnknPsU/aBLIesOF k3+H0yN4YoUX+/mTolyJgTObSLTwWXEXctXurSA2TYnt0vhPXa8OraeDPZzdVwlk8SIlmYTi81C 4mphM4RO6A7QEv4JDmRqovy1g3Kz6jkMLjAykpbdVqdZRz3gUtMNXXVp08mXhvCn8wdNCJhbd58 5wPo4nl7m5buiutjYy1OCCqvlW6W9iP25PBNDy0Ap/pZIXvsCG23F61TYXXxD4sPlRL9aNYhLRl 6HSKNhFqZC6EF92nGcHIguC5x+M+DPHSyocfSiEJJ3t2fijCN2AKhNgDM3qtW+PJrpqwhtvW1rc 7VW3yh+KGAOzmE= X-Received: by 2002:a05:7300:a483:b0:2c1:1d6b:1698 with SMTP id 5a478bee46e88-2cad67a8282mr332104eec.5.1775100267985; Wed, 01 Apr 2026 20:24:27 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:27 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v7 01/16] platform/x86: lenovo-wmi-helpers: Fix memory leak in lwmi_dev_evaluate_int() Date: Thu, 2 Apr 2026 03:24:09 +0000 Message-ID: <20260402032424.678528-2-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Rong Zhang lwmi_dev_evaluate_int() leaks output.pointer when retval =3D=3D NULL (found by sashiko.dev [1]). Fix it by moving `ret_obj =3D output.pointer' outside of the `if (retval)' block so that it is always freed by the __free cleanup callback. No functional change intended. Fixes: e521d16e76cd ("platform/x86: Add lenovo-wmi-helpers") Cc: stable@vger.kernel.org Link: https://sashiko.dev/#/patchset/20260331181208.421552-1-derekjohn.clar= k%40gmail.com [1] Signed-off-by: Rong Zhang --- drivers/platform/x86/lenovo/wmi-helpers.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/lenovo/wmi-helpers.c b/drivers/platform/x= 86/lenovo/wmi-helpers.c index 7379defac500..80021f59d1ef 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.c +++ b/drivers/platform/x86/lenovo/wmi-helpers.c @@ -55,8 +55,9 @@ int lwmi_dev_evaluate_int(struct wmi_device *wdev, u8 ins= tance, u32 method_id, if (ACPI_FAILURE(status)) return -EIO; =20 + ret_obj =3D output.pointer; + if (retval) { - ret_obj =3D output.pointer; if (!ret_obj) return -ENODATA; =20 --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f174.google.com (mail-dy1-f174.google.com [74.125.82.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AB91835A952 for ; Thu, 2 Apr 2026 03:24:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100271; cv=none; b=kzM4SAdGObWcVdhtyXUwpw3kEUYAKzt/hUMOVtgJmqw3Aopyg4slnMsjPgzjv9IjeMeRVZCqJ6q7H63dCxEgPpZde38fbkkufCeUWrSqVm1SyiHc7UedKT90IwWm3aWXVVyQ78LdtpFXplF+UGZ8QFSH4rPfwjuQLXpPQh/Ldek= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100271; c=relaxed/simple; bh=WAyuXvHg+IDaHK96s8SFan2J1QbE5G5c5VzthemtNBg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jhuGp11BeO3KKKKtYLnIks2c4JcUV7kAkLI+7L5tcZW2dVsCZHGsGq5RICJLQkyttdK5ZIVMVDzpEEtQWCa+MHFhr9RbUVEVK12KlM2qFhPvAfZgJAA8/Vq8jrzSFc4ZdKHbqtOzr+sSvrFZ7KFJlOnW5jc4vwUwbuLXcOQdymI= 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=AzMg0njM; arc=none smtp.client-ip=74.125.82.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="AzMg0njM" Received: by mail-dy1-f174.google.com with SMTP id 5a478bee46e88-2bd9a485bd6so1038816eec.1 for ; Wed, 01 Apr 2026 20:24:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100269; x=1775705069; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dtWSJAsPoNeIGexvUzam2g4A6bay7wxoWEXeu9FJabM=; b=AzMg0njMn0/kNGALFGS5YQVXzYWCXMHMJbqqGV3kmREZzrMnJtv+Y/DqvEJqa5gxDu xLSGjTeU8aobc1Ek0GFem8ObsrAmgzn5UR8Nyx9fxpsWb7F7aJch2/mIgAaoffQFcHYz 5Qj/tw8J7TXNjk44THIT2dU56A/Q/yChWOE+FOtyMceEKeedPHnqZidA3E3/zn7Antk/ k2o/MWlVIWEhZpslhEtU1WyvFo10k13wXPFIIDF6LWGWBu95iZQTWsng8F+Bh7cJwwzZ gmYvMw0tEIpgTycei4XpDO2QgscAtq6hMM8Qh+Eh9KGwoHWRL6HZQJwfXJNGwXE5rGJJ pLDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100269; x=1775705069; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dtWSJAsPoNeIGexvUzam2g4A6bay7wxoWEXeu9FJabM=; b=r5lIiSv5BWf0y8F/PABAVF5UHT2UNBZYTyXnA5zf4GXJi+fsZDehzxoOa34g5W0JVp V71+T8vu709ypK6bUigpD7L506xfECBIziPlYNgIl/wduZ3Kzgf6vPuCB/plKC4Q6Jdd R89wJrX1xk8SnuG7E+u4P3GrN5h1bBA15qQfhF4gCnn5BliFpDWnq//fgktFSONsZomg za6xdKT+jkfnIzPYWCuhlhfsBPCrFe8bGZWWC+3ZrX4P2WF8KuTalLd+KOoHssSYu9xx qJMePIsyTYBMOOixjF4qSQzbuIMrsXVA+7k3+C+iHZCaUzzJWw9jERt3YDzQknurb4GX 9AIA== X-Forwarded-Encrypted: i=1; AJvYcCUfRTo16j3gGpVv46Z+rry66X0R0OH7ptbU5kb9usM+EOdcb/ix55iXdMDEM/4OHm5eROyHdydjg+mKvdg=@vger.kernel.org X-Gm-Message-State: AOJu0YxXi/lGA0fQyrnoZOf8LJHXkDlEqvlbaHW64AeRtScI9DQPAPZA muxA7NU9PAYrsXOCkrpugLj2qtgVzl3TOht8zpyX9vF64mdSfU0lTKFs X-Gm-Gg: ATEYQzwn/XieP3V/Ha/jbzAVXYmMvByVcnORf1+FBb6KRAw94jZMZir0uVcctTRlDpU 5CaLRDa+/x9Yjp+ZjEeTSLQiGsCm3i66ymz+FnE4C6VhhIZqQkGwccVd8RxleCMzb8SsA6txZZ8 RHa/zWwvPmvtIu1hjVWadEVGY4t5+5vszcG+cAjjPBv8DXsZrjXcFFTKHG6cBu5fzu7uIsuGDzC hQWjmDHNU97aEAWr7sMWKTsY7N4KuIinXdluuUhkQocoNm8h0LKY/sccGoDX/WgeIrJUZ70k/9t uehTIP1kiU3QntXN1cp8MmbsgLfZdNfT17SgaogPbDehNkrKTpHTQlx0KvNR8HSELMGGWROWK/4 MaV4to2Oiq2hcNauWV80hOq8hFW4UHoTsGARolVRTl8pCfTVs786vpM5kPcxPIbMwCN1vyUrQGA Tg1F+u3DMfoBV6MLwcRBwWvCyzDiortTcqjaDM+StxVF03UPvY9Izb8G3SGm4oUbWWX3bIjtlkR eGM X-Received: by 2002:a05:7300:a483:b0:2c4:ec89:bd3 with SMTP id 5a478bee46e88-2c932bb1d1amr3029865eec.24.1775100268688; Wed, 01 Apr 2026 20:24:28 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:28 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v7 02/16] platform/x86: lenovo-wmi-other: Balance IDA id allocation and free Date: Thu, 2 Apr 2026 03:24:10 +0000 Message-ID: <20260402032424.678528-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Rong Zhang Currently, the IDA id is only freed on wmi-other device removal or failure to create firmware-attributes device, kset, or attributes. It leaks IDA ids if the wmi-other device is bound multiple times, as the unbind callback never frees the previously allocated IDA id. Additionally, if the wmi-other device has failed to create a firmware-attributes device before it gets removed, the wmi-device removal callback double frees the same IDA id. These bugs were found by sashiko.dev [1]. Fix them by moving ida_free() into lwmi_om_fw_attr_remove() so it is balanced with ida_alloc() in lwmi_om_fw_attr_add(). With them fixed, properly set and utilize the validity of priv->ida_id to balance firmware-attributes registration and removal, without relying on propagating the registration error to the component framework, which is more reliable and aligns with the hwmon device registration and removal sequences. No functional change intended. Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Cc: stable@vger.kernel.org Link: https://sashiko.dev/#/patchset/20260331181208.421552-1-derekjohn.clar= k%40gmail.com [1] Signed-off-by: Rong Zhang --- drivers/platform/x86/lenovo/wmi-other.c | 34 +++++++++++++++---------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 6040f45aa2b0..b47418df099f 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -957,17 +957,17 @@ static struct capdata01_attr_group cd01_attr_groups[]= =3D { /** * lwmi_om_fw_attr_add() - Register all firmware_attributes_class members * @priv: The Other Mode driver data. - * - * Return: Either 0, or an error code. */ -static int lwmi_om_fw_attr_add(struct lwmi_om_priv *priv) +static void lwmi_om_fw_attr_add(struct lwmi_om_priv *priv) { unsigned int i; int err; =20 priv->ida_id =3D ida_alloc(&lwmi_om_ida, GFP_KERNEL); - if (priv->ida_id < 0) - return priv->ida_id; + if (priv->ida_id < 0) { + err =3D priv->ida_id; + goto err; + } =20 priv->fw_attr_dev =3D device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), NULL, "%s-%u", @@ -993,7 +993,7 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *pri= v) =20 cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; } - return 0; + return; =20 err_remove_groups: while (i--) @@ -1007,7 +1007,12 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *= priv) =20 err_free_ida: ida_free(&lwmi_om_ida, priv->ida_id); - return err; + +err: + priv->ida_id =3D -EIDRM; + + dev_warn(&priv->wdev->dev, + "failed to register firmware-attributes device: %d\n", err); } =20 /** @@ -1016,12 +1021,17 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv = *priv) */ static void lwmi_om_fw_attr_remove(struct lwmi_om_priv *priv) { + if (priv->ida_id < 0) + return; + for (unsigned int i =3D 0; i < ARRAY_SIZE(cd01_attr_groups) - 1; i++) sysfs_remove_group(&priv->fw_attr_kset->kobj, cd01_attr_groups[i].attr_group); =20 kset_unregister(priv->fw_attr_kset); device_unregister(priv->fw_attr_dev); + ida_free(&lwmi_om_ida, priv->ida_id); + priv->ida_id =3D -EIDRM; } =20 /* =3D=3D=3D=3D=3D=3D=3D=3D Self (master: lenovo-wmi-other) =3D=3D=3D=3D= =3D=3D=3D=3D */ @@ -1063,7 +1073,9 @@ static int lwmi_om_master_bind(struct device *dev) =20 lwmi_om_fan_info_collect_cd00(priv); =20 - return lwmi_om_fw_attr_add(priv); + lwmi_om_fw_attr_add(priv); + + return 0; } =20 /** @@ -1115,13 +1127,7 @@ static int lwmi_other_probe(struct wmi_device *wdev,= const void *context) =20 static void lwmi_other_remove(struct wmi_device *wdev) { - struct lwmi_om_priv *priv =3D dev_get_drvdata(&wdev->dev); - component_master_del(&wdev->dev, &lwmi_om_master_ops); - - /* No IDA to free if the driver is never bound to its components. */ - if (priv->ida_id >=3D 0) - ida_free(&lwmi_om_ida, priv->ida_id); } =20 static const struct wmi_device_id lwmi_other_id_table[] =3D { --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f175.google.com (mail-dy1-f175.google.com [74.125.82.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5777635AC07 for ; Thu, 2 Apr 2026 03:24:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100271; cv=none; b=YKUN6iHYR6ZrItrxNNY5DGKG9Ty6G6ywBF9/F4J48U/m7OMOWTmq3otRUg05HxvUxSPPSbBeWu330/aAZlGnOHEUgbjj+YNnzVtl41KJ3P+BwFtw/Kafde9lCzyKAlsqPt0CtE5wGyBXTMHkPL8cB9N4P0PxgXk5qK4mmYntRp8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100271; c=relaxed/simple; bh=A5nBMBkWkafHNY7USWwQbGA1Gg3Rjn8l3CkT7z4RWhQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BPPagICWj/8EMNOyh3HwjshVp6WD+jZDfWsujwMW32w91+4NrcyUOhtYhIVyKSI4X3tVHuXEZfGFDygjwmM6yheAAQV+iLGFxVzCUQXF5ozJu5Dln715ECGYAyno/Fmfy0sZvmaiymGsDrrmy7MnCoy+JzxoaZDdOZS40sXH7Xc= 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=dNAW4O35; arc=none smtp.client-ip=74.125.82.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dNAW4O35" Received: by mail-dy1-f175.google.com with SMTP id 5a478bee46e88-2ba895adfeaso560954eec.0 for ; Wed, 01 Apr 2026 20:24:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100269; x=1775705069; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=c2sfsoM3eXXD/i3TYQHRzXUhUiniPGPfrTop9I4lCjo=; b=dNAW4O35mDqpTCwXTOG7pfCw+iGJOU3lcU6WaSTwP0059mhHp3DQPUGswdbzI7JdWh Ez1NX9EH7+xZMUyaIpDqU92AbMbNJhlYG16HfIucU82ZL1XBWUuB/lJhTH0F0vOy2klC roIQaj9WSqoeL5nxmUZ4MeePCkoiCQaEGRpwXCUHWU4ockIvULGOQX7ifyNzCK+WABi+ f93WlZLZszOJvKq6dpr1o4Ixzn9FOkpUW8XK5KC8WOojhDXkNOSArbh2xucKRg1ULJf4 mFMYoTDXT8SnXmjUUWQpOrJSLzFG77kNW6p80YoIxXSne2eb4XEJJLFSo6qq0J8dEtXs HbLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100270; x=1775705070; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=c2sfsoM3eXXD/i3TYQHRzXUhUiniPGPfrTop9I4lCjo=; b=LDq4giyWKPSetvFhMVyEAvi0mW1ZP8Yi742xXQ5Tnrp3rtaQxgvtXVU14IW2cTvpKR PCTpNFfYyfmQZOG2feyi40u+hKRIsezyCxjKDHgEsxQBOo5uzMfcSflw4Def5tlfN/fd XXRJSevs1VssQMUo3+23N0qARswxT5ddC0WcdaOS+sW7NwX2w+i2BFEAIhjGE6wBubVn izaBmumfdJDwnbo8618Q0PndTkDsZbXvXtuT/yPFHvy6bBaec4y8Yxad9X4YooE/muCT PuqCMeSajjLRuKZSC7AxGnVHP46+1Cz/X5IfxbWJtt8WRI2JVMwqAgdiCNFmb54koq1N vO3A== X-Forwarded-Encrypted: i=1; AJvYcCWWjWh8Kete5y4x8xXVCc56CIW5PRGCaeFKV5FOgkHHdO9kfZC+vJAHSd7yLowGKyDp9PRuYvj2Xe1eQZE=@vger.kernel.org X-Gm-Message-State: AOJu0YxRoXnQuGIE7yKJFjCJO5WWP6dKYAujpZHOzFwIDdwrAZ++Rn2H ojQxFRoNRskCHHXKa4XRnXhcvyQBr1WBsl7j2hwljLb1KNu2PyE15wGda6yanA== X-Gm-Gg: ATEYQzyGEaxT5Jn007GXd68srygKykvBRR2posNBNF83MHRSn3qpI8bHp4VQeAH/Csa t0/KjWA+5bdwp4DGZkpMBcu44+GwfErgpISM8hDI+idQpGmuNQhxEFxpOhJKU0en0M8yiXuYoln /A5ZLgV7gKzdT/SxMmvbMpMUj2w3Y6RJcCK+3Q7qklkT7iImTtgAZalgtDd8joOM74Ebhb3drRm P77bTTwozVblc8Psjzk7qR2f+/SnB2X8BiKZcA+XHqQL77P9x9c9LUU5rpZvrWHIzdq0DRo2dij yWotrl4WLUfD9w7yDHtFdwd47HlAA6ZYkazMdQB3ibDUtKm5jWFBRWDnDNsJv6TagdmK2QDDU50 NbNPbsy8/xxTu74XG9gJH8x+VVsotPDBtYnXBV7wtGcxS2xG6zwcQyzcPDdL07B+KaZ+S8HiPez x66xBzQFdvge5m1v+50q0dJDZTpIRf25i2gugGbJo/69tqmWEN3bHvclFY+pPzrW+o+8uHBHUqh OlZ X-Received: by 2002:a05:7300:6413:b0:2c0:dc7e:ed17 with SMTP id 5a478bee46e88-2c93116f5d6mr3146575eec.10.1775100269336; Wed, 01 Apr 2026 20:24:29 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:29 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v7 03/16] platform/x86: lenovo-wmi-other: Balance component bind and unbind Date: Thu, 2 Apr 2026 03:24:11 +0000 Message-ID: <20260402032424.678528-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Rong Zhang When lwmi_om_master_bind() fails, the master device's components are left bound, with the aggregate device destroyed due to the failure (found by sashiko.dev [1]). Balance calls to component_bind_all() and component_unbind_all() when an error is propagated to the component framework. No functional change intended. Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Cc: stable@vger.kernel.org Link: https://sashiko.dev/#/patchset/20260331181208.421552-1-derekjohn.clar= k%40gmail.com [1] Signed-off-by: Rong Zhang --- drivers/platform/x86/lenovo/wmi-other.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index b47418df099f..4b47b5886e33 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -1068,8 +1068,11 @@ static int lwmi_om_master_bind(struct device *dev) =20 priv->cd00_list =3D binder.cd00_list; priv->cd01_list =3D binder.cd01_list; - if (!priv->cd00_list || !priv->cd01_list) + if (!priv->cd00_list || !priv->cd01_list) { + component_unbind_all(dev, NULL); + return -ENODEV; + } =20 lwmi_om_fan_info_collect_cd00(priv); =20 --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f178.google.com (mail-dy1-f178.google.com [74.125.82.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29F3F35AC2C for ; Thu, 2 Apr 2026 03:24:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100272; cv=none; b=NJncK5xKE5+ro9GGw08CIuh0RqgZiEyBX4Ap2JLyVmD2cykNLaztmyaHJ4OnvRF9hDCgOupXcmO+GxUi4XEnVEu4aG2/2OW1YCNyG3ZlZpllsx4lVidZ8/93RF5Qv7MFiH26kLvg9GrtLzaI9RKutPoUuMUke9Af4vXw+cSii+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100272; c=relaxed/simple; bh=fqoWirm15gyR2T5vILMgWW6g7wMD/2DlfAbl65EnpPE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PNZ+/NQP5YC6XXc5CX9H6g5fJ90M+0hA0/ufLFl/mzrNcHNtXZCX2v3zxY5ALTBvIyQdqbzh+vNoeyDRphDYy16bzeHwOi635JmVZv3tFyzb7lCwblUozNlX1FWo1RPrt6HrHe0jtC9zBQYRR2ITzu21ZeuO+CDBkXP65snwC1o= 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=gvB7N8yA; arc=none smtp.client-ip=74.125.82.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gvB7N8yA" Received: by mail-dy1-f178.google.com with SMTP id 5a478bee46e88-2b4520f6b32so598371eec.0 for ; Wed, 01 Apr 2026 20:24:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100270; x=1775705070; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3yX9dP9ip8JwFkjEQDaOaU6XeU3b97kM6xm6qGhhPLg=; b=gvB7N8yAGoxM3WrpDbg2sVtW5HbAqlsLuFc2brd/PlqVWs6qBIqJBVOIZ9y+C+HrLB fDTdNK188Pny2zh5PYGLrD5/Bno/odfFU9dzwXBvUts4h9bafYT0i3zmsDz0F+vbaPzv 2RHcSMjVMhWaTcMuatbvFEtDEppdQoo0LjQVeazyLHotLvxYz6HsZ/RAgctPmONIoNJj 3xjrpNSHlm/TDhJinJBUKkALGn4b8YENqOqoOEqQcID9H4V374kaxiJqxDNf59psKHel hLdlEeebwT4+pwuhBy5RyD5Qc9UPV6qcOBYp16h1kzaphNkxPO5ySpMcUxClTx/Hit26 7OGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100270; x=1775705070; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=3yX9dP9ip8JwFkjEQDaOaU6XeU3b97kM6xm6qGhhPLg=; b=AC1r+nRTX/a/AhsqMoRTlij1cyx9a930EQJdae8s1TFnwzYipDkfFhOXDYJfvB8t38 WdPR42enN8879Qtr9dQdahp/7ual4pWxra+MSAkKY0mwHkw8B1QVr8oVqg8Fzfe2XMPz N7zw7bLf9BETLSo/5HT/T53NyMJ9Fk2umr4J+6n+Ad7UqVkqcnDpqt103I9QaZrd+2Fu rQzDhurMSi2MsUBnt1b5pca5P2M2Rap9OJ+x6j1u7NCAAYUz7dncdrR25u9r+z1w2cnR 53vovMGcPp4H2abILDDtPRtLIS9+bu/skALMV2TAx3h1ucumOVGUN801ZELgy+s0FjBs R3dg== X-Forwarded-Encrypted: i=1; AJvYcCXErbXB1RldLCDujKcfT5+sMUb2zmH1nvBlH2apcWF81xbi5OS5QaXeLlsMniIhb8rmrDYrlj0qr1cL6BI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy3gNWPAtOGhM49/GEfA0HfK0yu00zOJ6RI5YIPAxrsk6R44PTI WBkAcTPXUTx6PNyWo3CfSrD6jyM/pdMaWVd066fpfIfAbVjBFIqNq8gK X-Gm-Gg: ATEYQzzPZtrlXcozczbmB8KNJTPEduRnG1hjjV8nA09X/mXaUQaA99oEyQC8WBJ4t/K MXCKCCfs/gn8wxubiOVnHyhJ7w+rT+08AEKUPj49/gykpklTkUGizQtvsGnxtydLmbf0jPzx80q VJc0g48uMvolObI0xHGaiPN+97I5OWCdETLzUDCFce29FIhnuEHttYHrlP75SrW3gkk9N3XVWDj seqflni6vDN4GdClBVtdl5F1HOmSv5U4oSUYNpBJ/4LY2eD1WoVtYdLaFdHAPrKEq3r+UGS1PHG EMoSeP5FV1hImYM6o7QGIwKRTGcpeUvNIR7nVQf1bz29CwDeLGHEmWS+vmr8l6ajMxP4Qt6lQa5 yVl/4PdoMyS0qrFOsfuOkTih61FIG3+m0kB6X3Z+ppbGIpZfNK1tNOOffGY5ngDdgop99v4AHPt Pc93VzE1aOxDPZe0NhChZjLVHWiNirOtC1+kXT5GQp4dUsUnQHsOMbFFe5EFG28RJwhVt5jCVen GxL X-Received: by 2002:a05:7301:fa0d:b0:2c1:85a:d25d with SMTP id 5a478bee46e88-2c930e6bc1emr3147985eec.1.1775100270216; Wed, 01 Apr 2026 20:24:30 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:29 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v7 04/16] platform/x86: lenovo-wmi-other: Zero initialize WMI arguments Date: Thu, 2 Apr 2026 03:24:12 +0000 Message-ID: <20260402032424.678528-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Adds explicit initialization of wmi_method_args_32 declarations with zero values to prevent uninitialized data from being sent to the device BIOS when passed. No functional change intended. Fixes: 22024ac5366f ("platform/x86: Add Lenovo Gamezone WMI Driver") Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Reported-by: Rong Zhang Closes: https://lore.kernel.org/platform-driver-x86/95c7e7b539dd0af41189c75= 4fcd35cec5b6fe182.camel@rong.moe/ Cc: stable@vger.kernel.org Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- v7: - Include lwmi_gz_profile_set() fix as well. --- drivers/platform/x86/lenovo/wmi-gamezone.c | 2 +- drivers/platform/x86/lenovo/wmi-other.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.c b/drivers/platform/= x86/lenovo/wmi-gamezone.c index 381836d29a96..ca559e6c031d 100644 --- a/drivers/platform/x86/lenovo/wmi-gamezone.c +++ b/drivers/platform/x86/lenovo/wmi-gamezone.c @@ -203,7 +203,7 @@ static int lwmi_gz_profile_set(struct device *dev, enum platform_profile_option profile) { struct lwmi_gz_priv *priv =3D dev_get_drvdata(dev); - struct wmi_method_args_32 args; + struct wmi_method_args_32 args =3D {}; enum thermal_mode mode; int ret; =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 4b47b5886e33..985cb9859b44 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -166,7 +166,7 @@ MODULE_PARM_DESC(relax_fan_constraint, */ static int lwmi_om_fan_get_set(struct lwmi_om_priv *priv, int channel, u32= *val, bool set) { - struct wmi_method_args_32 args; + struct wmi_method_args_32 args =3D {}; u32 method_id, retval; int err; =20 @@ -773,7 +773,7 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, struct tunable_attr_01 *tunable_attr) { struct lwmi_om_priv *priv =3D dev_get_drvdata(tunable_attr->dev); - struct wmi_method_args_32 args; + struct wmi_method_args_32 args =3D {}; struct capdata01 capdata; enum thermal_mode mode; u32 attribute_id; @@ -836,7 +836,7 @@ static ssize_t attr_current_value_show(struct kobject *= kobj, struct tunable_attr_01 *tunable_attr) { struct lwmi_om_priv *priv =3D dev_get_drvdata(tunable_attr->dev); - struct wmi_method_args_32 args; + struct wmi_method_args_32 args =3D {}; enum thermal_mode mode; u32 attribute_id; int retval; --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f176.google.com (mail-dy1-f176.google.com [74.125.82.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB4E735D615 for ; Thu, 2 Apr 2026 03:24:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100273; cv=none; b=Cb8sfr49z6Q0P1sncUloCIC/tViug7hUnhDt0bJu2Z3rEXHN5qBlpcBSVuU34YHq2N1qjW6fNXnkxcp//MJUzeZO2nuotarlmZcEBVUJrgIKHezxNGOpbCj6LmD5kOKCEui+BWqurDRplTfKeGK0ie8ZuM6U60y/YDOOSXvC7ts= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100273; c=relaxed/simple; bh=rSDmCCEiDg6H2odhJiDoxieO0TKl6hml/thK1WrMGBo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Uylz9JJXUaBh8crzyHADaKcbDHZjZBnfltFKfrvZ9SAdoyD6xQdpDjM0JsVn7dTsRr5OTpTmllhdPhkQyGgv0bHlrVQzACpMrHmt+GitP9qTCCctx9o/ID9FsPxnA71Eanzp/uw7wwq1zIPnr6rOLy4iakf9qiepDlBFgdFB1Z4= 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=GIMwCmcF; arc=none smtp.client-ip=74.125.82.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GIMwCmcF" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2c156c4a9efso491925eec.1 for ; Wed, 01 Apr 2026 20:24:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100271; x=1775705071; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VN+fnLwvwAoWFMaejyWO9zQ/OWEWR+6r67Ac0CIVd7Y=; b=GIMwCmcFZVUn+ZFqa8Qkf+N8Ye8N01raD1qk5FSjyxB/u/QF2zfPP3wUrr9jJSEsd2 mgdvL8vKFK/gJaYTjOYtIagfSXpfU0IVv2cmNhEql08H7bG71EcNTmJaVxtdoA7lA740 e2eawrm4uOn+okigMn3UWbHzY7MlJCmHv0wN01jfGBCtgWkmF764TaFQb5NcadtMQa+Z NFrCPFr1mxy2BCAj8JpRWOyAsGv4SHWLsQCbfgtCrp6bQr9Pewju7IapnF2D+ayMoaVH +Tty2eBtuUpZq+9xwgrv+X3k+5lAXqMKopp1TZpsw2n0z0+sboTRO5M67q/Isxtq1YY0 aEBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100271; x=1775705071; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=VN+fnLwvwAoWFMaejyWO9zQ/OWEWR+6r67Ac0CIVd7Y=; b=MVvNZuu1pfVtXp0kIwjuXEJqGZ1JCzG2Mf0U9WkZPyDS5ZNsyHcND7wNQUX2eGFXUg JZclrYMqjtTrDXf0A6S1Kp0FSAySwD6xTDy0ax87790SKib3TAgNAzIIxfJe+aWWNjEz PGSzISQwOh6QJ+n+mUKDXEJnaXTjiY094GValwCdfCUwEDK3/6oS7Ezz4V5v3y21mwY8 mDP7s6j3EqL5G7DQXdyw+EtQDPNCR6NHxTMBZH8PkZGhldpQ171HGFkzmLQ07/91YNJU WSGA6MFhHy/A+tNvu+UknasOBnvDe/hn8bdmICg4w7W9dzQdR+jEf2MpW68iilIcy0bS ddqQ== X-Forwarded-Encrypted: i=1; AJvYcCUbIyGFxmr8HnM2gh3QsyzhMv70N2QFoPy6xebdYPtXOISonG0JB/iY2dzgbOe75jNrbGAtvkEWkmbEonU=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0l0ov7aqySr0TUu4yrVHJ7tMUDPWKmTR0ZHGvSyCMZ1QuQeC4 ImbYnYKCkULQrJtWfFfJg+ak2UARYxoE8E8VdeZgqhI8A9hfctOpAUXd X-Gm-Gg: ATEYQzzhzog7yavwBQNiU8lJEeLQUlu1XpcKXfUUWrrYSq9FGSNXnhvl97RnNu89f9k 6+jdWO7jGAUfkiVnytKdKzpF7LA1FwuKAQhl0TV/2D1mHgcsk50CYyG3nfJReJEzoYA6C7S2rjE 3tpSOM2NjF42d2KIl7gwLYCSNz5LrzeEDCjLlYCWj8V9F26hAyNLgxs4YoU9OA+nahHuREAU4oA 5jBZv7wZi0rK50Yf/loN48l9kZcsv+3Z11HF07CQyr4k5pLjcwfnybfIsbAba+NTgBXwnB+gkEt RFrh7jqBy1w6h3+TATl19YgizpY8beCwMaSSeiPHCgIabhdl8UIQ/SopGJbwdI78ct2Tuog6i5E 8b3DAD/zciXNk7rG1vdzvCMRRtdR3YLI6x0sFk1H9YLiERc4hiHdkL1myastvDVEg6aKWcDnplj 6A6ioICfKdUrrqwTEGIPF7P8YM0ib6S4idtI9GgMw5gK8XkPtkb89dgW9Mtcl00zB+rJM9WHmBC zRp X-Received: by 2002:a05:7300:e613:b0:2c8:b5e1:6b03 with SMTP id 5a478bee46e88-2c932ea9d1bmr3195433eec.23.1775100270860; Wed, 01 Apr 2026 20:24:30 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:30 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v7 05/16] platform/x86: lenovo-wmi-other: Fix tunable_attr_01 struct members Date: Thu, 2 Apr 2026 03:24:13 +0000 Message-ID: <20260402032424.678528-6-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In struct tunable_attr_01 the capdata pointer is unused and the size of the id members is u32 when it should be u8. Fix these prior to adding additional members. No functional change intended. Fixes: e1a5fe662b59 ("platform/x86: Add Lenovo Capability Data 01 WMI Drive= r") Cc: stable@vger.kernel.org Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-other.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 985cb9859b44..0e8a69309ec4 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -546,11 +546,10 @@ static void lwmi_om_fan_info_collect_cd_fan(struct de= vice *dev, struct cd_list * /* =3D=3D=3D=3D=3D=3D=3D=3D fw_attributes (component: lenovo-wmi-capdata 0= 1) =3D=3D=3D=3D=3D=3D=3D=3D */ =20 struct tunable_attr_01 { - struct capdata01 *capdata; struct device *dev; - u32 feature_id; - u32 device_id; - u32 type_id; + u8 feature_id; + u8 device_id; + u8 type_id; }; =20 static struct tunable_attr_01 ppt_pl1_spl =3D { --=20 2.53.0 From nobody Thu Apr 2 20:28:01 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 63AC235F185 for ; Thu, 2 Apr 2026 03:24:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100274; cv=none; b=IdoPbct2o4awY7IGZ4+NOlD23AeCqUylbKW4qhnueTZJOJW2poTUhffwtnDz+/TP3gYKSdCL1wwG1/eu5Q/JUOOuLKgHaVOKmcoeTdA7OmBOAxxc+CAnmho59BJlZ6S5msXfVw9NARDwL13l1h3K+wC2hWJmQqets4ETB6/W2Vs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100274; c=relaxed/simple; bh=bXzCjIcapy1IgU2Cyvj/zIULNmtq90aV6y8VdButOUw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z7lhOLpDBhXIbhyYmHDTmo+bqihzhZUepVWMvMDl1JZ4oD/1tX98HJ37aZnHaT8fEn5dJlozTSAtAl/pUM/5j/yAmJgEk6nvPSnvE070+AZUvWhOk7qT8hvzrccM2Tl4j9ac0hYI9JaanuPRW1OSXJKTv+kLp2IWUeXAeIhrDEQ= 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=p3rL7hnv; 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="p3rL7hnv" Received: by mail-dl1-f44.google.com with SMTP id a92af1059eb24-1271195d2a7so1611535c88.0 for ; Wed, 01 Apr 2026 20:24:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100272; x=1775705072; 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=7vq+xJhjvZJp46ut7S8v+Qz3a1iucTdFdMZuE5J9yuQ=; b=p3rL7hnvOlh192Icplorl3mc/ugZXKICYnPt+wql8MNVyhKURHVGx6MLZNaX+v5dIj lBSrHqwHrkF/oVM8CFiNLBKI7N3LkxmjBA8uRQEZ/GK8c2eXuH4C3oQgullrxHg48epe 8cWkUt8B4ekbpmzegU0ov08JIcfiISF/QYsD3Ui6n5UQoWgW6VusD8PaWXyXVcYd+xZV jrwlXdbbdrMw4zjV7dmVXD897pmEslRmTOctLpn/SgaGVM4QrdoT3Pdhb86MUnX9K77W b1FUqUcpFtmIyaqrkubMZuqxKgNOz+qHa/sncOLrvqhodNl2EKkitUpi/2NgkiqgxrtW 8DkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100272; x=1775705072; 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=7vq+xJhjvZJp46ut7S8v+Qz3a1iucTdFdMZuE5J9yuQ=; b=Z3e/bJ+9Onj2xVRvB1ld1dYOKQZ5cMR/sGB2PqaBhx0RfdiNYNYE+Rltm+658xU/fh 091jtMOxyiVKL7PmS5PNt9jhDjcbmPXba/N227nZDWgOGDXqgMlikuAH54+jlxJtP66/ O+i41jOgcuN/MI1MpgVBSiQBNtL9whuYCbZ/eOreWsUuIPKFWpFd9Q9yQVEvyWv4td3F jUbMF3z9WU4VhxYVjYvJERS9BA3JG81B+y3EFNf0aJrfRRJWrYtLwgtqAkSGP0LvpeqC 0bIU8mVC0Anjz/8XH/iDPQlAKz1Bk4QLRP6wTPOo3zND5L8qzsHryEbQOYunayw3E8RK R32A== X-Forwarded-Encrypted: i=1; AJvYcCVlLE9QO7csusMRmgZnaV7DRgCkp4pzijBDjUcv2y5RXc31G/qkE9g7Evano0rOOvAOOSkhGXYwCV4Zg2Q=@vger.kernel.org X-Gm-Message-State: AOJu0YxgV1+Ai1/C3gBYmv1Ete1aAf/XsB0m7tAv8qkLCqtvqZ4bDh0M hWWzAFNaz9MP6KGHsE33xP9+JOjlSwRiiPCf+QY7wXjxcUKx0G9T3EKW X-Gm-Gg: ATEYQzzTI/aS3gkTSQNqst1sBClxMnM0emhTfP2AINZUPsI3ZN1fKeR/z1sqg0/7LAA MPZ4X/EQEUJ+etY0hHcWg0HsC6c7aqsUA7clTnEYSUSWT8W66u9g5buWKJPieTrFwS/Ppf68wwX /2NbWFCFjU+2do0W4nMC+S9a8sysU5PfD3ORtItZuhvl20vQL5lZ3YW6ZZ8iawjQocLSWQof6w+ FPviAZd+uitz6BbcGOT71orJlHEald3afiegsmN7Ls/MlPg+PCiroBspkNTWPBFWeKkgAI65VhD HyjZtgEJbgGTGtpKIrD+//ZcAXTo8MQgzreCFTRIejpojoEEvSSX1T4LQ9WzCRcVaVsMLADSyTn /WSIAY1MQp8YTJHNOgHZpczlARhrVMk17q1OxOyn1PkrQt5gK+bgIn6ttaaLF4RHduUCRToaFU5 CCRFhf/ecl6CpPDQFq4I3R0G7xaTwT8/dHQIEZ2GgTBk0WnDmUCLzGt6FgdyZqMZCJ/io8IiMnp jQV X-Received: by 2002:a05:7301:6781:b0:2c1:7b61:8731 with SMTP id 5a478bee46e88-2c930e6c1eamr3081064eec.10.1775100271525; Wed, 01 Apr 2026 20:24:31 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:31 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v7 06/16] platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices Date: Thu, 2 Apr 2026 03:24:14 +0000 Message-ID: <20260402032424.678528-7-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Adds lwmi_is_attr_01_supported, and only creates the attribute subfolder if the attribute is supported by the hardware. Due to some poorly implemented BIOS this is a multi-step sequence of events. This is because: - Some BIOS support getting the capability data from custom mode (0xff), while others only support it in no-mode (0x00). - Some BIOS support get/set for the current value from custom mode (0xff), while others only support it in no-mode (0x00). - Some BIOS report capability data for a method that is not fully implemented. - Some BIOS have methods fully implemented, but no complimentary capability data. To ensure we only expose fully implemented methods with corresponding capability data, we check each outcome before reporting that an attribute can be supported. Checking for lwmi_is_attr_01_supported during remove is not done to ensure that we don't attempt to call cd01 or send WMI events if one of the interfaces being removed was the cause of the driver unloading. Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Reported-by: Kurt Borja Closes: https://lore.kernel.org/platform-driver-x86/DG60P3SHXR8H.3NSEHMZ6J7= XRC@gmail.com/ Cc: stable@vger.kernel.org Reviewed-by: Rong Zhang Tested-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- v7: - Move earlier in the series. This required dropping the use of lwmi_attr_id as it will be added later. - Add missing switch between cd_mode_id and cv_mode_id in current_value_store. v6: - Zero initialize args in lwmi_is_attr_01_supported. - Fix formatting. v5: - Move cv/cd_mode_id refrences from path 3/4. - Add missing import for ARRAY_SIZE. - Make lwmi_is_attr_01_supported return bool instead of u32. - Various formatting fixes. v4: - Use for loop instead of backtrace gotos for checking if an attribute is supported. - Add include for dev_printk. - Wrap dev_dbg in lwmi_is_attr_01_supported earlier. - Don't use symmetric cleanup of attributes in error states. --- drivers/platform/x86/lenovo/wmi-gamezone.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 114 ++++++++++++++++++--- 2 files changed, 98 insertions(+), 17 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.h b/drivers/platform/= x86/lenovo/wmi-gamezone.h index 6b163a5eeb95..ddb919cf6c36 100644 --- a/drivers/platform/x86/lenovo/wmi-gamezone.h +++ b/drivers/platform/x86/lenovo/wmi-gamezone.h @@ -10,6 +10,7 @@ enum gamezone_events_type { }; =20 enum thermal_mode { + LWMI_GZ_THERMAL_MODE_NONE =3D 0x00, LWMI_GZ_THERMAL_MODE_QUIET =3D 0x01, LWMI_GZ_THERMAL_MODE_BALANCED =3D 0x02, LWMI_GZ_THERMAL_MODE_PERFORMANCE =3D 0x03, diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 0e8a69309ec4..3e7dfe94499b 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -550,6 +550,8 @@ struct tunable_attr_01 { u8 feature_id; u8 device_id; u8 type_id; + u8 cd_mode_id; /* mode arg for searching capdata */ + u8 cv_mode_id; /* mode arg for set/get current_value */ }; =20 static struct tunable_attr_01 ppt_pl1_spl =3D { @@ -775,7 +777,6 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, struct wmi_method_args_32 args =3D {}; struct capdata01 capdata; enum thermal_mode mode; - u32 attribute_id; u32 value; int ret; =20 @@ -786,13 +787,12 @@ static ssize_t attr_current_value_store(struct kobjec= t *kobj, if (mode !=3D LWMI_GZ_THERMAL_MODE_CUSTOM) return -EBUSY; =20 - attribute_id =3D - FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | + FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | + FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, tunable_attr->cd_mode_id) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); =20 - ret =3D lwmi_cd01_get_data(priv->cd01_list, attribute_id, &capdata); + ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); if (ret) return ret; =20 @@ -803,7 +803,10 @@ static ssize_t attr_current_value_store(struct kobject= *kobj, if (value < capdata.min_value || value > capdata.max_value) return -EINVAL; =20 - args.arg0 =3D attribute_id; + args.arg0 =3D FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | + FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | + FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, tunable_attr->cv_mode_id) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); args.arg1 =3D value; =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, @@ -837,7 +840,6 @@ static ssize_t attr_current_value_show(struct kobject *= kobj, struct lwmi_om_priv *priv =3D dev_get_drvdata(tunable_attr->dev); struct wmi_method_args_32 args =3D {}; enum thermal_mode mode; - u32 attribute_id; int retval; int ret; =20 @@ -845,13 +847,14 @@ static ssize_t attr_current_value_show(struct kobject= *kobj, if (ret) return ret; =20 - attribute_id =3D - FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + /* If "no-mode" is the supported mode, ensure we never send current mode = */ + if (tunable_attr->cv_mode_id =3D=3D LWMI_GZ_THERMAL_MODE_NONE) + mode =3D tunable_attr->cv_mode_id; =20 - args.arg0 =3D attribute_id; + args.arg0 =3D FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | + FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | + FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), @@ -862,6 +865,81 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, return sysfs_emit(buf, "%d\n", retval); } =20 +/** + * lwmi_attr_01_is_supported() - Determine if the given attribute is suppo= rted. + * @tunable_attr: The attribute to verify. + * + * First check if the attribute has a corresponding capdata01 table in the= cd01 + * module under the "custom" mode (0xff). If that is not present then chec= k if + * there is a corresponding "no-mode" (0x00) entry. If either of those pas= ses, + * check capdata->supported for values > 0. If capdata is available, attem= pt to + * determine the set/get mode for the current value property using a simil= ar + * pattern. If the value returned by either custom or no-mode is 0, or we = get + * an error, we assume that mode is not supported. If any of the above che= cks + * fail then the attribute is not fully supported. + * + * The probed cd_mode_id/cv_mode_id are stored on the tunable_attr for lat= er + * reference. + * + * Return: bool. + */ +static bool lwmi_attr_01_is_supported(struct tunable_attr_01 *tunable_attr) +{ + u8 modes[2] =3D { LWMI_GZ_THERMAL_MODE_CUSTOM, LWMI_GZ_THERMAL_MODE_NONE = }; + struct lwmi_om_priv *priv =3D dev_get_drvdata(tunable_attr->dev); + struct wmi_method_args_32 args =3D { 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 FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id)= | + FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | + FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, modes[i]) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + + ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); + if (ret || !capdata.supported) + continue; + tunable_attr->cd_mode_id =3D modes[i]; + cd_mode_found =3D true; + break; + } + + if (!cd_mode_found) + return cd_mode_found; + + dev_dbg(tunable_attr->dev, + "cd_mode_id: %#010x\n", args.arg0); + + /* Determine tunable_attr->cv_mode_id, returns 1 if supported*/ + for (i =3D 0; i < ARRAY_SIZE(modes); i++) { + args.arg0 =3D FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id)= | + FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | + FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, modes[i]) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + + ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, + (unsigned char *)&args, sizeof(args), + &retval); + if (ret || !retval) + continue; + tunable_attr->cv_mode_id =3D modes[i]; + cv_mode_found =3D true; + break; + } + + if (!cv_mode_found) + return cv_mode_found; + + dev_dbg(tunable_attr->dev, "cv_mode_id: %#010x, attribute support level: = %#010x\n", + args.arg0, capdata.supported); + + return capdata.supported > 0 ? true : false; +} + /* Lenovo WMI Other Mode Attribute macros */ #define __LWMI_ATTR_RO(_func, _name) \ { \ @@ -985,12 +1063,14 @@ static void lwmi_om_fw_attr_add(struct lwmi_om_priv = *priv) } =20 for (i =3D 0; i < ARRAY_SIZE(cd01_attr_groups) - 1; i++) { + cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; + if (!lwmi_attr_01_is_supported(cd01_attr_groups[i].tunable_attr)) + continue; + err =3D sysfs_create_group(&priv->fw_attr_kset->kobj, cd01_attr_groups[i].attr_group); if (err) goto err_remove_groups; - - cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; } return; =20 --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f175.google.com (mail-dy1-f175.google.com [74.125.82.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 34DBB3563DD for ; Thu, 2 Apr 2026 03:24:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100277; cv=none; b=hiM+j/xJP+RNI2HN2U0Tj7NPI+zCbhpsh6kunRXDo05P6Xr8WQNAQDj5OHoe8B68ptaEkIttj92dHCyLhsrH2eF9yEBYxPFOPN6DumDv9jcIoqJvjHLyyqqBAWfswN+1N+eilGPts4wcX7UwKkIFjKWT24alMJeQHO6hlCVS0dM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100277; c=relaxed/simple; bh=sNPnhU+aIgmvpyhlZUY6QuIaRA1ZDZZpHjzMbhAuRLY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Nf7AcHBrTJ3zwZ89tT1DWIvmIZx+jnEB4i4DQ7/T5JwOyEpmQod1rcU0AGVGDYBOG0y/z2kh17wbQ3MnpCs/xeyBdHCE3QquyGUMBg87J/YNKYO5JNJg35o+RG2sQwcIJ59qjmzdl5Slw0gxe82XFfZNUrGcRSl8MsDSpx7x0M8= 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=F3TkdteR; arc=none smtp.client-ip=74.125.82.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="F3TkdteR" Received: by mail-dy1-f175.google.com with SMTP id 5a478bee46e88-2bd9a485bd6so1038884eec.1 for ; Wed, 01 Apr 2026 20:24:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100272; x=1775705072; 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=aXLSVUf/xHtj30r+XaQCcWYbykzsOo3w6/x8AuyQSzs=; b=F3TkdteRal39cU5dZIdXtuL2w3Am9YbM9tPncJaNLxrDoFqX8/aEd4IJK+c19LUdAl AK4ztma79fmkpHb3TxgdHeXM+1JRXLNq9iReep0cC6k+6SA7Z/yiq48uPg9rTKcLoQyS 01H8Rn5Y60nkeVqgdTGYQjKx/YvwT+xdC7LZ5nxkuzW9RrU2s3ntwbsQr81dyJ/pfkRk 2venVZTyItFajtXG3CLeo0L4GPO96olH7KhykBu5U4xgH8Z95XQfYfYCWcR+vWLptMmT 8AZDtw+RktlOMjzv0JQTLUtPh6cvoRXpRhds6lY5vztQXRcWqvVqenToymFfMiaBAzYO oryA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100272; x=1775705072; 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=aXLSVUf/xHtj30r+XaQCcWYbykzsOo3w6/x8AuyQSzs=; b=EWXKBl/fE/97DhJNhy0akMuvROXorBszeI8nlws6zUkTZYTj57bQjdqrzknTJwPMxg Mk59SOqelG+2SjmMRp95EXlLeQKE6QzHMI6W95Lh7zWi1fLphTM7pr0kAGSqh2OH4BuL ne7vBKzXmIFb2r/0csCaMr0D4F7kE2kWdmOV/h+blg/3JZdrmrvizwp+O1rcICudt0KI FSjx2VPK/JcMgpdF0GuCrql5dwBHotuKm41GnTERS3Be3wY8A1bOiCdBlurM58+vCLx5 l0GeL/7sejirF/e22tpn1RL2dzSo/3xLSg4ctycXfquIQ3pnflEvzkAvD1vj+Q0eAdty /iIQ== X-Forwarded-Encrypted: i=1; AJvYcCUewO67dL2v+1p3LreXZPRFJ4kcVeZahCMDZgHOQULSHr7fn8ACEi3kAbkUUeNx4Byma4XKzODJaAMIPSo=@vger.kernel.org X-Gm-Message-State: AOJu0YyBDg58lhWzsfma1ZzokC0TBy2pFt3aovCQ97FHCJRzGpTKqK9d jLu+dHlbyad2kngWVtognTiqMedawQn0Oz1HJ5DzKF77l9j7G9Cr2IsR X-Gm-Gg: ATEYQzzaJzqsoX+259TOwvmxcyQ2ZwefR0pY4Cn6vKf2z+DhzsJrytS+/B03dCQDCXD pY/GVH/UjH/67rdM6gOs/8BOtCmsyP0Yswpn4/7nwJMDqMF0PWY1N4Lf+irke3gP9e5tnOCPTeC jXC4/1MwHRnis3TpgEwl9DrA78xGTV+/Sapb4CNksMXx065OBdb2b7VLabSELAuOgx8yjIcCmgQ WvoH7qz79Zgs84EtLKsAJi2tboXT44YOb1+HH5ejI2Jc4EEdrav66BTJRHanbz438ynWiUYpb4B lkQV1B/dQcGfSmirAlW12OnS8xUn/FJhY6zga9i7wwZayfyw1P8+O8mLpxoiNKqbIZS9UJHyNAd DuobzPhZdrEZuvPrC00FwVy/BlPTCKcERuf69bWkJoCoLOigUG9pX+JfvnHNefB2lh+Sutl0f58 HPkuXYJoie7nGptTwwH5639CrIgVOf5ik7jrc/qzSAj7HTzwjqO34/Tz9dnCMZH+Acau+yvp243 pBn X-Received: by 2002:a05:7301:fa0d:b0:2c4:4276:709f with SMTP id 5a478bee46e88-2c930c7652cmr3380164eec.1.1775100272239; Wed, 01 Apr 2026 20:24:32 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:31 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, kernel test robot Subject: [PATCH v7 07/16] platform/x86: lenovo: Decouple lenovo-wmi-gamezone and lenovo-wmi-other Date: Thu, 2 Apr 2026 03:24:15 +0000 Message-ID: <20260402032424.678528-8-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Rong Zhang Currently, lenovo-wmi-gamezone depends on lenovo-wmi-other as the former imports symbols from the latter. The imported symbols are just used to register a notifier block. However, there is no runtime dependency between both drivers, and either of them can run without the other, which is the major purpose of using the notifier framework. Such a link-time dependency is non-optimal. A previous attempt to "fix" it made LENOVO_WMI_GAMEZONE select LENOVO_WMI_TUNING, which was fundamentally broken and resulted in undefined Kconfig behavior, as `select' cannot be used on a symbol with potentially unmet dependencies. Decouple both drivers by moving the thermal mode notifier chain to lenovo-wmi-helpers. Methods for notifier block (un)registration are exported for lenovo-wmi-gamezone, while a method for querying the current thermal mode are exported for lenovo-wmi-other. This turns the dependency graph from +------------ lenovo-wmi-gamezone | | v | lenovo-wmi-helpers | ^ | | V +------------ lenovo-wmi-other into +------------ lenovo-wmi-gamezone | v lenovo-wmi-helpers ^ | +------------ lenovo-wmi-other To make it clear, the name of the notifier chain is also renamed from `om_chain_head' to `tm_chain_head', indicating that it's used to query the current thermal mode. No functional change intended. Fixes: 6e38b9fcbfa3 ("platform/x86: lenovo: gamezone needs "other mode"") Cc: stable@vger.kernel.org Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202603252259.gHvJDyh3-lkp@int= el.com/ Closes: https://lore.kernel.org/oe-kbuild-all/202603260302.X0NjQOda-lkp@int= el.com/ Signed-off-by: Rong Zhang --- drivers/platform/x86/lenovo/Kconfig | 1 - drivers/platform/x86/lenovo/wmi-gamezone.c | 4 +- drivers/platform/x86/lenovo/wmi-helpers.c | 101 ++++++++++++++++++++ drivers/platform/x86/lenovo/wmi-helpers.h | 8 ++ drivers/platform/x86/lenovo/wmi-other.c | 104 +-------------------- drivers/platform/x86/lenovo/wmi-other.h | 16 ---- 6 files changed, 112 insertions(+), 122 deletions(-) delete mode 100644 drivers/platform/x86/lenovo/wmi-other.h diff --git a/drivers/platform/x86/lenovo/Kconfig b/drivers/platform/x86/len= ovo/Kconfig index f885127b007f..09b1b055d2e0 100644 --- a/drivers/platform/x86/lenovo/Kconfig +++ b/drivers/platform/x86/lenovo/Kconfig @@ -252,7 +252,6 @@ config LENOVO_WMI_GAMEZONE select ACPI_PLATFORM_PROFILE select LENOVO_WMI_EVENTS select LENOVO_WMI_HELPERS - select LENOVO_WMI_TUNING help Say Y here if you have a WMI aware Lenovo Legion device and would like = to use the platform-profile firmware interface to manage power usage. diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.c b/drivers/platform/= x86/lenovo/wmi-gamezone.c index ca559e6c031d..a91089694727 100644 --- a/drivers/platform/x86/lenovo/wmi-gamezone.c +++ b/drivers/platform/x86/lenovo/wmi-gamezone.c @@ -23,7 +23,6 @@ #include "wmi-events.h" #include "wmi-gamezone.h" #include "wmi-helpers.h" -#include "wmi-other.h" =20 #define LENOVO_GAMEZONE_GUID "887B54E3-DDDC-4B2C-8B88-68A26A8835D0" =20 @@ -385,7 +384,7 @@ static int lwmi_gz_probe(struct wmi_device *wdev, const= void *context) return ret; =20 priv->mode_nb.notifier_call =3D lwmi_gz_mode_call; - return devm_lwmi_om_register_notifier(&wdev->dev, &priv->mode_nb); + return devm_lwmi_tm_register_notifier(&wdev->dev, &priv->mode_nb); } =20 static const struct wmi_device_id lwmi_gz_id_table[] =3D { @@ -407,7 +406,6 @@ module_wmi_driver(lwmi_gz_driver); =20 MODULE_IMPORT_NS("LENOVO_WMI_EVENTS"); MODULE_IMPORT_NS("LENOVO_WMI_HELPERS"); -MODULE_IMPORT_NS("LENOVO_WMI_OTHER"); MODULE_DEVICE_TABLE(wmi, lwmi_gz_id_table); MODULE_AUTHOR("Derek J. Clark "); MODULE_DESCRIPTION("Lenovo GameZone WMI Driver"); diff --git a/drivers/platform/x86/lenovo/wmi-helpers.c b/drivers/platform/x= 86/lenovo/wmi-helpers.c index 80021f59d1ef..5fa7a92c145e 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. @@ -85,6 +89,103 @@ int lwmi_dev_evaluate_int(struct wmi_device *wdev, u8 i= nstance, u32 method_id, }; EXPORT_SYMBOL_NS_GPL(lwmi_dev_evaluate_int, "LENOVO_WMI_HELPERS"); =20 +/** + * lwmi_tm_register_notifier() - Add a notifier to the blocking notifier c= hain + * @nb: The notifier_block struct to register + * + * Call blocking_notifier_chain_register to register the notifier block to= the + * thermal mode notifier chain. + * + * Return: 0 on success, %-EEXIST on error. + */ +int lwmi_tm_register_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&tm_chain_head, nb); +} +EXPORT_SYMBOL_NS_GPL(lwmi_tm_register_notifier, "LENOVO_WMI_HELPERS"); + +/** + * lwmi_tm_unregister_notifier() - Remove a notifier from the blocking not= ifier + * chain. + * @nb: The notifier_block struct to register + * + * Call blocking_notifier_chain_unregister to unregister the notifier bloc= k from the + * thermal mode notifier chain. + * + * Return: 0 on success, %-ENOENT on error. + */ +int lwmi_tm_unregister_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&tm_chain_head, nb); +} +EXPORT_SYMBOL_NS_GPL(lwmi_tm_unregister_notifier, "LENOVO_WMI_HELPERS"); + +/** + * devm_lwmi_tm_unregister_notifier() - Remove a notifier from the blocking + * notifier chain. + * @data: Void pointer to the notifier_block struct to register. + * + * Call lwmi_tm_unregister_notifier to unregister the notifier block from = the + * thermal mode notifier chain. + * + * Return: 0 on success, %-ENOENT on error. + */ +static void devm_lwmi_tm_unregister_notifier(void *data) +{ + struct notifier_block *nb =3D data; + + lwmi_tm_unregister_notifier(nb); +} + +/** + * devm_lwmi_tm_register_notifier() - Add a notifier to the blocking notif= ier + * chain. + * @dev: The parent device of the notifier_block struct. + * @nb: The notifier_block struct to register + * + * Call lwmi_tm_register_notifier to register the notifier block to the + * thermal mode notifier chain. Then add devm_lwmi_tm_unregister_notifier + * as a device managed action to automatically unregister the notifier blo= ck + * upon parent device removal. + * + * Return: 0 on success, or an error code. + */ +int devm_lwmi_tm_register_notifier(struct device *dev, + struct notifier_block *nb) +{ + int ret; + + ret =3D lwmi_tm_register_notifier(nb); + if (ret < 0) + return ret; + + return devm_add_action_or_reset(dev, devm_lwmi_tm_unregister_notifier, + nb); +} +EXPORT_SYMBOL_NS_GPL(devm_lwmi_tm_register_notifier, "LENOVO_WMI_HELPERS"); + +/** + * lwmi_tm_notifier_call() - Call functions for the notifier call chain. + * @mode: Pointer to a thermal mode enum to retrieve the data from. + * + * Call blocking_notifier_call_chain to retrieve the thermal mode from the + * lenovo-wmi-gamezone driver. + * + * Return: 0 on success, or an error code. + */ +int lwmi_tm_notifier_call(enum thermal_mode *mode) +{ + int ret; + + ret =3D blocking_notifier_call_chain(&tm_chain_head, + LWMI_GZ_GET_THERMAL_MODE, &mode); + if ((ret & ~NOTIFY_STOP_MASK) !=3D NOTIFY_OK) + return -EINVAL; + + return 0; +} +EXPORT_SYMBOL_NS_GPL(lwmi_tm_notifier_call, "LENOVO_WMI_HELPERS"); + MODULE_AUTHOR("Derek J. Clark "); MODULE_DESCRIPTION("Lenovo WMI Helpers Driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/lenovo/wmi-helpers.h b/drivers/platform/x= 86/lenovo/wmi-helpers.h index 20fd21749803..651a039228ed 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.h +++ b/drivers/platform/x86/lenovo/wmi-helpers.h @@ -7,6 +7,8 @@ =20 #include =20 +struct device; +struct notifier_block; struct wmi_device; =20 struct wmi_method_args_32 { @@ -17,4 +19,10 @@ struct wmi_method_args_32 { int lwmi_dev_evaluate_int(struct wmi_device *wdev, u8 instance, u32 method= _id, unsigned char *buf, size_t size, u32 *retval); =20 +int lwmi_tm_register_notifier(struct notifier_block *nb); +int lwmi_tm_unregister_notifier(struct notifier_block *nb); +int devm_lwmi_tm_register_notifier(struct device *dev, + struct notifier_block *nb); +int lwmi_tm_notifier_call(enum thermal_mode *mode); + #endif /* !_LENOVO_WMI_HELPERS_H_ */ diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 3e7dfe94499b..1d1bab98298b 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -40,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -49,7 +48,6 @@ #include "wmi-events.h" #include "wmi-gamezone.h" #include "wmi-helpers.h" -#include "wmi-other.h" #include "../firmware_attributes_class.h" =20 #define LENOVO_OTHER_MODE_GUID "DC2A8805-3A8C-41BA-A6F7-092E0089CD3B" @@ -81,7 +79,6 @@ #define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 -static BLOCKING_NOTIFIER_HEAD(om_chain_head); static DEFINE_IDA(lwmi_om_ida); =20 enum attribute_property { @@ -109,7 +106,6 @@ struct lwmi_om_priv { struct device *hwmon_dev; struct device *fw_attr_dev; struct kset *fw_attr_kset; - struct notifier_block nb; struct wmi_device *wdev; int ida_id; =20 @@ -577,102 +573,6 @@ struct capdata01_attr_group { struct tunable_attr_01 *tunable_attr; }; =20 -/** - * lwmi_om_register_notifier() - Add a notifier to the blocking notifier c= hain - * @nb: The notifier_block struct to register - * - * Call blocking_notifier_chain_register to register the notifier block to= the - * lenovo-wmi-other driver notifier chain. - * - * Return: 0 on success, %-EEXIST on error. - */ -int lwmi_om_register_notifier(struct notifier_block *nb) -{ - return blocking_notifier_chain_register(&om_chain_head, nb); -} -EXPORT_SYMBOL_NS_GPL(lwmi_om_register_notifier, "LENOVO_WMI_OTHER"); - -/** - * lwmi_om_unregister_notifier() - Remove a notifier from the blocking not= ifier - * chain. - * @nb: The notifier_block struct to register - * - * Call blocking_notifier_chain_unregister to unregister the notifier bloc= k from the - * lenovo-wmi-other driver notifier chain. - * - * Return: 0 on success, %-ENOENT on error. - */ -int lwmi_om_unregister_notifier(struct notifier_block *nb) -{ - return blocking_notifier_chain_unregister(&om_chain_head, nb); -} -EXPORT_SYMBOL_NS_GPL(lwmi_om_unregister_notifier, "LENOVO_WMI_OTHER"); - -/** - * devm_lwmi_om_unregister_notifier() - Remove a notifier from the blocking - * notifier chain. - * @data: Void pointer to the notifier_block struct to register. - * - * Call lwmi_om_unregister_notifier to unregister the notifier block from = the - * lenovo-wmi-other driver notifier chain. - * - * Return: 0 on success, %-ENOENT on error. - */ -static void devm_lwmi_om_unregister_notifier(void *data) -{ - struct notifier_block *nb =3D data; - - lwmi_om_unregister_notifier(nb); -} - -/** - * devm_lwmi_om_register_notifier() - Add a notifier to the blocking notif= ier - * chain. - * @dev: The parent device of the notifier_block struct. - * @nb: The notifier_block struct to register - * - * Call lwmi_om_register_notifier to register the notifier block to the - * lenovo-wmi-other driver notifier chain. Then add devm_lwmi_om_unregiste= r_notifier - * as a device managed action to automatically unregister the notifier blo= ck - * upon parent device removal. - * - * Return: 0 on success, or an error code. - */ -int devm_lwmi_om_register_notifier(struct device *dev, - struct notifier_block *nb) -{ - int ret; - - ret =3D lwmi_om_register_notifier(nb); - if (ret < 0) - return ret; - - return devm_add_action_or_reset(dev, devm_lwmi_om_unregister_notifier, - nb); -} -EXPORT_SYMBOL_NS_GPL(devm_lwmi_om_register_notifier, "LENOVO_WMI_OTHER"); - -/** - * lwmi_om_notifier_call() - Call functions for the notifier call chain. - * @mode: Pointer to a thermal mode enum to retrieve the data from. - * - * Call blocking_notifier_call_chain to retrieve the thermal mode from the - * lenovo-wmi-gamezone driver. - * - * Return: 0 on success, or an error code. - */ -static int lwmi_om_notifier_call(enum thermal_mode *mode) -{ - int ret; - - ret =3D blocking_notifier_call_chain(&om_chain_head, - LWMI_GZ_GET_THERMAL_MODE, &mode); - if ((ret & ~NOTIFY_STOP_MASK) !=3D NOTIFY_OK) - return -EINVAL; - - return 0; -} - /* Attribute Methods */ =20 /** @@ -780,7 +680,7 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, u32 value; int ret; =20 - ret =3D lwmi_om_notifier_call(&mode); + ret =3D lwmi_tm_notifier_call(&mode); if (ret) return ret; =20 @@ -843,7 +743,7 @@ static ssize_t attr_current_value_show(struct kobject *= kobj, int retval; int ret; =20 - ret =3D lwmi_om_notifier_call(&mode); + ret =3D lwmi_tm_notifier_call(&mode); if (ret) return ret; =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.h b/drivers/platform/x86= /lenovo/wmi-other.h deleted file mode 100644 index 8ebf5602bb99..000000000000 --- a/drivers/platform/x86/lenovo/wmi-other.h +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ - -/* Copyright (C) 2025 Derek J. Clark */ - -#ifndef _LENOVO_WMI_OTHER_H_ -#define _LENOVO_WMI_OTHER_H_ - -struct device; -struct notifier_block; - -int lwmi_om_register_notifier(struct notifier_block *nb); -int lwmi_om_unregister_notifier(struct notifier_block *nb); -int devm_lwmi_om_register_notifier(struct device *dev, - struct notifier_block *nb); - -#endif /* !_LENOVO_WMI_OTHER_H_ */ --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f171.google.com (mail-dy1-f171.google.com [74.125.82.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B7DF636074D for ; Thu, 2 Apr 2026 03:24:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100275; cv=none; b=kH3aWuSAC8S754jDtyKNccSGdsB1xzF3QF2AMPbflWhlh2skuE9noqaHCBrTZgjmt1ob4m22TGVb62wGVdQ/vaI38kAwLmu4GBwkQOq9+1hxJqdLT+ONVwiCCx5p4FbezY9rQYOurU0gSW1j+Fjm7I/NwMY9VP6wU5Tdhk0RRc0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100275; c=relaxed/simple; bh=p2FW/7Co4gTuIHeXkZjiYHRP3A6bMG+GAgvWuoH8jxY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YnD2+vhSX7gLH46UTxsUrb6/bp0997yYxnR0mgXOkWAHUUZyuHatsKI2hnpPZYTVWyM0C44suLE4t4aSsJZANJjGMZ6/KqjIuXOWao5yZB/badI7QLfoK2d3RR8bxkRF5uEVkrKe5X71pAZ0o8x0iYaGezMGLxNldF6w5cImLBs= 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=fmsSY2+c; arc=none smtp.client-ip=74.125.82.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fmsSY2+c" Received: by mail-dy1-f171.google.com with SMTP id 5a478bee46e88-2bd9a485bd6so1038898eec.1 for ; Wed, 01 Apr 2026 20:24:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100273; x=1775705073; 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=7z92RBuaPY9HUNloJ1nuQ1a3FjYPlCzVXIVhYHp9tSk=; b=fmsSY2+cnrZCab5MiEqSx/pmaSvf8AiLC40PGKoToGmL9pWa1RLkqQoTKBsE8bbse1 JY0OohhFYQ/f8sTRJloibtD+m0inMFBCovbj++uyt90JD3ujIbZpWXWQo2+BQPHg6dCI Cn4dZEGijAMreggLfk3dndul8dCCfh3e7mLSPMNfXyYqO7+f8YCpPW62POl7CvAk2zKe dKCF5ptZOZpvEdHsc3ZngaeeUjIp91PY5Tbo55Y0gPXD8dwGrUUzKgD6lrq8KLHeroDX viHv+EB6EbNEre6regjfNYSDz+nPOjqKSp+yV43fGA0CcjkdxHhbilOQtr/CfHepOHQJ i7QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100273; x=1775705073; 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=7z92RBuaPY9HUNloJ1nuQ1a3FjYPlCzVXIVhYHp9tSk=; b=JJRAeeUpaMBjSGsg7p3pS2mOYT/4I8nrtpZ4wrjHjdu+CNg+8GoVGJaJokpwNMLPY1 kZjXrb6JKHgbKBorNasJFxiKDxgqI3VWf/8dOQ6VDxMbu1I+ZYdUIsUMPdwfXJ8U0EEg pB+h71bCObqnq462q0E1npbXu76kpEnpX/nclTj6S+rDMXLTOLAnmo2xPngTbFhbXfWt jALAfzZEl389OW559JFwfv/cnHZ/MQQTKvHGT91JWy/RlS1seLP+DfJHL9nYBnpE5aMh UD0f5PUqYPs40yommulJMQNO1UCOSlR00gDA87QavgBB1Uzj36AHNgOfn0xNCU6XRQL4 idOQ== X-Forwarded-Encrypted: i=1; AJvYcCUXUi1tF3R+vLWPaqp+TT7Ed6CCSHj/Pwm9KggBg2mpD7fpOMBBGWhFEjgP/3PgZV/laKBeCbmczqMInY8=@vger.kernel.org X-Gm-Message-State: AOJu0YzqwoSrDgxYapSU+brLRTe9B2oz2uGbC98v1suaTTa3NylEssb1 IdQTpiieUd9EGmtuSYe0+fG3/KD7UHU8WlKvV1lsEmYocvuYeJI/ZF+1 X-Gm-Gg: ATEYQzzoMFA70s9AUsp4ZtT/GIiQYb0+EOlwQaSGPk4YCGp/aiI4FMBGw+wrbcvHE33 KUukyPEVgOH49YzTU3T64RcaaZWoO9Ec6PEfJ2dh9lZLTxWiQEbPr+yqmY5uNH9RRz5WMc+InQ0 L4VZKDLTuX8LCl8EIERdnZ2GLMYl9mWqRiqQzVRTS/+UAMEUmbTNG036LjDk0x5yuE9GvuMynb5 iXBg3DdTIGGpeHl4FPYSzPXUtCvxnXNSxZ4SSUFWeEu3xLIkbev3viUlXSXnCcYEkGaPfIRAy49 BdDket/cglm+A3ZJlmfpBkeExab0xhGKENVhkSmAFER5s2ETmlVHsDR8e8We8ojcXwA0IKJbRa7 /CbUeI9+PDhg34vQOVJ0UYpUhBBgtzbppDOzlTIqlPsXneDl+sGFqhQVyCS6p5jT8XEmmjObGht 3oTp4XCxjYJp6kdmwE2C3ElEY2A5+Amwhbmr5pYmfKMAXo0iNJZPRSySMLAK3l5x2/8UKC8gFmv ks8 X-Received: by 2002:a05:7300:2211:b0:2c1:5b23:1752 with SMTP id 5a478bee46e88-2c932bb1657mr3343404eec.23.1775100272848; Wed, 01 Apr 2026 20:24:32 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:32 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v7 08/16] platform/x86: lenovo-wmi-helpers: Move gamezone enums to wmi-helpers Date: Thu, 2 Apr 2026 03:24:16 +0000 Message-ID: <20260402032424.678528-9-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In a later patch in the series the thermal mode enum will be accessed across three separate drivers (wmi-capdata, wmi-gamezonem and wmi-other). An additional patch in the series will also add a function protoype that needs to reference this enum in wmi-helpers.h To avoid having all these drivers begin to import each others headers, and to avoid declaring an opaque enum to hande the second case, move the thermal mode enum to helpers where it can be safely accessed by everything that needs it from a single import. While at it, since the gamezone_events_type enum is the only remaining item in the header, move that as well and remove the gamezone header entirely. Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-events.c | 2 +- drivers/platform/x86/lenovo/wmi-gamezone.c | 1 - drivers/platform/x86/lenovo/wmi-gamezone.h | 21 --------------------- drivers/platform/x86/lenovo/wmi-helpers.h | 13 +++++++++++++ drivers/platform/x86/lenovo/wmi-other.c | 3 +-- 5 files changed, 15 insertions(+), 25 deletions(-) delete mode 100644 drivers/platform/x86/lenovo/wmi-gamezone.h diff --git a/drivers/platform/x86/lenovo/wmi-events.c b/drivers/platform/x8= 6/lenovo/wmi-events.c index 0994cd7dd504..9e9f2e82e04d 100644 --- a/drivers/platform/x86/lenovo/wmi-events.c +++ b/drivers/platform/x86/lenovo/wmi-events.c @@ -17,7 +17,7 @@ #include =20 #include "wmi-events.h" -#include "wmi-gamezone.h" +#include "wmi-helpers.h" =20 #define THERMAL_MODE_EVENT_GUID "D320289E-8FEA-41E0-86F9-911D83151B5F" =20 diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.c b/drivers/platform/= x86/lenovo/wmi-gamezone.c index a91089694727..5a8f4aee02cf 100644 --- a/drivers/platform/x86/lenovo/wmi-gamezone.c +++ b/drivers/platform/x86/lenovo/wmi-gamezone.c @@ -21,7 +21,6 @@ #include =20 #include "wmi-events.h" -#include "wmi-gamezone.h" #include "wmi-helpers.h" =20 #define LENOVO_GAMEZONE_GUID "887B54E3-DDDC-4B2C-8B88-68A26A8835D0" diff --git a/drivers/platform/x86/lenovo/wmi-gamezone.h b/drivers/platform/= x86/lenovo/wmi-gamezone.h deleted file mode 100644 index ddb919cf6c36..000000000000 --- a/drivers/platform/x86/lenovo/wmi-gamezone.h +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ - -/* Copyright (C) 2025 Derek J. Clark */ - -#ifndef _LENOVO_WMI_GAMEZONE_H_ -#define _LENOVO_WMI_GAMEZONE_H_ - -enum gamezone_events_type { - LWMI_GZ_GET_THERMAL_MODE =3D 1, -}; - -enum thermal_mode { - LWMI_GZ_THERMAL_MODE_NONE =3D 0x00, - LWMI_GZ_THERMAL_MODE_QUIET =3D 0x01, - LWMI_GZ_THERMAL_MODE_BALANCED =3D 0x02, - LWMI_GZ_THERMAL_MODE_PERFORMANCE =3D 0x03, - LWMI_GZ_THERMAL_MODE_EXTREME =3D 0xE0, /* Ver 6+ */ - LWMI_GZ_THERMAL_MODE_CUSTOM =3D 0xFF, -}; - -#endif /* !_LENOVO_WMI_GAMEZONE_H_ */ diff --git a/drivers/platform/x86/lenovo/wmi-helpers.h b/drivers/platform/x= 86/lenovo/wmi-helpers.h index 651a039228ed..ed7db3ebba6c 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.h +++ b/drivers/platform/x86/lenovo/wmi-helpers.h @@ -16,6 +16,19 @@ struct wmi_method_args_32 { u32 arg1; }; =20 +enum lwmi_event_type { + LWMI_GZ_GET_THERMAL_MODE =3D 0x01, +}; + +enum thermal_mode { + LWMI_GZ_THERMAL_MODE_NONE =3D 0x00, + LWMI_GZ_THERMAL_MODE_QUIET =3D 0x01, + LWMI_GZ_THERMAL_MODE_BALANCED =3D 0x02, + LWMI_GZ_THERMAL_MODE_PERFORMANCE =3D 0x03, + LWMI_GZ_THERMAL_MODE_EXTREME =3D 0xE0, /* Ver 6+ */ + LWMI_GZ_THERMAL_MODE_CUSTOM =3D 0xFF, +}; + int lwmi_dev_evaluate_int(struct wmi_device *wdev, u8 instance, u32 method= _id, unsigned char *buf, size_t size, u32 *retval); =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 1d1bab98298b..e475d1d8a5a7 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -46,7 +46,6 @@ =20 #include "wmi-capdata.h" #include "wmi-events.h" -#include "wmi-gamezone.h" #include "wmi-helpers.h" #include "../firmware_attributes_class.h" =20 @@ -787,7 +786,7 @@ static bool lwmi_attr_01_is_supported(struct tunable_at= tr_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 }; + struct wmi_method_args_32 args =3D {}; bool cd_mode_found =3D false; bool cv_mode_found =3D false; struct capdata01 capdata; --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f171.google.com (mail-dy1-f171.google.com [74.125.82.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 601933612F8 for ; Thu, 2 Apr 2026 03:24:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100276; cv=none; b=BBcuRpvff2x37H69U0T72HTfh8fE0MWoQddc69N03uEzQ7Zic1U8QkXROnO+ADcfGbQo9lfPIIkXiIWIcLlbw8URwquOBNAXsdYocaYOLNbg68QK19Vu6zkflMIcyg48ehQUyc6B0QuNEV+czCgbF688hZi6zgfoURexSMMK/0o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100276; c=relaxed/simple; bh=xxnFlZyVLrmrwp1Xx7rKUBbi8dKXcSeqhsmT2hnuuMA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qj2YBfk0jZ4lc3CJrxH8/ZVJ8GmimSq5w0yDzLuypaEqPjd8O1nfb8GkS8FuwnFUzV73liDX6SZVj8Hjc+AY9vhpNaHh9UdUcBn/2bSjQUNvbdWbD/JduboRV36NfvHV9pjffk0brlg2Z/K35IYVWu4rjo/4BwjWppZuZOaZd14= 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=LtzlPt07; arc=none smtp.client-ip=74.125.82.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LtzlPt07" Received: by mail-dy1-f171.google.com with SMTP id 5a478bee46e88-2bdd40d3c61so415951eec.1 for ; Wed, 01 Apr 2026 20:24:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100273; x=1775705073; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xrqXPLDhLUafZCa8zUH8XiTLuTTy/7459nn79wC3d+c=; b=LtzlPt07PV67PUkM/z9OshHZCVTnYM7LaQIa6a34l8eTIx3slAIvyAJigCVAwF6oLU wbrxkiu33LzaPkIPPWyGxXUjFN/chj2QKG/AvS7btXfI1t4aJFT3CkNDCLVbJdz+CCgg YdfcEuPZH9SCGBVf9+C6d/5LRUALk3Nhx5NsHgLcDIkRUbiU+aizzWbrj7K5SoKbx3TQ yI3S16/V6bAbMxyg5D7koGzty3AuCPkeVIwOb2CixD6WaQgtkKsa5Csmwyi5/ocArRgW 6jEDXrIHkW8lyWg2unSRq2ypc+WUlFQFIVtdtHwlcpO6kLPvv2WtJn/K1MhWPUAv+ado QDEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100273; x=1775705073; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=xrqXPLDhLUafZCa8zUH8XiTLuTTy/7459nn79wC3d+c=; b=CbmW03v1B1DADjuz5Z5MWYTjx6bXCd7jtyxQjqyv7OIwX4xj5dp9bmDMWwVfBDVzhH YkrMOzAhoi1dkRbFWlqcItv/FEVBXMhZEI6bGlnY8eGc+tvGe0BsqnRAoCJ9OECBsrbk F8hflgmJLYbnF4u2VMNgBdZsB9u85UeyirLTOMa75AAHQcSFdTYBkTjPtMg3kSnPLfdJ h7KxC6Jnw6gAUa1EuVqbMR1Xkvp/eJnEMaxSEs66C+AeStfEthjb2YwwcJaHrBEgqoDg KfJpwUTmhyjOOWKbOUkfGpaoONfMq6teYaDoGoxMYt5Gc7x9+ZrVSCNyE48i2I9SHZok cCtw== X-Forwarded-Encrypted: i=1; AJvYcCUZN0v1LHO6oGFvHI2A3ISF9QBcf2X2XejM8g+R/WRwGM6zYme63gDOaD40NkaBjbzj6jaYPB3o0wflW8I=@vger.kernel.org X-Gm-Message-State: AOJu0YyJqlnwQ3LGNQ5uvdJ+pdcUljIBDbUL1k3iMk1AkIBNZXCzR1Nu sHz4s7KNmAmA5iDqDrL7Ujl2M595uE0H66T1SSC8DvevV1DqJyI6taoe X-Gm-Gg: ATEYQzw8UlOAj3/KR9QGfGam9c/+atAhCQ39NSrblUcISaJqEGtfykSwAHuGfwgqYy+ sj5vRNrtwP+Sm6dYs/iNxIJsOfEMESkGt0IW2jHoHqVuBh9oUjt+jeisDNlsvnqlTnlXSmnJTqr zc18ckfBF5jBCl7bGLqo5ts94Le7TrYmOzZhGQCxpl0RqHKZeygtoXeCACbQtS5+RJN/89yl84G ontE1xDSnrsHBNCy3glG2fFWjt29Js3v2q49mQwh+RD6dJG1THn/vKSiCP6FOhMH3cvQ2f1wx4e ZKlcNNdVORzzs7Hm3q23bJ6Jjs15xRfsXkEXdJnPdO78Ej6sDrtw+e7xjfc6gEWTtM0WQIvlyXy Dv494vcNlTh2uhVi1ZNuMVHNFpCF4p6FRDXSp3v+XwshdEblbafreiYJ6NEavwhBV/+U+RRdmXG 96qEH/ELn9UgD+vR1I5A5Zvs5j6fWtsWJq2n0u/oGtu3gYgakm6+AYzcbs3nkHLB0WetfCEv1TZ Tfk X-Received: by 2002:a05:7300:da13:b0:2c9:ee15:a0f2 with SMTP id 5a478bee46e88-2c9ee15e7d2mr1520928eec.33.1775100273482; Wed, 01 Apr 2026 20:24:33 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:33 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v7 09/16] platform/x86: lenovo-wmi-other: Move LWMI_FAN_DIV Date: Thu, 2 Apr 2026 03:24:17 +0000 Message-ID: <20260402032424.678528-10-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Later patches in this series will add additional attribute ID macros. Keep the fan defines together and permit attribute ID macros to stay together as well by moving LWMI_FAN_DIV. Reviewed-by: Rong Zhang Tested-by: Rong Zhang Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-other.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index e475d1d8a5a7..25ddfd54f692 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -68,13 +68,13 @@ #define LWMI_FAN_NR 4 #define LWMI_FAN_ID(x) ((x) + LWMI_FAN_ID_BASE) =20 +#define LWMI_FAN_DIV 100 + #define LWMI_ATTR_ID_FAN_RPM(x) \ (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) | \ FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_RPM) | \ FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, LWMI_FAN_ID(x))) =20 -#define LWMI_FAN_DIV 100 - #define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f173.google.com (mail-dy1-f173.google.com [74.125.82.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0911B361675 for ; Thu, 2 Apr 2026 03:24:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100277; cv=none; b=THcIVhVBRD2jV4Ig8ovjyLLF9yltaCCcg7r03HM5KZ44zuiH1Xyc9U4a6PFB8Ip0Qs2lrkXNeUhO6ze9jSk9vkE6NvJAZFOmyoU5W5jXvy2ybP6Z/quRwioZDvORdWp9IUo6PoMeMkiubaJZYsXx/5Y432jnm7lKB8JJZ48VZhM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100277; c=relaxed/simple; bh=bPryRTTEH+Q2w1E1N8JH2TQcaWKQ4Soh5LbEk2u1sbc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=p9KRN3iQopMfmoYld9iOws+s+pLtQae+eJLbkt3+3EgnsY1v5JdjBzgLq7rt2CuLWt4fuYbULoGO3n3XP5cjVO2K5nzjDLMb4oIsns4kfmmfTugMohDnpET+JLBYi0iLgRi/Nc2Mkf8BFiURdnO/RoQyAhzQuEf66pAqHrNTTjk= 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=foQuwCkv; arc=none smtp.client-ip=74.125.82.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="foQuwCkv" Received: by mail-dy1-f173.google.com with SMTP id 5a478bee46e88-2b4520f6b32so598413eec.0 for ; Wed, 01 Apr 2026 20:24:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100274; x=1775705074; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=T7odj6rBktOkCaSzuwYo02uinsQt9nFQM4fAXGo/q7k=; b=foQuwCkvIUd3lGwp/F0+4B04a6Dug7ngFUe+aBHWNXEIsx4PiCrDMzRyKlOxYZih61 /vRC4lDegKlgk5wDM8UOZdFqeNv9U4JLiOzTuL1E7J+Vl2qmXYoUm6UVnEPMwoHxGbQE lRz/sbDd9tzfXmm4F7ATjDM1k0XvCItqj3SHqbSfm89i51eH03Ykijrb2t706eCMp82C oPr7JCCqxysVc4xeosPuVZZe81va/Gb/fIG6ns/WNkRJQNVKamK97/076N9XcAnxsPvN 4111XG6wguL0y6pJm6/HdpWtz76eYYZFb0N7mSkan30RRPXocIvJQcpeu0w3oZylTZiy ur1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100274; x=1775705074; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=T7odj6rBktOkCaSzuwYo02uinsQt9nFQM4fAXGo/q7k=; b=N4qdg22Tbrbs3HGYxY1vhfFrqIjPlOH8sR7vgLin76KGHDRymz4eof/RcAdlgHAd6z w7N96bxKa7fl/4IabB8re92azRotbZbNEwU5brpapC+hejFU4Vc8FhfbO8AJroGzsya6 1HxBo9IaZBI8qbiSk+ruBxxWg0k6hxOzYh+AZGw55+m2zQrsAVT4YFo8UZL/O0vnaFtX rrmL97bjEbxwHRt7qV+x2yQmW31QllVoQKAO/2VZHBrhMXJwrNTv8wiw8Za+3dLVjB4C +6CFRSMuVNf32zpx5jj1+Gs1xvdhJDnXGDO0lu7vzjZxJL60GKJcNOlMTAjU9CK8wSVD gV9Q== X-Forwarded-Encrypted: i=1; AJvYcCXBkvryNdwtFJj8pVSv6PLzWE+tkaPTFkc/JrqsG4TcOpF6agw+8uNgn+tKG3eBq5Osb21UmnUSNO9/Xsw=@vger.kernel.org X-Gm-Message-State: AOJu0YzUcbSd3r+JCvqerFSjF1WJHUWQwRvMtlcKkMytoyn76YHqKmGA DSFo7xvs84skiEwQha+bZDOY+9D/J2URti+DZGDB/YozoKSDZYn6A8AC X-Gm-Gg: ATEYQzzHO9SNXb3R1wHuQ3XVZNxf7DtVf4YbNz2NvFtmkBwDWNSM4/PN9k3XMmBC0I6 rhf/vec0oLbvS7gjuckhHrBnEr8Qrhz0PWLQ7gCjjCoGtSgssVw8HmiZzYXFy2hSKl9Q/ZvPZih rZU3fj+Nez0c2CtMQ8hJPdhMHUNpdgpZvGR+bGR5UloZIFVN25AMpfE63uLBNfqukqug6W3UDis e0i5a2FX6x0rC1oFSwcozQ4o1pzZhR3TsKpaam8PEGVofkp7lhcg7FfR2QFEM3vWJKW85suq8Dm bhUkvAARm+wFXhVPB2HAZYlNOKEnkPWs29a7Tv8iwomEvUWOKVrV33RG1SaUj8ePoX9KYi7mZFf v2ecoKefrhmTFhWp5hXl/F6a51JNJZUSS3sSWLwV9DW08x/Adr6A8lYCmr5/2g0VigYhoeLK9AK Uw0SFgIWdj5XAs7BbtfCsJ4JHK22EHQ/kIBP+LpOvuNmbIEPULCOWGPmWtiS9qfDpGau6llZlFu 5od X-Received: by 2002:a05:7300:aa8c:b0:2c1:23d:c728 with SMTP id 5a478bee46e88-2c9333bca76mr3129756eec.31.1775100274130; Wed, 01 Apr 2026 20:24:34 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:33 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v7 10/16] platform/x86: lenovo-wmi-other: Add lwmi_attr_id() function Date: Thu, 2 Apr 2026 03:24:18 +0000 Message-ID: <20260402032424.678528-11-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Adds lwmi_attr_id() function. In the same vein as LWMI_ATTR_ID_FAN_RPM(), but as a generic, to de-duplicate attribute_id assignment biolerplate. Reviewed-by: Rong Zhang Tested-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- v7: - Incorporate additional replacements in lwmi_attr_01_is_supported after moving the patch that adds it to earlier in the series. v6: - Move lwmi_attr_id to wmi-capdata.h as static inline. v5: - Move references to cv/cd_mode_id to patch 4/8. - Move lwmi_attr_id to wmi-capdata.c and export with namespace. v4: - Switch from macro to static inline to preserve types. --- drivers/platform/x86/lenovo/wmi-capdata.c | 8 ++-- drivers/platform/x86/lenovo/wmi-capdata.h | 20 ++++++++ drivers/platform/x86/lenovo/wmi-other.c | 56 ++++++++--------------- 3 files changed, 43 insertions(+), 41 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-capdata.c b/drivers/platform/x= 86/lenovo/wmi-capdata.c index ee1fb02d8e31..169665be4dcf 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.c +++ b/drivers/platform/x86/lenovo/wmi-capdata.c @@ -27,7 +27,6 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 #include -#include #include #include #include @@ -48,6 +47,7 @@ #include =20 #include "wmi-capdata.h" +#include "wmi-helpers.h" =20 #define LENOVO_CAPABILITY_DATA_00_GUID "362A3AFE-3D96-4665-8530-96DAD5BB30= 0E" #define LENOVO_CAPABILITY_DATA_01_GUID "7A8F5407-CB67-4D6E-B547-39B3BE0181= 54" @@ -58,9 +58,9 @@ =20 #define LWMI_FEATURE_ID_FAN_TEST 0x05 =20 -#define LWMI_ATTR_ID_FAN_TEST \ - (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) | \ - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_TEST)) +#define LWMI_ATTR_ID_FAN_TEST \ + lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_TEST, \ + LWMI_GZ_THERMAL_MODE_NONE, LWMI_TYPE_ID_NONE) =20 enum lwmi_cd_type { LENOVO_CAPABILITY_DATA_00, diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index 8c1df3efcc55..1388eaf4ab4a 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -6,6 +6,7 @@ #define _LENOVO_WMI_CAPDATA_H_ =20 #include +#include #include =20 #define LWMI_SUPP_VALID BIT(0) @@ -19,6 +20,8 @@ =20 #define LWMI_DEVICE_ID_FAN 0x04 =20 +#define LWMI_TYPE_ID_NONE 0x00 + struct component_match; struct device; struct cd_list; @@ -57,6 +60,23 @@ struct lwmi_cd_binder { cd_list_cb_t cd_fan_list_cb; }; =20 +/** + * lwmi_attr_id() - Formats a capability data attribute ID + * @dev_id: The u8 corresponding to the device ID. + * @feat_id: The u8 corresponding to the feature ID on the device. + * @mode_id: The u8 corresponding to the wmi-gamezone mode for set/get. + * @type_id: The u8 corresponding to the sub-device. + * + * Return: u32. + */ +static inline u32 lwmi_attr_id(u8 dev_id, u8 feat_id, u8 mode_id, u8 type_= id) +{ + return (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, dev_id) | + FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, feat_id) | + FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode_id) | + FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, type_id)); +} + void lwmi_cd_match_add_all(struct device *master, struct component_match *= *matchptr); int lwmi_cd00_get_data(struct cd_list *list, u32 attribute_id, struct capd= ata00 *output); int lwmi_cd01_get_data(struct cd_list *list, u32 attribute_id, struct capd= ata01 *output); diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 25ddfd54f692..19a072bea2d4 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -27,7 +27,6 @@ */ =20 #include -#include #include #include #include @@ -59,8 +58,6 @@ =20 #define LWMI_FEATURE_ID_FAN_RPM 0x03 =20 -#define LWMI_TYPE_ID_NONE 0x00 - #define LWMI_FEATURE_VALUE_GET 17 #define LWMI_FEATURE_VALUE_SET 18 =20 @@ -70,10 +67,9 @@ =20 #define LWMI_FAN_DIV 100 =20 -#define LWMI_ATTR_ID_FAN_RPM(x) \ - (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) | \ - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_RPM) | \ - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, LWMI_FAN_ID(x))) +#define LWMI_ATTR_ID_FAN_RPM(x) \ + lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \ + LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x)) =20 #define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" @@ -616,12 +612,8 @@ static ssize_t attr_capdata01_show(struct kobject *kob= j, u32 attribute_id; int value, ret; =20 - attribute_id =3D - FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, - LWMI_GZ_THERMAL_MODE_CUSTOM) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + attribute_id =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feat= ure_id, + LWMI_GZ_THERMAL_MODE_CUSTOM, tunable_attr->type_id); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, attribute_id, &capdata); if (ret) @@ -686,10 +678,8 @@ static ssize_t attr_current_value_store(struct kobject= *kobj, if (mode !=3D LWMI_GZ_THERMAL_MODE_CUSTOM) return -EBUSY; =20 - args.arg0 =3D FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, tunable_attr->cd_mode_id) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + tunable_attr->cd_mode_id, tunable_attr->type_id); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); if (ret) @@ -702,10 +692,8 @@ static ssize_t attr_current_value_store(struct kobject= *kobj, if (value < capdata.min_value || value > capdata.max_value) return -EINVAL; =20 - args.arg0 =3D FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, tunable_attr->cv_mode_id) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + tunable_attr->cv_mode_id, tunable_attr->type_id); args.arg1 =3D value; =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, @@ -750,10 +738,8 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, if (tunable_attr->cv_mode_id =3D=3D LWMI_GZ_THERMAL_MODE_NONE) mode =3D tunable_attr->cv_mode_id; =20 - args.arg0 =3D FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + tunable_attr->cv_mode_id, tunable_attr->type_id); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), @@ -794,10 +780,8 @@ static bool lwmi_attr_01_is_supported(struct tunable_a= ttr_01 *tunable_attr) =20 /* Determine tunable_attr->cd_mode_id*/ for (i =3D 0; i < ARRAY_SIZE(modes); i++) { - args.arg0 =3D FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id)= | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, modes[i]) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], tunable_attr->type_id); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); if (ret || !capdata.supported) @@ -810,15 +794,10 @@ static bool lwmi_attr_01_is_supported(struct tunable_= attr_01 *tunable_attr) if (!cd_mode_found) return cd_mode_found; =20 - dev_dbg(tunable_attr->dev, - "cd_mode_id: %#010x\n", args.arg0); - /* Determine tunable_attr->cv_mode_id, returns 1 if supported*/ for (i =3D 0; i < ARRAY_SIZE(modes); i++) { - args.arg0 =3D FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id)= | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, modes[i]) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], tunable_attr->type_id); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), @@ -833,7 +812,10 @@ static bool lwmi_attr_01_is_supported(struct tunable_a= ttr_01 *tunable_attr) if (!cv_mode_found) return cv_mode_found; =20 - dev_dbg(tunable_attr->dev, "cv_mode_id: %#010x, attribute support level: = %#010x\n", + dev_dbg(tunable_attr->dev, + "cd_mode_id: %#010x, cv_mode_id: %#010x, attribute support level: %#010x= \n", + lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature_id, + tunable_attr->cd_mode_id, tunable_attr->type_id), args.arg0, capdata.supported); =20 return capdata.supported > 0 ? true : false; --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f170.google.com (mail-dy1-f170.google.com [74.125.82.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 40DCF3624D9 for ; Thu, 2 Apr 2026 03:24:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100278; cv=none; b=bWZa5f2FyZPgrAJeKBizNYddh4uRd4WsZfEKaZ6JaDSPsbOKemB37gIunWAJAFrdaPS2aGo18PbnQZY6xXp3D+QyGRKW6/BN6j3mCmCeQchE+OmoKIC4NSDlGkYNcUNKe6ui9Ox51ETV3Aj27xcqDH8aREYUknqrKO80jP8e3bw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100278; c=relaxed/simple; bh=JsqD6brbqzCpEzrS+G7rAEJLIm0pj1uL+2eA+qaNvGI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VbW3WJueGYHvfVRlimdVAYhPvtKuC2I0LTSYQMqAFt+aaTk5pMePi43OaPrZe+c0anugVOL+Y3IzPXOCIal3XJFkuEe+3RcarXgVSZnF5AKPIfU+R0pmMi13WltZSKF5CQ5fUJDg1XTWIzpINXs7JkeOYA+Xic2qvRTdtTOtZ04= 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=e2ZBmKnZ; arc=none smtp.client-ip=74.125.82.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="e2ZBmKnZ" Received: by mail-dy1-f170.google.com with SMTP id 5a478bee46e88-2c4db6bca03so195283eec.1 for ; Wed, 01 Apr 2026 20:24:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100275; x=1775705075; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HsaOxFpev1lQmsc3vPTVQ/+KxnqwZvCw8sDgDlpNyfo=; b=e2ZBmKnZzJBoYsMBJ0xZ+5PLfQEfziRHtAdG7ZvSWtcy0bjfFVLzqLHU2xOh6q/rzU YYkzqRkahVRud8SsXKzgX30PJVeqkMG3hSaXEUVJ02fY0NC5IXp1Eyb+lBchdQowiAWr Rforex0Op6yaMUb80sS7wakqDXPmMfHVFlpiVlZn/qrOyZSC1Gph/um5HUKuUAwI97EI Z0E4nhPrVe1NPMJtgrao0PDnJNSLDpViqINTYCfdcKb23LQMRQd8df9ek0tRIfxWh7wO yVo0OGUto+PpeCx/ZcvHiqo0w3HYDmLHs9etLtcJ2jCfTBqi1iyhSY+bRNSuC+ToidKb YyNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100275; x=1775705075; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=HsaOxFpev1lQmsc3vPTVQ/+KxnqwZvCw8sDgDlpNyfo=; b=fYED2A/TUXcBbw+HVgeTcgJJjmVpV8C4TVArKWhyjhkUG8rC2ExFGeGQYHfKw5lVyp fYWTo65EiisbjW8SZ6YOvBVtNw0B+3bM+8pbO+EwjzfPw5wTkDlp8OFv4cG95SrhtGja 0nr25XstIPDWSKWZpnisRmXBvJ8mmmCjIjQt6jhAan1KiPhB7SBdz0pSBDLt5eDIrH1d QfWIch0JkjNj9jOFA5+sHz69Pq0L6DVCq/AuJh66tDlRYlfV9kBge0OKxuE6OWSIQjhD nSDJo+yzLLonTqYSIJqcVnP0sHdZ+qcR8PkWTj/2HpzqRkaTbcotGvBKeZk9+/FksNxR gQjw== X-Forwarded-Encrypted: i=1; AJvYcCVssSEEX92m9nnE7SYYGzJX328BSd5moZlBxeEi/uarxwUwy1WFqY4dDxcAPO+owpccDeeB/nhu9+h7/Yg=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/ctF2mifeRNQLyknU0BNf2zSjtA/5Z3upPQmWgqsYehLxC25m +AwpwL1vmBQ1ng0TvHy55yTb2F2eUUWNX6AObiBSqQEn1TYGBZwArb3YMmhXNw== X-Gm-Gg: ATEYQzyJ0JAPwjv6H/agRcY3WsiOHvtaC2IDhMnkdnHU/yfpq7+uR8BlyY7uFg/zkLG 51ABTt85rzJbx8bQ73p6WPnLqfOsD7jHWgKbK00osXvQkPdRWcmgpvV7U4hynR69YWDcXqje2bT 2vvJ0c3rPha2f/dMI+UhHmH10F1rXS3+PkNA8wHUZvQv3GUScYLcsHd7HVCwVJ+YG7sqVt1MN28 6iLwxC49JK6Xg2/9QjEnz9tgPDF0Vh18QZP4TAubP70cDs3s1yWz+Z8ng10PsHmhXcXLzoM5pXQ T9sZa73mg1mqHZ7mT8fIu0VHWZfcqLlnRZZ0km403tgydJnkNZUZB8A5zhyhjCC6Ss/dqOXomcJ DywzApx8UhQFFNdnEKO2ThEb+k+7RKkmEuWC1grSrA22daLi30zCCLiKR+OiSXl89YNL6LNYvZN 8scfEcYqFcYH74dKq0d3TeOPv5fHywGMchqng7V+t/6piUqljuWd9ry6gfamP8oljaac7SlDxtl 4iq X-Received: by 2002:a05:693c:25c8:b0:2c5:fb3f:70c3 with SMTP id 5a478bee46e88-2cad7a13f41mr369287eec.15.1775100275215; Wed, 01 Apr 2026 20:24:35 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:34 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v7 11/16] platform/x86: lenovo-wmi-other: Add missing CPU tunable attributes Date: Thu, 2 Apr 2026 03:24:19 +0000 Message-ID: <20260402032424.678528-12-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use an enum for all device ID's and CPU attribute feature ID's, add missing CPU attributes. Reviewed-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- v7: - Fix typo in documentation. v4: - Align type ID defines. - Align CPU feature enum values. - remove cpu_oc_stat from Documentation. v3: - Remove cpu_oc_stat. --- .../wmi/devices/lenovo-wmi-other.rst | 9 ++ drivers/platform/x86/lenovo/wmi-capdata.h | 5 +- drivers/platform/x86/lenovo/wmi-other.c | 99 ++++++++++++++++++- 3 files changed, 107 insertions(+), 6 deletions(-) diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation= /wmi/devices/lenovo-wmi-other.rst index 01d471156738..189dd4d31926 100644 --- a/Documentation/wmi/devices/lenovo-wmi-other.rst +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst @@ -68,9 +68,18 @@ Each attribute has the following properties: - type =20 The following firmware-attributes are implemented: + - cpu_temp: CPU Thermal Load Limit + - ppt_cpu_cl: CPU Cross Loading Power Limit + - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit + - ppt_pl1_spl_cl: Platform Profile Tracking Cross Loading Sustained Power= Limit + - ppt_pl1_tau: Exceed Duration for Platform Profile Tracking Sustained Po= wer Limit - ppt_pl2_sppt: Platform Profile Tracking Slow Package Power Tracking + - ppt_pl2_sppt_cl: Platform Profile Tracking Cross Loading Slow Package T= racking - ppt_pl3_fppt: Platform Profile Tracking Fast Package Power Tracking + - ppt_pl3_fppt_cl: Platform Profile Tracking Cross Loading Fast Package P= ower Tracking + - ppt_pl4_ipl: Platform Profile Tracking Instantaneous Power Limit + - ppt_pl4_ipl_cl: Platform Profile Tracking Cross Loading Instantaneous P= ower Limit =20 LENOVO_FAN_TEST_DATA ------------------------- diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index 1388eaf4ab4a..f2d45cd7a188 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -18,7 +18,10 @@ #define LWMI_ATTR_MODE_ID_MASK GENMASK(15, 8) #define LWMI_ATTR_TYPE_ID_MASK GENMASK(7, 0) =20 -#define LWMI_DEVICE_ID_FAN 0x04 +enum lwmi_device_id { + LWMI_DEVICE_ID_CPU =3D 0x01, + LWMI_DEVICE_ID_FAN =3D 0x04, +}; =20 #define LWMI_TYPE_ID_NONE 0x00 =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 19a072bea2d4..56c8b84f306d 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -50,14 +50,21 @@ =20 #define LENOVO_OTHER_MODE_GUID "DC2A8805-3A8C-41BA-A6F7-092E0089CD3B" =20 -#define LWMI_DEVICE_ID_CPU 0x01 - -#define LWMI_FEATURE_ID_CPU_SPPT 0x01 -#define LWMI_FEATURE_ID_CPU_SPL 0x02 -#define LWMI_FEATURE_ID_CPU_FPPT 0x03 +enum lwmi_feature_id_cpu { + LWMI_FEATURE_ID_CPU_SPPT =3D 0x01, + LWMI_FEATURE_ID_CPU_SPL =3D 0x02, + LWMI_FEATURE_ID_CPU_FPPT =3D 0x03, + LWMI_FEATURE_ID_CPU_TEMP =3D 0x04, + LWMI_FEATURE_ID_CPU_APU =3D 0x05, + LWMI_FEATURE_ID_CPU_CL =3D 0x06, + LWMI_FEATURE_ID_CPU_TAU =3D 0x07, + LWMI_FEATURE_ID_CPU_IPL =3D 0x09, +}; =20 #define LWMI_FEATURE_ID_FAN_RPM 0x03 =20 +#define LWMI_TYPE_ID_CROSSLOAD 0x01 + #define LWMI_FEATURE_VALUE_GET 17 #define LWMI_FEATURE_VALUE_SET 18 =20 @@ -551,18 +558,72 @@ static struct tunable_attr_01 ppt_pl1_spl =3D { .type_id =3D LWMI_TYPE_ID_NONE, }; =20 +static struct tunable_attr_01 ppt_pl1_spl_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_SPL, + .type_id =3D LWMI_TYPE_ID_CROSSLOAD, +}; + static struct tunable_attr_01 ppt_pl2_sppt =3D { .device_id =3D LWMI_DEVICE_ID_CPU, .feature_id =3D LWMI_FEATURE_ID_CPU_SPPT, .type_id =3D LWMI_TYPE_ID_NONE, }; =20 +static struct tunable_attr_01 ppt_pl2_sppt_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_SPPT, + .type_id =3D LWMI_TYPE_ID_CROSSLOAD, +}; + static struct tunable_attr_01 ppt_pl3_fppt =3D { .device_id =3D LWMI_DEVICE_ID_CPU, .feature_id =3D LWMI_FEATURE_ID_CPU_FPPT, .type_id =3D LWMI_TYPE_ID_NONE, }; =20 +static struct tunable_attr_01 ppt_pl3_fppt_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_FPPT, + .type_id =3D LWMI_TYPE_ID_CROSSLOAD, +}; + +static struct tunable_attr_01 cpu_temp =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_TEMP, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_pl1_apu_spl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_APU, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_cpu_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_CL, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_pl1_tau =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_TAU, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_pl4_ipl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_IPL, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 ppt_pl4_ipl_cl =3D { + .device_id =3D LWMI_DEVICE_ID_CPU, + .feature_id =3D LWMI_FEATURE_ID_CPU_IPL, + .type_id =3D LWMI_TYPE_ID_CROSSLOAD, +}; + struct capdata01_attr_group { const struct attribute_group *attr_group; struct tunable_attr_01 *tunable_attr; @@ -898,17 +959,45 @@ static bool lwmi_attr_01_is_supported(struct tunable_= attr_01 *tunable_attr) .name =3D _fsname, .attrs =3D _attrname##_attrs \ } =20 +LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp", + "Set the CPU thermal load limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl", + "Set the CPU cross loading power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_apu_spl, "ppt_pl1_apu_spl", + "Set the APU sustained power limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_spl, "ppt_pl1_spl", "Set the CPU sustained power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_spl_cl, "ppt_pl1_spl_cl", + "Set the CPU cross loading sustained power limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl2_sppt, "ppt_pl2_sppt", "Set the CPU slow package power tracking limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl2_sppt_cl, "ppt_pl2_sppt_cl", + "Set the CPU cross loading slow package power tracking limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl3_fppt, "ppt_pl3_fppt", "Set the CPU fast package power tracking limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl3_fppt_cl, "ppt_pl3_fppt_cl", + "Set the CPU cross loading fast package power tracking limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_tau, "ppt_pl1_tau", + "Set the CPU sustained power limit exceed duration"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_ipl", + "Set the CPU instantaneous power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl", + "Set the CPU cross loading instantaneous power limit"); + =20 static struct capdata01_attr_group cd01_attr_groups[] =3D { + { &cpu_temp_attr_group, &cpu_temp }, + { &ppt_cpu_cl_attr_group, &ppt_cpu_cl }, + { &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl }, { &ppt_pl1_spl_attr_group, &ppt_pl1_spl }, + { &ppt_pl1_spl_cl_attr_group, &ppt_pl1_spl_cl }, + { &ppt_pl1_tau_attr_group, &ppt_pl1_tau }, { &ppt_pl2_sppt_attr_group, &ppt_pl2_sppt }, + { &ppt_pl2_sppt_cl_attr_group, &ppt_pl2_sppt_cl }, { &ppt_pl3_fppt_attr_group, &ppt_pl3_fppt }, + { &ppt_pl3_fppt_cl_attr_group, &ppt_pl3_fppt_cl }, + { &ppt_pl4_ipl_attr_group, &ppt_pl4_ipl }, + { &ppt_pl4_ipl_cl_attr_group, &ppt_pl4_ipl_cl }, {}, }; =20 --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f171.google.com (mail-dy1-f171.google.com [74.125.82.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CA274363C4A for ; Thu, 2 Apr 2026 03:24:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100279; cv=none; b=eSrv6z2dYTZ43tVHTvsrKvW3b0egnt0aA8sGpMRAc4LM6Mdw93e4pAjOaqmm+Jen4SBlIVzBvLVE8//xYnPxPQz6j9UOpo+sWth9pqEElX7UAjbx1uVKCVpkFBSg24yos/8uCJV90CRRv8NuPd02AS1BeA3Kche+ASvmN/HMW9s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100279; c=relaxed/simple; bh=AGNSJWHk6rHEufhSyPVS7Lzb46s2YrzKEXfMsYOAge4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=M8mhO/PHEvXLb0OHajiZWxDZvYhjB7G3wCYnASY5TR26UoK1w2B+l0Sz9y+hwio8oAFtMVOpTOX0mZZzA7zj6VIcMcOzYfYSjB+/owsUBvJBAVkgOU7TjlORsbIwhucmlp0hhn/PprV5nRb67Uq2MvkfKAr1VZseYHpve+nKHqs= 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=Af5HIWmG; arc=none smtp.client-ip=74.125.82.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Af5HIWmG" Received: by mail-dy1-f171.google.com with SMTP id 5a478bee46e88-2c56aa62931so979254eec.0 for ; Wed, 01 Apr 2026 20:24:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100276; x=1775705076; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=c4teSSDSZxadJncjuE0P+g4FnFzukItSRNmCV2eTIxU=; b=Af5HIWmG3qPlftzUKl0iqJdbajVu8QdxE0v3LVf5Wr7h+9JxfVNwvsVQV4kcKHeM6Q MuW94Vj6xb+SX/lPbS3nds7V93bOpLLjtA5P/7AiWY5nFUS6DR0Qna2MyWQdE2X4+8+K Htp198wBs8kXcgIYNuhTcoOYI2egvdQPofmirDV7ur6czDbpSEhSev3yAoIwsZV5dKWA KFkPRYQc6H/ZrmelFLbqlGz9jsujE6+jvKRH9s2qdn9qxXM2WdA4CcWtt3zDjf10KJ/6 O/nb9mOUd4gS0jvKSZnEiBEf8nlBM2+hzzNw0/AXOlk3MUgcJl4XENSe5ZURlJEE5eA8 OKfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100276; x=1775705076; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=c4teSSDSZxadJncjuE0P+g4FnFzukItSRNmCV2eTIxU=; b=iC0sIzCOfDlBzQBjOWjWjH30UY7JkO+2pT48+HEbq0nuwY4SB6dhn8hMEePHMA6seV eR5tc/W11qUarHZhZPf3uyy5PvY6lQbcounTLWGny1xXpx0+1WN7l1RQKs0mwkpUqAaa 02a54TEyquoI9c99aulC8tgvDXh7V56wchO4glJcKaw85sM6viEWvOsie1tx827I813L xyPNkdhFKisWrhNSoSY6vADhQJFWMgD8keFCdckGeF52Cd8k1hZMOzZEpKUiHrLS17xk C9ezmR+PAvwbFVnloS9c55NUr81s33apmpw3vbnhgj9fuaoB9Vw+pw5nku4mepiyXSXM KL/w== X-Forwarded-Encrypted: i=1; AJvYcCV8uLp7Tu7i715LeQn6E7Xzal2MtXR2cVOP1BoDUJKCZkAQd/voSeRg6sJCHnT7oMA3eJJSpofWiR6Vhz4=@vger.kernel.org X-Gm-Message-State: AOJu0YzH1yhdUwVp7TKtHTfNiR309QwXPN8UUmvzgD5HXU3k2SW7YV/M 0RqjXBroX+r6S74fngS7j3DNPJa7MNBaiEagOL86IvLXMzmJY3NVsIYI X-Gm-Gg: ATEYQzyDSQ/hQZl+mI4U1dUIfxAZDHVa+jeJaxFUjr2S6EGMnShj8BKbFEBytht02AK XZpEDB9sjqOKven+q5Cy/FT+h5u3nu6JP0AtIg2Tglz+NpVrI++yudCHKMjgyH8gkqvH0Nkaj6Z W8JjM8NxlN+PA34dtiiaeWG86FAAKd2vF6kIIEkKUJg1SLSHp+tTUJfB7tBgJYvYFdWUsIehpos h5pS5ZQhgL+PfnsM8MYfdaGThOb0sv5fq6U5+duGG7CDPO0ZpHu5Jz9Afvq1usvqU+PzETfg2rb GkIRf4Ma9ioJNTm/LpbWydnPKheBNXvwynvlaeWbfYMTxjYx15PkslKLX0VQkrgpevmuyJrZ9Mp lpcMOUD8PsVRPvirZSzs+8QmIvi+AfnbZRAeDDy4lUOtn2kIe9txx45MQiR39LfzGukelB3xuPs pcW9wOnJTVtrm1LFLsEAHJV1aKSjjzrlG0hAgO+PtP0ylChckXCcxjOIXTJljfBMTxODK/4LPwK /Ly X-Received: by 2002:a05:7300:2150:b0:2c6:31f0:a025 with SMTP id 5a478bee46e88-2ca9047cf7bmr992790eec.27.1775100275896; Wed, 01 Apr 2026 20:24:35 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:35 -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 v7 12/16] platform/x86: lenovo-wmi-other: Add GPU tunable attributes Date: Thu, 2 Apr 2026 03:24:20 +0000 Message-ID: <20260402032424.678528-13-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use an enum for all GPU attribute feature ID's and add GPU attributes. Reviewed-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- v7: - Fix typo in dgpu_boost_clk attribute string. v4: - Align CPU feature enum values. - Remove gpu_oc_stat from Documentation. v3: - Remove gpu_oc_stat. --- .../wmi/devices/lenovo-wmi-other.rst | 10 ++ drivers/platform/x86/lenovo/wmi-capdata.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 105 ++++++++++++++++++ 3 files changed, 116 insertions(+) diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation= /wmi/devices/lenovo-wmi-other.rst index 189dd4d31926..988ae04ff724 100644 --- a/Documentation/wmi/devices/lenovo-wmi-other.rst +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst @@ -69,6 +69,16 @@ Each attribute has the following properties: =20 The following firmware-attributes are implemented: - cpu_temp: CPU Thermal Load Limit + - dgpu_boost_clk: Dedicated GPU Boost Clock + - dgpu_enable: Dedicated GPU Enabled Status + - gpu_didvid: GPU Device Identifier and Vendor Identifier + - gpu_mode: GPU Mode by Power Limit + - gpu_nv_ac_offset: Nvidia GPU AC Total Processing Power Baseline Offset + - gpu_nv_bpl: Nvidia GPU Base Power Limit + - gpu_nv_cpu_boost: Nvidia GPU to CPU Dynamic Boost Limit + - gpu_nv_ctgp: Nvidia GPU Configurable Total Graphics Power + - gpu_nv_ppab: Nvidia GPU Power Performance Aware Boost Limit + - gpu_temp: GPU Thermal Load Limit - ppt_cpu_cl: CPU Cross Loading Power Limit - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index f2d45cd7a188..891b12ca1db6 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -20,6 +20,7 @@ =20 enum lwmi_device_id { LWMI_DEVICE_ID_CPU =3D 0x01, + LWMI_DEVICE_ID_GPU =3D 0x02, LWMI_DEVICE_ID_FAN =3D 0x04, }; =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 56c8b84f306d..57b6b6f17f33 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -61,6 +61,19 @@ enum lwmi_feature_id_cpu { LWMI_FEATURE_ID_CPU_IPL =3D 0x09, }; =20 +enum lwmi_feature_id_gpu { + LWMI_FEATURE_ID_GPU_NV_PPAB =3D 0x01, + LWMI_FEATURE_ID_GPU_NV_CTGP =3D 0x02, + LWMI_FEATURE_ID_GPU_TEMP =3D 0x03, + LWMI_FEATURE_ID_GPU_AC_OFFSET =3D 0x04, + LWMI_FEATURE_ID_DGPU_BOOST_CLK =3D 0x06, + LWMI_FEATURE_ID_DGPU_EN =3D 0x07, + LWMI_FEATURE_ID_GPU_MODE =3D 0x08, + LWMI_FEATURE_ID_DGPU_DIDVID =3D 0x09, + LWMI_FEATURE_ID_GPU_NV_BPL =3D 0x0a, + LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =3D 0x0b, +}; + #define LWMI_FEATURE_ID_FAN_RPM 0x03 =20 #define LWMI_TYPE_ID_CROSSLOAD 0x01 @@ -624,6 +637,66 @@ static struct tunable_attr_01 ppt_pl4_ipl_cl =3D { .type_id =3D LWMI_TYPE_ID_CROSSLOAD, }; =20 +static struct tunable_attr_01 gpu_nv_ppab =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_PPAB, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_ctgp =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_CTGP, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_temp =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_TEMP, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_ac_offset =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_AC_OFFSET, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 dgpu_boost_clk =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_DGPU_BOOST_CLK, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 dgpu_enable =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_DGPU_EN, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_mode =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_MODE, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 dgpu_didvid =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_DGPU_DIDVID, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_bpl =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_BPL, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + +static struct tunable_attr_01 gpu_nv_cpu_boost =3D { + .device_id =3D LWMI_DEVICE_ID_GPU, + .feature_id =3D LWMI_FEATURE_ID_GPU_NV_CPU_BOOST, + .type_id =3D LWMI_TYPE_ID_NONE, +}; + struct capdata01_attr_group { const struct attribute_group *attr_group; struct tunable_attr_01 *tunable_attr; @@ -959,6 +1032,7 @@ static bool lwmi_attr_01_is_supported(struct tunable_a= ttr_01 *tunable_attr) .name =3D _fsname, .attrs =3D _attrname##_attrs \ } =20 +/* CPU tunable attributes */ LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp", "Set the CPU thermal load limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl", @@ -984,9 +1058,40 @@ LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_i= pl", LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl", "Set the CPU cross loading instantaneous power limit"); =20 +/* GPU tunable attributes */ +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_boost_clk, "dgpu_boost_clk", + "Set the dedicated GPU boost clock"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_didvid, "gpu_didvid", + "Get the GPU device identifier and vendor identifier"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_enable, "dgpu_enable", + "Set the dedicated Nvidia GPU enabled status"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_mode, "gpu_mode", + "Set the GPU mode by power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ac_offset, "gpu_nv_ac_offset", + "Set the Nvidia GPU AC total processing power baseline offset"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_bpl, "gpu_nv_bpl", + "Set the Nvidia GPU base power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_cpu_boost, "gpu_nv_cpu_boost", + "Set the Nvidia GPU to CPU dynamic boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ctgp, "gpu_nv_ctgp", + "Set the GPU configurable total graphics power"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ppab, "gpu_nv_ppab", + "Set the Nvidia GPU power performance aware boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_temp, "gpu_temp", + "Set the GPU thermal load limit"); =20 static struct capdata01_attr_group cd01_attr_groups[] =3D { { &cpu_temp_attr_group, &cpu_temp }, + { &dgpu_boost_clk_attr_group, &dgpu_boost_clk }, + { &dgpu_didvid_attr_group, &dgpu_didvid }, + { &dgpu_enable_attr_group, &dgpu_enable }, + { &gpu_mode_attr_group, &gpu_mode }, + { &gpu_nv_ac_offset_attr_group, &gpu_nv_ac_offset }, + { &gpu_nv_bpl_attr_group, &gpu_nv_bpl }, + { &gpu_nv_cpu_boost_attr_group, &gpu_nv_cpu_boost }, + { &gpu_nv_ctgp_attr_group, &gpu_nv_ctgp }, + { &gpu_nv_ppab_attr_group, &gpu_nv_ppab }, + { &gpu_temp_attr_group, &gpu_temp }, { &ppt_cpu_cl_attr_group, &ppt_cpu_cl }, { &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl }, { &ppt_pl1_spl_attr_group, &ppt_pl1_spl }, --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f181.google.com (mail-dy1-f181.google.com [74.125.82.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C6C68361DDC for ; Thu, 2 Apr 2026 03:24:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100281; cv=none; b=gYfHjLmt33LgLmDR7Hk8I+fB0xJtk0Ouv7yCY5zRPd5Bx92zq4SMv8CVPgZTdm3O1fIexs3AhmM0IfSWCJ1lmKpQAtNURopUn61/1dC1Ug70dXt/pu9E//C4lsqI84eOsxvdJf7YinXymOO4SfSg/AroYPHT/QOD0EeBBPTpWZA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100281; c=relaxed/simple; bh=iFh0kepAp7+CUCWbukOagQfE8oUi6Sg9g6FZBrgbTWQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=miWICaRnzulYY+oADmIOApZSR1qRWExCOJpbnQzMYYVXx5EH3MyrjS2ZhpAKIy5LhJsf7KRjAq4aTV46Fk9vui2os1drNqBP/ofLVHoM4AnDPPTyG94vlxVV05n0r1mtSk2rd5i69GvJmWOiDJAYnhZT+bjTo+StrH9WmoT77ck= 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=rrdKvvBD; arc=none smtp.client-ip=74.125.82.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rrdKvvBD" Received: by mail-dy1-f181.google.com with SMTP id 5a478bee46e88-2c4db6bca03so195293eec.1 for ; Wed, 01 Apr 2026 20:24:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100276; x=1775705076; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qOFchhR6XmnD1NBAnpmpLdo/GO9fnq04FOmJKxWkKNQ=; b=rrdKvvBDNVXVACASHjwEWHBrgLQYI6wmTpqfO4A/GfIMKJigpNNYqwupor8V94iOEG D4p9LPp/aRHKOqYi9RAoasCpfnbiflhDZr6KPllssCrauLh5z/1IIqmGDbGs12aWfPDd 4GgPkutZSgO1MypNYRbW3gwflSi62v6wwiG20DQWEEifkXqU6d5aO4iHbsb1npt031Qh G0mxYiUkntGFYsCOw5qodQs2RtdsRIkcaOTVpijw+J6HwABU5cdnsauuNILcwIYL8EIk 2pbTwRvy03gWE7Mz3cyxUE7KoRbYg4PJ5Dv3SENe9K5ShHiL1rzqqHmfHZJI9pzBEZVd cTtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100276; x=1775705076; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=qOFchhR6XmnD1NBAnpmpLdo/GO9fnq04FOmJKxWkKNQ=; b=fpXHiNlNetVGQ+/52MHirkwe/zpA0LNP/ezrR5zci2m2Vpl6NyzpBl4Byin4SH6MQQ iU/V3iNhUYfqjdgAJSlsERufL6/sxCkibqJHZuZtl68W8Yf6yCzzfI8V8l6spmd9f19p kQ8FKZpo/S4XgnUhbV6erX6gjlINrKEdTRrnaqGFbU57MAdaSYLVnu1rIY1yeXrfDqOE syYCq5Iz9uS+jLVb5zrCdbGtmiRA6LlL9hOT3/oCxIwP0Lsr9n0Z+Zrn1pj0rR4dI6Qb RNNEbzpc+zLRzIIn5evkESGa/hjwR7wDZAFwVAjXuuvx5gn6ENEKGBVwctM+g28uj21H EC9w== X-Forwarded-Encrypted: i=1; AJvYcCVz7PNuaJh+mvs4DpMX5d9mrBOUBZJpq24ZQA9/PGlAAXjUsSiwf6EkiX8h8vJ1zLxPS7FWIil4ZxGj5XI=@vger.kernel.org X-Gm-Message-State: AOJu0Yxb1uOQEt4c9LY08l40Oe/611zzGbvjNBUZ4Y/8wenkWMG0pk71 BTyCDuq7VULH+Y5voDU8ORTRi5ER+Jdwt4iS+ZGyt+1SMzsqKr08CERJ X-Gm-Gg: ATEYQzyGcDneS6FTMP4nowI7GGASNu/dm6CeSYjb3bOdRla0LD7SSZHyQ6OuGgTE6DR jWVw6vFu8ymQKIIbM6i9s9sXVMjtaRbxrKW9vso2GURu8uTHHrjQxSOA8gMbytAojj3Xz0o283O bislh9V8iFwRaQrGOPuq1WCh2OBxFE5MeQaQmdvOGzkrZNUdJO4LSUFqhqgcsXYe2QUZGs1qYYy UOQrY+gOvZAOWtoNWBZpn9DFQd4OwxkptFe9bHLswGvx0t5jZDjMV/lvsdeQIrLcGW7Hf8lU1dU 3sbvb7Nzgnv1PYTxfZ3NpW+2bBAnInMmLP4/rzKBHyZDpxN3AkmWpIK+NmhK6gwpFQX+tLtXoX4 pSq2BRvJ+CI8XR53mo4FCHvxE4gPUEj8A7L8M0u0GuMhoojOhiyDc4WkuZcwBC9EsD+aGb65WPT R+5w3SrlV4Wj05x0RIjMXJT6+1FDj0iY9/yoJU7g2QxwhkjVsX7MAegLz+63FR6yaRXqsF9bRQY j58 X-Received: by 2002:a05:693c:3106:b0:2be:b20a:9b69 with SMTP id 5a478bee46e88-2cad7e37c3amr305622eec.12.1775100276521; Wed, 01 Apr 2026 20:24:36 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:36 -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 v7 13/16] platform/x86: lenovo-wmi-other: Rename LWMI_OM_FW_ATTR_BASE_PATH Date: Thu, 2 Apr 2026 03:24:21 +0000 Message-ID: <20260402032424.678528-14-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In the next patch a power supply extension is added which requires a name attribute. Instead of creating another const macro with the same information, rename LWMI_OM_FW_ATTR_BASE_PATH to LWMI_OM_SYSFS_NAME. Reviewed-by: Rong Zhang Tested-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-other.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 57b6b6f17f33..3ff7b9680f3a 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -91,7 +91,7 @@ enum lwmi_feature_id_gpu { lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \ LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x)) =20 -#define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" +#define LWMI_OM_SYSFS_NAME "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 static DEFINE_IDA(lwmi_om_ida); @@ -1123,8 +1123,7 @@ static void lwmi_om_fw_attr_add(struct lwmi_om_priv *= priv) =20 priv->fw_attr_dev =3D device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), NULL, "%s-%u", - LWMI_OM_FW_ATTR_BASE_PATH, - priv->ida_id); + LWMI_OM_SYSFS_NAME, priv->ida_id); if (IS_ERR(priv->fw_attr_dev)) { err =3D PTR_ERR(priv->fw_attr_dev); goto err_free_ida; --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f181.google.com (mail-dy1-f181.google.com [74.125.82.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BEE923659EA for ; Thu, 2 Apr 2026 03:24:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100283; cv=none; b=JXFfFggkUuZ6+71fcq/sYwChMsWS8I0IVJtDTWAzTOwoTqXTQfvyC4oU93mxCpJg0KeN5QHBeNjB4IAvTmnX8e0a99xbHVEx6I4M4clblyj87cmsYoezeOf9nt2oH3bsqMyDqGlh5QO8p1p1TcsWgKt9NTDMTEvvHmyuTI/hpPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100283; c=relaxed/simple; bh=Dzy26VujobLKov1grTdtaP5ctUqwU94eoA28fTqZgs4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kJgUkhvaItoIDA+Ux1VfIf0SL8hdW6WsQ2zXRaIffbqoFR/5eS9zD3D2nHcB1otUC9hXBdRNVWdG5m+jKzENEb+VpBJCNYgVWcclyGykr4Oi6P5tzymn/lMHtaewOLhRSfVmx5xV1RMM4wHJIRch3if+7+CWY1LQeLrLKKlcZxg= 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=GqgTnpGA; arc=none smtp.client-ip=74.125.82.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GqgTnpGA" Received: by mail-dy1-f181.google.com with SMTP id 5a478bee46e88-2c1632faeb9so953503eec.0 for ; Wed, 01 Apr 2026 20:24:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100278; x=1775705078; 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=fruAGVKSqjMOiOzqq/RTqFIhPBYG7Dw2i5TYreojnJ8=; b=GqgTnpGApJR6++0jT5a0ZAJ2Wwcouag8uCxTJ7I/FsDqLS77BfT6CZosU6kGzKxlhX bkLRZnDHFz1Ylx5196Ylv0TkIZ2CK3GYLq0KNKhQ7I4rOv4fVvWJrO/8GzU2qKO0x+Pc Ar/WvmAJ7tabsW7QX+IhRctE4gakbIPN0p3Fko4Ah+hJf7C0jB6K49WrE0HzneIvD5Xq sRW13sv1BBWcKORD27ZBJMk6bBAoDe8CQ7bIQU9H6xtmi/iDa23KPzhB/FGZ7wc0UX9d L2A3sWf0r4vFC9WcKPrLuCVFf63OnxDh9kezwj0949PKgvfdSnEK5L+Kpps6ZW0Th++H ybLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100278; x=1775705078; 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=fruAGVKSqjMOiOzqq/RTqFIhPBYG7Dw2i5TYreojnJ8=; b=a+sf9kihZvOAYuNuAzc9VrbUkBQHtNnLrR8KlyBju8jYLnHiL48Lqhd8sUSKCPbN3t sJuuPrzbBREFJ7JkNDIjbAkPX45THBWENCCW+pA+bLbrYft4qSFjA3wdjUNj5+R8ymPn jVMHscwvWfyp+u78Cvyd7r63rVtKJEJ2nPBNKUXeVbiR4gMNeT+wTM1bdK5b9r/U/PWM cDaVQM6yi8FPCAHXQaBzC79CzK7VdM78MbFvjFlPleySR8vrnhFuZrGcV1imrJ6WLpOu eEOCtfZUF+CUVmzUoRiHi8wxcFib4sK9ioxSFS9wd4Zoe3tiZs7jDlSe+OSdWEv9iYQ2 lTkg== X-Forwarded-Encrypted: i=1; AJvYcCWNp7syV9rPxyV+E7S6iuSRSsHT5cuVBXbi/hg2fIliy2rlRMVBHw2/8PNOfpkpJopDykZLZ//Wgl5tBF4=@vger.kernel.org X-Gm-Message-State: AOJu0YxCShlMG+z+HcIEeicarN8SqltYt5ZNJ9w9FfhUkcWIJlEG2CW+ sFl/txm34hlYrjXsS3OXkDcI07X4+1RpEqMrdhnaVf8MzwF50EcKt0TL X-Gm-Gg: ATEYQzzTe5GtIJM668XvJE6LGqV49DN7b9jRcQbfOd8Jv4NyHzNBRqjIzNJV4E9jar4 a7qUy0iTQQYIeCvLp6bLbD6P62NvQWjbFVqi93D5M5Oxp1w74m0BaavGX5uGOvpQXBfBK3JT1Kv VEvokvY+5O7gJVQi2eBCbrGPRU+02lr0KmIwv2KpiQ/H8UqPISboWXeVbQd0nO6hfGs2xOOWX1E rRbXjahLm27q/rPbpIrvvIXSCCHNw/CQ+WjExww91ArKdN7OoMfwdV4EuBmdHz1brlk94GWCkGQ qLDx0cpDPYd/EjtZR40y8mRvMI7d0G8V7BB/3Zunr3ZGADrInVIzcRFerLpiv4SLH9sYJbs+LiQ 0MjS+w9o9CAb8LIOP4Qct9pBGY50NES6WidgPWRkBoAc6+PYTEUHfIzySHFT5tMT3kXsEN1fqMt Pl2BmrDGpEYqrRxkqOE4yJTaAHG73vZDSEKsoU9/6JKfQfjGVsvCvAl2ZQDW+vf7++/ehG+aDER s53RE6dTrurSwE= X-Received: by 2002:a05:7301:4188:b0:2c5:347:e642 with SMTP id 5a478bee46e88-2c932eae777mr3585024eec.33.1775100277567; Wed, 01 Apr 2026 20:24:37 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:36 -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 v7 14/16] platform/x86: lenovo-wmi-other: Add WMI battery charge limiting Date: Thu, 2 Apr 2026 03:24:22 +0000 Message-ID: <20260402032424.678528-15-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add charge-type power supply extension for devices that support WMI based charge enable/disable. Lenovo Legion devices that implement WMI function and capdata ID 0x03010001 in their BIOS are able to enable or disable charging at 80% through the lenovo-wmi-other interface. Add a charge_type power supply extension to expose this capability to the sysfs. The ideapad_laptop driver can also provide the charge_type attribute. To avoid conflicts between the drivers, get the acpi_handle and do the same check that ideapad_laptop does when it enables the feature. If the feature is supported in ideapad_laptop, abort adding the extension from lenovo-wmi-other. The ACPI method is more reliable when both are present, from my testing, so we can prefer that implementation and do not need to worry about de-conflicting from inside that driver. A new module parameter, force_load_psy_ext, is provided to bypass this ACPI check, if desired. Reviewed-by: Rong Zhang Reviewed-by: Mark Pearson Signed-off-by: Derek J. Clark --- v7: - Use devm_battery_hook_register, manually unregister during unbind. v6: - Check feature flags to determine if the extension should be loaded and if it is writable. - Zero initialize wmi_method_args_32. - Fix formatting. v5: - Use switch statement instead of if for battery charge state set/get. - use force_load_psy_ext to skip all ACPI interactions. - Various formatting fixes. v4: - Remove unused defines. - Disambiguate charging defines by renaming them to be more consistent with the kernel modes they represent. - Add module parameter to ignore ACPI checks. - Don't fail if the ACPI handle isn't found, skip the ACPI check instead. --- drivers/platform/x86/lenovo/Kconfig | 1 + drivers/platform/x86/lenovo/wmi-capdata.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 293 +++++++++++++++++++++- 3 files changed, 294 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/lenovo/Kconfig b/drivers/platform/x86/len= ovo/Kconfig index 09b1b055d2e0..b9a5d18caa1e 100644 --- a/drivers/platform/x86/lenovo/Kconfig +++ b/drivers/platform/x86/lenovo/Kconfig @@ -262,6 +262,7 @@ config LENOVO_WMI_GAMEZONE config LENOVO_WMI_TUNING tristate "Lenovo Other Mode WMI Driver" depends on ACPI_WMI + depends on ACPI_BATTERY select HWMON select FW_ATTR_CLASS select LENOVO_WMI_CAPDATA diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index 891b12ca1db6..e0a30f2c0c87 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -21,6 +21,7 @@ enum lwmi_device_id { LWMI_DEVICE_ID_CPU =3D 0x01, LWMI_DEVICE_ID_GPU =3D 0x02, + LWMI_DEVICE_ID_PSU =3D 0x03, LWMI_DEVICE_ID_FAN =3D 0x04, }; =20 diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 3ff7b9680f3a..5bb22567453c 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -40,9 +40,12 @@ #include #include #include +#include #include #include =20 +#include + #include "wmi-capdata.h" #include "wmi-events.h" #include "wmi-helpers.h" @@ -74,9 +77,11 @@ enum lwmi_feature_id_gpu { LWMI_FEATURE_ID_GPU_NV_CPU_BOOST =3D 0x0b, }; =20 -#define LWMI_FEATURE_ID_FAN_RPM 0x03 +#define LWMI_FEATURE_ID_FAN_RPM 0x03 +#define LWMI_FEATURE_ID_PSU_CHARGE_TYPE 0x01 =20 #define LWMI_TYPE_ID_CROSSLOAD 0x01 +#define LWMI_TYPE_ID_PSU_AC 0x01 =20 #define LWMI_FEATURE_VALUE_GET 17 #define LWMI_FEATURE_VALUE_SET 18 @@ -87,10 +92,17 @@ enum lwmi_feature_id_gpu { =20 #define LWMI_FAN_DIV 100 =20 +#define LWMI_CHARGE_TYPE_STANDARD 0x00 +#define LWMI_CHARGE_TYPE_LONGLIFE 0x01 + #define LWMI_ATTR_ID_FAN_RPM(x) \ lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \ LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x)) =20 +#define LWMI_ATTR_ID_PSU(feat, type) \ + lwmi_attr_id(LWMI_DEVICE_ID_PSU, feat, \ + LWMI_GZ_THERMAL_MODE_NONE, type) + #define LWMI_OM_SYSFS_NAME "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 @@ -130,6 +142,9 @@ struct lwmi_om_priv { bool capdata00_collected : 1; bool capdata_fan_collected : 1; } fan_flags; + + struct acpi_battery_hook battery_hook; + bool bh_registered; }; =20 /* @@ -554,6 +569,279 @@ static void lwmi_om_fan_info_collect_cd_fan(struct de= vice *dev, struct cd_list * lwmi_om_hwmon_add(priv); } =20 +/* =3D=3D=3D=3D=3D=3D=3D=3D Power Supply Extension (component: lenovo-wmi-= capdata 00) =3D=3D=3D=3D=3D=3D=3D=3D */ + +/** + * lwmi_psy_ext_get_prop() - Get a power_supply_ext property + * @ps: The battery that was extended + * @ext: The extension + * @ext_data: Pointer the lwmi_om_priv drvdata + * @prop: The property to read + * @val: The value to return + * + * Writes the given value to the power_supply_ext property + * + * Return: 0 on success, or an error + */ +static int lwmi_psy_ext_get_prop(struct power_supply *ps, + const struct power_supply_ext *ext, + void *ext_data, + enum power_supply_property prop, + union power_supply_propval *val) +{ + struct wmi_method_args_32 args =3D { 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; + + priv->bh_registered =3D false; + + /* Deconflict ideapad_laptop driver */ + if (force_load_psy_ext) + goto load_psy_ext; + + if (!lwmi_psy_prop_is_supported(priv)) + return; + + ret =3D acpi_get_devices(ideapad_hid, lwmi_acpi_match, &handle, NULL); + if (ret) + return; + + if (handle && acpi_has_method(handle, "GBMD") && acpi_has_method(handle, = "SBMC")) { + dev_dbg(&priv->wdev->dev, "ideapad_laptop driver manages battery for dev= ice\n"); + return; + } + +load_psy_ext: + /* Add battery hooks */ + priv->battery_hook.add_battery =3D lwmi_add_battery; + priv->battery_hook.remove_battery =3D lwmi_remove_battery; + priv->battery_hook.name =3D "Lenovo WMI Other Battery Extension"; + priv->bh_registered =3D true; + + battery_hook_register(&priv->battery_hook); +} + +/** + * lwmi_om_psy_remove() - Unregister battery hook + * @priv: Driver private data + * + * Unregisters the battery hook if applicable. + */ +static void lwmi_om_psy_remove(struct lwmi_om_priv *priv) +{ + if (!priv->bh_registered) + return; + + battery_hook_unregister(&priv->battery_hook); + priv->bh_registered =3D false; +} + /* =3D=3D=3D=3D=3D=3D=3D=3D fw_attributes (component: lenovo-wmi-capdata 0= 1) =3D=3D=3D=3D=3D=3D=3D=3D */ =20 struct tunable_attr_01 { @@ -1228,6 +1516,7 @@ static int lwmi_om_master_bind(struct device *dev) } =20 lwmi_om_fan_info_collect_cd00(priv); + lwmi_om_psy_ext_init(priv); =20 lwmi_om_fw_attr_add(priv); =20 @@ -1250,6 +1539,8 @@ static void lwmi_om_master_unbind(struct device *dev) =20 lwmi_om_hwmon_remove(priv); =20 + lwmi_om_psy_remove(priv); + component_unbind_all(dev, NULL); } =20 --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f176.google.com (mail-dy1-f176.google.com [74.125.82.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 801DC36166E for ; Thu, 2 Apr 2026 03:24:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100283; cv=none; b=JmLDsZNHgKr5W0R84pTBpvP+uJIsNIQueCUZHahWpLE/LMb8bPlNIIBDaPRQQShQcJ43QC3kOl0USn0sVY1BlHCu/u7bPfTb7XUBio7R7MzWFH6z8NftBGlBqnFA1AMBe2qTdcW+HeiGzNpKfOTXRgVrh00boj4O1J+zTMtYc1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100283; c=relaxed/simple; bh=WMysZ52oSNBakQksYCHeaVkUqkeNNcoimYTv8lkjwoU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=U0kB/e9zU+3SGbiKRa1Vb4xWZ3weIM3QgtCuxwG5r0HNEy9eIe2ElPdkReR0ffhSN8PpkWM/NsNcRV/hVY0R7o0EVMI5fQA07/JnLw1j+E9O5FFrwcqepORJjCGUVL1I8IUG6MVpW6pV31XXECaVhYgdbPStY9AU46SMjgpcRc4= 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=j9Y35ngJ; arc=none smtp.client-ip=74.125.82.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="j9Y35ngJ" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2c54c68db4dso825446eec.0 for ; Wed, 01 Apr 2026 20:24:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100278; x=1775705078; 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=EO0kfkAc/BO0FF9zBAWzVI8l6UMi0BZlbrLXFCaNrd0=; b=j9Y35ngJ16n/xf/PjCz61hNfp4ymVoTr4pAREDEsKXd7lRRKgAKFRHu7fDPWpT9bqL 7filhOtKRkdVmZNItGOQXTn780eVA+xiNOJQr/KAgGzltbMt3RECuuhsd4PpuCJFK5Ks 7FuthAxxwLJIm7eJ/Ays4lXXT0Zq2rdaF04XTpF1hx6iTPRsyPOHtYEaMzh3C8vWLmkV EwQgy3MOdSdLBe9Wup6goYgwDES6e+JKE2TK1CtWUKKjo3UMsVwImPvGUFnXnsSrLe7a 4I7AACxzo1szyjCA0Uo4XGNEzB9YHYIsfnYeNYbL37g4VxnUXvxu26S4S/mlMTsrN1xS pENA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100278; x=1775705078; 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=EO0kfkAc/BO0FF9zBAWzVI8l6UMi0BZlbrLXFCaNrd0=; b=ilsnVtl7fR7xGTC+ShDu8+mFFZhhKfbxKFvkejleCyWgPUy08aA0euuPemHqR/ozHG vMZ0eppiulgUzsDkqF6/mEle3X2yWNlxkfAebP3PhLPMXkmUiUtVOz3OyiWLhJuG3ej/ IE0EPLV7uUS7janpbWMJgdRxgYP8m2h4ov7Egft31/YKxbQ4u7YmDEnP1SUI/CfbfliF dsPYVw/kbuNLKEooIYbqely2L6mmj45reQih9XEuBS4JNCz0K66D8SQT51MMJAgE6WHB EjGo+fex6H732dc4JhmPXI57Gv6J442KBgmnjI618TzIIZM69vmOio0a4pSNVN32MZbL FH8w== X-Forwarded-Encrypted: i=1; AJvYcCU/G/MzLOkBB773zwFuEaQ1YaGWGoSIOi9NUZ2ngJLdNC32puyJ6B98X6cBbAG3qnA+BB12tLYg17DKE0I=@vger.kernel.org X-Gm-Message-State: AOJu0YwcMkq7mLPYphB+1yVwzpiGio8N8OiungoXZEx9trImXsCZOxl2 Cp5z4Krf993o3wynTNSMltYfbi4EACtxisUVJ63OSu1Sc/EMzG0bD2LE X-Gm-Gg: ATEYQzyqcdfM7RiNNpZIh+oniF48pbGVsIg11NStlyBG4AtM66DVeTO0UnsCF8NxZJG DT6f4duu8OFyaNbBp60jiaHrOkwh98YbJ3vMYmmGv7daIebLUxA9f9EwiP9NhmBTH5/hnGH6iiT /l3b3sQQtoO2fSVkifHilcExglb/8x22hCjwORO2vSrUbMfsKDcaFEliZPWNKojfmsuRuBhJ7QQ iVix2iVHHek/4BJZ6NwgtC04KVCd+TZ22S8LB4Q+pCFIjP7ghtwdgEZxQAjoTQVBU0z7mWNc8KK CkPHbge3QgMDJBG7QBKEqrz2UaKJUBs9RDXUVrvBxH2bgDr2MjbetSW+YrcqFfTvVpkp/oiOwiS Wwhj+32XoM/1aKf9eeGRieXS13177tP5SNaD1cGdf0eheGd9VSmI3GhuT60tgCgnGAA4HgcmZ5W 5ByYV3hCULNyN6VCAz0YLgrB5OlCE0v7WCRzbZT9bBGAbTTpyXmdferRiN0rCu9p9VKIJD7qf6i XE4 X-Received: by 2002:a05:7300:6d1f:b0:2c8:6361:ab58 with SMTP id 5a478bee46e88-2c931276e6amr3837194eec.13.1775100278227; Wed, 01 Apr 2026 20:24:38 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:37 -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 v7 15/16] platform/x86: lenovo-wmi-helpers: Add helper for creating per-device debugfs dir Date: Thu, 2 Apr 2026 03:24:23 +0000 Message-ID: <20260402032424.678528-16-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Rong Zhang We are about to add debugfs support for lenovo-wmi-capdata. Let's setup a debugfs directory called "lenovo_wmi" for tidiness, so that any lenovo-wmi-* device can put its subdirectory under the directory. Subdirectories will be named after the corresponding WMI devices. Signed-off-by: Rong Zhang Signed-off-by: Derek J. Clark --- v7: - Use subsys_initcall() instead of module_init(). --- drivers/platform/x86/lenovo/wmi-helpers.c | 34 +++++++++++++++++++++++ drivers/platform/x86/lenovo/wmi-helpers.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/drivers/platform/x86/lenovo/wmi-helpers.c b/drivers/platform/x= 86/lenovo/wmi-helpers.c index 5fa7a92c145e..0446d25adf6e 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 @@ -186,6 +188,38 @@ int lwmi_tm_notifier_call(enum thermal_mode *mode) } EXPORT_SYMBOL_NS_GPL(lwmi_tm_notifier_call, "LENOVO_WMI_HELPERS"); =20 +static struct dentry *lwmi_debugfs_dir; + +/** + * lwmi_debugfs_create_dir() - Helper function for creating a debugfs dire= ctory + * for a device. + * @wdev: Pointer to the WMI device to be called. + * + * Caller must remove the directory with debugfs_remove_recursive() on dev= ice + * removal. + * + * Return: Pointer to the created directory. + */ +struct dentry *lwmi_debugfs_create_dir(struct wmi_device *wdev) +{ + return debugfs_create_dir(dev_name(&wdev->dev), lwmi_debugfs_dir); +} +EXPORT_SYMBOL_NS_GPL(lwmi_debugfs_create_dir, "LENOVO_WMI_HELPERS"); + +static int __init lwmi_helpers_init(void) +{ + lwmi_debugfs_dir =3D debugfs_create_dir("lenovo_wmi", NULL); + + return 0; +} +subsys_initcall(lwmi_helpers_init) + +static void __exit lwmi_helpers_exit(void) +{ + debugfs_remove_recursive(lwmi_debugfs_dir); +} +module_exit(lwmi_helpers_exit) + MODULE_AUTHOR("Derek J. Clark "); MODULE_DESCRIPTION("Lenovo WMI Helpers Driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/lenovo/wmi-helpers.h b/drivers/platform/x= 86/lenovo/wmi-helpers.h index ed7db3ebba6c..039fe61003ce 100644 --- a/drivers/platform/x86/lenovo/wmi-helpers.h +++ b/drivers/platform/x86/lenovo/wmi-helpers.h @@ -16,6 +16,8 @@ struct wmi_method_args_32 { u32 arg1; }; =20 +struct dentry *lwmi_debugfs_create_dir(struct wmi_device *wdev); + enum lwmi_event_type { LWMI_GZ_GET_THERMAL_MODE =3D 0x01, }; --=20 2.53.0 From nobody Thu Apr 2 20:28:01 2026 Received: from mail-dy1-f174.google.com (mail-dy1-f174.google.com [74.125.82.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04336366546 for ; Thu, 2 Apr 2026 03:24:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100285; cv=none; b=Tmq4LhDqHA5i5W5PI9n1lsQnkv/ojaoAmZrrmcZ3bhUYcLyqhuRHqaghY37nASYEjPvjLwnn3BSP9OYxIwz64cv/52vHVvWjgCt4iow0UaVdDBvOpnBmpQ3LsBhZ6JupUFbg+RTypVzPkucGTrQw36EONpWVxkKHRo3iBnF5mnc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775100285; c=relaxed/simple; bh=cvE6jnfJKB7PyqI9IxmPPiPq9P+SLWPdZ3/G/ov1JPg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dWIa0WZwUFk9KWxibwh2jIYFL1nJXe5Z00vJaDso0EVw/88fTHbmILnzwUSEPts2NA3WkmgW29B5jKcXuNaXiUst4FKckIlgxqdS4dXjBoctMXZhKCAEPLYJDPUY/bbX8jgNgolm7h2YC10Yxhhj5jRLOID3J/CfkSBrkHHSEjk= 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=Cg/lEqy9; arc=none smtp.client-ip=74.125.82.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Cg/lEqy9" Received: by mail-dy1-f174.google.com with SMTP id 5a478bee46e88-2b6b0500e06so604444eec.1 for ; Wed, 01 Apr 2026 20:24:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775100279; x=1775705079; 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=Cg/lEqy9iXwB6xezflBT/C3cRzQvBmm6/1h8axG5hdDzPB+nmsMuyJPNXCPyNcRZ5v 2vsSamZcO2YEHxym0mDL3j2AEFJQEkATgCXArpfruVf5AQIGCjvzQ0U9/ggvpgRUS/TL NMao/1EBq5sRQjRCqOqJ1ZKrHsuEHRltRWhOTKfAatTO86glwpLRcrf1pH+X/x/YFnP3 Un9Cng4Ad9FgDpODb/sp5NVighOmyNV4LTXOdjFer1xTznkn7Z/wO+0pUYK8184JRyZK ncJJGdhFfrbc9cyHEAMPOLpEhl0CUBOG8ivD743V25qCwtNrW+q7G5B9H4nE54M8ylqs V0sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775100279; x=1775705079; 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=Q9piqOAUlT44Yz/CaOcSu88z2CmrN1YPwKgoNm8F1YfB9X8UA18hIsiWgUcO1L870L naQIvtkwnYaynCV+6HRawUC1SFVHT7RO01ISIJbV+qNzMx07Tg9rBaxl3aCuzxoG8erQ yl81meoMnzRTnmxt9plJCueAPeuf5cULPyJOv7RAYJ5T2M5/w3lPHeiI5k7oxX0Q9SwC ZTHH0XHrB7qXWVYHcXTKcUazjzHwzxShNENPvYkWEM0LerBVEsWKPgUNWJK1Ko3igUPC phd+oOokT1ED4+ftE6y7kcDqsZJfi3GbZQW8xRHS1fFVCOpNi9eQdJIBz79t5cbydME7 Lc/w== X-Forwarded-Encrypted: i=1; AJvYcCWnMiF+HLqolrrduOuslDtEOjIXaHRsiTy7GbpX8IbjrPIYfXEZHwnIPPwFG+V1PbbDi7CUn45h7+XZJck=@vger.kernel.org X-Gm-Message-State: AOJu0Yy+NGI38SSXKrHqBDk2Th8eoDz/TcAENN5z+nfusb925+abYiOj nvnsUFY4O35Ct8uzJWk+Yr5+U6kLUQGfSBohGCXqdBigRbVRz25wQpRT X-Gm-Gg: ATEYQzx0iWwZ/YmbACNy+X7bPTLO308h8BPCpcDrda73j35OkE2eULEyaIe8iHAESwF Zi4cEzZ1Tuc3MZlEJwoOD9X3hIFNK1PeBy1B2l2rJ/FokV9WadkJg2Q8sk9HMDSDtCGL6lg73kI qqTSnomEFvZlIAdFelElHZ7D8p5e2CCJiZ3/2Mn4Hf/lp1XABc/Uh9NXPwJ4cRoedJDPWtmu7PB 5FEFfzw+DaAxD2oa07VPFrFAviV76ogJYf7E5iF5zx7973v4FA0Pkz0bygo353QfvnIlMTh/t5M fcJhRt/S/9hVWG34n7mLt04hvpwA5Riwyu5waUMiAwt4PmD4LpcK1tpOYGTRpDRqz34dmILpml0 D2Sn1sv185O96FCAV7CPM7Lb3H3ZPWzQ75XRZX2+zQ3SlwZGN7Ps3yclvWb3msKz6mdlRS7wb1R Km2L95WygPBGzoveTgyXONOfHrz6zrQiBV8L3hWHqYnWLyush+OzZjjxQ9ZmdGwm8TrLAvpSELL 1b1 X-Received: by 2002:a05:7300:72cc:b0:2be:833c:149d with SMTP id 5a478bee46e88-2ca8fa567eemr1121701eec.28.1775100278859; Wed, 01 Apr 2026 20:24:38 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7cae9e9esm1265981eec.23.2026.04.01.20.24.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 20:24:38 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v7 16/16] platform/x86: lenovo-wmi-capdata: Add debugfs file for dumping capdata Date: Thu, 2 Apr 2026 03:24:24 +0000 Message-ID: <20260402032424.678528-17-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260402032424.678528-1-derekjohn.clark@gmail.com> References: <20260402032424.678528-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