From nobody Fri Apr 3 02:56:58 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 4769D3C5DA3 for ; Tue, 24 Mar 2026 22:10:37 +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=1774390238; cv=none; b=kEF3/WGwNgKpmqMG3Uiu+9dDVuxCXxacsUkrU/iOUMLtNdpSZmtnIq1jP6gvjUTDZHP2+su7d+GiPRYmfGW7A3nLp8ezTPhMlxxLcBqid24QlFsAZTsOTD8XzJH0k+hL2bDCxdgx5GSTltN9G5UZqV8ltNBsWhWmHQM5Vemgya4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390238; c=relaxed/simple; bh=qqWzkRLXexyACYfoPu91Z2Zg4QrtfEree/Xfmn4eCzg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DHwpdyu6pfJFLs3XUlNQLpcRbDFROFvp8z7cNhjnVmypzRgyWdxS7oCuEVDFj9QeEJY2p+7jygi0N4AkvCamN+AEFqlZa9QKo0S67ALJgCDdCM6TqL0qA1Kr/AXCLo1NSoXjlWCDIp/2wIOPZYKQt+FGwLEU+hwyAj+kW9BlECM= 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=VDSmOw7V; 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="VDSmOw7V" Received: by mail-dy1-f180.google.com with SMTP id 5a478bee46e88-2ba895adfeaso2049227eec.0 for ; Tue, 24 Mar 2026 15:10:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774390236; x=1774995036; 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=VDSmOw7VC0gfS9OrKh6doqc7Lkert+6hvmWMRQ+M215E/2oeCkQ1Lu5cDFje868mlP Meac5wdOq7fmUxg2N6t8UqC/MJKoC1FkHlSwVKxz6XefEdFrkogH258onEMaQ02rSgck 1hpjAk+O2hN+Z3z5ACGvWbJP3BFo/4041ZSz9hc6oJSthY8fXUmCXpVeysaPR9oI5aJw V3uG9NhFs18FP7TyfCg5egkcNz0kJHk5Lnz5UmB5uyoyv58IWbqEUPjOxwpkd3iQeqkH a5XzcfAUv6O1ezqCJMc8aavmUQSHjpNdCeUgo42RcoRg7OWGV41IawExTTJ3duA8EB7S 7nSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774390236; x=1774995036; 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=OkFTciqdFL2+NdFqMauQ80TNq++7KKFD8gxCBV40dVgPHNVAiiGENuFGNJ44vK1PE6 x9u0KQB01NZ8mJrN+M+kFa2sDD7wofUD0CvYJmNWZJ1WxAEZ/ftOz/Xqo7RivGjZHC7k WJ7XWvcw69VSsmInrr7mNOU6UmBk8f5m5Z6yvQW/Tu61FKuVsdFEcaaSUEUDDunJOZ24 wclim6zW2zAbmtkKDa/o/wrQ1I5hhDDyqk75lTDKjRUV1EffGMp0RLcHaFCqI9GUfnV+ KYkp7Mx3nfBJrIKcVmtJQbk5QVg5n7VLgsUy7mUDkBFTclbhMNFI8AaJtLlHlh5Uaxk9 ndlA== X-Forwarded-Encrypted: i=1; AJvYcCVV9YY0256FD2Fz+Heknvkd3bAfJ1DQk+KMMamRQxMaUhwoWiT2qVnSE/J1FqBO3Fvg1EGi9FOakCYHB98=@vger.kernel.org X-Gm-Message-State: AOJu0Ywsm/aJMzaL87xB+eIOiyi4mOoLSaSgd844GePCu6kRL0I+Ln3G xsMAtcgHbaTev9zDC6wYsJj4UPekWRdVfytKy+7jmwyywJrW/I86FRh1 X-Gm-Gg: ATEYQzzZwSoKwo37WQDlDK/DaOXNbAKdaLqqlNM3VwLGnAKRZdikRjEFR32KBzokDh6 di9w3VV7ZgWoZ401LXPHaZ1yb0722eH5+zsl+IrUNyf8eZ2z4i/+YNixwt2m0xe6RgzhVBWO/ZX 4aVlvowe2/0GVvgEUTP3ep5CsSOHnL6XN/SG3tKG9LaKST9pv+dUyJ7xuYdgShPRLguwpXmK/Ng rsUVbbI1M98u2E4tzGX28EtgYmZttphN9l7OWBTRapYb0lI9Q2sDVGBUvnMYYxXsLfyLwYXnpaO pKf4qGQB/oCjtNJPdxhBw4qN03+8qrmd6eheP1eBz3bZmySsGN2nJkwSLqhoj1xnUCH3o9MPaC+ JOqHun6GSTeY/6zY036kcMJAX+EPdR83gRhmQuZMygxLm3LNHJuulNMtHApespPK+CaZpVbUQdC 30JTyqQGPz1qiO4Mh8jBJE9r3cO9YZvn15yfeKSmOrwfa9P7X4Vc5VhE40TbocqyL3h4OgbtHPt JChNYWXyVfZLEo= X-Received: by 2002:a05:7301:644b:b0:2b7:32a6:82bc with SMTP id 5a478bee46e88-2c15d46c9c2mr581391eec.26.1774390236146; Tue, 24 Mar 2026 15: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-2c10b14c299sm16282832eec.6.2026.03.24.15.10.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 15: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 v5 1/8] platform-x86: lenovo-wmi-other: Move LWMI_FAN_DIV Date: Tue, 24 Mar 2026 22:10:25 +0000 Message-ID: <20260324221032.1333636-2-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324221032.1333636-1-derekjohn.clark@gmail.com> References: <20260324221032.1333636-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 Reviewed-by: Rong Zhang Tested-by: Rong Zhang --- 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 Fri Apr 3 02:56:58 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 B345B3C5DB2 for ; Tue, 24 Mar 2026 22:10:37 +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=1774390238; cv=none; b=kYyOwI3gBUS3Mg1hWNfHGHKeiYvtKpu2c1sxbJUCRvKK1I4UStLwiGUGyd1jUXpyn1Pqsx6hHJ2086PeKENXYqemm7FXjAb9cS394KkXNEsFngL0xFwAEKY8lQAAYLY3hYxBAkC9peVjhnriRgBF2WpKrgCLJIc8t1225310c48= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390238; c=relaxed/simple; bh=9hrTM3BxY52r/i83ciCo+2/+wCJlHZeKSOLwSgXFeFA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tEk4cXpJBn93R5buZZ4XlChK63up79ASspJ4yOi0bc87MtZ5yZvdiBEglAD3u6ghZZVkbfx2ikJZzzdSRwRfj979s63TRiLd4kp1rWwePXROGwNG8o4hViAxer2bjdGvlxGtQ9Hk819uxOQmQD/5Vnyi2hrtJtYoUmIYM2+P5wI= 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=qs0qPxd6; 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="qs0qPxd6" Received: by mail-dy1-f170.google.com with SMTP id 5a478bee46e88-2bdd40d3c61so3852229eec.1 for ; Tue, 24 Mar 2026 15:10:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774390237; x=1774995037; 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=qs0qPxd6MJEkooxDgpahaOks8g0hG5lpnkyaw8fgsiBNZeAkiSbOji8ME26cOS4Dcf AYSdDhuEQpGb42h/pwiLhdQoW7cIPSiHgR6dtSdqE3UCZup4yTjnfZKwt987iE1AryMf vCtevlZN+xwmvILevtNaKk9LbVHVSmIyuHQlBKz8hF3gF3gMDeKdW9iYa2JwRJR0he/N RfU40mQv2YeBBscVElrD8rjIqoHZrExF+VMBMDEButreMuPOkqCRk7GdRFPGFoKqmQdP UjYO8Y/iMjG6JNprgkyyS4muIFNFKJBDp1x0jsZUz1MImDV96zZkMfsHTAQExcvAzFNf CASA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774390237; x=1774995037; 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=ouCAcvMeX1DTKhO7Tj9nMB8foZY78u6HKrFzeKM0lpwsdpkYkuS8bnFe8HCzVFdvBI S62Qj0WAS0JfO8EjWi3ZoLsHeB7z5PeaCQ8TrgfM8QK4YLNbl9FcC5utO+f/OLZWZMar 0VXZKYkeyE1hnPMmGfDeAq6HH+hkR/bSIgMLbwTobZmRLlWNUqiennC7fg/s7NWVMzst vNUKn6IksvSnr0JT2E7bXPERUoKL5DYYliIn85xvJYjYzsWUjt6AJ6YLI0AX6g79ZFZE g+TH6vCRC5Dch2xHUIPHjDgcyOYaEmfKhGJaqPE2QxwA2w8ejlanErCXCc5+UM31RFyT QIzw== X-Forwarded-Encrypted: i=1; AJvYcCUNleBykIqKrXnZz7VSajLvQB9Y9Koku3LO7hn9JFc+FJixFnY1Bzdmx2vQERaFcG6Iu3++H5huUWwN8B8=@vger.kernel.org X-Gm-Message-State: AOJu0YzrSyVCxHc+5M2Rt9QijN1dCMhTfofRK6vjMoTET3AAeV5iYiRJ po23jUAejhTX2zcwovB+kUEz2IIG3bBl+Q8SDUzCXBS/9CTf0a4Zt3+0 X-Gm-Gg: ATEYQzyz0k+gFTMNsVHGLeAsjsD6kQzqLmuu20MT+wefwSVQZmol+bkMsGjjuEVdNp8 2HDr451jI2ntklhVH+SzScOfi+Kpi07f4fsHVuF5Ouon9Bg9fbYG52KyCJBfJBShxQAvOGq8/et 50CvBhG5TBzOOFSXMFBQHlOKSw3ByKLXk0jD25ORoyslOWolBpISiLVsJ0QWilNJmaFpgx9n3cA +tJZl+LVzRFO6v/jHn9pE1qJbI5Db/64AmQEk6ADorOJfeoxQy0SDx7737IduhHs/CBj1Z9LtuL zD0W0B1EO0EF1d0KnWOPjaoqAKFudPf1i0tOhZiLq6jXpyeNdhUpsfkyzNfGGCu8hXAV4+g7CLt VaW6iNS5WLHgA8XUZCE/2feu2nPT77VqrSCCeG693g2oXQsSCHU3QO3veG86v4QmUjslJ3NLKIH e7n2aPQpNw7gsjicDrngybS/r60b63MOf39A+i91EB0cbjlaOsl0N8UHco8tPNXm1N6eoQCuMhI ZkF X-Received: by 2002:a05:7300:bc8a:b0:2c0:bfe3:b95c with SMTP id 5a478bee46e88-2c15d252487mr532131eec.4.1774390236835; Tue, 24 Mar 2026 15: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-2c10b14c299sm16282832eec.6.2026.03.24.15.10.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 15: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 v5 2/8] platform-x86: lenovo-wmi-other: Fix tunable_attr_01 struct members Date: Tue, 24 Mar 2026 22:10:26 +0000 Message-ID: <20260324221032.1333636-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324221032.1333636-1-derekjohn.clark@gmail.com> References: <20260324221032.1333636-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 Reviewed-by: Rong Zhang Tested-by: Rong Zhang --- 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 Fri Apr 3 02:56:58 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 91AEF3C65FF for ; Tue, 24 Mar 2026 22:10:38 +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=1774390240; cv=none; b=qKVm0YLbDYU9KVzYA0c9haPIglm97PswImk5jDXCbBcFls51MFCQ7XIHQsn68lI9v3UchkaLzwoYO8Pd96CTSi+EkOEgzvBNNxfEWi7Vz8WOfohMB+VhHf4IhF4Z7VIE6eOw7adj9Wmk/4EaAOK5GwIZjHsOf6u1AF3EOBuj4Jw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390240; c=relaxed/simple; bh=Pc3sAaXzwQS4fT6oy/dAnfR9bvz0ywfoOoPIB9D9HNs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N4QFg+QPvjLTMsfhyRewvD9nVcCBMm0rzKhSFHqftYXtKsG1K9zi8hdo/P0OH+B0A+heiHNPu67FbIL0FZ5vMdVZd48jXjk6JeSBwgzESDUdMWgbndkUwGffzag06RfE6KUNecO/vGWGwacX32Ufa1DxSSWi4n78GB8IXgTB5P4= 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=IBdPwVW6; 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="IBdPwVW6" Received: by mail-dy1-f175.google.com with SMTP id 5a478bee46e88-2bdcf5970cdso300475eec.0 for ; Tue, 24 Mar 2026 15:10:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774390238; x=1774995038; 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=djDoCNG99snwNhYF4bOVVKdkPIFPpULHg36c9f29rYs=; b=IBdPwVW6llh5cD2KHCXQivbvwbCTB7+LdqV1eNEme+hEQeTER455xLi/PS00tdkwhe 7WEusALWzR+3anRVVOC4Bn3k8qJRKjEpmnFlUp/REH8ASQLURwqMFqlGpb4P6yvZpmyX ptAsSxlcOb/mBqiMqcSA/sQFh1pN40WpcbM6riWbbk0SwN/zAqslmvunI10vsBejyNGd y+BQqKpeztVlNt1xRgCPoX5ox4lPw3s229T/Ns46f7Sa43Y5PpVSvsZW33jzZJgMoSGY tvGZrpwEPDhHPQd1IeKyIDzyw6O7S4YFjobt/iRrjyuUszsfvGApiv4dKAlBzQBfgfI/ XzSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774390238; x=1774995038; 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=djDoCNG99snwNhYF4bOVVKdkPIFPpULHg36c9f29rYs=; b=kip7m8q6mvKsG649K4GIojNFxFfbhITuBzjPOR08/fEz0IPZgEpeJSns2UC8VxqNgh pgNlpVPXkUtxdYpEGwk+4EqrUFvRMCRW8j4Ux9Lrt6irG8lQIT6fVYekU+RdXB9AftpS /wtfd1ge1Sf0M0XRGIKGS5MckD6qLVuPDbl1oM2vq4KBZzDvuA22RJTWLmbGpcRcXm/c p8S54cBb5OE36L5coAJjkk84OT2rSs5PmgpqIspRuIy/vq291eBAeuj/wYvBGfi8SoQu g+B2BKU0donWAix1rbHxJrbfztP20vOK/FpECk8IbBxNbG8bCdQZf6luwM+0ZAlKZWfX Azrw== X-Forwarded-Encrypted: i=1; AJvYcCVdPB2bzou6IVFWyX9tSm7RkJVOrhaLorpAAzhCJy7lR5C048k7IiD1F/P5UzZ+rmAegTexwHUPg2QrXKM=@vger.kernel.org X-Gm-Message-State: AOJu0YxCIROG0baQ+yQwYjFfRkTpEWUOeGv+6TGlnoGq52p9LsSMfFs9 exYxFUACdWteroSZli9h/zj9+0HfgHwIXy9nMNG/NW+PkdxKXNyq1S7M X-Gm-Gg: ATEYQzyTTZd/XHlYrqK2nCkXeZk8gOV6wY/ewgjOKSi4uTEK5VGmPuIzPyI0NRGespm 2jJFFZKrkRHkfIgoZDghQrgCHDFPbRYHuLD0Ln7hOgkKM0e1KYXEQZ+kJfYBaf2LzPVOHewz2g4 YaqoFZhHwnnsd1WEaWQG2JNYmxB5mq3wXH00LoZ7ABynwbo2gzNHpYGUWYuaU1yLkUtDprlVn7u AVcePjRacPJRSMxcQCBI1+AL2OKFxGEcYvVYb2/cHDdV4dLiITUEPsgXkyzWcqUYf3qYvxmNojg mKnO8s3ItPZo9cH2AZnzn5KpJUsN/7sevJlfO82IpBz72/I1QMnEA6RoUFpCE38qvaoOccBJmRt Ldi3PYpy256MRVYOxr9vyylFV/nw7f7CXK31W5DA6BJIyh7c6jWnQrzytkH0Dmu/t8G4lrEHa1x fjZ0WifLfTR/o2QUuNirCntsdnfupSXKc2vi4vPkJWLg5lB/phBGgKCiNECEiaHCKECmGisEb5l nXH X-Received: by 2002:a05:7301:4195:b0:2c1:1a55:e4b7 with SMTP id 5a478bee46e88-2c14b679191mr2371073eec.21.1774390237539; Tue, 24 Mar 2026 15: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-2c10b14c299sm16282832eec.6.2026.03.24.15.10.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 15: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 v5 3/8] platform/x86: lenovo-wmi-other: Add lwmi_attr_id() function Date: Tue, 24 Mar 2026 22:10:27 +0000 Message-ID: <20260324221032.1333636-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324221032.1333636-1-derekjohn.clark@gmail.com> References: <20260324221032.1333636-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 Reviewed-by: Rong Zhang Tested-by: Rong Zhang --- 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 | 25 ++++++++++++-- drivers/platform/x86/lenovo/wmi-capdata.h | 3 ++ drivers/platform/x86/lenovo/wmi-gamezone.h | 1 + drivers/platform/x86/lenovo/wmi-other.c | 39 ++++++---------------- 4 files changed, 36 insertions(+), 32 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-capdata.c b/drivers/platform/x= 86/lenovo/wmi-capdata.c index ee1fb02d8e31..6cb3665e9399 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.c +++ b/drivers/platform/x86/lenovo/wmi-capdata.c @@ -48,6 +48,7 @@ #include =20 #include "wmi-capdata.h" +#include "wmi-gamezone.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 +59,27 @@ =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)) +/** + * 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. + */ +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)); +} +EXPORT_SYMBOL_NS_GPL(lwmi_attr_id, "LENOVO_WMI_CAPDATA"); + +#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..b5b6d0305b6a 100644 --- a/drivers/platform/x86/lenovo/wmi-capdata.h +++ b/drivers/platform/x86/lenovo/wmi-capdata.h @@ -19,6 +19,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 +59,7 @@ struct lwmi_cd_binder { cd_list_cb_t cd_fan_list_cb; }; =20 +u32 lwmi_attr_id(u8 dev_id, u8 feat_id, u8 mode_id, u8 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-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..7aa512ff1446 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 @@ -62,8 +61,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 @@ -73,10 +70,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" @@ -715,12 +711,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 +767,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 +777,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 +791,6 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, if (value < capdata.min_value || value > capdata.max_value) return -EINVAL; =20 - args.arg0 =3D attribute_id; args.arg1 =3D value; =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, @@ -837,7 +824,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 +831,8 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, if (ret) return ret; =20 - attribute_id =3D - FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) | - FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) | - FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) | - FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id); - - args.arg0 =3D attribute_id; + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + mode, tunable_attr->type_id); =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, (unsigned char *)&args, sizeof(args), --=20 2.53.0 From nobody Fri Apr 3 02:56:58 2026 Received: from mail-dy1-f169.google.com (mail-dy1-f169.google.com [74.125.82.169]) (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 42B443C6A4C for ; Tue, 24 Mar 2026 22:10:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390241; cv=none; b=kZqoG3flU8zoZKNqKC38TfwlKcbo7bQnlWPsb8y3E4QR64xGv+JNtJIZ9GqiHi4DNZLVl+GDSbr+QA6W1dpbkY4dJI33zIkJXzJDEZ9okdTpPWAaPw4gmf9IXxRzOqbQnLX5aWkojYzk3jf6kPWbk1RXZVzR4e8XzQWdvr7cQ1c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390241; c=relaxed/simple; bh=zk2PMq1pfwQicynBW9pC2cx2syEO+ArZHTP+J/ldLT0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cu/q8ocASQjICdmGpnpP/vsEcMWBtUEPcOvV6iavNnQIOKXrou38BQu95fsOh56tLE8L2g+VIBBGYHoNmAUGLO6jaIS67GQ3ERM819r2xxXOcmXc7uXqfeOhL8tybXQcu8soDNbCiRYM3Qb/zfOJK3OidTz6wLzVbuICM3fY+F4= 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=YcHLza+l; arc=none smtp.client-ip=74.125.82.169 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="YcHLza+l" Received: by mail-dy1-f169.google.com with SMTP id 5a478bee46e88-2bd9a485bd6so3215172eec.1 for ; Tue, 24 Mar 2026 15:10:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774390238; x=1774995038; 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=1YcZeN4ErQAIW4bmYlM2mRp93tMYFqqmCe0N61Nwzx4=; b=YcHLza+lUUL15COXjDY9FL3AVtuBIDrrvhZ2WKWNFLgFbCpMvjk3NUeA3MTbBb2aXf xA59GVeHqCAWUU5ifflsM18J7QQT+0ysFJL/NphMNSTaBSznMarZ7FfYhxoVDAyA1ZFy 1FM16O1q+tUezYVG0S9d4wP0QqqZzunly1Z160i6aujBGN/tkmiKD/5a6XqD2C4lHWmn 5fqQ61j6qqnJQM0xb5dWEO3bCqAOJ2j7NWq3mOYFm/dSKhpn6l4O5eD2utUf5zifAICF HmSoXwjLB8nIwfPAH/3czCej9C0cp8UrCuVUUBBom3nZamAzsPunRYDRFAaMAPok2MkI tNjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774390238; x=1774995038; 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=1YcZeN4ErQAIW4bmYlM2mRp93tMYFqqmCe0N61Nwzx4=; b=Hy7fyfV5IG5WGNakx0WQLJW4MO7b7sVwpXOXTaU8JwE8Vql4yBUkB0ra4MruvnZFLz ROt/ugviZTut34xBWzhaDeaYtJsCTPHDdQeJ+4+TlPASGeG1QDa/sb6qy8pBhdGci+kL nmcio2i2GKO+aM5Q8zunqjp929hajGWwS7pnyNgpBfnIgxxyOMeUUz6dRFiiMV1kGrNI 0jafrtzxUq4B/cyJvvvjn9b9QHYDtjkHKy8p5og+sGB1Zq20ZZ01czM25ExYZ5jtodyH kben6W0kTZnz1tyj5w6RWkcNTjhSEvtYdbBLIWnsUiyKlGj1dglnBY0WT8wi05MdbOzR uymQ== X-Forwarded-Encrypted: i=1; AJvYcCVU1Xd/ZDilu9olqZPGCSDeZQDcWQmSJRnefus53BDGTym6sN0AEbWx2kAtjEKeHeJuQ5hw6V68spVkuZA=@vger.kernel.org X-Gm-Message-State: AOJu0YxUAXBMq+Mksj++kk1oZ8CViUaSx9oZdLe7H5Cg6FAwQAHvy5of 3Sn3+gcqiL/AhxI3ECJJgFzTGz3wjoxJ57vbRRmHski082HcWtxHCrzl X-Gm-Gg: ATEYQzxeDCWA169iWOO+evtQ/pwoE7HGGCnhjSILzhgQ3xLf00MzAx0gvojZqG0gmEB GL1VOV3CVsQDjU/1Yo9jKxsnR2jUkCCcooWOxQrCNx5SLoOazs6nbyEPFxmDAFy+XbLOHfF1v+M nIY5ROqdyGl65IlbOMIEqRB766mFSbFwG9Y2yO4QmbjBnirjZtc00kY7x84SibspFnrlpzKMeSQ H66A4j249fCo+30Zb7YLn4TkhzVAS0fpJ0rtMH2m1/eNsiVWagGH0gqRkgH3t5nDnJprQGl5xPn lNC0kZts70s6dMqisfyAQbFzw5Zb76nwL9hlTxdUCm6tEbzd8ctMFeoVbFApde9gECB4WUXtgPs iErgjunwPfEsLUf5WqeHJOlRO68ff4TS5wxoC8c+Oj+6Xku7vb1AmLjg7nw7gJFJs/VRBRNhwll pWimrYw1P4IYnu1qbj0R1fdQSWIvTAGO/10Xq/74goFgRazbnIxXq296Npch3cUkLFYrClzupg8 Hh4E7OwP9wvMRE= X-Received: by 2002:a05:7301:60b:b0:2be:2f58:2ef5 with SMTP id 5a478bee46e88-2c15d2b54d1mr599587eec.1.1774390238235; Tue, 24 Mar 2026 15: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-2c10b14c299sm16282832eec.6.2026.03.24.15.10.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 15: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 v5 4/8] platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices Date: Tue, 24 Mar 2026 22:10:28 +0000 Message-ID: <20260324221032.1333636-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324221032.1333636-1-derekjohn.clark@gmail.com> References: <20260324221032.1333636-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 Reviewed-by: Rong Zhang Tested-by: Rong Zhang --- v5: - Move cv/cd_mode_id refrences from path 3/4. - Add missing import for ARRAY_SIZE. - Make lwmi_is_attr_01_supported return bool instead of u32. - Various formatting fixes. v4: - Use for loop instead of backtrace gotos for checking if an attribute is supported. - Add include for dev_printk. - Wrap dev_dbg in lwmi_is_attr_01_supported earlier. - Don't use symmetric cleanup of attributes in error states. --- drivers/platform/x86/lenovo/wmi-other.c | 87 ++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 7aa512ff1446..dd98e7f930f5 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -27,10 +27,12 @@ */ =20 #include +#include #include #include #include #include +#include #include #include #include @@ -546,6 +548,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 { @@ -778,7 +782,7 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, return -EBUSY; =20 args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, - mode, tunable_attr->type_id); + tunable_attr->cd_mode_id, tunable_attr->type_id); =20 ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); if (ret) @@ -831,6 +835,10 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, if (ret) return ret; =20 + /* If "no-mode" is the supported mode, ensure we never send current mode = */ + if (tunable_attr->cv_mode_id =3D=3D LWMI_GZ_THERMAL_MODE_NONE) + mode =3D tunable_attr->cv_mode_id; + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, mode, tunable_attr->type_id); =20 @@ -843,6 +851,77 @@ static ssize_t attr_current_value_show(struct kobject = *kobj, return sysfs_emit(buf, "%d\n", retval); } =20 +/** + * lwmi_attr_01_is_supported() - Determine if the given attribute is suppo= rted. + * @tunable_attr: The attribute to verify. + * + * First check if the attribute has a corresponding capdata01 table in the= cd01 + * module under the "custom" mode (0xff). If that is not present then chec= k if + * there is a corresponding "no-mode" (0x00) entry. If either of those pas= ses, + * check capdata->supported for values > 0. If capdata is available, attem= pt to + * determine the set/get mode for the current value property using a simil= ar + * pattern. If the value returned by either custom or no-mode is 0, or we = get + * an error, we assume that mode is not supported. If any of the above che= cks + * fail then the attribute is not fully supported. + * + * The probed cd_mode_id/cv_mode_id are stored on the tunable_attr for lat= er + * reference. + * + * Return: bool. + */ +static bool lwmi_attr_01_is_supported(struct tunable_attr_01 *tunable_attr) +{ + u8 modes[2] =3D { LWMI_GZ_THERMAL_MODE_CUSTOM, LWMI_GZ_THERMAL_MODE_NONE = }; + struct lwmi_om_priv *priv =3D dev_get_drvdata(tunable_attr->dev); + struct wmi_method_args_32 args; + bool cd_mode_found =3D false; + bool cv_mode_found =3D false; + struct capdata01 capdata; + int retval, ret, i; + + /* Determine tunable_attr->cd_mode_id*/ + for (i =3D 0; i < ARRAY_SIZE(modes); i++) { + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], tunable_attr->type_id); + + ret =3D lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata); + if (ret || !capdata.supported) + continue; + tunable_attr->cd_mode_id =3D modes[i]; + cd_mode_found =3D true; + break; + } + + if (!cd_mode_found) + return cd_mode_found; + + /* Determine tunable_attr->cv_mode_id, returns 1 if supported*/ + for (i =3D 0; i < ARRAY_SIZE(modes); i++) { + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->featur= e_id, + modes[i], tunable_attr->type_id); + + ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET, + (unsigned char *)&args, sizeof(args), + &retval); + if (ret || !retval) + continue; + tunable_attr->cv_mode_id =3D modes[i]; + cv_mode_found =3D true; + break; + } + + if (!cv_mode_found) + return cv_mode_found; + + dev_dbg(tunable_attr->dev, + "cd_mode_id: %#10x, cv_mode_id: %#10x attribute support level: %#10x\n", + lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature_id, + tunable_attr->cd_mode_id, tunable_attr->type_id), + args.arg0, capdata.supported); + + return capdata.supported > 0 ? true : false; +} + /* Lenovo WMI Other Mode Attribute macros */ #define __LWMI_ATTR_RO(_func, _name) \ { \ @@ -966,12 +1045,14 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *= priv) } =20 for (i =3D 0; i < ARRAY_SIZE(cd01_attr_groups) - 1; i++) { + cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; + if (!lwmi_attr_01_is_supported(cd01_attr_groups[i].tunable_attr)) + continue; + err =3D sysfs_create_group(&priv->fw_attr_kset->kobj, cd01_attr_groups[i].attr_group); if (err) goto err_remove_groups; - - cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; } return 0; =20 --=20 2.53.0 From nobody Fri Apr 3 02:56:58 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 E18EB3C73D7 for ; Tue, 24 Mar 2026 22:10:39 +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=1774390242; cv=none; b=XMX4ROcUA6qpFP7fvaNHeigpek7P1HLQist3fM57QLTLtj1ib0oDqzk52jw7OCCBQ7kk2KVKerl21AxcSHybYg8DWu6PMnxvbQ2v2qfn3ENRVBJfONmRmefoEEL/YDCc7nsXbjkqDFsgHByer5tsuDU8S8dib4XsXLrjj8lzFzk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390242; c=relaxed/simple; bh=NhrKwtUQcjJatCCx3ryK1/8R6kThqyiE2/zkMKgXxzY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Tsrg4PUVS2XDTSlH4QsZhIku7bofUOlnawYI2C7CjZwChefY7NhJHJ03qCgps8x9qHkXB0JvQHHMaI8iiCl23oT/7PwjsCDcvTZcSU/EtpzelFQnOJgcXfc+eGLCqo/bYhbj9k1H5u40dhEe9eWvHsFzSFbkRM0uqdq9sQWNQ8s= 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=m3JpMg9A; 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="m3JpMg9A" Received: by mail-dy1-f182.google.com with SMTP id 5a478bee46e88-2c156c4a9efso910531eec.1 for ; Tue, 24 Mar 2026 15:10:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774390239; x=1774995039; 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=EKaNrhc05yAccaxhVc4sY8HFstQiIz5DevinHHD49W0=; b=m3JpMg9AvSZ0orlWTS3KX1stBzT0tSiu3w90y+1sIqztZV6gFC9g9EShkuQTlHmjgn YUkRVMRwkCzNeBlwE1Lx63NvBFUJovIqTNdhL7i/h+oHsfs744dTtnIzW9ujb/1vI4ip VwJdODsDUX/c+M7o0Sw9Bm2jWQcVL3NqnixDO6BMnajD4RRBsB5gkS6Y0ovN2F3DGNUl ZC2mqSmaGTTYyqF6BoSUZMHzLxHdVqugq4v5cOliGuod7OXSGXtZKbiI00PpWl6UGyWd BuMEpL/uZI61+OrbqL2NWWqrKnS7UQ6ozIkyQV/+l5SyVdEMgYlGpeWQwq4j2xvWms/c Wm2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774390239; x=1774995039; 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=EKaNrhc05yAccaxhVc4sY8HFstQiIz5DevinHHD49W0=; b=s29ESB4ekGeIq3j0nQLs07GS5FEk4AYtbDCvynvbn6utIbwcyYIwZBlheZZlW2zVvV EjAGD6o+tI1Cah5DQ689BzSN8xfittfJECcJWKe9MeggXghuGkfkG6iO7sW2fFSPNkAa ET7Kp5i7AQo7VXmxRcEu79E+PxNwm02auS7J0KZv64BbAaSIPmwtu6KQ41mp6Dy9mIzC LybQ9syI+j3YHuQ06EQsfEFusy32I6A9AW6cJy0wzvjvVrkRrc1b7cBP7FXEFO8S4zq6 vf55vrIJcxVUtp/75vQT0+CJ4T6NfnSOoJPCXrmogcpcU/Tn8JA8sqezCREfV25QTluG 0JmQ== X-Forwarded-Encrypted: i=1; AJvYcCXA3hPuIyhKWuxwv51R8O4/hE0qH6Zt1cYdMxyUyzXCwuaGYPyhBBXdE1heFu5u5zGsBMO28yYXSnXtm/I=@vger.kernel.org X-Gm-Message-State: AOJu0YxEkoiM4e8YlTGipuWZ0W/a84hkWf3RvlcdFD8Mur7tk93AlGDC BDyyXbXj2MeKkWmvpOb1OjPaQdBF+Y5rYicvb0qJD0KTLDYiPjH27Z67 X-Gm-Gg: ATEYQzyfWoFQW3waQSSeIgm65YijvJF3QmMX9tNcmP71HviOpoI2VrUDKL88HnulPUd +lpBjNcixWGMHI+Dw7UlMhXlWnXROEev/W2OVCBXOQPT6/NLN/LimcusBp4u5kJYsoftCVcpw9X S8WCS34AhFHuM4xnX+Ma7e9xsctJ9C+N+Ov+QtpAuQtVbBg9NC0TLoReRHUIjsY5jfT2DCA+qJ2 80X0MLwXAITkaFbXE3VEj7GVyX6SX2YImBTs7aWIEtvtp3cNurvwBotjRXHS6Lk4+VOm+U5DZoM CtZCphsdWiZLxF+HCASjq2ZfVeO8eRx/DLUcXnR8P4calagkBy5kmYGIG0AGZzWsyn9INnTZz0B k97RJH1lr67unyrvay48VCvidxXkS7+RZZlU8HIzNB5z2goksy9ld16Lp59lMXGnQqPAd/mSpWu 4aWWUP4aGs0DXL5oEMSeQF6ryqQ9w319qEcTTqazJ0aMtBzRosa4H6TKx1QhDX6kIHL43oLdLbr GMb X-Received: by 2002:a05:7300:730e:b0:2be:969:75f3 with SMTP id 5a478bee46e88-2c15d492cdcmr552309eec.34.1774390238924; Tue, 24 Mar 2026 15: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-2c10b14c299sm16282832eec.6.2026.03.24.15.10.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 15: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 v5 5/8] platform/x86: lenovo-wmi-other: Add missing CPU tunable attributes Date: Tue, 24 Mar 2026 22:10:29 +0000 Message-ID: <20260324221032.1333636-6-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324221032.1333636-1-derekjohn.clark@gmail.com> References: <20260324221032.1333636-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 Reviewed-by: Rong Zhang Tested-by: Rong Zhang --- v4: - Align type ID defines. - Align CPU feature enum values. - remove cpu_oc_stat from Documentation. v3: - Remove cpu_oc_stat. --- .../wmi/devices/lenovo-wmi-other.rst | 9 ++ drivers/platform/x86/lenovo/wmi-capdata.h | 5 +- drivers/platform/x86/lenovo/wmi-other.c | 101 +++++++++++++++++- 3 files changed, 109 insertions(+), 6 deletions(-) diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation= /wmi/devices/lenovo-wmi-other.rst index 01d471156738..82c17361e749 100644 --- a/Documentation/wmi/devices/lenovo-wmi-other.rst +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst @@ -68,9 +68,18 @@ Each attribute has the following properties: - type =20 The following firmware-attributes are implemented: + - cpu_temp: CPU Thermal Load Limit + - ppt_cpu_cl: CPU Cross Loading Power Limit + - ppt_pl1_apu_spl: Platform Profile Tracking APU Sustained Power Limit - ppt_pl1_spl: Platform Profile Tracking Sustained Power Limit + - ppt_pl1_spl_cl: Platform Profile Tracking Cross Loading Sustained Power= Limit + - ppt_pl1_tau: Exceed Duration for Platform Profile Tracking Sustained Po= wer Limit - ppt_pl2_sppt: Platform Profile Tracking Slow Package Power Tracking + - ppt_pl2_sppt_cl: Platform Profile Tracking Cross Loading Slow Package T= racking - ppt_pl3_fppt: Platform Profile Tracking Fast Package Power Tracking + - ppt_pl3_fppt_cl: Platform Profile Tracking Cross Loading Fast Package P= ower Tracking + - ppt_pl4_ipl: Platform Profile Trakcing Instantaneous Power Limit + - ppt_pl4_ipl_cl: Platform Profile Tracking Cross Loading Instantaneous P= ower Limit =20 LENOVO_FAN_TEST_DATA ------------------------- diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index b5b6d0305b6a..a35c6d43d946 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 #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 dd98e7f930f5..68a03b383526 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -55,14 +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_CROSSLOAD 0x01 + #define LWMI_FEATURE_VALUE_GET 17 #define LWMI_FEATURE_VALUE_SET 18 =20 @@ -558,18 +565,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; @@ -795,6 +856,8 @@ static ssize_t attr_current_value_store(struct kobject = *kobj, if (value < capdata.min_value || value > capdata.max_value) return -EINVAL; =20 + args.arg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->feature= _id, + tunable_attr->cv_mode_id, tunable_attr->type_id); args.arg1 =3D value; =20 ret =3D lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET, @@ -999,17 +1062,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 Fri Apr 3 02:56:58 2026 Received: from mail-dy1-f172.google.com (mail-dy1-f172.google.com [74.125.82.172]) (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 60FC33C73E5 for ; Tue, 24 Mar 2026 22:10:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390242; cv=none; b=fmr3Do6UP0Pq8nG1d0WbSpVAyFBagt73+NtWcp/6iw6/Oug/iRiHg+x4Tz6LMpIlDxjO+7ZGSYkw98gSfGc8+h/Wrf3cUDVGhpb8v+7FhEYQvsIf1ktCmessUQ5i/24sGXvD6zdnf66RE/908AAceKZgx8Iq8qSH7HxnFo4ucVs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390242; c=relaxed/simple; bh=lWQY8puC197EavYHG9sUuDU53XxjWvHwi96c3puX7zU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZQtdpibYGYMXn4bzApUXjkea2dDyEqTvPIUsCfzIzpiDCm4RYnMNhu/AoHz9eq3sNMKwSf6Z/tIl5x4PlCtjurfHMQ5AVM6nBdItzuJSn2jGtutGF1HR/ugBZV2OqJih2pgSk8fMvHKZJ4sXccHz534+jQpCbH1+ceqbejQzgxo= 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=SEk3F/kR; arc=none smtp.client-ip=74.125.82.172 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="SEk3F/kR" Received: by mail-dy1-f172.google.com with SMTP id 5a478bee46e88-2c107ef474fso4194042eec.0 for ; Tue, 24 Mar 2026 15:10:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774390240; x=1774995040; 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=h+FajLkNHdOqTpkWDGYQQxZJnwmeSWNlMwxRpfXPyHw=; b=SEk3F/kRDIvINqmrstTkOytSgxMDlEK5cmOAcz16IpBGeV8KY7e/cVlg7GT7en/bjM sCiiKoXNcQl+6JxtRq6qIegtml6AtYXuI+WYrvXwaD0jhvVQ0sT4zZFf5OBs9mbrzQJr zs9wtJiBmxZxSi3jxD+iVFPpzmOqsVQM7ab8yaEG8rrHAopBFxz98yUJu6z7InPtgEUt /6t1AqAdreJTIPwLvblbG4ZF9fcZnhnSpaz+GMEPX6ACY/0mwApOdNQiTGmNnbRzmM93 RuzIPVZqsbh0b3wqjTLdVApdS+tIHBtI5ALEJVf71yqrV/QqUn6rup+KFA6VN+azCQyN m41Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774390240; x=1774995040; 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=h+FajLkNHdOqTpkWDGYQQxZJnwmeSWNlMwxRpfXPyHw=; b=Gh9cjL9GRZLoS+L4cOGt7fy/A+ltQZF/08//4ROhxXCZ9wJR5BxU4dG4xj0Z9Vhh7J 6xPeJoWisNqtKKUBisIcPOaRPnHGtm6zSMh0bFSWiOdXiyCA5K1VDOZ5heOd2rTAFhPs qhkQj35FMCeJ5kZA/rM4mA2CG2jTQ5ziAHFuqHb9u8A2e2r+T+SHRjiPCZFvAnKvUGhC chN9O7lu7NcURCCMctMi3+r6cpjXiq8lkN0hPcApeK/rWVMfh1AsFgk3byKgF5TlDyza EyttFUqU+CaFOeQQbSsqlFY2bE2Z0GmiAGoF4b98gDajBbHO3Od3y2CIRXOtKzltZODx epSg== X-Forwarded-Encrypted: i=1; AJvYcCX/I5Jo/7mbBTGtzI6aMug0TCNgSSBG7vwF0DrBNTIcaJ5lya27wL/PUlbzaLCNNu7Lq57BdKCjCPZJExM=@vger.kernel.org X-Gm-Message-State: AOJu0YxB85cADr8Q42Cg3VjB02nMkHb9xyzvg0sz5dumd1gt/1nmOdBB yky0qbu5W6muvogE9cj5EpIUSV8wV1mQ4beh5JkCx755R4sFch7GXPkA X-Gm-Gg: ATEYQzxaflJ0a+niPtLBfJet91J0UAVky4iVD1ARBylf6PS7+WevD/tJAi6pMlFSV8W 3piTAakjMc5hirGB8cgWwWj22waXZ1Vvv/+z4W8qIvEnhCt9Q22DD2+1NZf0agASyOe9Kp283xq 7y1pHwncjCrxj0yxMkUfeH8AoDIKOZMscmKQZ2DU1bl7iFiooFzbHaJIsIzGzfGTiKSZTV90fjf gINVi3G0cyWlUTV/5fxtle0SSCaU17ahwPZp/8qMuGTtygggpuoZ/MX2tlU+MbJgqjqmu6TSiDu xYdhnA4NFcT/ngG/bSFpOrIHxfeCMBbYwIBcdIGifTDr17fT1RycFDiIJ4lDqvlzEkuIVTZvD45 wZ7SRMhM+NRX5K+IVkW4IoXRrjKS8c1oQWieLuLZ8PmyBydEozTwr67QODoOVqjP3KxEdUH0SZR /6SPBMH2IVCNjTUCV5f6KYdO4ztenkhzbmnon48GggZ3Pw0/nzLCwGSfHqqPAmjuk8BG8bxn/A1 K/y X-Received: by 2002:a05:7300:6ca6:b0:2c1:59ea:1103 with SMTP id 5a478bee46e88-2c15d3e2cdfmr633538eec.21.1774390239602; Tue, 24 Mar 2026 15: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-2c10b14c299sm16282832eec.6.2026.03.24.15.10.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 15: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 v5 6/8] platform/x86: lenovo-wmi-other: Add GPU tunable attributes Date: Tue, 24 Mar 2026 22:10:30 +0000 Message-ID: <20260324221032.1333636-7-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324221032.1333636-1-derekjohn.clark@gmail.com> References: <20260324221032.1333636-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 Reviewed-by: Rong Zhang Tested-by: Rong Zhang --- 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 a35c6d43d946..b026ee30c828 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 68a03b383526..6ce7877ce032 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_CROSSLOAD 0x01 @@ -631,6 +644,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; @@ -1062,6 +1135,7 @@ static bool lwmi_attr_01_is_supported(struct tunable_= attr_01 *tunable_attr) .name =3D _fsname, .attrs =3D _attrname##_attrs \ } =20 +/* CPU tunable attributes */ LWMI_ATTR_GROUP_TUNABLE_CAP01(cpu_temp, "cpu_temp", "Set the CPU thermal load limit"); LWMI_ATTR_GROUP_TUNABLE_CAP01(ppt_cpu_cl, "ppt_cpu_cl", @@ -1087,9 +1161,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 Fri Apr 3 02:56:58 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 16A613C7DF6 for ; Tue, 24 Mar 2026 22: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=1774390242; cv=none; b=fwKNncuzrJJGRpPCz6pjYRZommcKe8hyY68KNPfrm1ddnPxAF5PKB9zNAr5gSMc4i+MhrhsEZijw3uaFEHUMJiov/9TCGZJCft1g7oSDAiOAyINEE8krguthq1Zzhh9fKi0r1+ONMGCi8r/7RF0Z+xDurWK2Me/DobyLSO6x5rw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390242; c=relaxed/simple; bh=AQUeaXXHGbiRndMECPqoU/Ior8Gvc/r9qSAFlGar4zY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=enUptyF/1TSGoQ/viF+BhOk86XJMB1XnziY1cAkXWmjdbTBzwizOwD7wGtPfV1hv6qIWh+aAmw5aC/Li+VmdZAZKvlNOpF6BwoUzXFjDBTVF3avx75SejDXf0BSKwx2TmhySURJgUMqp5BrVQMK+5N2yM+iYbzH5XXfStF2eEmI= 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=i+UdVxZi; 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="i+UdVxZi" Received: by mail-dy1-f176.google.com with SMTP id 5a478bee46e88-2c15849aa2cso948108eec.0 for ; Tue, 24 Mar 2026 15:10:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774390240; x=1774995040; 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=Lg/R8SNUkbuKmOj4guhipOUp/eufIeneu/lMA/V0xQQ=; b=i+UdVxZiKHVkrvkUy6QugwiaTWecG6C3MSxisEjwa0pNI7IAnwiX58CWKcr/D6qgAw Bmd54rlrgOgnvINxz3yHOzuaMSBBIXvSijSFvHxqWrxwlW2qy+H5FadnUAvnbPriTAMb xw9WVPPsNH7KCGa344w1ZpIq71ArY8XeGf1+NtiB7JznXZPNmo6QHLRD4qbtLVdkoZQZ jXVlej4TRZkHr8ADRyDgnH6IplJkgJihVahsC+LDDD5R2/jYp9/TJBv4fS+xtfDryNap Oq2gSuqD7cj5bDlVniIfiNWNQF5O2jF40PwbU23pCU3F+PsAIdpprih/6QwAfazqZdJx FXTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774390240; x=1774995040; 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=Lg/R8SNUkbuKmOj4guhipOUp/eufIeneu/lMA/V0xQQ=; b=rHwEJ3c25mazBYUW2CfN1c1VLzaco6Ne1mdNFmA5HXoA693/AQnRXYfHfWtFC8YRl+ tHKnlbP6m2zr2ao9tGQy9Q4lfM5GfJLX/WwAX+EfxhJmLipfkRHVkKB95q7vUtRTIu4O D9R2E6E00GVQW+2gQu/sCdEmiHJ7MniKi5cl14aimj4w+RYLOycdaMbqYCeL/OGQtxVr xT3Hio/PLbFij0CyQI0h66Qw2tEev99yKup+H3RtYP4V5RaBDluYLQKBTUkkfD/7lsTD EYMingPf1x/qmC7qyPvaiysgGdrR+jZME8+ibZLomLt2Elm7dkDLyIUNAD/K53FnN8Br klbQ== X-Forwarded-Encrypted: i=1; AJvYcCUkmD1gfwAWdmI4+QYkAOhf/0gjE2RWVtaStcNIe7YA6fWc+uviQFKn0xuhwGV5KkPI/Yuqmv7zPGXkDOU=@vger.kernel.org X-Gm-Message-State: AOJu0YzQRJL6YuvyE90lsBr1aNUFVFELAaphIdqjEe17k/eW4IqPuzHV sD4ZrVhqgatw+vX6E/vtIXaUHnX9gnfyLGv3lCvNXaq6uFKYjVFh5Zk7 X-Gm-Gg: ATEYQzzh9AasG5pZ7MZ7p6OFOgNa1bUAs9gaQTQuuZV4kSSftGjJ8L7CCY3mRqHc7Lu kT0D9Pbdd2NDGE76U1zWY+xv9dTOqjmD76bAXNfcsqT7tVO4L3jfDAXDzpWhc74R5BO4g7790oQ qcAbAP2c89K5voLzJXFmvi6pv22BAplj5r1qtMu0wAS4cgr6Yb+5jzKZgKme4BQ7K85gKPsFyJS jMhfVwMHVYGjPKroEqoOsWm5ACDWC1HsZuY0gw3c/yUDsx5ZBW6sr9svbcXZjFoEJQwfUhdulUl PrnYpXtk+pcrAfh4iqhja+Qh8YGgn2d/PczDCdq6Ig/VKluZ54Ks7JdKRBUlHefpPtMh+xPut0X TesOv+9aY9KzQGp0JdgKIdW531LtNV+KPriTn6zszNidlPu3pq7P/eEZvfMf2RsMxitk8Fybz/2 FFsb+x27sWzWP57PDLlPPRsTyP7gcJa8i2Z57ZSxz+1Tvh8a5Qgnlk6xcMItAI05bhV3wmIAg4k Lf5 X-Received: by 2002:a05:7301:1e91:b0:2b7:1d38:3596 with SMTP id 5a478bee46e88-2c15d32adfamr436483eec.4.1774390240229; Tue, 24 Mar 2026 15: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-2c10b14c299sm16282832eec.6.2026.03.24.15.10.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 15: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 v5 7/8] platform-x86: lenovo-wmi-other: Rename LWMI_OM_FW_ATTR_BASE_PATH Date: Tue, 24 Mar 2026 22:10:31 +0000 Message-ID: <20260324221032.1333636-8-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324221032.1333636-1-derekjohn.clark@gmail.com> References: <20260324221032.1333636-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 Reviewed-by: Rong Zhang Tested-by: Rong Zhang --- 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 6ce7877ce032..11c16857ef97 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -96,7 +96,7 @@ enum lwmi_feature_id_gpu { lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \ LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x)) =20 -#define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other" +#define LWMI_OM_SYSFS_NAME "lenovo-wmi-other" #define LWMI_OM_HWMON_NAME "lenovo_wmi_other" =20 static BLOCKING_NOTIFIER_HEAD(om_chain_head); @@ -1226,8 +1226,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 Fri Apr 3 02:56:58 2026 Received: from mail-dy1-f169.google.com (mail-dy1-f169.google.com [74.125.82.169]) (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 334FF3C5DD5 for ; Tue, 24 Mar 2026 22:10:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390244; cv=none; b=X/1k4BVmNYVYH/oEjaApHa/3erh7n5W0Et9cslTuSTjXVXHTjP3OtuLTOxJ/2tsTj7kwI8QZVjdHf5JLf+oN0uZVY8QF2x40ODCL0oHtDA0uROHqbDZ/WYiBDCf+gw+dLHohBahFLEWa8PHXHztNbtkzYWiLT4QOX8yFue0A6YY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774390244; c=relaxed/simple; bh=++q/TIbFFULKGy6KkUZYgcdJioWrXHdR5t3T1e5fAao=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HoOu9jD57vvi79GKyLPS/81ScXUF1QBWUBHP6ihCm5+niGQ932xwX+RgOYQdCis8v854PyAHeVQ2bahkRX0GsmLn2W/qRxGwPFdB0zy/T2qMRTzPRE1a0sYZjb9lGDYe5GJZOepdCjdXguIEcmkAWMzbyvqd4mcEwJh6yU+SX7g= 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=knWSWGoh; arc=none smtp.client-ip=74.125.82.169 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="knWSWGoh" Received: by mail-dy1-f169.google.com with SMTP id 5a478bee46e88-2c160cb021cso116852eec.1 for ; Tue, 24 Mar 2026 15:10:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774390241; x=1774995041; 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=2gMM/Qe6t0JjJ7msgQKHqXE41UfA697h2w/oTgTV6Dw=; b=knWSWGoh65RegKv5wNW1RZEo2oZEpp8QWwccoYZPPqE+WOHo9az8dxWxEW41DP4UAa FhcIdj4I3pydtrW3G/hIgf9SpQdXRHciHoSRs/NWK7S9aXCqpdyiIV5HdZ3wFNQisnbZ rgvQvT3vS/f7ByOSURFhVdoALYuIsaD08p4+Uc1qquZ1GYS7v0bEtrUM70oW+rGvbveM hwmkndEZxy/iCQvlcT6NjJjJ4bEcrF7mJe5uwD1Whqyl6RTYGRrcLuUQPkds1xwUxZue LBg8yw7Nq4Vt9olsLA2HJ5lNNSopk5a+qud8sTXFrAnz9ETSuJsaj4CY2vtlGWRhyHcD iowA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774390241; x=1774995041; 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=2gMM/Qe6t0JjJ7msgQKHqXE41UfA697h2w/oTgTV6Dw=; b=SZAJmGll0j2PUCINvH4mt4O116ByLQ5MYChJEAgtoqwTmMaiEjLAQ3CfHo/TX13Nys MpyTbbHR1lvDfxW4ndzexKC4e0527TqcqeG7dTYJhvZfESgsFKXO4SC4Yf1UEVSqcKXy HpFMD+IC5AKLbTie2EVF+KhXjTedbJ9QUVgR7YzTWxcaZF7QjFDUYAYAs0g5AuaQGZ7p Pug85dAEKR5UH1TASvWTFLvxgd7eUTJkaBgSNOiL9ZuwsyeaMEbxo0NGj0heArfRX3/d TDzXIHx5j9Il6x8VWAA8CkaFdUAP5Os0tUPPoYsruS7MBXOqJCb7a533Xb4rBS/duU05 DZlw== X-Forwarded-Encrypted: i=1; AJvYcCVKGZ5+dAgtEEEXUsZ/GvIsbaQ840KZY1BK8xYDBeA3t8KE1DjFItYCTH6v3OEyO7mhLsAjIsbrqU+M7ug=@vger.kernel.org X-Gm-Message-State: AOJu0YwWCKdFzP9OtRsSyNrBzOdud6WU6Q32tmTA+pT/S99p74Xd4Dhj U/Ha91RLzO6UMixGUIebP/uZuKZkzzYHTnszPcA4fy3UcZ4ZGBhk1TWS X-Gm-Gg: ATEYQzxnMERP3PjfQNH9G0pwy69rg+EwS3xuOhi5GeF9w7AAeTCzUkb9igcMI1aHKgU eqhy7SXFbiP3ZyaZuODdw5b2kVfJvdgHi5eM3zdNtDsPTKSpGn1a96OZU6fkA46PPEBRyC1fMzD sNbH4O1KwrH8PVO9vftDr8+BBhxgZJFwngCmlh0umIGFq63+NkaYeJvUAdtDKJh15NwTgBCW/hR MHSzhiUfZ8DpbV47JHLBYKGW+sNyRHC/MsMalv1sWvZkirnlFH3R4njDwiKhs4dL2sirGGgvLDK +N3UasrxMoieaXbJo8FJ5yD92N9/5vW4PZztIt9drwqN8VyQqxq/+j4P+FS1hZT8PKznrotwZOM OV5Q7aHRqNuG+0nF9lWqTILKUxSdglG3uyEYdEj8OV4+R9lQD3s8YVBArB201i64txe+ybhBcoc SW6UEhDKC8QCvUzyGD3ioUREnpZtfa6bn/w4TnugMqolTKyng0gWKNgXRVB+hVnUj3LjtcsEilb QNu X-Received: by 2002:a05:7301:4088:b0:2c1:5134:54d3 with SMTP id 5a478bee46e88-2c15d433488mr550753eec.22.1774390240958; Tue, 24 Mar 2026 15: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-2c10b14c299sm16282832eec.6.2026.03.24.15.10.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 15: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 v5 8/8] platform/x86: lenovo-wmi-other: Add WMI battery charge limiting Date: Tue, 24 Mar 2026 22:10:32 +0000 Message-ID: <20260324221032.1333636-9-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324221032.1333636-1-derekjohn.clark@gmail.com> References: <20260324221032.1333636-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 Reviewed-by: Rong Zhang Tested-by: Rong Zhang --- 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 | 250 +++++++++++++++++++++- 3 files changed, 251 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/lenovo/Kconfig b/drivers/platform/x86/len= ovo/Kconfig index f885127b007f..75a8b144b0da 100644 --- a/drivers/platform/x86/lenovo/Kconfig +++ b/drivers/platform/x86/lenovo/Kconfig @@ -263,6 +263,7 @@ config LENOVO_WMI_GAMEZONE config LENOVO_WMI_TUNING tristate "Lenovo Other Mode WMI Driver" depends on ACPI_WMI + depends on ACPI_BATTERY select HWMON select FW_ATTR_CLASS select LENOVO_WMI_CAPDATA diff --git a/drivers/platform/x86/lenovo/wmi-capdata.h b/drivers/platform/x= 86/lenovo/wmi-capdata.h index b026ee30c828..1939401c6c14 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 11c16857ef97..cef51cded7be 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,9 +82,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 @@ -92,10 +97,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 @@ -137,6 +149,8 @@ struct lwmi_om_priv { bool capdata00_collected : 1; bool capdata_fan_collected : 1; } fan_flags; + + struct acpi_battery_hook battery_hook; }; =20 /* @@ -561,6 +575,239 @@ 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", retva= l, 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 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); + 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 %#10x 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 (%#10x) 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 */ + if (force_load_psy_ext) + goto load_psy_ext; + + ret =3D acpi_get_devices(ideapad_hid, lwmi_acpi_match, &handle, NULL); + if (ret) + return; + + if (handle && acpi_has_method(handle, "GBMD") && acpi_has_method(handle, = "SBMC")) { + dev_dbg(&priv->wdev->dev, "ideapad_laptop driver manages battery for dev= ice.\n"); + return; + } + +load_psy_ext: + /* Add battery hooks */ + priv->battery_hook.add_battery =3D lwmi_add_battery; + priv->battery_hook.remove_battery =3D lwmi_remove_battery; + priv->battery_hook.name =3D "Lenovo WMI Other Battery Extension"; + + ret =3D devm_battery_hook_register(&priv->wdev->dev, &priv->battery_hook); + if (ret) + dev_err(&priv->wdev->dev, "Error during battery hook: %i\n", ret); +} + /* =3D=3D=3D=3D=3D=3D=3D=3D fw_attributes (component: lenovo-wmi-capdata 0= 1) =3D=3D=3D=3D=3D=3D=3D=3D */ =20 struct tunable_attr_01 { @@ -1318,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