From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f53.google.com (mail-dl1-f53.google.com [74.125.82.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7118D1D6DB5 for ; Sun, 15 Mar 2026 03:49:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.53 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773546568; cv=none; b=rvignU7c1e1H8IyYz8IXuYi292arOcQ7iqmQP1pHm+OyM7Zw+yiI4wKCAXe41fbNR5ZutC5t7UCzc9WuGirq0jeZXcczpC3rxX1xiNSxPKJhLV/hfLhPMNRKsZarHjv4JItUiy0gHbrGsBO6LWWsO6GyV4ldcpun8KLfWw0iQrM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773546568; c=relaxed/simple; bh=DWmvO0n6uQxalLWR3d53bNCn+z/xn5lf3tCB5KPiLYY=; h=Date:From:To:CC:Subject:In-Reply-To:References:Message-ID: MIME-Version:Content-Type; b=oeiGJz09g1nbohFbkCipujlp+iwGLVdPu5V4Uu5fU4OYN4Ba+351JUOAKlKL/eTQEgOSlCbaLcpvr859i1ijdqU/HftiTw/5ENqp4GXQFa+YyST0n4ftwkmfkRnFBIwmcbkc4nhU8o/CD0U3bFV/KPPoxjeNJT9OL+Z0Kprt+zs= 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=nP8MF1mg; arc=none smtp.client-ip=74.125.82.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nP8MF1mg" Received: by mail-dl1-f53.google.com with SMTP id a92af1059eb24-1279eced0b9so4465990c88.0 for ; Sat, 14 Mar 2026 20:49:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773546566; x=1774151366; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:references :in-reply-to:user-agent:subject:cc:to:from:date:from:to:cc:subject :date:message-id:reply-to; bh=ZU9nWpVZsDjH/4ZFq/SHhtUIo0Ljcnxp6MMvWDE03Yk=; b=nP8MF1mgYWyGJ+tIR8JvRQPJFh2D3rSYADUjuD86hHY1QRrQgxlssdXVOGg0rfu3Ac iXYZMa7fapTo9RaKo8z54KQPa/WWUt6KjhnMuvarUQAvV9V07XWvN8WHNN2n6XIUJ7IS 32xcY16P8Hkd6UhBxT8ChURR1Mu8hXJurcv4dw8eYXfGSXGvljsHRN/bgZ+i2qTr0K5r onzVUCrgsOATSbq5oEJFnGPBghztZs88q+MVum09SAOSScoPnsiYLWuxH53/GzHWU+LW ZYQa7ynboOcGw65h8rpVwrbmL3HC8lEeiflxxjFCGnlzFZXIa5QN/3nZ44LpWvsEH4ow 8S+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773546566; x=1774151366; h=content-transfer-encoding:mime-version:message-id:references :in-reply-to:user-agent:subject:cc:to:from:date:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ZU9nWpVZsDjH/4ZFq/SHhtUIo0Ljcnxp6MMvWDE03Yk=; b=bwxSMSdJi0isb92st4U7W6Kpzx/uVgbEOCSTxegNbm8q9Ci8baj0vh88ahYcQ3tKJW Oz9R0Go5VAhZhzrCh4nhzFH5j/kuLzHg2ubHsAsiiihlfIuElkuJ7oF9Q7RzT8BLl3ue I6bXgVCGmMDQmIy43S8EcJ3ZS/0XyvCA8iDuqb6pv6qPhd1H8tc/7i6ChzBDHxMp6Ytw 9wOeEUoKY3hHYllWvRNtuxMV1Bh/mrhhKSZDk81OSsVz0jK0++Aats9/FHXWc3AY4WV2 Yr4bkpEO24pvd314Sw5zTRy5thrS6Mixr8HOdpAqCS1L2wNibu/nXJ5xKk0Mcm5bK+jK JKww== X-Forwarded-Encrypted: i=1; AJvYcCVOoFjWm9tfKDEjEKXHvHS25TXaqXk8mOWccvZlRz3+beZumlEEyrrDsB6BrRCNHsgYZWReco/EMT+jbjQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxsuoPpWzxIYUNi8gtLTwKrxr+1U5s+xn7G/mvERvMurp/rBSd5 COC2z3fxXlkTaD+huATC+VMbYImvebacZBoyLNZNQofnRAH+gEuxOkpJY8hFNQ== X-Gm-Gg: ATEYQzwKwqrIWqKRWFjhLeLYs9fw0+OHCEbKLuH+SAr2u7X4M4Pa6q2FA1PZep14GQG 8ivL3xn0j8XfXKwO5UMa775qmak53kW/N4shBkrLLa2wTepzBHjinH4GXPpeVcZDQ8I7VFMZx5F Hp/jHGjv9Kt+4JQc8htmGFcKHaNGlBF378FOqcFPJVtZICGllJfHDxOEU8jGBQULEJNYkIQHorB x7QWpZ/uXohXrQSKnueOR3rzx53yfnK0A7/T+wLLGAzoQzXNH0NR745XVMpRYu6qyD340oHcbmT RpQDuZa+u+9NXuxzmCubrWljWiP8k10M3qNxSQ3fnJ2wt/y1JXGUYAttlwMXJAGwYfP+h3qoJY4 dDke5tPWo+ZQB6HJqS6+QdOA5kpjfUtYiA6Wq8wEDnAmoyeK5hvrf9+E8rQidyLJZBRRvH0eZpd yGY9+lIIw33wVHOEO3bpW+RJWHP8D92Lb5QzQ+bVirJQ/sRTxUREmp5Nx3Yr6gymnpZa1TZ3O2S +R55RZ4nwgiaDeR7MwUSw== X-Received: by 2002:a05:7022:793:b0:11b:923d:7753 with SMTP id a92af1059eb24-128f3d6eca9mr4076401c88.3.1773546566426; Sat, 14 Mar 2026 20:49:26 -0700 (PDT) Received: from ehlo.thunderbird.net (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-128f62b01eesm8830660c88.7.2026.03.14.20.49.25 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 14 Mar 2026 20:49:26 -0700 (PDT) Date: Sat, 14 Mar 2026 20:49:26 -0700 From: "Derek J. Clark" To: Rong Zhang , =?ISO-8859-1?Q?Ilpo_J=E4rvinen?= , Hans de Goede CC: Mark Pearson , Armin Wolf , Jonathan Corbet , Kurt Borja , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: =?US-ASCII?Q?Re=3A_=5BPATCH_v4_3/8=5D_platform/x86=3A_lenovo?= =?US-ASCII?Q?-wmi-other=3A_Add_lwmi=5Fattr=5Fid=28=29_function?= User-Agent: Thunderbird for Android In-Reply-To: References: <20260312031032.3467565-1-derekjohn.clark@gmail.com> <20260312031032.3467565-4-derekjohn.clark@gmail.com> Message-ID: <01E4C08A-8258-4FB4-9308-6F3796E70087@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On March 14, 2026 6:32:51 PM PDT, Rong Zhang wrote: >Hi Derek, > >On Thu, 2026-03-12 at 03:10 +0000, Derek J=2E Clark wrote: >> Adds lwmi_attr_id() function=2E In the same vein as LWMI_ATTR_ID_FAN_RP= M(), >> but as a generic, to de-duplicate attribute_id assignment biolerplate= =2E >>=20 >> Reviewed-by: Mark Pearson >> Signed-off-by: Derek J=2E Clark >> --- >> v4: >> - Switch from macro to static inline to preserve types=2E >> --- >> drivers/platform/x86/lenovo/wmi-gamezone=2Eh | 1 + >> drivers/platform/x86/lenovo/wmi-other=2Ec | 59 +++++++++++++-------= -- >> 2 files changed, 35 insertions(+), 25 deletions(-) >>=20 >> diff --git a/drivers/platform/x86/lenovo/wmi-gamezone=2Eh b/drivers/pla= tform/x86/lenovo/wmi-gamezone=2Eh >> index 6b163a5eeb95=2E=2Eddb919cf6c36 100644 >> --- a/drivers/platform/x86/lenovo/wmi-gamezone=2Eh >> +++ b/drivers/platform/x86/lenovo/wmi-gamezone=2Eh >> @@ -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=2Ec b/drivers/platfo= rm/x86/lenovo/wmi-other=2Ec >> index c1728c7c2957=2E=2E9fff9c1f768c 100644 >> --- a/drivers/platform/x86/lenovo/wmi-other=2Ec >> +++ b/drivers/platform/x86/lenovo/wmi-other=2Ec >> @@ -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=2E >> + * @feat_id: The u8 corresponding to the feature ID on the device=2E >> + * @mode_id: The u8 corresponding to the wmi-gamezone mode for set/get= =2E >> + * @type_id: The u8 corresponding to the sub-device=2E >> + * >> + * Return: u32=2E >> + */ >> +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)); >> +} > >Hmm, I'd suggest adding them to wmi-capdata=2Eh so that you can refactor >LWMI_ATTR_ID_FAN_TEST in wmi-capdata=2Ec too=2E > >Thanks, >Rong > Can do=2E I was trying to avoid logic in the headers (despite Ilpo saying = it was alright in this case) but that's a valid reason to move it=2E Thanks, - Derek=20 >> + >> +#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 = *kobj, >> 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->= feature_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 kobj= ect *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 ko= bject *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=2Earg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->f= eature_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=2Earg0, &capdata); >> if (ret) >> return ret; >> =20 >> @@ -803,7 +813,8 @@ static ssize_t attr_current_value_store(struct kobj= ect *kobj, >> if (value < capdata=2Emin_value || value > capdata=2Emax_value) >> return -EINVAL; >> =20 >> - args=2Earg0 =3D attribute_id; >> + args=2Earg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->f= eature_id, >> + tunable_attr->cv_mode_id, tunable_attr->type_id); >> args=2Earg1 =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 kobje= ct *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 kob= ject *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 m= ode */ >> + if (tunable_attr->cv_mode_id =3D=3D LWMI_GZ_THERMAL_MODE_NONE) >> + mode =3D tunable_attr->cv_mode_id; >> =20 >> - args=2Earg0 =3D attribute_id; >> + args=2Earg0 =3D lwmi_attr_id(tunable_attr->device_id, tunable_attr->f= eature_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),