ACPI: EC: Rewrite DMI checks
PATCH 1/1 ACPI: EC: Rewrite DMI checks
"Notebook" name is not unique to MSI, thus should not be used to identify MSI hardware.
Use dmi_check_system() for DMI matching.wq
References: http://bugzilla.kernel.org/show_bug.cgi?id=14086
---
drivers/acpi/ec.c | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 43 insertions(+), 6 deletions(-)
drivers/acpi/ec.c +43 -6
@@ -119,6 +119,8 @@ static struct acpi_ec { } *boot_ec, *first_ec;static int EC_FLAGS_MSI ;/* Out-of-spec MSI controller */ +static int EC_FLAGS_VALIDATE_ECDT ;/* ASUStec ECDTs need to be validated */ +static int EC_FLAGS_SKIP_DSDT_SCAN ;/* Not all BIOS survive early DSDT scan */ /* -------------------------------------------------------------------------- Transaction Management
@@ -899,6 +901,41 @@ static const struct acpi_device_id ec_device_ids[] = { {"", 0}, }; +/* Some BIOS do not survive early DSDT scan, skip it */ +static int ec_skip_dsdt_scan (const struct dmi_system_id *id) { +EC_FLAGS_SKIP_DSDT_SCAN =1 ; +return 0 ; +} + +/* ASUStek often supplies us with broken ECDT, validate it */ +static int ec_validate_ecdt (const struct dmi_system_id *id) { +EC_FLAGS_VALIDATE_ECDT =1 ; +return 0 ; +} + +/* MSI EC needs special treatment, enable it */ +static int ec_flag_msi (const struct dmi_system_id *id) { +EC_FLAGS_MSI =1 ; +EC_FLAGS_VALIDATE_ECDT =1 ; +return 0 ; +} + +static struct dmi_system_id __initdata ec_dmi_table[] = { + { + ec_skip_dsdt_scan,"Compal JFL92" , { +DMI_MATCH (DMI_BIOS_VENDOR ,"COMPAL" ), +DMI_MATCH (DMI_BOARD_NAME ,"JFL92" ) },NULL }, + { + ec_flag_msi,"MSI hardware" , { +DMI_MATCH (DMI_BIOS_VENDOR ,"Micro-Star" ), +DMI_MATCH (DMI_CHASSIS_VENDOR ,"MICRO-Star" ) },NULL }, + { + ec_validate_ecdt,"ASUS hardware" , { +DMI_MATCH (DMI_BIOS_VENDOR ,"ASUS" ) },NULL }, + {}, +}; + +int __init acpi_ec_ecdt_probe (void ) {acpi_status status;
@@ -911,11 +948,7 @@ int __init acpi_ec_ecdt_probe(void)/* * Generate a boot ec context */ -if (dmi_name_in_vendors ("Micro-Star" ) || -dmi_name_in_vendors ("Notebook" )) { -pr_info (PREFIX "Enabling special treatment for EC from MSI.\n" ); -EC_FLAGS_MSI =1 ; - } +dmi_check_system (ec_dmi_table); status =acpi_get_table (ACPI_SIG_ECDT ,1 , (struct acpi_table_header **)&ecdt_ptr);if (ACPI_SUCCESS (status)) {
@@ -926,7 +959,7 @@ int __init acpi_ec_ecdt_probe(void) boot_ec->handle =ACPI_ROOT_OBJECT ;acpi_get_handle (ACPI_ROOT_OBJECT , ecdt_ptr->id, &boot_ec->handle);/* Don't trust ECDT, which comes from ASUSTek */ -if (!dmi_name_in_vendors ("ASUS" ) &&EC_FLAGS_MSI ==0 ) +if (!EC_FLAGS_VALIDATE_ECDT ) goto install; saved_ec =kmalloc (sizeof (struct acpi_ec ),GFP_KERNEL );if (!saved_ec)
@@ -934,6 +967,10 @@ int __init acpi_ec_ecdt_probe(void)memcpy (saved_ec, boot_ec,sizeof (struct acpi_ec ));/* fall through */ } + +if (EC_FLAGS_SKIP_DSDT_SCAN ) +return -ENODEV ; +/* This workaround is needed only on some broken machines, * which require early EC, but fail to provide ECDT */ printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");
Len Brown
reviewerQuoted 26 lines · Alexey Starikovskiy
"Notebook" name is not unique to MSI, thus should not be used to identify MSI hardware.
Usedmi_check_system()for DMI matching.wqReferences: http://bugzilla.kernel.org/show_bug.cgi?id=14086
Signed-off-by Alexey Starikovskiy <[email protected]>---
drivers/acpi/ec.c | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 43 insertions(+), 6 deletions(-)drivers/acpi/ec.c +2
-0@@ -119,6 +119,8 @@ static struct acpi_ec { } *boot_ec, *first_ec;static int EC_FLAGS_MSI ;/* Out-of-spec MSI controller */ +static int EC_FLAGS_VALIDATE_ECDT ;/* ASUStec ECDTs need to be validated */ +static int EC_FLAGS_SKIP_DSDT_SCAN ;/* Not all BIOS survive early DSDT scan */ /* -------------------------------------------------------------------------- Transaction Management
drivers/acpi/ec.c static const struct acpi_device_id ec_device_ids[] = { · line 905
Quoted 5 lines
drivers/acpi/ec.c +2
-0@@ -899,6 +901,41 @@ static const struct acpi_device_id ec_device_ids[] = { {"", 0}, }; +/* Some BIOS do not survive early DSDT scan, skip it */ +static int ec_skip_dsdt_scan (const struct dmi_system_id *id) {
scripts/checkpatch.pl wants {'s for new routines to start on the next line.
Quoted 12 lines
drivers/acpi/ec.c +12
-0+EC_FLAGS_SKIP_DSDT_SCAN =1 ; +return 0 ; +} + +/* ASUStek often supplies us with broken ECDT, validate it */ +static int ec_validate_ecdt (const struct dmi_system_id *id) { +EC_FLAGS_VALIDATE_ECDT =1 ; +return 0 ; +} + +/* MSI EC needs special treatment, enable it */ +static int ec_flag_msi (const struct dmi_system_id *id) {
drivers/acpi/ec.c static const struct acpi_device_id ec_device_ids[] = { · line 927
Quoted 10 lines
drivers/acpi/ec.c +10
-0+EC_FLAGS_MSI =1 ; +EC_FLAGS_VALIDATE_ECDT =1 ; +return 0 ; +} + +static struct dmi_system_id __initdata ec_dmi_table[] = { + { + ec_skip_dsdt_scan,"Compal JFL92" , { +DMI_MATCH (DMI_BIOS_VENDOR ,"COMPAL" ), +DMI_MATCH (DMI_BOARD_NAME ,"JFL92" ) },NULL },
How does ec_skip_dsdt_scan(), EC_FLAGS_SKIP_DSDT_SCAN, and the new DMI check for Compal relate to the check-in comments above? Should they be in a 2nd patch?
thanks,
-Len Brown, Intel Open Source Technology Center
Quoted 53 lines
drivers/acpi/ec.c +17
-7+ { + ec_flag_msi, "MSI hardware", { +DMI_MATCH (DMI_BIOS_VENDOR ,"Micro-Star" ), + DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-Star") }, NULL}, + { + ec_validate_ecdt, "ASUS hardware", { + DMI_MATCH(DMI_BIOS_VENDOR, "ASUS") }, NULL}, + {}, +}; + +int __init acpi_ec_ecdt_probe (void ) {acpi_status status;@@ -911,11 +948,7 @@ int __init acpi_ec_ecdt_probe(void)/* * Generate a boot ec context */ -if (dmi_name_in_vendors ("Micro-Star" ) || -dmi_name_in_vendors ("Notebook" )) { -pr_info (PREFIX "Enabling special treatment for EC from MSI.\n" ); -EC_FLAGS_MSI =1 ; - } +dmi_check_system (ec_dmi_table); status =acpi_get_table (ACPI_SIG_ECDT ,1 , (struct acpi_table_header **)&ecdt_ptr);if (ACPI_SUCCESS (status)) {@@ -926,7 +959,7 @@ int __init acpi_ec_ecdt_probe(void) boot_ec->handle =ACPI_ROOT_OBJECT ;acpi_get_handle (ACPI_ROOT_OBJECT , ecdt_ptr->id, &boot_ec->handle);/* Don't trust ECDT, which comes from ASUSTek */ -if (!dmi_name_in_vendors ("ASUS" ) &&EC_FLAGS_MSI ==0 ) +if (!EC_FLAGS_VALIDATE_ECDT ) goto install; saved_ec =kmalloc (sizeof (struct acpi_ec ),GFP_KERNEL );if (!saved_ec)@@ -934,6 +967,10 @@ int __init acpi_ec_ecdt_probe(void)memcpy (saved_ec, boot_ec,sizeof (struct acpi_ec ));/* fall through */ } + +if (EC_FLAGS_SKIP_DSDT_SCAN ) +return -ENODEV ; +/* This workaround is needed only on some broken machines, * which require early EC, but fail to provide ECDT */ printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n"); --To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html