All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Kurt Borja" <kuurtb@gmail.com>
To: "Rong Zhang" <i@rong.moe>, "Kurt Borja" <kuurtb@gmail.com>
Cc: "Derek J. Clark" <derekjohn.clark@gmail.com>,
	"Mark Pearson" <mpearson-lenovo@squebb.ca>,
	"Armin Wolf" <W_Armin@gmx.de>, "Hans de Goede" <hansg@kernel.org>,
	"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
	"Guenter Roeck" <linux@roeck-us.net>,
	platform-driver-x86@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org
Subject: Re: [PATCH v9 7/7] platform/x86: lenovo-wmi-other: Add HWMON for fan reporting/tuning
Date: Fri, 16 Jan 2026 12:17:02 -0500	[thread overview]
Message-ID: <DFQ6N3R4HO0M.2L0HZMH3N0N49@gmail.com> (raw)
In-Reply-To: <0e7dfebcaa4509e907faa7b43fc8d49ca6729ca2.camel@rong.moe>

On Fri Jan 16, 2026 at 9:18 AM -05, Rong Zhang wrote:
> Hi Kurt,
>
> On Thu, 2026-01-15 at 14:09 -0500, Kurt Borja wrote:
>> On Thu Jan 15, 2026 at 11:57 AM -05, Rong Zhang wrote:
>> > Hi Kurt,
>> > 
>> > On Thu, 2026-01-15 at 08:58 -0500, Kurt Borja wrote:
>> > > On Thu Jan 15, 2026 at 8:03 AM -05, Rong Zhang wrote:
>> > > > Hi Kurt,
>> > > > 
>> > > > On Wed, 2026-01-14 at 19:16 -0500, Kurt Borja wrote:
>> > > > > Hi Rong,
>> > > > > 
>> > > > > On Wed Jan 14, 2026 at 7:27 AM -05, Rong Zhang wrote:
>> > > > > > Register an HWMON device for fan reporting/tuning according to
>> > > > > > Capability Data 00 (capdata00) and Fan Test Data (capdata_fan) provided
>> > > > > > by lenovo-wmi-capdata. The corresponding HWMON nodes are:
>> > > > > > 
>> > > > > >  - fanX_enable: enable/disable the fan (tunable)
>> > > > > >  - fanX_input: current RPM
>> > > > > >  - fanX_max: maximum RPM
>> > > > > >  - fanX_min: minimum RPM
>> > > > > >  - fanX_target: target RPM (tunable)
>> > > > > > 
>> > > > > > Information from capdata00 and capdata_fan are used to control the
>> > > > > > visibility and constraints of HWMON attributes. Fan info from capdata00
>> > > > > > is collected on bind, while fan info from capdata_fan is collected in a
>> > > > > > callback. Once all fan info is collected, register the HWMON device.
>> > > > > > 
>> > > > > > Signed-off-by: Rong Zhang <i@rong.moe>
>> > > > > > Reviewed-by: Derek J. Clark <derekjohn.clark@gmail.com>
>> > > > > > ---
>> > > > > 
>> > > > > ...
>> > > > > 
>> > > > > > diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation/wmi/devices/lenovo-wmi-other.rst
>> > > > > > index 821282e07d93c..bd1d733ff286d 100644
>> > > > > > --- a/Documentation/wmi/devices/lenovo-wmi-other.rst
>> > > > > > +++ b/Documentation/wmi/devices/lenovo-wmi-other.rst
>> > > > > > @@ -31,6 +31,8 @@ under the following path:
>> > > > > >  
>> > > > > >    /sys/class/firmware-attributes/lenovo-wmi-other/attributes/<attribute>/
>> > > > > >  
>> > > > > > +Additionally, this driver also exports attributes to HWMON.
>> > > > > > +
>> > > > > >  LENOVO_CAPABILITY_DATA_00
>> > > > > >  -------------------------
>> > > > > >  
>> > > > > > @@ -39,6 +41,11 @@ WMI GUID ``362A3AFE-3D96-4665-8530-96DAD5BB300E``
>> > > > > >  The LENOVO_CAPABILITY_DATA_00 interface provides various information that
>> > > > > >  does not rely on the gamezone thermal mode.
>> > > > > >  
>> > > > > > +The following HWMON attributes are implemented:
>> > > > > > + - fanX_enable: enable/disable the fan (tunable)
>> > > > > 
>> > > > > I was testing this series and I'm a bit confused about fanX_enable.
>> > > > 
>> > > > Thanks for testing!
>> > > 
>> > > Thanks for working on this!
>> > > 
>> > > > 
>> > > > > Judging by this comment and also by taking a quick look at the code, it
>> > > > > looks like writting 0 to this attribute disables the fan.
>> > > > > 
>> > > > > This is however (per hwmon ABI documentation [1]) not how this attribute
>> > > > > should work. IIUC, it is intended for devices which can disable the fan
>> > > > > sensor, not the actual fan.
>> > > > 
>> > > > Hmm, what a confusing name :-/
>> > > > 
>> > > > > I fail to see how this feature is useful and I also find it dangerous
>> > > > > for this to be exposed by default, considering the same could be
>> > > > > achieved with the relaxed module parameter, which at least tells the
>> > > > > user to be careful.
>> > > > 
>> > > > Makes sense. I will remove the attribute and mention such behavior in
>> > > > the module parameter.
>> > > 
>> > > Also, it would be worth to mention that writting 0 to the fanY_target
>> > > attribute is auto mode, right?
>> > 
>> > Ah, yes.
>> > 
>> > > I was testing the fanX_target attribute and it does work as intended,
>> > > i.e. the fan speed changes to the desired speed. However, every time I
>> > > write to this attribute I'm getting -EIO error and it always reads 0.
>> > > 
>> > > For example:
>> > > 
>> > > 	$ echo 3550 | sudo tee fan*_target
>> > > 	3550
>> > > 	tee: fan1_target: Input/output error
>> > > 	tee: fan2_target: Input/output error
>> > > 	$ cat fan*_target
>> > > 	0
>> > > 	0
>> > > 
>> > > But as I said, the fans do reach the desired speed (an approximation of
>> > > it):
>> > > 
>> > > 	$ cat fan*_input
>> > > 	3500
>> > > 	3500
>> > > 
>> > > This is a bit weird, but I haven't look in depth into it. I will find
>> > > some time to do it later. This happens on a 83KY (Legion 7 16IAX1)
>> > > laptop.
>> > 
>> > I'd like to fix it in the next revision. Looking forward to your
>> > progress in debugging :-)
>> > 
>> > It seems to me that the corresponding ACPI method did not return 1 on
>> > success. There should be some clues in the decompiled ASL code. Could
>> > you attach it in your reply? The HWMON implementation was developed
>> > mostly based on my understanding on the decompiled ASL code of my
>> > device. I'd like to check the one of your device as a cross-reference
>> > to see if there are more potential bugs.
>> 
>> Yep, the ACPI method retval is 0 instead of 1.
>
> Given the divergence between your device and mine, I think we could
> just accept both 0 and 1. That should be fine considering that we've
> strictly checked LENOVO_CAPABILITY_DATA_00 and LENOVO_FAN_TEST_DATA
> before exposing fan channels.

