From: Rong Zhang <i@rong.moe>
To: "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>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Cc: Rong Zhang <i@rong.moe>, Guenter Roeck <linux@roeck-us.net>,
Kurt Borja <kuurtb@gmail.com>,
platform-driver-x86@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org
Subject: [PATCH v11 0/7] platform/x86: lenovo-wmi-{capdata,other}: Add HWMON for fan speed
Date: Wed, 21 Jan 2026 02:20:01 +0800 [thread overview]
Message-ID: <20260120182104.163424-1-i@rong.moe> (raw)
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
--
2.51.0
next reply other threads:[~2026-01-20 18:21 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-20 18:20 Rong Zhang [this message]
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 ` [PATCH v11 0/7] platform/x86: lenovo-wmi-{capdata,other}: Add HWMON for fan speed Ilpo Järvinen
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=20260120182104.163424-1-i@rong.moe \
--to=i@rong.moe \
--cc=W_Armin@gmx.de \
--cc=derekjohn.clark@gmail.com \
--cc=hansg@kernel.org \
--cc=ilpo.jarvinen@linux.intel.com \
--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
all inboxes | Powered by JetHome®