From nobody Tue Apr 7 18:33:06 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 D22AF35F5E9 for ; Thu, 12 Mar 2026 03:10: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=1773285039; cv=none; b=hLzrJR++DN48lRH3fXly8cs7zOqyFxMrpVuxfAcTThuSlPRlG+TmCq9D/Vsfh26C8R0UgOSKgEtGvwUZil+sBHuLtwaLWKiXXVCaLrFkCRXXY/R7hIe5GB7doUqBU9rAlDRfr6k9eVkQCErrinaio9ebYyNJSE9QnfytYWYw7tQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285039; c=relaxed/simple; bh=qqWzkRLXexyACYfoPu91Z2Zg4QrtfEree/Xfmn4eCzg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZPtMS45N1VI2+3km3HCYzA+O3De57vY2K7HgbMBSl3l4hUpEG+dwr+Ds5L3BGaSkRP9B0tt5p293I/cJ0iaxmMcy71PsFZYie7FGvxc+387o2k5Q6CdZkc86ZstQufEhJyXA7FjeiHoKnxC9hdYEacQI7rUYo8t5Pd+DB0jOQsQ= 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=X+vbYJvK; 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="X+vbYJvK" Received: by mail-dy1-f170.google.com with SMTP id 5a478bee46e88-2be19f05d7dso1535209eec.1 for ; Wed, 11 Mar 2026 20:10:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773285036; x=1773889836; 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=B7frXpjkjCejQVH5HN0YDV6bknAYxJzfjcY78d3zLEg=; b=X+vbYJvKNq/eYCVrGp4IALtgnk5K3jHRez/6TZoawOiS6D0+D6G3NfUXn/t8fkRQL3 gDNouiOPOWiHCzGsBg9Ge3zsSl+LLkWmIQVXP2dDbKDseZASOLvNiQyB5+sdiOopbiLm kvSQ8fAWu/V4JdVDZdrYje/Q+2KCn56F04DfkRL7yWUrUjoKkrgeAe/eIwCJmeePqXwB 5UzxNf5Vn5JdPFIukP2PpSRGoF2psyltBELPhMGBhGptdaho2GsxxB7d97xELkaFJGe0 61pXsJisVmFtKbPXnuGTp4CkmzoPgulC6jwROgLXiBHNhNZxQerPHZOYG4TUAKiLvB57 Lmwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773285036; x=1773889836; 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=B7frXpjkjCejQVH5HN0YDV6bknAYxJzfjcY78d3zLEg=; b=RBxXpFbfJ6YfnQirNJXtaBI9h37E+UAZmAJCjsPfYfDYuInMXR9pBDPNtG/BodrJC3 deUAzczgf7y0oCzO20K+9PhY23gDe9uRsh78EI9v0Mol4bLzu8eeNmC6EcJdobgaaltL mQMjCOoGwQ1WVn8NkHfIZ89txm4TO3re1d6zSE/KxRvpVDHnCMASkSLq7J47g8Jy+mH3 dkOUp1PnIQ2oeosluXOCT8sNfaGhRSzUdsoRstoL1HqNNhoLp/8AdBJuVj9brnpWmgOv kutU730Y2ZX3p7aKnp5OTla43m6WDH+RjUzoKjGYRUFkhdRovZb8tJo5F7iXLRpVfj88 ofnQ== X-Forwarded-Encrypted: i=1; AJvYcCVRT2xP+6PECc3UKNcpG3OME3ZjYlN9a3i8RnuUumpbryd4NVTK015AO5kdkYAAi1/vEGIuBvyvW1EE0aQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyxLlXtdsa8aWeQxikorq5FiuhbAMw6PMc6xm+8YYex5HAgaOad v6Xud0IGYEvYaAqOGEgsOexNShNN9sSx+hCBvVkwwBeaJCM/aVZsCNuU X-Gm-Gg: ATEYQzxAH+LV6C5WFhTzQQyUREAE7CG6fGVlG2SUXYuwyhvPcHGLYSzq/06ar4YLRBG ZMdgW+K/bq64xa77vnSHXlYzNbAJJU9ucPkhx4prszaAd9Fl8DaZyGU3KBvPNUQq5Rk9nJzBCJI 0f/IFlxrfagzRV0xnsgWNLIac0JopqIZCBG93L5KlqC8j58F3ba48hGLVauSp+9T8qzpN770r/4 /C0apW+JZnxugLQz2COc7I0ykDE7TsqMwGFHvHDrXXipFCVCsaU776zkOcHxt6dDVfd6JCmAOdP oqEtjb9YjjtVzgIXYJC12aidgQkTDAFBqyDhNVqbfkoSbvVcnrr7V31bcHoVY97tYwHtWFB0Vav G5Ezt178edkgfHj+ZFWpPEtISnNI8ZRIS9G6POmKe2BPlNbb3b7k/OmerZOclTR1A0FboQO0WwQ zBKVTCHZPukjSKpjAhUEFoxf0RJHzR+yULWeAp/Irfv+oKNnacQBs5yFPyI0IaipI0L74/apGzC yNi X-Received: by 2002:a05:7300:bc0b:b0:2b8:6b32:1cf1 with SMTP id 5a478bee46e88-2be8a3330cbmr2117411eec.29.1773285035923; Wed, 11 Mar 2026 20:10: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-2be8aa97dcfsm4802495eec.33.2026.03.11.20.10.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 20:10: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 v4 1/8] platform-x86: lenovo-wmi-other: Move LWMI_FAN_DIV Date: Thu, 12 Mar 2026 03:10:25 +0000 Message-ID: <20260312031032.3467565-2-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260312031032.3467565-1-derekjohn.clark@gmail.com> References: <20260312031032.3467565-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. Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-other.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 6040f45aa2b0..caf360b76fc5 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -71,13 +71,13 @@ #define LWMI_FAN_NR 4 #define LWMI_FAN_ID(x) ((x) + LWMI_FAN_ID_BASE) =20 +#define LWMI_FAN_DIV 100 + #define LWMI_ATTR_ID_FAN_RPM(x) \ (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) | \ FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_RPM) | \ FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, LWMI_FAN_ID(x))) =20 -#define LWMI_FAN_DIV 100 - #define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 --=20 2.53.0 From nobody Tue Apr 7 18:33:06 2026 Received: from mail-dy1-f182.google.com (mail-dy1-f182.google.com [74.125.82.182]) (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 81C6F382F3B for ; Thu, 12 Mar 2026 03:10:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285038; cv=none; b=H4yFaZotzmKFDuuX14BRF/OtxDyQcvsZa8Zr6A4d11ibgftyd9DY4ubLEup8MshO1Ubh3c/FwrmztuGRZUGJgExEGuiJqo8OTogoytG3kqMolnZaSz+3XvE5CX6LtdhesBe/CEfS8CVFWQuhzP79+u7n5hNlLdgbwW5Pz95Dh64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285038; c=relaxed/simple; bh=9hrTM3BxY52r/i83ciCo+2/+wCJlHZeKSOLwSgXFeFA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZPC20Pum8jo5tevdXeLkDaQ4yf/S7bBQQOBkcHUWgsEwN+3Rno6DmKAY+R1KH2D5yEhQ8rc0FCMjYwkDZNcfcfsWu7okD7h/xyv/b6goQQJFQlocJ4Ro+st8kEcEsc0SOKk9MnWQG5c0uUf7IDWdVGvQpd228R2LrIYpYS24yZ0= 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=eaLGD+CY; arc=none smtp.client-ip=74.125.82.182 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="eaLGD+CY" Received: by mail-dy1-f182.google.com with SMTP id 5a478bee46e88-2be26842fd5so381047eec.1 for ; Wed, 11 Mar 2026 20:10:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773285037; x=1773889837; 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=U2voJFRWYe3/IRDOJSsRfVKzuFslhb/kU1EVyyj6gX0=; b=eaLGD+CYJ9JmoUJyqzixYmScfJ7rdq53WXPo1Yv4QLLVq9vENwJ6lzAZrcXZ90fFig a3keiJAuLotyksGdNlBVSwqSndEjUrrRPPwHNxCCz3hsTica6tGxmXiPg8zFRf6jr6+4 evstZIAIM3/cGDoYWf55Z7EyW0pPFVkg0S1WTkuggPqLz+I9Jsx2zd6E2vhY5VRbzXa4 BCxjOGYHXBXeFhCdTru2lqBqsUP/Io9N34ezDeh4a4/T6D/VRSwJGoPc+N9l2DAMijHx Se2o7i/gE/QWCOD9I3IXReaUKKDjC0CTEJDgM41w+TbTJGzW59BYxcFJs2WmdXdiOyjI UZiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773285037; x=1773889837; 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=U2voJFRWYe3/IRDOJSsRfVKzuFslhb/kU1EVyyj6gX0=; b=OzrFfyUNBePko8SqSPyIncNSrnDv+XiuU4YpET+sZUF4INWhGGQMpUb3DDcESVSB2L nbP51evYgnmS2xVNXCJ3SFd6nNuUiqJoJUs654ELcHsIPk0xdKYpE3JVHmmFsqDa1y0h fV+GBG5LJ7hWQ9tPdCHBa4F4xFH3BiXXPB77FlqEPmW9+sHJxHnIrsoEPkYKT028TX9W h1j3aqHUKXcCNK33HCgi+AEuh9EAnE4anlQqZPAeryEcfg3Yy8lua7NRODdGfCR60aPO J4P1nhRGpJJlE496xYDmt+CI2P3AI+D83LZtUV56dsQsn+Dq3cwYT7E7SK3mn+5pmU3B PK/A== X-Forwarded-Encrypted: i=1; AJvYcCVcgyxb9V+F9vUILwhLzuHmyKK//14lTHk9uABLx/im/c6ca6BsZgcv8/022uJ+yEsjIu3CJ6kaVCnOJGA=@vger.kernel.org X-Gm-Message-State: AOJu0YzbbTiKh+eW3rVEbjiA5bcQfJYXdCuJRdlgfFtxnlf9r5AG7c7v pPgys15hgBpm4uoy8F8d4AWaaALYcqPe6IGrl8Vxz2QoiO0eUGLoN0n3 X-Gm-Gg: ATEYQzyq8D+BM0Xk3pt+8x/XKp+1LsvbF7PMP2jYNblkE8RnLiVlCPt2RbmC5mzVBIo qdxz226ZbVH85PVSwSKPmaX0NXrO6lHaNKbZXYJck1TF61pWtZuN12EhAzWmGAHqlwaQqIJLLJj tY/I+cTy2fCBJ7oODFGVKpmk3pud62CIJ43tnOq/nnx8NvMN+7iauji85IwKlwYc7evjlsGk3XU UZJuYzLKLCj53nqViuHgytVQv+QL34tUetty4pLepbKF99F36V2PvfxlKiH7tE1dd3nc9zbwdVS k5mF0JhKOi7vr9lB/zgJgsXjDC10noTdotAG77J/DKuY2tBdf+1MXAehdlwkYWAkEHLWT56YvYO 3WorbsT5IYtrOo1d15gXIwUtyf6jpy4jmzHSmScUcG2jMc0nZujZX+mwo2ufz8WivarUIAHe0OT i+kuoTyLVfQ4yyMp14WRDYcsnUd8ixW2OvDv+gD48COpWEwjw0VTMFnGBFPZQUS+YMJk45H4F5n 85l X-Received: by 2002:a05:7301:9f06:b0:2ba:7046:b6b5 with SMTP id 5a478bee46e88-2be9441fc7amr799039eec.15.1773285036661; Wed, 11 Mar 2026 20:10: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-2be8aa97dcfsm4802495eec.33.2026.03.11.20.10.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 20:10: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 v4 2/8] platform-x86: lenovo-wmi-other: Fix tunable_attr_01 struct members Date: Thu, 12 Mar 2026 03:10:26 +0000 Message-ID: <20260312031032.3467565-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260312031032.3467565-1-derekjohn.clark@gmail.com> References: <20260312031032.3467565-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. Signed-off-by: Derek J. Clark --- drivers/platform/x86/lenovo/wmi-other.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index caf360b76fc5..c1728c7c2957 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -546,11 +546,10 @@ static void lwmi_om_fan_info_collect_cd_fan(struct de= vice *dev, struct cd_list * /* =3D=3D=3D=3D=3D=3D=3D=3D fw_attributes (component: lenovo-wmi-capdata 0= 1) =3D=3D=3D=3D=3D=3D=3D=3D */ =20 struct tunable_attr_01 { - struct capdata01 *capdata; struct device *dev; - u32 feature_id; - u32 device_id; - u32 type_id; + u8 feature_id; + u8 device_id; + u8 type_id; }; =20 static struct tunable_attr_01 ppt_pl1_spl =3D { --=20 2.53.0 From nobody Tue Apr 7 18:33:06 2026 Received: from mail-dl1-f49.google.com (mail-dl1-f49.google.com [74.125.82.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E715383C8D for ; Thu, 12 Mar 2026 03:10:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285039; cv=none; b=gRplw0s1V3ydP+IG9Xfgu6+/RLJWbqkSYVXSGpIVnRWqP92durfUOyRXmBwCR9N9R7Bxans0PqSN6FhetfbvRQmtbkBLysx5fnm4TCvBI+HNUZdrpEcoaW8iSXwBGKjMBQCvJNZRrGu+MYEmwfT+xiM0OaoFaR1KfeBR7XsEEFM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285039; c=relaxed/simple; bh=EHszIbgPf3Pj1SlsxCaIWbxPiGpyfzBK/0p9Mu5UyrM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I0NB6oFcFzb8PNZxwWXjlQOgGlwFkBra4GqWq2vheVC1pUy6WruUJpqxTzSY6ktXlmf2mzPPsnl98kV4WoLkec7oj9tRXwsVB4JEBYukFhMLjGOzQO/lTm6J5Q8gUE6fdHLyhGY23pkXs3kYGxZVD6x/InxXWCevBihWOkDwz6E= 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=Po1+T5zk; arc=none smtp.client-ip=74.125.82.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Po1+T5zk" Received: by mail-dl1-f49.google.com with SMTP id a92af1059eb24-12776bebe9fso1086083c88.1 for ; Wed, 11 Mar 2026 20:10:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773285038; x=1773889838; 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=MPSmt+yaVGqHLHpRv6ym/e/BrIWJwmP5C5mFkiIOv04=; b=Po1+T5zkVfuRvGBP6H7sZpzeNWHHXxIf58IgQbqDO2//WCvB5wMY3OCJujOvC98mbU PyNGwLL9f79Fp0g/9v52WRyVwkLQBgWcx1W68qCVmH9kotnFZp4lWhyVNdlKb2M40Ohh 1637u+yHOgkuXNAuTmlsIL+PqTVW2jKvUjkpukfvX5T2MvqvdZxiYpTi4I8ekoSZGeiU PHXtzEG0udIl9EH6ORZ1pPQ5aW7Jqggmm2sfdekcpsf9yxPDLrdoOnNIkpCGQM2VFkX1 PdwV+0qY13CctTNhZRLDdkvIB4HveZLqoeMPcJNZ85L85K8+21MDLWODEyWvC4rT4ooR Qy4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773285038; x=1773889838; 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=MPSmt+yaVGqHLHpRv6ym/e/BrIWJwmP5C5mFkiIOv04=; b=RjZ6GqOIMgbzWDIjvqSfdF8SPG0jXJ7HHkP1uCBFURjGUIIL2VgnD6hF/w6lcp+ild xbSS+l+DK6/Yz74/AlQdNDbZyRMDDjOMSDt4zr5yKN6cYalhWGYwaaxE66wK0r87vI1p AprHFP6MEaxUGFYIuSSO3ged7PQnJIGWhGlyZUu80xMhu8A6dVLbO43P/7Ymfi4j+duT NpDCzdxn3DMuwV8FVM4SFRpibaztDNmcyLLvTuMsl1QjU9kR4SnSwfufOzHksoBE1IpG A/ssMyl0ZmHeftg1K7AsQ+dUyZYLoX+WsCWLrEqkHh2nIkyelyyZfg3AH5fhvAqfThZH vxgQ== X-Forwarded-Encrypted: i=1; AJvYcCXDXva6SecD1sNwCfFb/JNvoYc4CqVjae0Ak8+sxRov/rrGwc0PatDJ9V73sGylqYwSTGB8RaYM8ctBl0g=@vger.kernel.org X-Gm-Message-State: AOJu0YyPBpxsd7XDewIYA2yLdn02jgALB4cEmz7tWzmq8M+pHe+iNhMs as3XFGLIkBNyIVySWQUhaP7Cxx6Flr9H2+Jc1Xymf/m93ixyp5ICSmRD X-Gm-Gg: ATEYQzz0AOAnYNG9EPgxyiOnhNBktN8zTgzsAP/nbZLACsnMjyX4zUrFE09y+wzT+a7 sLbciu+oXvAFI1eDJPp7lq/XeQtM7jtDglCjgrvbZ4ngtA7LhBXKyaJYtdslE1SufnIML3TXkCY 5lxInH0IiAuwt3otuZD2NBPlad5wF7s4p4Xm/buM0PIixoQYXQlp0yp4A7P+cTx3uxphPD0LEOU D/rD0Z/yyYFwaW1DXadT4YzOnzvOEIbdZLCt64iSG1q81Rnkrl3jUaEVoZlXBI2AHQH8Qx86TrT jToo7EKUfwH4HVR9BZ/dIiyBXlHkdzkwS9p/n/oFVSHIMigSkG+BgNZq9Ugm0AcTYR0wxYQiUHs ZgMyBnTYplHIWAwVMa/hj1DOwQrV9FGMG0avNC2znBtWDNQdbqHbU6FoSFfrBOVEAKshZX5G3Yj dJVTa4HaSWqqNf1fqIAXnlRnaE33kbtEO3FYEWB+rpQXodKVYtecsjHbCjer3/92Cz7AP1PErH+ r2A X-Received: by 2002:a05:7022:4597:b0:11d:c91e:3b58 with SMTP id a92af1059eb24-128e784b84emr2187064c88.39.1773285037502; Wed, 11 Mar 2026 20:10: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-2be8aa97dcfsm4802495eec.33.2026.03.11.20.10.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 20:10: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 v4 3/8] platform/x86: lenovo-wmi-other: Add lwmi_attr_id() function Date: Thu, 12 Mar 2026 03:10:27 +0000 Message-ID: <20260312031032.3467565-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260312031032.3467565-1-derekjohn.clark@gmail.com> References: <20260312031032.3467565-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: Mark Pearson Signed-off-by: Derek J. Clark --- v4: - Switch from macro to static inline to preserve types. --- drivers/platform/x86/lenovo/wmi-gamezone.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 59 +++++++++++++--------- 2 files changed, 35 insertions(+), 25 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 c1728c7c2957..9fff9c1f768c 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -73,10 +73,26 @@ =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))) +/** + * 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 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)); +} + +#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" @@ -550,6 +566,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 { @@ -715,12 +733,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) @@ -775,7 +789,6 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, struct wmi_method_args_32 args; struct capdata01 capdata; enum thermal_mode mode; - u32 attribute_id; u32 value; int ret; =20 @@ -786,13 +799,10 @@ static ssize_t attr_current_value_store(struct kobjec= t *kobj, if (mode !=3D LWMI_GZ_THERMAL_MODE_CUSTOM) return -EBUSY; =20 - attribute_id =3D - FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + mode, tunable_attr->type_id); =20 - ret =3D lwmi_cd01_get_data(priv->cd01_list, attribute_id, &capdata); + ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); if (ret) return ret; =20 @@ -803,7 +813,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 attribute_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, @@ -837,7 +848,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; enum thermal_mode mode; - u32 attribute_id; int retval; int ret; =20 @@ -845,13 +855,12 @@ 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 lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + mode, tunable_attr->type_id); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), --=20 2.53.0 From nobody Tue Apr 7 18:33:06 2026 Received: from mail-dy1-f182.google.com (mail-dy1-f182.google.com [74.125.82.182]) (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 1D507384242 for ; Thu, 12 Mar 2026 03:10:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285040; cv=none; b=SzXPJwI74+6WX5UVYZ5QTaY3KQ9kr+UToK8u4Q7G3HRtHVt6w3faMFH+747/VhoowHHvMhPDnDeqd1iH6Lc203QdED4es4qmzF/ZUYD7mlmcfeiP6SCnz+vtWE+BR3hFnpRUz5iywjQcfctjmCPWF6xtWJS0d8HXpRO26k7vxTQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285040; c=relaxed/simple; bh=GZx66QH4s1fRNtSvLsssk0BTCtezNoNWKFyAnw8TXmM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QKiprhFLjg1BodfgFMY1jWEnwPLHMUnSJObqZYim5Wng0BtduvHthj1vBfbXtDK49NxG/Aglg7kIAUVd+M0tBUkudLuRp9JWq/L2r04dTxRn03UZTGjsmLWTOBMdV0Dr2101S7JSyjEodPFiAHgbZCsEYnEPgeOjxq7JdZzOvNo= 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=TONW9yW9; arc=none smtp.client-ip=74.125.82.182 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="TONW9yW9" Received: by mail-dy1-f182.google.com with SMTP id 5a478bee46e88-2bd9a485bd6so1165737eec.1 for ; Wed, 11 Mar 2026 20:10:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773285038; x=1773889838; 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=V9coopxWI7PMIieiIS2sg8rOAHMXedH4sD+nHdF54Dw=; b=TONW9yW9ZXYTm4EsqjtLHK79hERf9+r+C1O3gT2X+8s/JBTqDeOlQi6iAFM836cZbZ yNFy7sjKeGUOjVWOElWDZQ7X8R/MjOGzqgGEEA9YEB2Wtf6scVv7laBYj0LZyU9qOFJK taMq2xIjTp8gR1q+RUe69M5C+fwMXqXeaAPZ89Y62gH9RRXEqVJ+Of19pG0aWg160CyH 2JDt5vbqQCkEBCsQC0JdSFLDMa/cP98feJhm5nLXpeN2gMZ6LVsdRAosief8MU8Utrgs doat/LT84KnuCVp/wgSJGwS/YBts5XsHT4tKabT9Vv9SZddcCxbgFJ3jpwBjl7ISo3eP f0/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773285038; x=1773889838; 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=V9coopxWI7PMIieiIS2sg8rOAHMXedH4sD+nHdF54Dw=; b=UG2B3Mn9q8WXP7N0XC+i17oGSvlCWwkhGcnRsQwSFSeah5W7JTKwhBJmVME0EZX2im Jo7OgD8rjztC+1OoKfCTshsU6naT9BB89GzVFtjtahS8odJ+JHi6Ku4NGTZouPXTFUiB hXFiCmB6JUE80GiqOksFH+d4/GX817smgZBvlr7t9aksLcpQcrup3ebwxRNQRkcBei7J Kc/1vYj1J/da3f1fm7HbvUMWcLATysYgdfRWBjlEC3WQP752gjsXyGMBj+O7bE2maJE+ aVpZWdq67nd9a7JAO6YZ+x+XUP5UgZcK5OaTNqwIXEukok6w9PVt91coUDwnNfIcKswt hncA== X-Forwarded-Encrypted: i=1; AJvYcCUKaBpPtdFxm0OJTPL3nK+9GikdZStjxlWFz5AorZSgM99chpv5g6FjUEBWXlyYe6okO3109fzVzkB2+dI=@vger.kernel.org X-Gm-Message-State: AOJu0Yyc0U3R+14eCcf9K8swShdCxecOFlnIilH56xJCbtfRQkY56rX5 TZ8CCI6JfuSwQrfFmLt2HkX2YwCHjjCnMAcDXvtl2PzzSimISyjHSK78 X-Gm-Gg: ATEYQzxSfdhRBstzaXu6e+GwZanlehwd5Md19GxBJjZVlmwB8qr75j28MUq4s6qb2Q+ DPlPd5Us3Zz5bIFUYp2bjWkmtFx33dY9htfxbkx6m1iwCxf4dbCKKChLNAZD8GJyxGTF58NaXfk R3VmyshKA6th/aCjZWgRHk2Hl/ONEWJsTzvFfAR0HNsgdgWgw4yIFiYdeQ+TeDWXA2nnZGZPti4 KTM4gbAT3E1qA78Tmf4Z13XwH0DgxJNMBONudWIiWw2L9ZtO0ui7oAnVY3Wpa5ycEH9kao4W+0i FRsWj4a+tTD3/mUCBtI317rsQ39Mmk6hCHOkHudqdtKMKyJYgmd7gJX7+kelYm5gb33hjMIqvt0 TjbvDpR7PV9LzaUTdkBL60rrj0c7paZ0DNdMxUQ2xECNCWwcpsIVy0d3sJdtBKQgS4osDP9vvWa Mp85cbiRcamqkAX5INWEnm4ul2G+6UGd4s0tr3X8moUleYHY7mF5z9K87nMbAJenD2bnLJRFQJh LV/ X-Received: by 2002:a05:693c:3003:b0:2be:833c:1486 with SMTP id 5a478bee46e88-2be8a567ac9mr2257428eec.18.1773285038172; Wed, 11 Mar 2026 20:10: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-2be8aa97dcfsm4802495eec.33.2026.03.11.20.10.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 20:10: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 v4 4/8] platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices Date: Thu, 12 Mar 2026 03:10:28 +0000 Message-ID: <20260312031032.3467565-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260312031032.3467565-1-derekjohn.clark@gmail.com> References: <20260312031032.3467565-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Adds lwmi_is_attr_01_supported, and only creates the attribute subfolder if the attribute is supported by the hardware. Due to some poorly implemented BIOS this is a multi-step sequence of events. This is because: - Some BIOS support getting the capability data from custom mode (0xff), while others only support it in no-mode (0x00). - Some BIOS support get/set for the current value from custom mode (0xff), while others only support it in no-mode (0x00). - Some BIOS report capability data for a method that is not fully implemented. - Some BIOS have methods fully implemented, but no complimentary capability data. To ensure we only expose fully implemented methods with corresponding capability data, we check each outcome before reporting that an attribute can be supported. Checking for lwmi_is_attr_01_supported during remove is not done to ensure that we don't attempt to call cd01 or send WMI events if one of the interfaces being removed was the cause of the driver unloading. Reviewed-by: Mark Pearson Reported-by: Kurt Borja Closes: https://lore.kernel.org/platform-driver-x86/DG60P3SHXR8H.3NSEHMZ6J7= XRC@gmail.com/ Signed-off-by: Derek J. Clark --- v4: - Use for loop instead of backtrace gotos for checking if an attribute is supported. - Add include for dev_printk. - Wrap dev_dbg in lwmi_is_attr_01_supported earlier. - Don't use symmetric cleanup of attributes in error states. --- drivers/platform/x86/lenovo/wmi-other.c | 76 ++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 9fff9c1f768c..55a26e5617d4 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -871,6 +872,76 @@ 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: Support level, or an error code. + */ +static int 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; + bool cd_mode_found =3D false; + bool cv_mode_found =3D false; + struct capdata01 capdata; + int retval, ret, i; + + /* Determine tunable_attr->cd_mode_id*/ + for (i =3D 0; i < ARRAY_SIZE(modes); i++) { + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], tunable_attr->type_id); + + ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); + if (ret || !capdata.supported) + continue; + tunable_attr->cd_mode_id =3D modes[i]; + cd_mode_found =3D true; + break; + } + + if (!cd_mode_found) + return -EOPNOTSUPP; + + /* Determine tunable_attr->cv_mode_id, returns 1 if supported*/ + for (i =3D 0; i < ARRAY_SIZE(modes); i++) { + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], tunable_attr->type_id); + + ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, + (unsigned char *)&args, sizeof(args), + &retval); + if (ret || !retval) + continue; + tunable_attr->cv_mode_id =3D modes[i]; + cv_mode_found =3D true; + break; + } + + if (!cv_mode_found) + return -EOPNOTSUPP; + + dev_dbg(tunable_attr->dev, + "cd_mode_id: %02x%02x%02x%02x, cv_mode_id: %#08x attribute support level= : %x\n", + tunable_attr->device_id, tunable_attr->feature_id, tunable_attr->cd_mode= _id, + tunable_attr->type_id, args.arg0, capdata.supported); + + return capdata.supported; +} + /* Lenovo WMI Other Mode Attribute macros */ #define __LWMI_ATTR_RO(_func, _name) \ { \ @@ -994,12 +1065,13 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *= priv) } =20 for (i =3D 0; i < ARRAY_SIZE(cd01_attr_groups) - 1; i++) { + cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; + if (lwmi_attr_01_is_supported(cd01_attr_groups[i].tunable_attr) <=3D 0) + continue; err =3D sysfs_create_group(&priv->fw_attr_kset->kobj, cd01_attr_groups[i].attr_group); if (err) goto err_remove_groups; - - cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; } return 0; =20 --=20 2.53.0 From nobody Tue Apr 7 18:33:06 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 9D7703845A1 for ; Thu, 12 Mar 2026 03:10:39 +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=1773285041; cv=none; b=PpxrlBK27Efe5/ofzn4B0pikCdEotkxa9iYU+iqlb7TwXzU6ariO09rT2ssYNf10MZ9Pbii+Gbt4iO1eTEUM3q0C3k4wTS4SiO9mMT/cdta5IbXeGE1fBApgV35II6AI0Gszr+BfNj87vKIq1glHuJHtVinvaA//NGLsHLyBwXc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285041; c=relaxed/simple; bh=QR0zSE+nqF2iCz7QCMKUI0rGVSRB9ryVoP6ZBB68EMg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UNBKmeeQeCVXklSB/4F0NZ0EuzEAsmdg3mB7abGQKbVk1FzwElJa53uQKoSjhZw7/CczxTiFw2MTju0d9ppzbtpv25TSQbXSg8qTATy6W8REfWKmAjmtrt7ScnjGYR9Saka2qIZZlAD9klP1Srr3yKI9B201dT/1YJ5gKWLLOic= 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=grJIscuL; 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="grJIscuL" Received: by mail-dy1-f180.google.com with SMTP id 5a478bee46e88-2b6b0500e06so685390eec.1 for ; Wed, 11 Mar 2026 20:10:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773285039; x=1773889839; 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=I0nX4zSgIoFVhyYBOE8zOcxktKIEBCmk6esG3M7ceEY=; b=grJIscuLkH7OxNV1g47uqQm6sCLAZWWbZcSJoAURQk7F+t7MvCHwq8TbfGwb3+OjDB b9gTYnnQdfjIyHeJWnQZ9tAp0giqu5OVNUbThptsC5CGZugSVLSeHNeqnNKlGABd3p3m mKeBZHatVDpJxctnJMeeEigIEwXJ+kR8K1rtJBGfYT0sylvj1SkQ8IbJ0UEH1ZsQB+3l qA5FYV7XqhL0MiGTDeto9qFBdp7o4wH6lUho5aGH7rUvp1LKH9xv5SSp39SnSOyeBNjZ vO+V4CVgt4CsfWaRM8Twp0fqqCwkbfBZvSMiC0OcwUAE+RtzxHvm+JE6D7r0+e6NAnuJ YyEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773285039; x=1773889839; 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=I0nX4zSgIoFVhyYBOE8zOcxktKIEBCmk6esG3M7ceEY=; b=Gvi+hJUkxFxriFrh/bmpPJBbcx8nXgvpHvhPFYk941XpBHXi5I+FaR4WENXPoxnkkZ w+Nxr02vv1O4YlL5hEz02bHR9JxxmQFiITYkxPd8/Jyssgzq488yZVpjZeA2ZbnXqBzi iLal+VxXMytaXd6lQnuK2Ba0+cWlmd9ks27UaEKaGpJ41K2GAxxCodbzpySz+3hHvsxE S6Cc5P6UkAGDWL7xM21eZNY2Ms8nl/oML09K7RzLczkDz95TvgiNgxLGhSLK31oSx06p ZWpbVnytah1fcv24ORu++JiQCBO1qYbhaNp1MojtS6nIS7Q53rKRnHizAFcLQNn7wrIT RcQA== X-Forwarded-Encrypted: i=1; AJvYcCV146uJ4C2V0RHRpQTzA+j6fVbQX2nlE5p9lIrTqd1eZVSIzogGGV/lKA9pQ1CzMBjDk9jZKwlqHbV6Wrk=@vger.kernel.org X-Gm-Message-State: AOJu0Ywh/kYp+NLuAJAJyppXDkNd9R7e7PA9p3dOX3J7DlUJwBocgzRo NK6GtUrr4ftworkVZPeOF0LY4vy5zdpZOd2hXBktBS5hwiWAboZ5HXss X-Gm-Gg: ATEYQzyYz9KOVuGTxbPY5O2hv2OdYg3MCpg1AOmC24d8xi8Kdd1SwXaPZMkNIDxhsR1 Xmw5EqSdPhCQIJnsYzPcejRZtT4l2yA6eGzxeb1UZHQ7+DiqF63CLJoET5Ue/573C3vUTIA/poj rmSYYfBX7n5dcOuNGTlh4R2cI/E5jjnDPYAOTAdPwoBfJdOqk/ol6mgW/djMzNbVt0LejGdwo7A FB6aqQTFsFP8BijoXAz6xk8CEC9KXCzRwJDrP8XYFKDWiYq1fahB+PbOI6QUgjeqI6EmrshTJ8I JWB3AB3XSyzNdrkCS+hdUTBhJcZXOMvJSJNRGjs/7Yt93TCA2VdIxxbPujOPenmKlMyBkPJJBhj RsCse3EjVV6PF0ZFaHdE4EoTK/GF4lJU1rUvi5A6OJaDxYezQ2pbA0+U0zn4TBGkNjy3Et+dPj3 baroQoo+nKcATj+SzqOqoYwM8wYePuGUeTHL8u5zkL+WECaAoC+c/NJa1/IfMrY153y6iecPN78 TZVZA5xsFu7VnA= X-Received: by 2002:a05:693c:3016:b0:2ba:974c:4949 with SMTP id 5a478bee46e88-2be8a5804c7mr1945808eec.34.1773285038810; Wed, 11 Mar 2026 20:10: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-2be8aa97dcfsm4802495eec.33.2026.03.11.20.10.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 20:10: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 v4 5/8] platform/x86: lenovo-wmi-other: Add missing CPU tunable attributes Date: Thu, 12 Mar 2026 03:10:29 +0000 Message-ID: <20260312031032.3467565-6-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260312031032.3467565-1-derekjohn.clark@gmail.com> References: <20260312031032.3467565-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: Mark Pearson Signed-off-by: Derek J. Clark --- 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 | 100 ++++++++++++++++-- 3 files changed, 107 insertions(+), 7 deletions(-) diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation= /wmi/devices/lenovo-wmi-other.rst index 01d471156738..82c17361e749 100644 --- a/Documentation/wmi/devices/lenovo-wmi-other.rst +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst @@ -68,9 +68,18 @@ Each attribute has the following properties: - type =20 The following firmware-attributes are implemented: + - cpu_temp: CPU Thermal Load Limit + - ppt_cpu_cl: CPU Cross Loading Power Limit + - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit + - ppt_pl1_spl_cl: Platform Profile Tracking Cross Loading Sustained Power= Limit + - ppt_pl1_tau: Exceed Duration for Platform Profile Tracking Sustained Po= wer Limit - ppt_pl2_sppt: Platform Profile Tracking Slow Package Power Tracking + - ppt_pl2_sppt_cl: Platform Profile Tracking Cross Loading Slow Package T= racking - ppt_pl3_fppt: Platform Profile Tracking Fast Package Power Tracking + - ppt_pl3_fppt_cl: Platform Profile Tracking Cross Loading Fast Package P= ower Tracking + - ppt_pl4_ipl: Platform Profile Trakcing Instantaneous Power Limit + - ppt_pl4_ipl_cl: Platform Profile Tracking Cross Loading Instantaneous P= ower Limit =20 LENOVO_FAN_TEST_DATA ------------------------- diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index 8c1df3efcc55..0e61a873d5ff 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -17,7 +17,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 struct component_match; struct device; diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 55a26e5617d4..11b5f71092fe 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -55,15 +55,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_NONE 0x00 +#define LWMI_TYPE_ID_NONE 0x00 +#define LWMI_TYPE_ID_CROSSLOAD 0x01 =20 #define LWMI_FEATURE_VALUE_GET 17 #define LWMI_FEATURE_VALUE_SET 18 @@ -577,18 +583,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; @@ -1019,17 +1079,45 @@ static int lwmi_attr_01_is_supported(struct tunable= _attr_01 *tunable_attr) .name =3D _fsname, .attrs =3D _attrname##_attrs \ } =20 +LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp", + "Set the CPU thermal load limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl", + "Set the CPU cross loading power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_apu_spl, "ppt_pl1_apu_spl", + "Set the APU sustained power limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_spl, "ppt_pl1_spl", "Set the CPU sustained power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_spl_cl, "ppt_pl1_spl_cl", + "Set the CPU cross loading sustained power limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl2_sppt, "ppt_pl2_sppt", "Set the CPU slow package power tracking limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl2_sppt_cl, "ppt_pl2_sppt_cl", + "Set the CPU cross loading slow package power tracking limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl3_fppt, "ppt_pl3_fppt", "Set the CPU fast package power tracking limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl3_fppt_cl, "ppt_pl3_fppt_cl", + "Set the CPU cross loading fast package power tracking limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl1_tau, "ppt_pl1_tau", + "Set the CPU sustained power limit exceed duration"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_ipl", + "Set the CPU instantaneous power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl", + "Set the CPU cross loading instantaneous power limit"); + =20 static struct capdata01_attr_group cd01_attr_groups[] =3D { + { &cpu_temp_attr_group, &cpu_temp }, + { &ppt_cpu_cl_attr_group, &ppt_cpu_cl }, + { &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl }, { &ppt_pl1_spl_attr_group, &ppt_pl1_spl }, + { &ppt_pl1_spl_cl_attr_group, &ppt_pl1_spl_cl }, + { &ppt_pl1_tau_attr_group, &ppt_pl1_tau }, { &ppt_pl2_sppt_attr_group, &ppt_pl2_sppt }, + { &ppt_pl2_sppt_cl_attr_group, &ppt_pl2_sppt_cl }, { &ppt_pl3_fppt_attr_group, &ppt_pl3_fppt }, + { &ppt_pl3_fppt_cl_attr_group, &ppt_pl3_fppt_cl }, + { &ppt_pl4_ipl_attr_group, &ppt_pl4_ipl }, + { &ppt_pl4_ipl_cl_attr_group, &ppt_pl4_ipl_cl }, {}, }; =20 --=20 2.53.0 From nobody Tue Apr 7 18:33:06 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 732AF38422D for ; Thu, 12 Mar 2026 03:10:40 +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=1773285042; cv=none; b=gJQYuUHiZMgjWVzU/qACSv1iqdQZlYTw5h75zbpHqoYFasJaAhyGXuVAMHS3imVgKD3xsMTS1O6ZPdKesyplFP9TyoWplPsLjAwW/mcrtNXmmi+ZqZufQPcuVWU3ux8Wnx1lqpBgiRB7j0kk1DniPgdwhT1eWcDNQjYZ5KvX/ww= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285042; c=relaxed/simple; bh=nUwBD+vJyzvnR/4LUOgFszn4MlNXSSIUimJRhv0THLE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fk8X5855pOzagSTrcvmPS3zOYTDQ7rvVX86cc8ETz+v+YMRhWbDMC2hvJjugobZgbmzBBBUJy+UC0KikPDnAT2EYvhuny+3ddVJ16rLrffhPhpMQgLzM7HU3m22dPwb8xUC5bEZVTSNxmZGR3Tv0GTB47merozR5LDbz8op2kLg= 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=O6kRhU0u; 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="O6kRhU0u" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2be1c918173so903954eec.1 for ; Wed, 11 Mar 2026 20:10:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773285040; x=1773889840; 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=d6BUowh16N9n58eqqEsAwSeb4O3H8onAffV8REkHHqQ=; b=O6kRhU0u990OY7RqugFt5ZLnE6AqOAXegiedER9AxGeXClILlmiYnlBHurNfJ02jhh e/YTakUsCcHbDqoSH7arjoeSC3WCyuKI4pxYmVZH8ZACNEZirH2R+rkX6dv0VsZiIrp8 xJaK72q0I2nQPolwc4bauTeZUxV7MdXqzSnp/5rB3GF99LI3QK6rcKriH9ecJ9PACNuO KQAShpWtQ69rnQ2IKspaojb/GXOnvM+1oT5rv+sNXU6WJpvW6rb16L4GWv8gBqw4H/QH gtKbMuGFl2mfFBDhbc97/ch+pYJK1oB5MCRlR5hLfPbmED0XBbeKK4y2z+B6QCia19vY DbtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773285040; x=1773889840; 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=d6BUowh16N9n58eqqEsAwSeb4O3H8onAffV8REkHHqQ=; b=IAP4I+6/gDJAUP4sXQEKfkx6vbCnvMCaWDCpuRnrSzbRiSgFbsiV9018yqTGPpH9Rx lxKyzmRWtSxQt9oa8C7HCAUiC6zIHqY07/kTN4PKzV7Kf9snpYIQKSDrQZL2WG8nI+BW BvcTJk56UXKw+G/1a7s3GML9xZ+ngGMOxJJwV96bU/jfnArh8smO9ajn/AatVWpijMY0 zSF8Nj9xT8EzwP5rI5Mbs9XghdVEXZk4t0XPJaKDaRdBpGCDTRfUzOl+rrIrDJmnOunL pIlQpTo/yIA0aK0WpgPz3B/CZ95GP05xgn856Od3LkvOvJXTnjj/qEveIMnhQLWbwMk7 0xpQ== X-Forwarded-Encrypted: i=1; AJvYcCUCaN9v9SfCnoTGMIBoUaIXI/41yaro/tiSQiRYJKJgLnnkgIOKDVoyesN9xOdjDlVUGlXcBFUlFE4fPOg=@vger.kernel.org X-Gm-Message-State: AOJu0YwkTwGfBeA+AIB80OpH9vuVBKOZI6hT7xhH/iuPHq6W+ysjlQ3j LWepW50ZBGMDamNn3VA5JLUQmRwm4Rz8o32GLQ+KOiSCnt5b0+Ustur6 X-Gm-Gg: ATEYQzz7fjMMe8nKeW299myV4fAu2dmSJratf9k0ROjsvLyyBpaI+vCVvkbaTULBmaN E3wwo8zS3oyByx2ev7Zko8wPSkoymT6IzRhtdAqx/LKlTMdVIUXU2b8k5FB9yJayEsjXH+QUITC 8IQx8o5hqwvWzHBN3rB56Vws4r6/hs7XtHO0EYcrou7unciVyAk5PGzyE4i0l4sYE5vpmqvhWHt 6KsY9wQn/bP2jaeK1vZXjGXM88zxfCCaulxc/z4afxeTWyCbull1z48UoK/XYpVmaCgiGH6s4ET J/sZVwtap8Hy7HkCY1kw6yNzXHd6nsMJwyaqxiPJwZuoENeyWPLKNpeBaFTLU4cxXAPDS6/vX56 9Em2t54L4SjYn/jRUJq9pjkoZHqr/mT1YtTu6gCDdg6WAYkhsn01TtdJtJXT2WkTzflAVMLqENT uptaAQIRN24zV+zc2T+GgwsZp847fiVmhdyG/dTZZDT5TBkZJKqDGxHxAm69rjX0TKvV7BJL7bI +uZ X-Received: by 2002:a05:7300:fb88:b0:2be:1dc7:999a with SMTP id 5a478bee46e88-2be8a24ec2cmr2305296eec.4.1773285039575; Wed, 11 Mar 2026 20:10:39 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2be8aa97dcfsm4802495eec.33.2026.03.11.20.10.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 20:10:39 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 6/8] platform/x86: lenovo-wmi-other: Add GPU tunable attributes Date: Thu, 12 Mar 2026 03:10:30 +0000 Message-ID: <20260312031032.3467565-7-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260312031032.3467565-1-derekjohn.clark@gmail.com> References: <20260312031032.3467565-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: Mark Pearson Signed-off-by: Derek J. Clark --- v4: - Align CPU feature enum values. - Remove gpu_oc_stat from Documentation. v3: - Remove gpu_oc_stat. --- .../wmi/devices/lenovo-wmi-other.rst | 10 ++ drivers/platform/x86/lenovo/wmi-capdata.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 105 ++++++++++++++++++ 3 files changed, 116 insertions(+) diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation= /wmi/devices/lenovo-wmi-other.rst index 82c17361e749..bfbea59637bd 100644 --- a/Documentation/wmi/devices/lenovo-wmi-other.rst +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst @@ -69,6 +69,16 @@ Each attribute has the following properties: =20 The following firmware-attributes are implemented: - cpu_temp: CPU Thermal Load Limit + - dgpu_boost_clk: Dedicated GPU Boost Clock + - dgpu_enable: Dedicated GPU Enabled Status + - gpu_didvid: GPU Device Identifier and Vendor Identifier + - gpu_mode: GPU Mode by Power Limit + - gpu_nv_ac_offset: Nvidia GPU AC Total Processing Power Baseline Offset + - gpu_nv_bpl: Nvidia GPU Base Power Limit + - gpu_nv_cpu_boost: Nvidia GPU to CPU Dynamic Boost Limit + - gpu_nv_ctgp: Nvidia GPU Configurable Total Graphics Power + - gpu_nv_ppab: Nvidia GPU Power Performance Aware Boost Limit + - gpu_temp: GPU Thermal Load Limit - ppt_cpu_cl: CPU Cross Loading Power Limit - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index 0e61a873d5ff..196481b1ce17 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -19,6 +19,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 11b5f71092fe..7b98e9271eec 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -66,6 +66,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_NONE 0x00 @@ -649,6 +662,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; @@ -1079,6 +1152,7 @@ static int 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", @@ -1104,9 +1178,40 @@ LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl, "ppt_pl4_= ipl", LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_pl4_ipl_cl, "ppt_pl4_ipl_cl", "Set the CPU cross loading instantaneous power limit"); =20 +/* GPU tunable attributes */ +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_boost_clk, "gpu_boost_clk", + "Set the dedicated GPU boost clock"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_didvid, "gpu_didvid", + "Get the GPU device identifier and vendor identifier"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(dgpu_enable, "dgpu_enable", + "Set the dedicated Nvidia GPU enabled status"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_mode, "gpu_mode", + "Set the GPU mode by power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ac_offset, "gpu_nv_ac_offset", + "Set the Nvidia GPU AC total processing power baseline offset"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_bpl, "gpu_nv_bpl", + "Set the Nvidia GPU base power limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_cpu_boost, "gpu_nv_cpu_boost", + "Set the Nvidia GPU to CPU dynamic boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ctgp, "gpu_nv_ctgp", + "Set the GPU configurable total graphics power"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_nv_ppab, "gpu_nv_ppab", + "Set the Nvidia GPU power performance aware boost limit"); +LWMI_ATTR_GROUP_TUNABLE_CAP01(gpu_temp, "gpu_temp", + "Set the GPU thermal load limit"); =20 static struct capdata01_attr_group cd01_attr_groups[] =3D { { &cpu_temp_attr_group, &cpu_temp }, + { &dgpu_boost_clk_attr_group, &dgpu_boost_clk }, + { &dgpu_didvid_attr_group, &dgpu_didvid }, + { &dgpu_enable_attr_group, &dgpu_enable }, + { &gpu_mode_attr_group, &gpu_mode }, + { &gpu_nv_ac_offset_attr_group, &gpu_nv_ac_offset }, + { &gpu_nv_bpl_attr_group, &gpu_nv_bpl }, + { &gpu_nv_cpu_boost_attr_group, &gpu_nv_cpu_boost }, + { &gpu_nv_ctgp_attr_group, &gpu_nv_ctgp }, + { &gpu_nv_ppab_attr_group, &gpu_nv_ppab }, + { &gpu_temp_attr_group, &gpu_temp }, { &ppt_cpu_cl_attr_group, &ppt_cpu_cl }, { &ppt_pl1_apu_spl_attr_group, &ppt_pl1_apu_spl }, { &ppt_pl1_spl_attr_group, &ppt_pl1_spl }, --=20 2.53.0 From nobody Tue Apr 7 18:33:06 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 2BCC538552A for ; Thu, 12 Mar 2026 03:10:41 +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=1773285042; cv=none; b=PzCs2YC/Jb8KtpFYo5FpTawOKfUYhaOtWkot1a0C31TiuH+fXcehgq+o6VVTrrHHB2bOGM8SYmvsu0FsfT10qk1OSgpuxAlpGBuxj/FjAx4SG6b6Iwt5A+LtXqKvYMh1wAi4M/xFGCPnALngBiK403PjFenUGdBBNC+4X6I2PHc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285042; c=relaxed/simple; bh=xoJDaHeGE10tB/OgQJVbj0y4ysOzv5cGh/fEFk6Jjus=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XMVsOZMJZsa6CeY/x44xcdmffMPNFYufSak5j9E1CZYFhjet5oo31qS3CTFG3PGQZFMUsaP2O0J1jnCDYNa+kgngYVnzFNMJrd7vqQFJ7Z2OFneMNXDPC0S5so0fAw35ClvkoIjMaFZBlTmzPLkH4oqHxOeDb5x0UJj7zaNu/38= 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=CRyo/lnf; 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="CRyo/lnf" Received: by mail-dy1-f180.google.com with SMTP id 5a478bee46e88-2be4781d2baso1299949eec.0 for ; Wed, 11 Mar 2026 20:10:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773285040; x=1773889840; 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=7uk9Rf0W8BgjGzTpflKJXer4l/RsDMi7bflK7Q66tV0=; b=CRyo/lnfNJSICVsaoE+DpoJlPKPa6hw0PBMKv8Yg4/tWmgf4SQY+6lcprVP2+fPR3L RQZv1THsvGST7HLp34r3ox82PCM3LWGADcJDZzepaN8iQSy29Mugtbucfblzwol0hAGV hNrkBKCTsI0IEYJ59ptoAtErjzQiGXT8ZbmHQSRemdSYojtMP915HT7x5RCW8bm3TRat G0SBtdfRZzhyzfpENLlcNIBPZ24RN5BuAwSNoPnxEAFZ6ESrZ6jumiKcdU19pGHpAKMh BDBbD5D5bpj2WhFxdbor657B4Nkn6vGtYv8l+pTcBBHltH4wUfxeZ8sja0NaeKew9wI7 Q9oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773285040; x=1773889840; 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=7uk9Rf0W8BgjGzTpflKJXer4l/RsDMi7bflK7Q66tV0=; b=BGqacjhH2iCGYRpJs0Qyf9UW2n4p2HyXuuyVs/t535lqoVNA8s+kfeJmsib3ecSGpt nW93fvH4SlydF+ZjgTczy+GPFd7vdYQRtkQf2y/h12sHV0Gn8PAvB9EB3FRRyO0CNIql uC1NDCXyeQEhEb++rSdkwFix14ESqj9PtUCUMYqvrHYiV7e+QBILV4GObnMN27dgbkfl 86yg9Pj7tGtXKgO048tyO8a1gPS5RQnflJYabekJy/4e3SohRiBUJUAOKVSZtsxi3ezS 48kfeeCSrSmYP8TrAIJ8vPJ/Q2Y0/MQhhOV3e9S5hTvqw56DU1BZaM2Y+/wVctWJ6Id6 KJHQ== X-Forwarded-Encrypted: i=1; AJvYcCVUtYM4l1qjDUazeA3zaQfaOD5+iKYnXTWQMLwU8Dg24mqpUTHP2dxPxf/dXgkrSrjHy8wYST718O7nGyA=@vger.kernel.org X-Gm-Message-State: AOJu0YzMrYlx00p1obX1y1mjL5uF5KyKCeGhnAx61S3QVHco8xM4UDwF uJ5qU7CynfPI4KDQxRA6G0dwvyLseGt3OK7YPcUpNSe7JdOiU3yLYk4C X-Gm-Gg: ATEYQzyF+t0KyqhOAELtZqXQtlPkAy37Q4qKJqjj69H8MQyRqiqDw+cWvVUubuQuUfB O9Yz/yKHEidp87H3NheFmQqqoe5ZD8uD0qHJ3PmDhdS8N32x45z5/MQFI7OOtBpC2M7kEKkD1xV XiIKD6gB9bBb5jRt1TRrRankE9yYYUp3A5UwtB3rGDiK3QLl7RnESj1oeZ2n7cvXSltY8rFYqDY 62UUhW7r+gMZEtLDkP4Zv15YWcEYyrwsrM34p/etNNN2nsEcVvQ+lqk4HSJpEm9YwAlyI77U1Tv jDdXrRlXdImTOWCykq+CO62lnlPithhW/VUe5ZGRTsu2rIdxBJ2V7k/NdERZ2YLC9d3MEZid1b1 efQ4fYVxSOCyf/e+Qes0PEUswSC7VtaTaEpL20w3BsDA41M83JO0/+REFRBcgSnMYAol3KZ0UwW ehvfLoJTQd/l2FXD2QXuPque1pHNm4SbJ2obVYMoaMAsXQoSUCgIQU7In2ANV6V2teXt/BmrrfJ E3Hr+fBWDbf444= X-Received: by 2002:a05:7300:8ca0:b0:2be:22e9:2178 with SMTP id 5a478bee46e88-2be8a2b1290mr2287521eec.17.1773285040240; Wed, 11 Mar 2026 20:10:40 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2be8aa97dcfsm4802495eec.33.2026.03.11.20.10.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 20:10:39 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 7/8] platform-x86: lenovo-wmi-other: Rename LWMI_OM_FW_ATTR_BASE_PATH Date: Thu, 12 Mar 2026 03:10:31 +0000 Message-ID: <20260312031032.3467565-8-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260312031032.3467565-1-derekjohn.clark@gmail.com> References: <20260312031032.3467565-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: 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 7b98e9271eec..61ac9bee352f 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -114,7 +114,7 @@ static u32 lwmi_attr_id(u8 dev_id, u8 feat_id, u8 mode_= id, u8 type_id) lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \ LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x)) =20 -#define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" +#define LWMI_OM_SYSFS_NAME "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 static BLOCKING_NOTIFIER_HEAD(om_chain_head); @@ -1243,8 +1243,7 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *p= riv) =20 priv->fw_attr_dev =3D device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), NULL, "%s-%u", - LWMI_OM_FW_ATTR_BASE_PATH, - priv->ida_id); + LWMI_OM_SYSFS_NAME, priv->ida_id); if (IS_ERR(priv->fw_attr_dev)) { err =3D PTR_ERR(priv->fw_attr_dev); goto err_free_ida; --=20 2.53.0 From nobody Tue Apr 7 18:33:06 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 C4423386430 for ; Thu, 12 Mar 2026 03:10:41 +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=1773285043; cv=none; b=K3KOa/WBwXGmRXxfmrl9sidF08ebUAvrsjLkoaZ3rnPi6QyE2OXHGf00Kyv3Wq+1MjMiJ2pb+Lek1CI03kioVkLNwj9INBWtKAu2cCw1qhxSzpcjztEt63LUcbVDXAi2VZWzlx3fcxawg4WgbmSNiVSB8b1jttb6DCRfSD9KNsg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773285043; c=relaxed/simple; bh=jZGkc0CaX1KiVfoT+MjN4RrjO76bH/XuYnnKqmkqi/M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mlAAoMsV5sDhhB23KP+9/DMa9cAvVFwTarJDqdqaMOmpu+BY4gCLRMo04QKj0ZSr5NZSnr9lYLqrOwcWL4qR2rNq2e4TDPVi2CKqzu+oGqUwViqRj4XPqZr/D1Lz5I/buom8rP6aHCbHZydQ3nYX/D38Z1i5stUlg03vNpT29/w= 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=CUxI4sSC; 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="CUxI4sSC" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2be4781d2baso1299984eec.0 for ; Wed, 11 Mar 2026 20:10:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773285041; x=1773889841; 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=UShDUsZkuPSTbtrFEPurAUVLmu+3zQB+pbyGgJQ6eFA=; b=CUxI4sSCmU37/+0/VkhOcOUKHvDfwG/t2CjO0WSl5hcNWHi66kAFoiczITwcrXSn1h BxU9siIe8khH11K2Kg6EyyPNmJRRY5roXy0I4uulH23abO/05vY53jGhpZHsGFCtciD0 VW8jnFIf9vc1s4OOZ9jiQsJMJJ0efnKGyrv9hyznanGKomhwM9aApr40VQO2/kl+ngG2 y/cdZgHGOq7QQrz2NME9jz6SDxxdy+unMf41DjK4cC3uOvw7vTIXXBk3UtkChbZHKHQ1 x6/G+J8bkwekdOyTJRZAUPhgQUI389E4Zpz1G6EI538YwThoncHQCq2qI0+M0O6BgTpS LbjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773285041; x=1773889841; 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=UShDUsZkuPSTbtrFEPurAUVLmu+3zQB+pbyGgJQ6eFA=; b=woUffriI1WDyLdl5LACeHdzt83PxXNheSmQn6fFur8ATTMGI8OnR0/XE05YjloyjU+ XXEj3LRxDQABudKk9gWOHVz1ukiP4h3NejtGk4mjTR8/zkMU2oLWbaj1oVIS6U2+2b2W ENniBAJm38HdJXenOL4gVHwayEZ/HYFZr2aJYDF5yEqEkldd7SAnR8LGZyrG1oaLvWNt uUnnBxkpryfKYdHFILjopCCc66/YwnbdFLJ8TVaqnoCXMqTuNkoNAdcA4QtBKL+nd+2A ci+o4cuSmHInFXyyBIBhDxsk4HGIFQ5MReSbUGmhNcQCP4gYTTBRAxyiEcq5YKPujPsp ncvw== X-Forwarded-Encrypted: i=1; AJvYcCXSKpi5ypIUdvsqg76hZh6QrQJBe6IonvKjp5Tt8jPYxCEEwcV/4lD5aj4v2rS1pDN3Zyj6G1VhN4lVO+k=@vger.kernel.org X-Gm-Message-State: AOJu0Yzo0awrNM7XfaGSiYU8+ZyzyHpaZiBinPGiOsqZlX/Y15KggadC joez1Nwr9TRMUBLi7jPe70MBGyy93ef94j8WGL4VAs7naNiRNIUkt48+ X-Gm-Gg: ATEYQzx5VK8DSu+r4bparpvSg0YVAswRvI9nbBH9kl5MRdp9k32fDS5rl9VewoDOdYn tQwpJET8nLLSOJ+pbFmthbhYUSNo6hLicYY/ugg+12bmNfGwRuyoKRiALEaIC/w/vENU6MlZnRK l+bj/WIOvxWVMfz2RzgA7o9UmtuVAzZZGbxMkvyEJHGkw+enNjy3OPmzQJwuZXuEyNRqLRf6Zsi +DyCERxzDxpqfulAXght/OLU09q8eFFzYAnobVOvAQjy/XjVCJzt0bIiU8Lh2TipRJIDC17G3PU JyoGvchweoA9kvYmPi0CdDhECrtJNiYLANUv/TKwKNtasezilg6o3oNh1TSS4QcdPAXYjN5jp8Y ME1PUxXWYzGFXNXhbe8xrmjO/uJd1WGNWRsRJxsObZe1CYyRVHrieGFmxQuQMfUY+pzBuM8OJTS HvnES/LzO15iugcNxe4gXZLgHLh6t/6nMqfkWct2dxPgtzxEBYB2QykRF9DTbNlVPg0zgIZC/NG EA++hO6hDlXzFA= X-Received: by 2002:a05:7301:d1a:b0:2ba:a04a:8372 with SMTP id 5a478bee46e88-2be8a59cf82mr2116408eec.33.1773285040945; Wed, 11 Mar 2026 20:10:40 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2be8aa97dcfsm4802495eec.33.2026.03.11.20.10.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 20:10:40 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 8/8] platform/x86: lenovo-wmi-other: Add WMI battery charge limiting Date: Thu, 12 Mar 2026 03:10:32 +0000 Message-ID: <20260312031032.3467565-9-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260312031032.3467565-1-derekjohn.clark@gmail.com> References: <20260312031032.3467565-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: Mark Pearson Signed-off-by: Derek J. Clark --- 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/wmi-capdata.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 234 +++++++++++++++++++++- 2 files changed, 234 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index 196481b1ce17..cc0d1c176c2f 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -20,6 +20,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 61ac9bee352f..cab9ae6bd811 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -43,9 +43,12 @@ #include #include #include +#include #include #include =20 +#include + #include "wmi-capdata.h" #include "wmi-events.h" #include "wmi-gamezone.h" @@ -79,10 +82,12 @@ 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_NONE 0x00 #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 @@ -93,6 +98,9 @@ enum lwmi_feature_id_gpu { =20 #define LWMI_FAN_DIV 100 =20 +#define LWMI_CHARGE_TYPE_STANDARD 0x00 +#define LWMI_CHARGE_TYPE_LONGLIFE 0x01 + /** * lwmi_attr_id() - Formats a capability data attribute ID * @dev_id: The u8 corresponding to the device ID. @@ -114,6 +122,10 @@ static u32 lwmi_attr_id(u8 dev_id, u8 feat_id, u8 mode= _id, u8 type_id) 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 @@ -155,6 +167,8 @@ struct lwmi_om_priv { bool capdata00_collected : 1; bool capdata_fan_collected : 1; } fan_flags; + + struct acpi_battery_hook battery_hook; }; =20 /* @@ -579,6 +593,223 @@ 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 lwmi_om_priv *priv =3D ext_data; + struct wmi_method_args_32 args; + 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", retval= , prop); + + if (retval =3D=3D LWMI_CHARGE_TYPE_LONGLIFE) + val->intval =3D POWER_SUPPLY_CHARGE_TYPE_LONGLIFE; + else + val->intval =3D POWER_SUPPLY_CHARGE_TYPE_STANDARD; + + 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 lwmi_om_priv *priv =3D ext_data; + struct wmi_method_args_32 args; + + args.arg0 =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_TYPE, LWMI_TYPE= _ID_PSU_AC); + if (val->intval =3D=3D POWER_SUPPLY_CHARGE_TYPE_LONGLIFE) + args.arg1 =3D LWMI_CHARGE_TYPE_LONGLIFE; + else + args.arg1 =3D LWMI_CHARGE_TYPE_STANDARD; + + dev_dbg(&priv->wdev->dev, "Attempting to set %#08x 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_writeable() - Determine if the property is supported + * @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 supported. + * + * Return: Support level, 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) +{ + struct lwmi_om_priv *priv =3D ext_data; + struct capdata00 capdata; + u32 attribute_id =3D LWMI_ATTR_ID_PSU(LWMI_FEATURE_ID_PSU_CHARGE_TYPE, LW= MI_TYPE_ID_PSU_AC); + 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 (%#08x) support level: %x\= n", + attribute_id, capdata.supported); + + return capdata.supported; +} + +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_ps_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_ps_ext_init(struct lwmi_om_priv *priv) +{ + static const char * const ideapad_hid =3D "VPC2004"; + acpi_handle handle =3D NULL; + int ret; + + /* Deconflict ideapad_laptop driver */ + ret =3D acpi_get_devices(ideapad_hid, lwmi_acpi_match, &handle, NULL); + if (ret) + return; + + if (handle && !force_load_psy_ext) { + if (acpi_has_method(handle, "GBMD") && acpi_has_method(handle, "SBMC")) { + dev_dbg(&priv->wdev->dev, "ideapad_laptop driver manages battery for de= vice.\n"); + return; + } + } + + /* Add battery hooks */ + priv->battery_hook.add_battery =3D lwmi_add_battery; + priv->battery_hook.remove_battery =3D lwmi_remove_battery; + priv->battery_hook.name =3D "Lenovo WMI Other Battery Extension"; + + ret =3D devm_battery_hook_register(&priv->wdev->dev, &priv->battery_hook); + if (ret) + dev_err(&priv->wdev->dev, "Error during battery hook: %i\n", ret); +} + /* =3D=3D=3D=3D=3D=3D=3D=3D fw_attributes (component: lenovo-wmi-capdata 0= 1) =3D=3D=3D=3D=3D=3D=3D=3D */ =20 struct tunable_attr_01 { @@ -1334,6 +1565,7 @@ static int lwmi_om_master_bind(struct device *dev) return -ENODEV; =20 lwmi_om_fan_info_collect_cd00(priv); + lwmi_om_ps_ext_init(priv); =20 return lwmi_om_fw_attr_add(priv); } --=20 2.53.0