public inbox for linux-hwmon@vger.kernel.org
 help / color / mirror / Atom feed
From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: Rong Zhang <i@rong.moe>
Cc: Mark Pearson <mpearson-lenovo@squebb.ca>,
	 "Derek J. Clark" <derekjohn.clark@gmail.com>,
	Armin Wolf <W_Armin@gmx.de>,  Hans de Goede <hansg@kernel.org>,
	Guenter Roeck <linux@roeck-us.net>,
	 Kurt Borja <kuurtb@gmail.com>,
	platform-driver-x86@vger.kernel.org,
	 LKML <linux-kernel@vger.kernel.org>,
	linux-hwmon@vger.kernel.org
Subject: Re: [PATCH v11 0/7] platform/x86: lenovo-wmi-{capdata,other}: Add HWMON for fan speed
Date: Thu, 22 Jan 2026 16:32:46 +0200 (EET)	[thread overview]
Message-ID: <eb8e0be1-bbff-4c78-797b-586f2201554f@linux.intel.com> (raw)
In-Reply-To: <20260120182104.163424-1-i@rong.moe>

[-- Attachment #1: Type: text/plain, Size: 8851 bytes --]

On Wed, 21 Jan 2026, Rong Zhang wrote:

> Lenovo WMI Other Mode interface also supports querying or setting fan
> speed RPM. This capability is described by LENOVO_CAPABILITY_DATA_00.
> Besides, LENOVO_FAN_TEST_DATA provides reference data for self-test of
> cooling fans, including minimum and maximum fan speed RPM.
> 
> This patchset turns lenovo-wmi-capdata01 into a unified driver (now
> named lenovo-wmi-capdata) for LENOVO_CAPABILITY_DATA_{00,01} and
> LENOVO_FAN_TEST_DATA; then adds HWMON support for lenovo-wmi-other:
> 
>  - fanX_div: internal RPM divisor
>  - fanX_input: current RPM
>  - fanX_max: maximum RPM
>  - fanX_min: minimum RPM
>  - fanX_target: target RPM (tunable, 0=auto)
> 
> LENOVO_CAPABILITY_DATA_{00,01} presents on all devices, so
> both binds to lenovo-wmi-other. However, some device does not have
> LENOVO_FAN_TEST_DATA and its presence is described by
> LENOVO_CAPABILITY_DATA_00; hence, the former binds to the latter and a
> callback is used to pass the data to lenovo-wmi-other.
> 
> Summarizing this scheme:
> 
>         lenovo-wmi-other <-> capdata00 <-> capdata_fan
>         |- master            |- component
>                              |- sub-master |- sub-component
> 
> The callback will be called once both the master and the sub-component
> are bound to the sub-master (component).
> 
> This scheme is essential to solve these issues:
> - The component framework only supports one aggregation per master
> - A binding is only established until all components are found
> - The Fan Test Data interface may be missing on some devices
> - To get rid of queries for the presence of WMI GUIDs
> - The notifier framework cannot cleanly connect capdata_fan to
>   lenovo-wmi-other without introducing assumptions on probing sequence
> 
> capdata00 is registered as a component and a sub-master on probe,
> instead of chaining the registrations in one's bind callback. This is
> because calling (un)registration methods of the component framework
> causes deadlock in (un)bind callbacks, i.e., it's impossible to register
> capdata00 as a sub-master/component in its component/sub-master bind
> callback, and vice versa.
> 
> The implementation does not rely on a specific binding sequence. This
> has been fuzz-tested using:
> 
> 	#!/bin/bash
> 
> 	DRV_DIR=/sys/bus/wmi/drivers/lenovo_wmi_cd
> 	CAPDATA_GUIDS=(
> 		$(find "$DRV_DIR"/ -name '*-*-*-*-*-*' -printf "%f ")
> 	)
> 
> 	b() {
> 		echo -n 'B: '
> 		sudo tee "$DRV_DIR"/bind <<<"$1"
> 	}
> 	u() {
> 		echo -n 'U: '
> 		sudo tee "$DRV_DIR"/unbind <<<"$1"
> 	}
> 
> 	while read -rsa perm; do
> 		for guid in "${perm[@]}"; do
> 			u "$guid"
> 		done
> 		for guid in "${perm[@]}"; do
> 			b "$guid"
> 		done
> 		sensors | grep -A3 lenovo_wmi_other
> 		echo '========'
> 	done < <(python3 -c "
> 	from itertools import permutations
> 	guids = '${CAPDATA_GUIDS[*]}'.split()
> 	for r in range(1, len(guids) + 1):
> 		ps = permutations(guids, r)
> 		for p in ps:
> 			print(' '.join(p))
> 	")
> 
> Tested on ThinkBook 14 G7+ ASP.
> 
> Changes in v11:
> - Adopt a unified name (lenovo_wmi_capdata) for kmod, Kconfig, export
>   namespace and driver (thanks Ilpo Järvinen)
> - Link to v10: https://lore.kernel.org/r/20260117210051.108988-1-i@rong.moe/
> 
> Changes in v10:
> - Remove fanX_enable due to semantic mismatch with HWMON ABI (thanks
>   Kurt Borja)
>   - By removing it, its functionality (stopping the fan) is hidden
>     behind the module parameter "relax_fan_constraint", so that users
>     won't accidentally stop the fan while in a default setup (ditto)
> - Mention fanX_target=0 means auto in documentation (ditto)
> - Also accept retval=0 while setting the fan (ditto)
> - Add fanX_div (thanks Derek J. Clark)
> - Round down the written value of fanX_target to the nearest multiple of
>   fanX_div, so that the stored value matches the effective value
> - Fix HWMON missing when capdata01 is reprobed
> - Link to v9: https://lore.kernel.org/r/20260114122745.986699-1-i@rong.moe/
> 
> Changes in v9:
> - Make kernel-doc.py happy (thanks Ilpo Järvinen, kernel test robot)
> - Link to v8: https://lore.kernel.org/r/20260113172817.393856-1-i@rong.moe/
> 
> Changes in v8:
> - Refactor some statements to improve readability (thanks Ilpo Järvinen)
> - Use more commonly used errno (ditto)
> - Fix missing #include (ditto)
> - Link to v7: https://lore.kernel.org/r/20251125194959.157524-1-i@rong.moe/
> 
> Changes in v7:
> - Fix missing #include (thanks Ilpo Järvinen)
> - Fix formatting issues (ditto)
> - dev_dbg() instead of dev_info() on probe success (ditto)
> - Rearrange to drop some gotos (ditto)
> - Move the declarations of __free()-managed variables to where they are
>   assigned (ditto)
> - Improve the readability of struct definition and error paths (ditto)
> - Prevent back-and-forth changes (ditto)
> - Fix mistakenly inverted boundary check
> - Emit unaligned access to Fan Test Data's WMI block
> - Properly calculate array index when we truncate Fan Test Data
> - Fix typo
> - Link to v6: https://lore.kernel.org/r/20251122184522.18677-1-i@rong.moe/
> 
> Changes in v6:
> - Fix mistaken error paths
> - Link to v5: https://lore.kernel.org/r/20251114175927.52533-1-i@rong.moe/
> 
> Changes in v5:
> - Do not cast pointer to non-pointer or vice versa (thanks kernel test
>   robot)
> - Fix missing include (ditto)
> - Link to v4: https://lore.kernel.org/r/20251113191152.96076-1-i@rong.moe/
> 
> Changes in v4:
> - Get rid of wmi_has_guid() (thanks Armin Wolf's inspiration)
>   - Add [PATCH v4 6/7], please review & test
>     - Check 0x04050000.supported and bind capdata_fan to capdata00
>   - Rework HWMON registration
>     - Collect fan info from capdata00 and capdata_fan separately
>     - Use a callback to collect fan info from capdata_fan
>     - Trigger HWMON registration only if all fan info is collected
>     - Do not check 0x04050000.supported, implied by the presence of
>       capdata_fan
> - Drop Reviewed-by & Tested-by from [PATCH v4 7/7] due to the changes,
>   please review & test
> - Link to v3: https://lore.kernel.org/r/20251031155349.24693-1-i@rong.moe/
> 
> Changes in v3:
> - Fix grammar (thanks Derek J. Clark)
> - Link to v2: https://lore.kernel.org/r/20251030193955.107148-1-i@rong.moe/
> 
> Changes in v2:
> - Add a workaround for ACPI methods that return a 4B buffer for u32
>   (thanks Armin Wolf)
> - Fix function documentation (thanks kernel test bot)
> - Reword documentation (thanks Derek J. Clark)
> - Squash min/max reporting patch into the initial HWMON one (ditto)
> - Query 0x04050000 for interface availability (ditto)
>   - New parameter "expose_all_fans" to skip this check
> - Enforce min/max RPM constraint on set (ditto)
>   - New parameter "relax_fan_constraint" to disable this behavior
>   - Drop parameter "ignore_fan_cap", superseded by the next one
>   - New parameter "expose_all_fans" to expose fans w/o such data
> - Assume auto mode on probe (ditto)
> - Do not register HWMON device if no fan can be exposed
> - fanX_target: Return -EBUSY instead of raw target value when fan stops
> - Link to v1: https://lore.kernel.org/r/20251019210450.88830-1-i@rong.moe/
> 
> Rong Zhang (7):
>   platform/x86: lenovo-wmi-helpers: Convert returned buffer into u32
>   platform/x86: Rename lenovo-wmi-capdata01 to lenovo-wmi-capdata
>   platform/x86: lenovo-wmi-{capdata,other}: Support multiple Capability
>     Data
>   platform/x86: lenovo-wmi-capdata: Add support for Capability Data 00
>   platform/x86: lenovo-wmi-capdata: Add support for Fan Test Data
>   platform/x86: lenovo-wmi-capdata: Wire up Fan Test Data
>   platform/x86: lenovo-wmi-other: Add HWMON for fan reporting/tuning
> 
>  .../wmi/devices/lenovo-wmi-other.rst          |  46 +-
>  drivers/platform/x86/lenovo/Kconfig           |   5 +-
>  drivers/platform/x86/lenovo/Makefile          |   2 +-
>  drivers/platform/x86/lenovo/wmi-capdata.c     | 829 ++++++++++++++++++
>  drivers/platform/x86/lenovo/wmi-capdata.h     |  65 ++
>  drivers/platform/x86/lenovo/wmi-capdata01.c   | 302 -------
>  drivers/platform/x86/lenovo/wmi-capdata01.h   |  25 -
>  drivers/platform/x86/lenovo/wmi-helpers.c     |  21 +-
>  drivers/platform/x86/lenovo/wmi-other.c       | 528 ++++++++++-
>  9 files changed, 1466 insertions(+), 357 deletions(-)
>  create mode 100644 drivers/platform/x86/lenovo/wmi-capdata.c
>  create mode 100644 drivers/platform/x86/lenovo/wmi-capdata.h
>  delete mode 100644 drivers/platform/x86/lenovo/wmi-capdata01.c
>  delete mode 100644 drivers/platform/x86/lenovo/wmi-capdata01.h
> 
> 
> base-commit: 24d479d26b25bce5faea3ddd9fa8f3a6c3129ea7

Thanks, I've replace v10 with this.

-- 
 i.

      parent reply	other threads:[~2026-01-22 14:32 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-20 18:20 [PATCH v11 0/7] platform/x86: lenovo-wmi-{capdata,other}: Add HWMON for fan speed Rong Zhang
2026-01-20 18:20 ` [PATCH v11 1/7] platform/x86: lenovo-wmi-helpers: Convert returned buffer into u32 Rong Zhang
2026-01-22 18:51   ` Mark Pearson
2026-01-20 18:20 ` [PATCH v11 2/7] platform/x86: Rename lenovo-wmi-capdata01 to lenovo-wmi-capdata Rong Zhang
2026-01-22 18:51   ` Mark Pearson
2026-01-20 18:20 ` [PATCH v11 3/7] platform/x86: lenovo-wmi-{capdata,other}: Support multiple Capability Data Rong Zhang
2026-01-22 18:53   ` Mark Pearson
2026-01-20 18:20 ` [PATCH v11 4/7] platform/x86: lenovo-wmi-capdata: Add support for Capability Data 00 Rong Zhang
2026-01-22 18:53   ` Mark Pearson
2026-01-20 18:20 ` [PATCH v11 5/7] platform/x86: lenovo-wmi-capdata: Add support for Fan Test Data Rong Zhang
2026-01-22 18:53   ` Mark Pearson
2026-01-20 18:20 ` [PATCH v11 6/7] platform/x86: lenovo-wmi-capdata: Wire up " Rong Zhang
2026-01-20 18:20 ` [PATCH v11 7/7] platform/x86: lenovo-wmi-other: Add HWMON for fan reporting/tuning Rong Zhang
2026-01-22 14:32 ` Ilpo Järvinen [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=eb8e0be1-bbff-4c78-797b-586f2201554f@linux.intel.com \
    --to=ilpo.jarvinen@linux.intel.com \
    --cc=W_Armin@gmx.de \
    --cc=derekjohn.clark@gmail.com \
    --cc=hansg@kernel.org \
    --cc=i@rong.moe \
    --cc=kuurtb@gmail.com \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=mpearson-lenovo@squebb.ca \
    --cc=platform-driver-x86@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox