On Thu, Jan 10, 2019 at 10:43 AM Zhang Rui <rui.zhang@xxxxxxxxx> wrote: > > On 三, 2019-01-09 at 00:34 +0100, Rafael J. Wysocki wrote: > > From: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > > > > Some systems have had functional issues since commit 5a8361f7ecce > > (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 5a8361f7ecce, 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 5a8361f7ecce, 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 5a8361f7ecce 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 d737f333b211 > > (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 5a8361f7ecce. > > > > Fixes: 5a8361f7ecce (ACPICA: Integrate package handling with module- > > level code) > > Link: https://bugzilla.kernel.org/show_bug.cgi?id=199981 > > Reported-by: step-ali <sunmooon15@xxxxxxxxx> > > Reported-by: Charles Stanhope <charles.stanhope@xxxxxxxxx> > > Reported-by: Paulo Nascimento <paulo.ulusu@xxxxxxxxxxxxxx> > > Reported-by: David Purton <dcpurton@xxxxxxxxxxxxxxx> > > Reported-by: Adam Harvey <adam@xxxxxxxxxxxxxxx> > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > > I have tested this on a Lenovo laptops with ECDT, on top of 5.0-rc1, > and confirms that EC _REG is evaluated with the patch, and is not > evaluated without the patch. > > Let me update the patch link to the bugzilla to get more test. Thank you!