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.

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