From: Arthur Heymans <art...@aheymans.xyz>

Currently this driver is loaded if the DMI string matches coreboot
and has a proper smi_command in the ACPI FADT table, but a GSMI handler in
SMM is an optional feature in coreboot.

So probe for a SMM GSMI handler before initializing the driver.
If the smihandler leaves the calling argument in %eax in the SMM save state
untouched that generally means the is no handler for GSMI.

Signed-off-by: Arthur Heymans <art...@aheymans.xyz>
---
 drivers/firmware/google/gsmi.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/firmware/google/gsmi.c b/drivers/firmware/google/gsmi.c
index 974c769b75cf..a3eaa9f41125 100644
--- a/drivers/firmware/google/gsmi.c
+++ b/drivers/firmware/google/gsmi.c
@@ -746,6 +746,7 @@ MODULE_DEVICE_TABLE(dmi, gsmi_dmi_table);
 static __init int gsmi_system_valid(void)
 {
        u32 hash;
+       u16 cmd, result;
 
        if (!dmi_check_system(gsmi_dmi_table))
                return -ENODEV;
@@ -780,6 +781,23 @@ static __init int gsmi_system_valid(void)
                return -ENODEV;
        }
 
+       /* Test the smihandler with a bogus command. If it leaves the
+        * calling argument in %ax untouched, there is no handler for
+        * GSMI commands.
+        */
+       cmd = GSMI_CALLBACK | 0xff << 8;
+       asm volatile (
+               "outb %%al, %%dx\n\t"
+               : "=a" (result)
+               : "0" (cmd),
+                 "d" (acpi_gbl_FADT.smi_command)
+               : "memory", "cc"
+               );
+       if (cmd == result) {
+               pr_info("gsmi: no gsmi handler in firmware\n");
+               return -ENODEV;
+       }
+
        /* Found */
        return 0;
 }
-- 
2.21.0
_______________________________________________
coreboot mailing list -- coreboot@coreboot.org
To unsubscribe send an email to coreboot-le...@coreboot.org

Reply via email to