platform-driver-x86.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
@ 2023-04-14 18:02 Daniel Bertalan
  2023-04-15 10:12 ` Hans de Goede
  2023-04-17 10:23 ` Hans de Goede
  0 siblings, 2 replies; 10+ messages in thread
From: Daniel Bertalan @ 2023-04-14 18:02 UTC (permalink / raw)
  To: Mark Gross, Hans de Goede, Henrique de Moraes Holschuh
  Cc: ibm-acpi-devel, platform-driver-x86, liavalb, Daniel Bertalan

On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
accessing the Embedded Controller: instead of a method that reads from
the EC's memory, `ECRD` is the name of a location in high memory. This
meant that trying to call them would fail with the following message:

  ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
  ACPI object (RegionField)

With this commit, it is now possible to access the EC and read
temperature and fan speed information. Note that while writes to the
HFSP register do go through (as indicated by subsequent reads showing
the new value), the fan does not actually change its speed.

Signed-off-by: Daniel Bertalan <dani@danielbertalan.dev>
---
 drivers/platform/x86/thinkpad_acpi.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index 7191ff2625b1..6fe82f805ea8 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -11699,6 +11699,7 @@ static int __init thinkpad_acpi_module_init(void)
 {
 	const struct dmi_system_id *dmi_id;
 	int ret, i;
+	acpi_object_type obj_type;
 
 	tpacpi_lifecycle = TPACPI_LIFE_INIT;
 
@@ -11724,6 +11725,21 @@ static int __init thinkpad_acpi_module_init(void)
 	TPACPI_ACPIHANDLE_INIT(ecrd);
 	TPACPI_ACPIHANDLE_INIT(ecwr);
 
+	/*
+	 * Quirk: in some models (e.g. X380 Yoga), an object named ECRD
+	 * exists, but it is a register, not a method.
+	 */
+	if (ecrd_handle) {
+		acpi_get_type(ecrd_handle, &obj_type);
+		if (obj_type != ACPI_TYPE_METHOD)
+			ecrd_handle = NULL;
+	}
+	if (ecwr_handle) {
+		acpi_get_type(ecwr_handle, &obj_type);
+		if (obj_type != ACPI_TYPE_METHOD)
+			ecwr_handle = NULL;
+	}
+
 	tpacpi_wq = create_singlethread_workqueue(TPACPI_WORKQUEUE_NAME);
 	if (!tpacpi_wq) {
 		thinkpad_acpi_module_exit();
-- 
2.40.0



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
  2023-04-14 18:02 [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga Daniel Bertalan
@ 2023-04-15 10:12 ` Hans de Goede
       [not found]   ` <a1229347-b5f3-8a1d-40a8-20beb863592a@gmail.com>
  2023-04-17 10:23 ` Hans de Goede
  1 sibling, 1 reply; 10+ messages in thread
From: Hans de Goede @ 2023-04-15 10:12 UTC (permalink / raw)
  To: Daniel Bertalan, Mark Gross, Henrique de Moraes Holschuh, Mark Pearson
  Cc: ibm-acpi-devel, platform-driver-x86, liavalb

Hi,

On 4/14/23 20:02, Daniel Bertalan wrote:
> On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
> accessing the Embedded Controller: instead of a method that reads from
> the EC's memory, `ECRD` is the name of a location in high memory. This
> meant that trying to call them would fail with the following message:
> 
>   ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
>   ACPI object (RegionField)
> 
> With this commit, it is now possible to access the EC and read
> temperature and fan speed information. Note that while writes to the
> HFSP register do go through (as indicated by subsequent reads showing
> the new value), the fan does not actually change its speed.
> 
> Signed-off-by: Daniel Bertalan <dani@danielbertalan.dev>

Interestig, this looks like a pretty clean solution to me.

Mark Pearson, do you have any remarks on this ?

Regards,

Hans


> ---
>  drivers/platform/x86/thinkpad_acpi.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
> index 7191ff2625b1..6fe82f805ea8 100644
> --- a/drivers/platform/x86/thinkpad_acpi.c
> +++ b/drivers/platform/x86/thinkpad_acpi.c
> @@ -11699,6 +11699,7 @@ static int __init thinkpad_acpi_module_init(void)
>  {
>  	const struct dmi_system_id *dmi_id;
>  	int ret, i;
> +	acpi_object_type obj_type;
>  
>  	tpacpi_lifecycle = TPACPI_LIFE_INIT;
>  
> @@ -11724,6 +11725,21 @@ static int __init thinkpad_acpi_module_init(void)
>  	TPACPI_ACPIHANDLE_INIT(ecrd);
>  	TPACPI_ACPIHANDLE_INIT(ecwr);
>  
> +	/*
> +	 * Quirk: in some models (e.g. X380 Yoga), an object named ECRD
> +	 * exists, but it is a register, not a method.
> +	 */
> +	if (ecrd_handle) {
> +		acpi_get_type(ecrd_handle, &obj_type);
> +		if (obj_type != ACPI_TYPE_METHOD)
> +			ecrd_handle = NULL;
> +	}
> +	if (ecwr_handle) {
> +		acpi_get_type(ecwr_handle, &obj_type);
> +		if (obj_type != ACPI_TYPE_METHOD)
> +			ecwr_handle = NULL;
> +	}
> +
>  	tpacpi_wq = create_singlethread_workqueue(TPACPI_WORKQUEUE_NAME);
>  	if (!tpacpi_wq) {
>  		thinkpad_acpi_module_exit();


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
       [not found]   ` <a1229347-b5f3-8a1d-40a8-20beb863592a@gmail.com>
@ 2023-04-15 13:30     ` Hans de Goede
  2023-04-15 14:22       ` Daniel Bertalan
  0 siblings, 1 reply; 10+ messages in thread
From: Hans de Goede @ 2023-04-15 13:30 UTC (permalink / raw)
  To: Liav Albani, Daniel Bertalan, Mark Gross,
	Henrique de Moraes Holschuh, Mark Pearson
  Cc: ibm-acpi-devel, platform-driver-x86

Hi,

On 4/15/23 15:24, Liav Albani wrote:
> 
> On 4/15/23 13:12, Hans de Goede wrote:
>> Hi,
>>
>> On 4/14/23 20:02, Daniel Bertalan wrote:
>>> On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
>>> accessing the Embedded Controller: instead of a method that reads from
>>> the EC's memory, `ECRD` is the name of a location in high memory. This
>>> meant that trying to call them would fail with the following message:
>>>
>>>   ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
>>>   ACPI object (RegionField)
>>>
>>> With this commit, it is now possible to access the EC and read
>>> temperature and fan speed information. Note that while writes to the
>>> HFSP register do go through (as indicated by subsequent reads showing
>>> the new value), the fan does not actually change its speed.
>>>
>>> Signed-off-by: Daniel Bertalan <dani@danielbertalan.dev>
>> Interestig, this looks like a pretty clean solution to me.
> 
> Daniel and I have looked in the DSDT ASL code and found a bunch of registers in high physical memory location (which is an ACPI OpRegion),
> and one of the registers had a bit called ECRD.
> However, there were many other registers that might be interesting as well, the problem is the short names in the ASL code (so we only see abbreviations essentially).
> 
> 
> While I do agree that adding this code is indeed a clean solution, if you (people that are dealing with Thinkpad laptops) know about cleaner way to access the embedded controller, I think it's preferable, because this way Daniel might be able to trigger the fan on that laptop so it will actually spin and will dissipate-out heat from the system, without the relying on the embedded controller to get into some sort of thermal state and then to trigger the fan.

Have you tried falling back to the ec_read() and ec_write() helpers
exported by the ACPI EC code ?

The "first_ec" pointer used by these functions is exported too,
so you could try modifying thinkpad_acpi to use ec_read() and
ec_write() as fallback when first_ec is set (and the quirk
added by this patch triggers).

Regards,

Hans



>> Mark Pearson, do you have any remarks on this ?
>>
>> Regards,
>>
>> Hans
>>
>>
>>> ---
>>>  drivers/platform/x86/thinkpad_acpi.c | 16 ++++++++++++++++
>>>  1 file changed, 16 insertions(+)
>>>
>>> diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
>>> index 7191ff2625b1..6fe82f805ea8 100644
>>> --- a/drivers/platform/x86/thinkpad_acpi.c
>>> +++ b/drivers/platform/x86/thinkpad_acpi.c
>>> @@ -11699,6 +11699,7 @@ static int __init thinkpad_acpi_module_init(void)
>>>  {
>>>  	const struct dmi_system_id *dmi_id;
>>>  	int ret, i;
>>> +	acpi_object_type obj_type;
>>>  
>>>  	tpacpi_lifecycle = TPACPI_LIFE_INIT;
>>>  
>>> @@ -11724,6 +11725,21 @@ static int __init thinkpad_acpi_module_init(void)
>>>  	TPACPI_ACPIHANDLE_INIT(ecrd);
>>>  	TPACPI_ACPIHANDLE_INIT(ecwr);
>>>  
>>> +	/*
>>> +	 * Quirk: in some models (e.g. X380 Yoga), an object named ECRD
>>> +	 * exists, but it is a register, not a method.
>>> +	 */
>>> +	if (ecrd_handle) {
>>> +		acpi_get_type(ecrd_handle, &obj_type);
>>> +		if (obj_type != ACPI_TYPE_METHOD)
>>> +			ecrd_handle = NULL;
>>> +	}
>>> +	if (ecwr_handle) {
>>> +		acpi_get_type(ecwr_handle, &obj_type);
>>> +		if (obj_type != ACPI_TYPE_METHOD)
>>> +			ecwr_handle = NULL;
>>> +	}
>>> +
>>>  	tpacpi_wq = create_singlethread_workqueue(TPACPI_WORKQUEUE_NAME);
>>>  	if (!tpacpi_wq) {
>>>  		thinkpad_acpi_module_exit();


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
  2023-04-15 13:30     ` Hans de Goede
@ 2023-04-15 14:22       ` Daniel Bertalan
  2023-04-17 10:19         ` Hans de Goede
  0 siblings, 1 reply; 10+ messages in thread
From: Daniel Bertalan @ 2023-04-15 14:22 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Liav Albani, Mark Gross, Henrique de Moraes Holschuh,
	Mark Pearson, ibm-acpi-devel, platform-driver-x86

Hi,

On Saturday, April 15th, 2023 at 15:30, Hans de Goede <hdegoede@redhat.com> wrote:

> Hi,
> 
> On 4/15/23 15:24, Liav Albani wrote:
> 
> > On 4/15/23 13:12, Hans de Goede wrote:
> > 
> > > Hi,
> > > 
> > > On 4/14/23 20:02, Daniel Bertalan wrote:
> > > 
> > > > On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
> > > > accessing the Embedded Controller: instead of a method that reads from
> > > > the EC's memory, `ECRD` is the name of a location in high memory. This
> > > > meant that trying to call them would fail with the following message:
> > > > 
> > > > ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
> > > > ACPI object (RegionField)
> > > > 
> > > > With this commit, it is now possible to access the EC and read
> > > > temperature and fan speed information. Note that while writes to the
> > > > HFSP register do go through (as indicated by subsequent reads showing
> > > > the new value), the fan does not actually change its speed.
> > > > 
> > > > Signed-off-by: Daniel Bertalan dani@danielbertalan.dev
> > > > Interestig, this looks like a pretty clean solution to me.
> > 
> > Daniel and I have looked in the DSDT ASL code and found a bunch of registers in high physical memory location (which is an ACPI OpRegion),
> > and one of the registers had a bit called ECRD.
> > However, there were many other registers that might be interesting as well, the problem is the short names in the ASL code (so we only see abbreviations essentially).
> > 
> > While I do agree that adding this code is indeed a clean solution, if you (people that are dealing with Thinkpad laptops) know about cleaner way to access the embedded controller, I think it's preferable, because this way Daniel might be able to trigger the fan on that laptop so it will actually spin and will dissipate-out heat from the system, without the relying on the embedded controller to get into some sort of thermal state and then to trigger the fan.
> 
> 
> Have you tried falling back to the ec_read() and ec_write() helpers
> exported by the ACPI EC code ?
> 
> The "first_ec" pointer used by these functions is exported too,
> so you could try modifying thinkpad_acpi to use ec_read() and
> ec_write() as fallback when first_ec is set (and the quirk
> added by this patch triggers).

This is basically what my patch does. If the ECRD/ECWR method handles
are NULL, thinkpad_acpi's acpi_ec_{read,write} functions fall back to
the regular ACPI EC helpers you mentioned.

Speaking of which, does anyone know why these private helper functions
exist in the first place? The code seems to use them interchangeably.
Even in the fan control code, there are places where the regular EC
helpers are called directly. Can we get away with always doing that?

Back to the issue at hand, is there someone we could ask if the X380Y
even supports manual fan control in the first place? My debugging
efforts are starting to look like a wild goose chase.

The thermal sensors and fan PWM readings now work, which is better
than nothing, but it would be good to get to the bottom of this.

All the best,

Daniel

> Regards,
> 
> Hans
> 
> 
> > > Mark Pearson, do you have any remarks on this ?
> > > 
> > > Regards,
> > > 
> > > Hans
> > > 
> > > > ---
> > > > drivers/platform/x86/thinkpad_acpi.c | 16 ++++++++++++++++
> > > > 1 file changed, 16 insertions(+)
> > > > 
> > > > diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
> > > > index 7191ff2625b1..6fe82f805ea8 100644
> > > > --- a/drivers/platform/x86/thinkpad_acpi.c
> > > > +++ b/drivers/platform/x86/thinkpad_acpi.c
> > > > @@ -11699,6 +11699,7 @@ static int __init thinkpad_acpi_module_init(void)
> > > > {
> > > > const struct dmi_system_id *dmi_id;
> > > > int ret, i;
> > > > + acpi_object_type obj_type;
> > > > 
> > > > tpacpi_lifecycle = TPACPI_LIFE_INIT;
> > > > 
> > > > @@ -11724,6 +11725,21 @@ static int __init thinkpad_acpi_module_init(void)
> > > > TPACPI_ACPIHANDLE_INIT(ecrd);
> > > > TPACPI_ACPIHANDLE_INIT(ecwr);
> > > > 
> > > > + /*
> > > > + * Quirk: in some models (e.g. X380 Yoga), an object named ECRD
> > > > + * exists, but it is a register, not a method.
> > > > + */
> > > > + if (ecrd_handle) {
> > > > + acpi_get_type(ecrd_handle, &obj_type);
> > > > + if (obj_type != ACPI_TYPE_METHOD)
> > > > + ecrd_handle = NULL;
> > > > + }
> > > > + if (ecwr_handle) {
> > > > + acpi_get_type(ecwr_handle, &obj_type);
> > > > + if (obj_type != ACPI_TYPE_METHOD)
> > > > + ecwr_handle = NULL;
> > > > + }
> > > > +
> > > > tpacpi_wq = create_singlethread_workqueue(TPACPI_WORKQUEUE_NAME);
> > > > if (!tpacpi_wq) {
> > > > thinkpad_acpi_module_exit();

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
  2023-04-15 14:22       ` Daniel Bertalan
@ 2023-04-17 10:19         ` Hans de Goede
  2023-04-17 13:17           ` Mark Pearson
       [not found]           ` <TYZPR03MB59945171347BC248412EBEE6BD9D9@TYZPR03MB5994.apcprd03.prod.outlook.com>
  0 siblings, 2 replies; 10+ messages in thread
From: Hans de Goede @ 2023-04-17 10:19 UTC (permalink / raw)
  To: Daniel Bertalan
  Cc: Liav Albani, Mark Gross, Henrique de Moraes Holschuh,
	Mark Pearson, ibm-acpi-devel, platform-driver-x86

Hi,

On 4/15/23 16:22, Daniel Bertalan wrote:
> Hi,
> 
> On Saturday, April 15th, 2023 at 15:30, Hans de Goede <hdegoede@redhat.com> wrote:
> 
>> Hi,
>>
>> On 4/15/23 15:24, Liav Albani wrote:
>>
>>> On 4/15/23 13:12, Hans de Goede wrote:
>>>
>>>> Hi,
>>>>
>>>> On 4/14/23 20:02, Daniel Bertalan wrote:
>>>>
>>>>> On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
>>>>> accessing the Embedded Controller: instead of a method that reads from
>>>>> the EC's memory, `ECRD` is the name of a location in high memory. This
>>>>> meant that trying to call them would fail with the following message:
>>>>>
>>>>> ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
>>>>> ACPI object (RegionField)
>>>>>
>>>>> With this commit, it is now possible to access the EC and read
>>>>> temperature and fan speed information. Note that while writes to the
>>>>> HFSP register do go through (as indicated by subsequent reads showing
>>>>> the new value), the fan does not actually change its speed.
>>>>>
>>>>> Signed-off-by: Daniel Bertalan dani@danielbertalan.dev
>>>>> Interestig, this looks like a pretty clean solution to me.
>>>
>>> Daniel and I have looked in the DSDT ASL code and found a bunch of registers in high physical memory location (which is an ACPI OpRegion),
>>> and one of the registers had a bit called ECRD.
>>> However, there were many other registers that might be interesting as well, the problem is the short names in the ASL code (so we only see abbreviations essentially).
>>>
>>> While I do agree that adding this code is indeed a clean solution, if you (people that are dealing with Thinkpad laptops) know about cleaner way to access the embedded controller, I think it's preferable, because this way Daniel might be able to trigger the fan on that laptop so it will actually spin and will dissipate-out heat from the system, without the relying on the embedded controller to get into some sort of thermal state and then to trigger the fan.
>>
>>
>> Have you tried falling back to the ec_read() and ec_write() helpers
>> exported by the ACPI EC code ?
>>
>> The "first_ec" pointer used by these functions is exported too,
>> so you could try modifying thinkpad_acpi to use ec_read() and
>> ec_write() as fallback when first_ec is set (and the quirk
>> added by this patch triggers).
> 
> This is basically what my patch does. If the ECRD/ECWR method handles
> are NULL, thinkpad_acpi's acpi_ec_{read,write} functions fall back to
> the regular ACPI EC helpers you mentioned.

Ah I did not realize that. Ok that sounds good to me.

I'll go and apply the patch then. To be on the save side I'm going
to only add this to -next, so that it gets some testing before
showing up in stable series. Once 6.4-rc1 is out you can then
send it to stable@vger.kernel.org to get it backported.

> Speaking of which, does anyone know why these private helper functions
> exist in the first place? The code seems to use them interchangeably.
> Even in the fan control code, there are places where the regular EC
> helpers are called directly. Can we get away with always doing that?

I assume that on some older models there is no standard ACPI EC device
in the ACPI tables, so there only ECRD/ECWR work. I guess that code-paths
which directly call ec_read() / ec_write() are only used on newer
models. But this does indeed seem inconsistent.

> Back to the issue at hand, is there someone we could ask if the X380Y
> even supports manual fan control in the first place? My debugging
> efforts are starting to look like a wild goose chase.
> 
> The thermal sensors and fan PWM readings now work, which is better
> than nothing, but it would be good to get to the bottom of this.

Mark Pearson from Lenovo can hopefully help answer this, but I know
that he is quite busy atm. Hopefully Mark will get back to you when
he has some more bandwidth.

Regards,

Hans



>>>>> ---
>>>>> drivers/platform/x86/thinkpad_acpi.c | 16 ++++++++++++++++
>>>>> 1 file changed, 16 insertions(+)
>>>>>
>>>>> diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
>>>>> index 7191ff2625b1..6fe82f805ea8 100644
>>>>> --- a/drivers/platform/x86/thinkpad_acpi.c
>>>>> +++ b/drivers/platform/x86/thinkpad_acpi.c
>>>>> @@ -11699,6 +11699,7 @@ static int __init thinkpad_acpi_module_init(void)
>>>>> {
>>>>> const struct dmi_system_id *dmi_id;
>>>>> int ret, i;
>>>>> + acpi_object_type obj_type;
>>>>>
>>>>> tpacpi_lifecycle = TPACPI_LIFE_INIT;
>>>>>
>>>>> @@ -11724,6 +11725,21 @@ static int __init thinkpad_acpi_module_init(void)
>>>>> TPACPI_ACPIHANDLE_INIT(ecrd);
>>>>> TPACPI_ACPIHANDLE_INIT(ecwr);
>>>>>
>>>>> + /*
>>>>> + * Quirk: in some models (e.g. X380 Yoga), an object named ECRD
>>>>> + * exists, but it is a register, not a method.
>>>>> + */
>>>>> + if (ecrd_handle) {
>>>>> + acpi_get_type(ecrd_handle, &obj_type);
>>>>> + if (obj_type != ACPI_TYPE_METHOD)
>>>>> + ecrd_handle = NULL;
>>>>> + }
>>>>> + if (ecwr_handle) {
>>>>> + acpi_get_type(ecwr_handle, &obj_type);
>>>>> + if (obj_type != ACPI_TYPE_METHOD)
>>>>> + ecwr_handle = NULL;
>>>>> + }
>>>>> +
>>>>> tpacpi_wq = create_singlethread_workqueue(TPACPI_WORKQUEUE_NAME);
>>>>> if (!tpacpi_wq) {
>>>>> thinkpad_acpi_module_exit();
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
  2023-04-14 18:02 [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga Daniel Bertalan
  2023-04-15 10:12 ` Hans de Goede
@ 2023-04-17 10:23 ` Hans de Goede
  1 sibling, 0 replies; 10+ messages in thread
From: Hans de Goede @ 2023-04-17 10:23 UTC (permalink / raw)
  To: Daniel Bertalan, Mark Gross, Henrique de Moraes Holschuh
  Cc: ibm-acpi-devel, platform-driver-x86, liavalb

Hi,

On 4/14/23 20:02, Daniel Bertalan wrote:
> On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
> accessing the Embedded Controller: instead of a method that reads from
> the EC's memory, `ECRD` is the name of a location in high memory. This
> meant that trying to call them would fail with the following message:
> 
>   ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
>   ACPI object (RegionField)
> 
> With this commit, it is now possible to access the EC and read
> temperature and fan speed information. Note that while writes to the
> HFSP register do go through (as indicated by subsequent reads showing
> the new value), the fan does not actually change its speed.
> 
> Signed-off-by: Daniel Bertalan <dani@danielbertalan.dev>

Thank you for your patch, I've applied this patch to my review-hans 
branch:
https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans

Note it will show up in my review-hans branch once I've pushed my
local branch there, which might take a while.

Once I've run some tests on this branch the patches there will be
added to the platform-drivers-x86/for-next branch and eventually
will be included in the pdx86 pull-request to Linus for the next
merge-window.

Regards,

Hans



> ---
>  drivers/platform/x86/thinkpad_acpi.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
> index 7191ff2625b1..6fe82f805ea8 100644
> --- a/drivers/platform/x86/thinkpad_acpi.c
> +++ b/drivers/platform/x86/thinkpad_acpi.c
> @@ -11699,6 +11699,7 @@ static int __init thinkpad_acpi_module_init(void)
>  {
>  	const struct dmi_system_id *dmi_id;
>  	int ret, i;
> +	acpi_object_type obj_type;
>  
>  	tpacpi_lifecycle = TPACPI_LIFE_INIT;
>  
> @@ -11724,6 +11725,21 @@ static int __init thinkpad_acpi_module_init(void)
>  	TPACPI_ACPIHANDLE_INIT(ecrd);
>  	TPACPI_ACPIHANDLE_INIT(ecwr);
>  
> +	/*
> +	 * Quirk: in some models (e.g. X380 Yoga), an object named ECRD
> +	 * exists, but it is a register, not a method.
> +	 */
> +	if (ecrd_handle) {
> +		acpi_get_type(ecrd_handle, &obj_type);
> +		if (obj_type != ACPI_TYPE_METHOD)
> +			ecrd_handle = NULL;
> +	}
> +	if (ecwr_handle) {
> +		acpi_get_type(ecwr_handle, &obj_type);
> +		if (obj_type != ACPI_TYPE_METHOD)
> +			ecwr_handle = NULL;
> +	}
> +
>  	tpacpi_wq = create_singlethread_workqueue(TPACPI_WORKQUEUE_NAME);
>  	if (!tpacpi_wq) {
>  		thinkpad_acpi_module_exit();


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
  2023-04-17 10:19         ` Hans de Goede
@ 2023-04-17 13:17           ` Mark Pearson
       [not found]           ` <TYZPR03MB59945171347BC248412EBEE6BD9D9@TYZPR03MB5994.apcprd03.prod.outlook.com>
  1 sibling, 0 replies; 10+ messages in thread
From: Mark Pearson @ 2023-04-17 13:17 UTC (permalink / raw)
  To: Hans de Goede, Daniel Bertalan
  Cc: Liav Albani, markgross, Henrique de Moraes Holschuh,
	ibm-acpi-devel, platform-driver-x86

On Mon, Apr 17, 2023, at 6:19 AM, Hans de Goede wrote:
> Hi,
>
> On 4/15/23 16:22, Daniel Bertalan wrote:
>> Hi,
>> 
>> On Saturday, April 15th, 2023 at 15:30, Hans de Goede <hdegoede@redhat.com> wrote:
>> 
>>> Hi,
>>>
>>> On 4/15/23 15:24, Liav Albani wrote:
>>>
>>>> On 4/15/23 13:12, Hans de Goede wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> On 4/14/23 20:02, Daniel Bertalan wrote:
>>>>>
>>>>>> On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
>>>>>> accessing the Embedded Controller: instead of a method that reads from
>>>>>> the EC's memory, `ECRD` is the name of a location in high memory. This
>>>>>> meant that trying to call them would fail with the following message:
>>>>>>
>>>>>> ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
>>>>>> ACPI object (RegionField)
>>>>>>
>>>>>> With this commit, it is now possible to access the EC and read
>>>>>> temperature and fan speed information. Note that while writes to the
>>>>>> HFSP register do go through (as indicated by subsequent reads showing
>>>>>> the new value), the fan does not actually change its speed.
>>>>>>
>>>>>> Signed-off-by: Daniel Bertalan dani@danielbertalan.dev
>>>>>> Interestig, this looks like a pretty clean solution to me.
>>>>
>>>> Daniel and I have looked in the DSDT ASL code and found a bunch of registers in high physical memory location (which is an ACPI OpRegion),
>>>> and one of the registers had a bit called ECRD.
>>>> However, there were many other registers that might be interesting as well, the problem is the short names in the ASL code (so we only see abbreviations essentially).
>>>>
>>>> While I do agree that adding this code is indeed a clean solution, if you (people that are dealing with Thinkpad laptops) know about cleaner way to access the embedded controller, I think it's preferable, because this way Daniel might be able to trigger the fan on that laptop so it will actually spin and will dissipate-out heat from the system, without the relying on the embedded controller to get into some sort of thermal state and then to trigger the fan.
>>>
>>>
>>> Have you tried falling back to the ec_read() and ec_write() helpers
>>> exported by the ACPI EC code ?
>>>
>>> The "first_ec" pointer used by these functions is exported too,
>>> so you could try modifying thinkpad_acpi to use ec_read() and
>>> ec_write() as fallback when first_ec is set (and the quirk
>>> added by this patch triggers).
>> 
>> This is basically what my patch does. If the ECRD/ECWR method handles
>> are NULL, thinkpad_acpi's acpi_ec_{read,write} functions fall back to
>> the regular ACPI EC helpers you mentioned.
>
> Ah I did not realize that. Ok that sounds good to me.
>
> I'll go and apply the patch then. To be on the save side I'm going
> to only add this to -next, so that it gets some testing before
> showing up in stable series. Once 6.4-rc1 is out you can then
> send it to stable@vger.kernel.org to get it backported.
>
>> Speaking of which, does anyone know why these private helper functions
>> exist in the first place? The code seems to use them interchangeably.
>> Even in the fan control code, there are places where the regular EC
>> helpers are called directly. Can we get away with always doing that?
>
> I assume that on some older models there is no standard ACPI EC device
> in the ACPI tables, so there only ECRD/ECWR work. I guess that code-paths
> which directly call ec_read() / ec_write() are only used on newer
> models. But this does indeed seem inconsistent.
>
>> Back to the issue at hand, is there someone we could ask if the X380Y
>> even supports manual fan control in the first place? My debugging
>> efforts are starting to look like a wild goose chase.
>> 
>> The thermal sensors and fan PWM readings now work, which is better
>> than nothing, but it would be good to get to the bottom of this.
>
> Mark Pearson from Lenovo can hopefully help answer this, but I know
> that he is quite busy atm. Hopefully Mark will get back to you when
> he has some more bandwidth.
>

Apologies - I thought I had already replied to thread, but seems I hadn't.

I'm checking with the FW team and will see what I can find out. It may take a little while, especially as this is an older platform and the question is a bit more non-standard than normal.
Internal ticket is LO-2411

Thanks!
Mark

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ibm-acpi-devel] [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
       [not found]           ` <TYZPR03MB59945171347BC248412EBEE6BD9D9@TYZPR03MB5994.apcprd03.prod.outlook.com>
@ 2023-04-18 13:16             ` Mark Pearson
  2023-04-18 13:23               ` Hans de Goede
  0 siblings, 1 reply; 10+ messages in thread
From: Mark Pearson @ 2023-04-18 13:16 UTC (permalink / raw)
  To: Daniel Bertalan
  Cc: Liav Albani, platform-driver-x86, Mark Gross >,
	ibm-acpi-devel, >, Henrique de Moraes Holschuh >

> Subject: [External] Re: [ibm-acpi-devel] [PATCH] platform/x86: 
> thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
>
> Hi,
>
> On 4/15/23 16:22, Daniel Bertalan wrote:
>> Hi,
>>
>> On Saturday, April 15th, 2023 at 15:30, Hans de Goede <hdegoede@redhat.com> wrote:
>>
>>> Hi,
>>>
>>> On 4/15/23 15:24, Liav Albani wrote:
>>>
>>>> On 4/15/23 13:12, Hans de Goede wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> On 4/14/23 20:02, Daniel Bertalan wrote:
>>>>>
>>>>>> On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
>>>>>> accessing the Embedded Controller: instead of a method that reads from
>>>>>> the EC's memory, `ECRD` is the name of a location in high memory. This
>>>>>> meant that trying to call them would fail with the following message:
>>>>>>
>>>>>> ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
>>>>>> ACPI object (RegionField)
>>>>>>
>>>>>> With this commit, it is now possible to access the EC and read
>>>>>> temperature and fan speed information. Note that while writes to the
>>>>>> HFSP register do go through (as indicated by subsequent reads showing
>>>>>> the new value), the fan does not actually change its speed.
>>>>>>
>>>>>> Signed-off-by: Daniel Bertalan dani@danielbertalan.dev
>>>>>> Interestig, this looks like a pretty clean solution to me.
>>>>
>>>> Daniel and I have looked in the DSDT ASL code and found a bunch of registers in high physical memory location (which is an ACPI OpRegion),
>>>> and one of the registers had a bit called ECRD.
>>>> However, there were many other registers that might be interesting as well, the problem is the short names in the ASL code (so we only see abbreviations essentially).
>>>>
>>>> While I do agree that adding this code is indeed a clean solution, if you (people that are dealing with Thinkpad laptops) know about cleaner way to access the embedded controller, I think it's preferable, because this way Daniel might be able to trigger the fan on that laptop so it will actually spin and will dissipate-out heat from the system, without the relying on the embedded controller to get into some sort of thermal state and then to trigger the fan.
>>>
>>>
>>> Have you tried falling back to the ec_read() and ec_write() helpers
>>> exported by the ACPI EC code ?
>>>
>>> The "first_ec" pointer used by these functions is exported too,
>>> so you could try modifying thinkpad_acpi to use ec_read() and
>>> ec_write() as fallback when first_ec is set (and the quirk
>>> added by this patch triggers).
>>
>> This is basically what my patch does. If the ECRD/ECWR method handles
>> are NULL, thinkpad_acpi's acpi_ec_{read,write} functions fall back to
>> the regular ACPI EC helpers you mentioned.
>
> Ah I did not realize that. Ok that sounds good to me.
>
> I'll go and apply the patch then. To be on the save side I'm going
> to only add this to -next, so that it gets some testing before
> showing up in stable series. Once 6.4-rc1 is out you can then
> send it to stable@vger.kernel.org to get it backported.
>
>> Speaking of which, does anyone know why these private helper functions
>> exist in the first place? The code seems to use them interchangeably.
>> Even in the fan control code, there are places where the regular EC
>> helpers are called directly. Can we get away with always doing that?
>
> I assume that on some older models there is no standard ACPI EC device
> in the ACPI tables, so there only ECRD/ECWR work. I guess that code-paths
> which directly call ec_read() / ec_write() are only used on newer
> models. But this does indeed seem inconsistent.
>
>> Back to the issue at hand, is there someone we could ask if the X380Y
>> even supports manual fan control in the first place? My debugging
>> efforts are starting to look like a wild goose chase.
>>
>> The thermal sensors and fan PWM readings now work, which is better
>> than nothing, but it would be good to get to the bottom of this.
>
> Mark Pearson from Lenovo can hopefully help answer this, but I know
> that he is quite busy atm. Hopefully Mark will get back to you when
> he has some more bandwidth.
>
Sorry for the slow reply on this one.

I checked with the FW team and they confirmed on the x380 Yoga that the implementation is unique and not using the ECRD/WCWR ACPI methods. They didn't say why...but it's not expected to be something done again.

I had missed the question about fan control so didn't ask about that. Is there a reason you need to change the fans? It's generally not recommended as it can violate temperature specs and leads to all sorts of issues.

I don't know if the fact this is a one off makes this a better candidate as a quirk? To reduce the risk of breaking something on other platforms? But the code changes looked sensible to me.

I'll aim to do some builds with it in and test it on a few platforms - but I'm travelling next week so this week (and almost certainly the week after) are a bit hectic.

Thanks
Mark


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ibm-acpi-devel] [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
  2023-04-18 13:16             ` [ibm-acpi-devel] " Mark Pearson
@ 2023-04-18 13:23               ` Hans de Goede
  2023-04-18 14:17                 ` Daniel Bertalan
  0 siblings, 1 reply; 10+ messages in thread
From: Hans de Goede @ 2023-04-18 13:23 UTC (permalink / raw)
  To: Mark Pearson, Daniel Bertalan
  Cc: Liav Albani, platform-driver-x86, Mark Gross>,
	ibm-acpi-devel, Henrique de Moraes Holschuh>

Hi,

On 4/18/23 15:16, Mark Pearson wrote:
>> Subject: [External] Re: [ibm-acpi-devel] [PATCH] platform/x86: 
>> thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
>>
>> Hi,
>>
>> On 4/15/23 16:22, Daniel Bertalan wrote:
>>> Hi,
>>>
>>> On Saturday, April 15th, 2023 at 15:30, Hans de Goede <hdegoede@redhat.com> wrote:
>>>
>>>> Hi,
>>>>
>>>> On 4/15/23 15:24, Liav Albani wrote:
>>>>
>>>>> On 4/15/23 13:12, Hans de Goede wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> On 4/14/23 20:02, Daniel Bertalan wrote:
>>>>>>
>>>>>>> On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
>>>>>>> accessing the Embedded Controller: instead of a method that reads from
>>>>>>> the EC's memory, `ECRD` is the name of a location in high memory. This
>>>>>>> meant that trying to call them would fail with the following message:
>>>>>>>
>>>>>>> ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
>>>>>>> ACPI object (RegionField)
>>>>>>>
>>>>>>> With this commit, it is now possible to access the EC and read
>>>>>>> temperature and fan speed information. Note that while writes to the
>>>>>>> HFSP register do go through (as indicated by subsequent reads showing
>>>>>>> the new value), the fan does not actually change its speed.
>>>>>>>
>>>>>>> Signed-off-by: Daniel Bertalan dani@danielbertalan.dev
>>>>>>> Interestig, this looks like a pretty clean solution to me.
>>>>>
>>>>> Daniel and I have looked in the DSDT ASL code and found a bunch of registers in high physical memory location (which is an ACPI OpRegion),
>>>>> and one of the registers had a bit called ECRD.
>>>>> However, there were many other registers that might be interesting as well, the problem is the short names in the ASL code (so we only see abbreviations essentially).
>>>>>
>>>>> While I do agree that adding this code is indeed a clean solution, if you (people that are dealing with Thinkpad laptops) know about cleaner way to access the embedded controller, I think it's preferable, because this way Daniel might be able to trigger the fan on that laptop so it will actually spin and will dissipate-out heat from the system, without the relying on the embedded controller to get into some sort of thermal state and then to trigger the fan.
>>>>
>>>>
>>>> Have you tried falling back to the ec_read() and ec_write() helpers
>>>> exported by the ACPI EC code ?
>>>>
>>>> The "first_ec" pointer used by these functions is exported too,
>>>> so you could try modifying thinkpad_acpi to use ec_read() and
>>>> ec_write() as fallback when first_ec is set (and the quirk
>>>> added by this patch triggers).
>>>
>>> This is basically what my patch does. If the ECRD/ECWR method handles
>>> are NULL, thinkpad_acpi's acpi_ec_{read,write} functions fall back to
>>> the regular ACPI EC helpers you mentioned.
>>
>> Ah I did not realize that. Ok that sounds good to me.
>>
>> I'll go and apply the patch then. To be on the save side I'm going
>> to only add this to -next, so that it gets some testing before
>> showing up in stable series. Once 6.4-rc1 is out you can then
>> send it to stable@vger.kernel.org to get it backported.
>>
>>> Speaking of which, does anyone know why these private helper functions
>>> exist in the first place? The code seems to use them interchangeably.
>>> Even in the fan control code, there are places where the regular EC
>>> helpers are called directly. Can we get away with always doing that?
>>
>> I assume that on some older models there is no standard ACPI EC device
>> in the ACPI tables, so there only ECRD/ECWR work. I guess that code-paths
>> which directly call ec_read() / ec_write() are only used on newer
>> models. But this does indeed seem inconsistent.
>>
>>> Back to the issue at hand, is there someone we could ask if the X380Y
>>> even supports manual fan control in the first place? My debugging
>>> efforts are starting to look like a wild goose chase.
>>>
>>> The thermal sensors and fan PWM readings now work, which is better
>>> than nothing, but it would be good to get to the bottom of this.
>>
>> Mark Pearson from Lenovo can hopefully help answer this, but I know
>> that he is quite busy atm. Hopefully Mark will get back to you when
>> he has some more bandwidth.
>>
> Sorry for the slow reply on this one.
> 
> I checked with the FW team and they confirmed on the x380 Yoga that the implementation is unique and not using the ECRD/WCWR ACPI methods. They didn't say why...but it's not expected to be something done again.
> 
> I had missed the question about fan control so didn't ask about that. Is there a reason you need to change the fans? It's generally not recommended as it can violate temperature specs and leads to all sorts of issues.
> 
> I don't know if the fact this is a one off makes this a better candidate as a quirk? To reduce the risk of breaking something on other platforms? But the code changes looked sensible to me.
> 
> I'll aim to do some builds with it in and test it on a few platforms - but I'm travelling next week so this week (and almost certainly the week after) are a bit hectic.

I just remembered that making thinkpad_acpi fan-control
actually requires passing a module-parameter, because as
said generally speaking leaving the fan on auto mode is best.

I wonder if that parameter was set when testing on
the X380 ?  I guess it was set since the actual
register was inspected and the changes were visible
there, right ?

Regards,

Hans



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ibm-acpi-devel] [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga
  2023-04-18 13:23               ` Hans de Goede
@ 2023-04-18 14:17                 ` Daniel Bertalan
  0 siblings, 0 replies; 10+ messages in thread
From: Daniel Bertalan @ 2023-04-18 14:17 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Mark Pearson, Liav Albani, platform-driver-x86, Mark Gross>,
	ibm-acpi-devel, Henrique de Moraes Holschuh>

Hi Mark and Hans,

please see my reply inline.

On Tuesday, April 18th, 2023 at 15:23, Hans de Goede wrote:


> On 4/18/23 15:16, Mark Pearson wrote:
>
> > 
> > Sorry for the slow reply on this one.
> > 
> > I checked with the FW team and they confirmed on the x380 Yoga that the implementation is unique and not using the ECRD/WCWR ACPI methods. They didn't say why...but it's not expected to be something done again.

Thank you and the FW team for the quick reply! As a first time
kernel hacker, I find my experience top-notch :)

> > I had missed the question about fan control so didn't ask about that. Is there a reason you need to change the fans? It's generally not recommended as it can violate temperature specs and leads to all sorts of issues.

My end goal is to hopefully get a bit more performance out of
my machine by making the fan kick in earlier using Thinkfan.

I have been doing a lot of compile-heavy development lately on
my X380 Yoga, and I noticed that the CPU will throttle down to
around 1.4 GHz at full load. This might just be normal for such
a small ultrabook, but I want to get the most out of it, as I'm
likely going to be stuck with this laptop for my first year of
CS studies.

Additionally, I remember the fans being louder at full load back
when I used Windows. With this patch, I can see that the highest
it gets is 4800 RPM. My memory might just be wrong though, and if so,
I apologize for wasting your time.

I have set "Adaptive Thermal Management" to "Maximize Performance"
in the BIOS, but I don't see a significant improvement.

> > I don't know if the fact this is a one off makes this a better candidate as a quirk? To reduce the risk of breaking something on other platforms? But the code changes looked sensible to me.
> >
> > I'll aim to do some builds with it in and test it on a few platforms - but I'm travelling next week so this week (and almost certainly the week after) are a bit hectic.

Thank you again. In no way is this patch urgent, so feel free to
take your time.

> 
> 
> I just remembered that making thinkpad_acpi fan-control
> actually requires passing a module-parameter, because as
> said generally speaking leaving the fan on auto mode is best.
> 
> I wonder if that parameter was set when testing on
> the X380 ? I guess it was set since the actual
> register was inspected and the changes were visible
> there, right ?

This is correct, I did set fan_control=1 for my testing.
Writes to /proc/acpi/ibm/fan are rejected otherwise.

> 
> Regards,
> 
> Hans

Regards,

Daniel

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-04-18 14:17 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-14 18:02 [PATCH] platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga Daniel Bertalan
2023-04-15 10:12 ` Hans de Goede
     [not found]   ` <a1229347-b5f3-8a1d-40a8-20beb863592a@gmail.com>
2023-04-15 13:30     ` Hans de Goede
2023-04-15 14:22       ` Daniel Bertalan
2023-04-17 10:19         ` Hans de Goede
2023-04-17 13:17           ` Mark Pearson
     [not found]           ` <TYZPR03MB59945171347BC248412EBEE6BD9D9@TYZPR03MB5994.apcprd03.prod.outlook.com>
2023-04-18 13:16             ` [ibm-acpi-devel] " Mark Pearson
2023-04-18 13:23               ` Hans de Goede
2023-04-18 14:17                 ` Daniel Bertalan
2023-04-17 10:23 ` Hans de Goede

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).