All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ACPI: EC: trust DSDT GPE for certain HP laptop
@ 2021-06-21  1:28 Zhang Rui
  2021-06-21  1:29 ` Zhang Rui
  2021-06-21 16:42 ` Rafael J. Wysocki
  0 siblings, 2 replies; 4+ messages in thread
From: Zhang Rui @ 2021-06-21  1:28 UTC (permalink / raw)
  To: linux-acpi; +Cc: rjw, gleo881003, rui.zhang

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>
---
 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 9555c65f2f94..8d8abd0c6cfb 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 */
 static int EC_FLAGS_FORCE_EC_REG; /* Needs EC _REG evaluated explicitly */
 
@@ -1601,7 +1602,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
@@ -1836,6 +1838,18 @@ static int ec_honor_ecdt_gpe(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 buggy BIOS does not have EC OperationRegion, this results in the
  * EC._REG fails to be evaluated when installing the EC address space handler.
@@ -1876,6 +1890,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.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] ACPI: EC: trust DSDT GPE for certain HP laptop
  2021-06-21  1:28 [PATCH] ACPI: EC: trust DSDT GPE for certain HP laptop Zhang Rui
@ 2021-06-21  1:29 ` Zhang Rui
  2021-06-21 16:42 ` Rafael J. Wysocki
  1 sibling, 0 replies; 4+ messages in thread
From: Zhang Rui @ 2021-06-21  1:29 UTC (permalink / raw)
  To: linux-acpi; +Cc: rjw, leo881003

Sorry that this patch is based on top of some local changes and can not
be applied cleanly to latest upstream git.
Patch rebased on top of v5.13-rc7 and resent.

thanks,
rui

On Mon, 2021-06-21 at 09:28 +0800, Zhang Rui wrote:
> 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>
> ---
>  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 9555c65f2f94..8d8abd0c6cfb 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 */
>  static int EC_FLAGS_FORCE_EC_REG; /* Needs EC _REG evaluated
> explicitly */
>  
> @@ -1601,7 +1602,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
> @@ -1836,6 +1838,18 @@ static int ec_honor_ecdt_gpe(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 buggy BIOS does not have EC OperationRegion, this results in
> the
>   * EC._REG fails to be evaluated when installing the EC address
> space handler.
> @@ -1876,6 +1890,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},
>  	{


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] ACPI: EC: trust DSDT GPE for certain HP laptop
  2021-06-21  1:28 [PATCH] ACPI: EC: trust DSDT GPE for certain HP laptop Zhang Rui
  2021-06-21  1:29 ` Zhang Rui
@ 2021-06-21 16:42 ` Rafael J. Wysocki
  1 sibling, 0 replies; 4+ messages in thread
From: Rafael J. Wysocki @ 2021-06-21 16:42 UTC (permalink / raw)
  To: Zhang Rui; +Cc: ACPI Devel Maling List, Rafael J. Wysocki, gleo881003

On Mon, Jun 21, 2021 at 3:18 AM Zhang Rui <rui.zhang@intel.com> wrote:
>
> 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>
> ---
>  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 9555c65f2f94..8d8abd0c6cfb 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 */
>  static int EC_FLAGS_FORCE_EC_REG; /* Needs EC _REG evaluated explicitly */
>
> @@ -1601,7 +1602,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
> @@ -1836,6 +1838,18 @@ static int ec_honor_ecdt_gpe(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 buggy BIOS does not have EC OperationRegion, this results in the
>   * EC._REG fails to be evaluated when installing the EC address space handler.
> @@ -1876,6 +1890,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},
>         {
> --

Applied as 5.14 material, thanks!

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] ACPI: EC: trust DSDT GPE for certain HP laptop
@ 2021-06-21  1:37 Zhang Rui
  0 siblings, 0 replies; 4+ messages in thread
From: Zhang Rui @ 2021-06-21  1:37 UTC (permalink / raw)
  To: linux-acpi; +Cc: rjw, leo881003, rui.zhang

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>
---
 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 13565629ce0a..34a472600e63 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 */
 
 /* --------------------------------------------------------------------------
@@ -1593,7 +1594,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
@@ -1816,6 +1818,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
@@ -1854,6 +1868,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.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-06-21 16:44 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-21  1:28 [PATCH] ACPI: EC: trust DSDT GPE for certain HP laptop Zhang Rui
2021-06-21  1:29 ` Zhang Rui
2021-06-21 16:42 ` Rafael J. Wysocki
2021-06-21  1:37 Zhang Rui

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.