Thanks! This fixes the -EIO issue.

>
>> Here is a snippet of what I believe is the fan control stuff on my
>> device (L: 50393):
>> 
>> 
>> 	If ((SFV0 == 0x04030001))
>> 	{
>> 		Local0 = (SFV1 / 0x64)
>> 		^^PC00.LPCB.EC0.LECR (0xD1, One, Local0, 0x02)
>> 		Return (Zero)
>> 	}
>> 
>> 	If ((SFV0 == 0x04030002))
>> 	{
>> 		Local0 = (SFV1 / 0x64)
>> 		^^PC00.LPCB.EC0.LECR (0xD1, 0x02, Local0, 0x02)
>> 		Return (Zero)
>> 	}
>> 
>> 	If ((SFV0 == 0x04030004))
>> 	{
>> 		Local0 = (SFV1 / 0x64)
>> 		^^PC00.LPCB.EC0.LECR (0xD1, 0x03, Local0, 0x02)
>> 		Return (Zero)
>> 	}
>
> On my device, 0x04030001 always returns 1 after writing to EC
> registers. 0x04030002 is a stub and always returns 0. That was the
> reason why I assumed 1 => success and 0 => failure. Here's the
> corresponding code snippet on my device:

I had this exact issue in the alienware-wmi-wmax driver. OEMs tend to be
inconsistent with return values across models.

