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 <d...@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();



_______________________________________________
ibm-acpi-devel mailing list
ibm-acpi-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ibm-acpi-devel

Reply via email to