| From 3af5c5e9e91e4c34547f228b1d6e2159576743ee Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Jun 2021 09:37:27 +0800 |
| Subject: ACPI: EC: trust DSDT GPE for certain HP laptop |
| |
| From: Zhang Rui <rui.zhang@intel.com> |
| |
| [ Upstream commit 4370cbf350dbaca984dbda9f9ce3fac45d6949d5 ] |
| |
| On HP Pavilion Gaming Laptop 15-cx0xxx, the ECDT EC and DSDT EC share |
| the same port addresses but different GPEs. And the DSDT GPE is the |
| right one to use. |
| |
| The current code duplicates DSDT EC with ECDT EC if the port addresses |
| are the same, and uses ECDT GPE as a result, which breaks this machine. |
| |
| Introduce a new quirk for the HP laptop to trust the DSDT GPE, |
| and avoid duplicating even if the port addresses are the same. |
| |
| Link: https://bugzilla.kernel.org/show_bug.cgi?id=209989 |
| Reported-and-tested-by: Shao Fu, Chen <leo881003@gmail.com> |
| Signed-off-by: Zhang Rui <rui.zhang@intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/acpi/ec.c | 21 ++++++++++++++++++++- |
| 1 file changed, 20 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c |
| index 32f3b6d268f5..be3e0921a6c0 100644 |
| --- a/drivers/acpi/ec.c |
| +++ b/drivers/acpi/ec.c |
| @@ -183,6 +183,7 @@ static struct workqueue_struct *ec_query_wq; |
| |
| static int EC_FLAGS_CORRECT_ECDT; /* Needs ECDT port address correction */ |
| static int EC_FLAGS_IGNORE_DSDT_GPE; /* Needs ECDT GPE as correction setting */ |
| +static int EC_FLAGS_TRUST_DSDT_GPE; /* Needs DSDT GPE as correction setting */ |
| static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */ |
| |
| /* -------------------------------------------------------------------------- |
| @@ -1606,7 +1607,8 @@ static int acpi_ec_add(struct acpi_device *device) |
| } |
| |
| if (boot_ec && ec->command_addr == boot_ec->command_addr && |
| - ec->data_addr == boot_ec->data_addr) { |
| + ec->data_addr == boot_ec->data_addr && |
| + !EC_FLAGS_TRUST_DSDT_GPE) { |
| /* |
| * Trust PNP0C09 namespace location rather than |
| * ECDT ID. But trust ECDT GPE rather than _GPE |
| @@ -1829,6 +1831,18 @@ static int ec_correct_ecdt(const struct dmi_system_id *id) |
| return 0; |
| } |
| |
| +/* |
| + * Some ECDTs contain wrong GPE setting, but they share the same port addresses |
| + * with DSDT EC, don't duplicate the DSDT EC with ECDT EC in this case. |
| + * https://bugzilla.kernel.org/show_bug.cgi?id=209989 |
| + */ |
| +static int ec_honor_dsdt_gpe(const struct dmi_system_id *id) |
| +{ |
| + pr_debug("Detected system needing DSDT GPE setting.\n"); |
| + EC_FLAGS_TRUST_DSDT_GPE = 1; |
| + return 0; |
| +} |
| + |
| /* |
| * Some DSDTs contain wrong GPE setting. |
| * Asus FX502VD/VE, GL702VMK, X550VXK, X580VD |
| @@ -1883,6 +1897,11 @@ static const struct dmi_system_id ec_dmi_table[] __initconst = { |
| DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
| DMI_MATCH(DMI_PRODUCT_NAME, "X580VD"),}, NULL}, |
| { |
| + /* https://bugzilla.kernel.org/show_bug.cgi?id=209989 */ |
| + ec_honor_dsdt_gpe, "HP Pavilion Gaming Laptop 15-cx0xxx", { |
| + DMI_MATCH(DMI_SYS_VENDOR, "HP"), |
| + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Gaming Laptop 15-cx0xxx"),}, NULL}, |
| + { |
| ec_clear_on_resume, "Samsung hardware", { |
| DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD.")}, NULL}, |
| {}, |
| -- |
| 2.30.2 |
| |