Skip to content
  • Rafael J. Wysocki's avatar
    ACPI: EC: Look for ECDT EC after calling acpi_load_tables() · b1c03308
    Rafael J. Wysocki authored
    Some systems have had functional issues since commit 5a8361f7
    (ACPICA: Integrate package handling with module-level code) that,
    among other things, changed the initial values of the
    acpi_gbl_group_module_level_code and acpi_gbl_parse_table_as_term_list
    global flags in ACPICA which implicitly caused acpi_ec_ecdt_probe() to
    be called before acpi_load_tables() on the vast majority of platforms.
    
    Namely, before commit 5a8361f7, acpi_load_tables() was called from
    acpi_early_init() if acpi_gbl_parse_table_as_term_list was FALSE and
    acpi_gbl_group_module_level_code was TRUE, which almost always was
    the case as FALSE and TRUE were their initial values, respectively.
    The acpi_gbl_parse_table_as_term_list value would be changed to TRUE
    for a couple of platforms in acpi_quirks_dmi_table[], but it remained
    FALSE in the vast majority of cases.
    
    After commit 5a8361f7, the initial values of the two flags have
    been reversed, so in effect acpi_load_tables() has not been called
    from acpi_early_init() any more.  That, in turn, affects
    acpi_ec_ecdt_probe() which is invoked before acpi_load_tables() now
    and it is not possible to evaluate the _REG method for the EC address
    space handler installed by it.  That effectively causes the EC address
    space to be inaccessible to AML on platforms with an ECDT matching the
    EC device definition in the DSDT and functional problems ensue in
    there.
    
    Because the default behavior before commit 5a8361f7 was to call
    acpi_ec_ecdt_probe() after acpi_load_tables(), it should be safe to
    do that again.  Moreover, the EC address space handler installed by
    acpi_ec_ecdt_probe() is only needed for AML to be able to access the
    EC address space and the only AML that can run during acpi_load_tables()
    is module-level code which only is allowed to access address spaces
    with default handlers (memory, I/O and PCI config space).
    
    For this reason, move the acpi_ec_ecdt_probe() invocation back to
    acpi_bus_init(), from where it was taken away by commit d737f333
    (ACPI: probe ECDT before loading AML tables regardless of module-level
    code flag), and put it after the invocation of acpi_load_tables() to
    restore the original code ordering from before commit 5a8361f7.
    
    Fixes: 5a8361f7 ("ACPICA: Integrate package handling with module-level code")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=199981
    
    
    Reported-by: default avatarstep-ali <sunmooon15@gmail.com>
    Reported-by: default avatarCharles Stanhope <charles.stanhope@gmail.com>
    Tested-by: default avatarCharles Stanhope <charles.stanhope@gmail.com>
    Reported-by: default avatarPaulo Nascimento <paulo.ulusu@googlemail.com>
    Reported-by: default avatarDavid Purton <dcpurton@marshwiggle.net>
    Reported-by: default avatarAdam Harvey <adam@adamharvey.name>
    Reported-by: default avatarZhang Rui <rui.zhang@intel.com>
    Tested-by: default avatarZhang Rui <rui.zhang@intel.com>
    Tested-by: default avatarJean-Marc Lenoir <archlinux@jihemel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    b1c03308