>
>    If ((DEV1 == 0x04))
>    {
>        If ((FEA1 == 0x03))
>        {
>            Local0 = Buffer (0x06){}
>            Local0 [Zero] = 0x46
>            If ((TYP1 == One))
>            {
>                Local1 = ToInteger (DAT1)
>                If ((Local1 == Zero))

Here auto mode is more explicit too.

>                {
>                    Local0 [One] = 0x84
>                }
>                Else
>                {
>                    MBGS ("Fan1S")
>                    Local0 [One] = 0x85
>                    Divide (Local1, 0x64, Local2, Local1)
>                    Local0 [0x02] = Local1
>                }
>            }
>    
>            If ((TYP1 == 0x02))
>            {
>                MBGS ("Fan2S")
>                Return (Zero)
>            }
>    
>            \_SB.PCI0.LPC0.EC0.ERCD (Local0)
>            Return (One)
>        }
>    
>        If ((FEA1 == 0x04))
>        {
>            MBGS ("wSet FanNoise")
>            DB2H (DAT1)
>            \_SB.FANL = DAT1 /* \_SB_.GZFD.WMAE.DAT1 */
>            Notify (\_TZ.VFAN, 0x80) // Status Change
>        }
>    }
>
>> You can find the full acpidump attached in this email.
>
> Thanks for that.
>
>> Do you have any idea of what 0x04030004 might be?
>
> It's "system fan". See
> https://lore.kernel.org/all/CAFqHKTkOZUfDb8cGbGnVPCS9wNbOBsiyOk_MkZR-2_Za6ZPMng@mail.gmail.com/
>
>> This laptop only has 2
>> fans. FW bug?
>
> Nope, that's not a bug as long as LENOVO_CAPABILITY_DATA_00 or
> LENOVO_FAN_TEST_DATA only indicates the presence of fan 1&2. Lenovo
> usually reuses a lot of ASL code among different SKUs, with some other
> mechanism to gate inapplicable functionalities.
>
> So I quickly glanced at the decompiled ASL code of your device...
>
> Method WQA9 is LENOVO_CAPABILITY_DATA_00, and it only exposes fan 4 on
> specific SKUs (L: 47975):
>
>    If (((GSKU == 0x02) || (GSKU == 0x03)))
>    {
>        Return (Buffer (0x0C)
>        {
>            /* 0000 */  0x04, 0x00, 0x03, 0x04, 0x07, 0x00, 0x00, 0x00,
>            /* 0008 */  0x01, 0x00, 0x00, 0x00
>        })
>    }
>    Else
>    {
>        Return (Buffer (0x0C)
>        {
>            /* 0000 */  0x04, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00,
>            /* 0008 */  0x00, 0x00, 0x00, 0x00
>        })
>    }
>
> I assume your device should return the latter buffer, indicating fan 4
> does not exist. That being said, it won't be surprising if the former
> one is returned -- my device's LENOVO_CAPABILITY_DATA_00 indicates the
> presence of fan 1&2 while LENOVO_FAN_TEST_DATA only exposes fan 1.
>
> Method WQAB is LENOVO_FAN_TEST_DATA (L: 48195). It exposes fan 1&2,
> declaring their RPM range to be [1700,5700].
>
>    Return (Buffer (0x1C)
>    {
>        /* 0000 */  0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
>        /* 0008 */  0x02, 0x00, 0x00, 0x00, 0x44, 0x16, 0x00, 0x00,
>        /* 0010 */  0x44, 0x16, 0x00, 0x00, 0xA4, 0x06, 0x00, 0x00,
>        /* 0018 */  0xA4, 0x06, 0x00, 0x00
>    })
>
> So these WMI interfaces on your device are implemented mostly well.
> LENOVO_FAN_TEST_DATA is enough to prevent fan 4 from being exposed on
> your device.

Yes, fan 4 is not exposed to user-space so everything is fine here.

Thanks for the detailed explaination! I'll check the structure of those
buffers to understand these drivers better.

>
> Thanks,
> Rong


-- 
Thanks,
 ~ Kurt


      reply	other threads:[~2026-01-16 17:17 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-14 12:27 [PATCH v9 0/7] platform/x86: lenovo-wmi-{capdata,other}: Add HWMON for fan speed Rong Zhang
2026-01-14 12:27 ` [PATCH v9 1/7] platform/x86: lenovo-wmi-helpers: Convert returned buffer into u32 Rong Zhang
2026-01-14 12:27 ` [PATCH v9 2/7] platform/x86: Rename lenovo-wmi-capdata01 to lenovo-wmi-capdata Rong Zhang
2026-01-14 12:27 ` [PATCH v9 3/7] platform/x86: lenovo-wmi-{capdata,other}: Support multiple Capability Data Rong Zhang
2026-01-14 12:27 ` [PATCH v9 4/7] platform/x86: lenovo-wmi-capdata: Add support for Capability Data 00 Rong Zhang
2026-01-14 12:27 ` [PATCH v9 5/7] platform/x86: lenovo-wmi-capdata: Add support for Fan Test Data Rong Zhang
2026-01-14 12:27 ` [PATCH v9 6/7] platform/x86: lenovo-wmi-capdata: Wire up " Rong Zhang
2026-01-14 12:27 ` [PATCH v9 7/7] platform/x86: lenovo-wmi-other: Add HWMON for fan reporting/tuning Rong Zhang
2026-01-15  0:16   ` Kurt Borja
2026-01-15 13:03     ` Rong Zhang
2026-01-15 13:58       ` Kurt Borja
2026-01-15 16:57         ` Rong Zhang
2026-01-15 17:45           ` Derek J. Clark
2026-01-15 18:19             ` Kurt Borja
2026-01-16 14:01             ` Rong Zhang
2026-01-15 19:09           ` Kurt Borja
2026-01-16 14:18             ` Rong Zhang
2026-01-16 17:17               ` Kurt Borja [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=DFQ6N3R4HO0M.2L0HZMH3N0N49@gmail.com \
    --to=kuurtb@gmail.com \
    --cc=W_Armin@gmx.de \
    --cc=derekjohn.clark@gmail.com \
    --cc=hansg@kernel.org \
    --cc=i@rong.moe \
    --cc=ilpo.jarvinen@linux.intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.