* [PATCH v3 0/3] firmware: google: Fix minor bugs
@ 2019-11-18 10:19 patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 1/3] firmware: google: Release devices before unregistering the bus patrick.rudolph
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: patrick.rudolph @ 2019-11-18 10:19 UTC (permalink / raw)
To: linux-kernel
Cc: coreboot, Patrick Rudolph, Allison Randal, Thomas Gleixner,
Alexios Zavras, Greg Kroah-Hartman, Arthur Heymans
From: Patrick Rudolph <patrick.rudolph@9elements.com>
This patch series fixes 3 independent bugs in the google firmware
drivers.
Patch 1-2 do proper cleanup at kernel module unloading.
Patch 3 adds a check if the optional GSMI SMM handler is actually
present in the firmware and responses to the driver.
Changes in v2:
- Add missing return statement
- Add s-o-b on GSMI patches
- Add define for reserved GSMI command
Changes in v3:
- Cosmetic changes only
Arthur Heymans (2):
firmware: google: Unregister driver_info on failure and exit in gsmi
firmware: google: Probe for a GSMI handler in firmware
Patrick Rudolph (1):
firmware: google: Release devices before unregistering the bus
drivers/firmware/google/coreboot_table.c | 7 +++++++
drivers/firmware/google/gsmi.c | 25 ++++++++++++++++++++++++
2 files changed, 32 insertions(+)
--
2.21.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v3 1/3] firmware: google: Release devices before unregistering the bus
2019-11-18 10:19 [PATCH v3 0/3] firmware: google: Fix minor bugs patrick.rudolph
@ 2019-11-18 10:19 ` patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 2/3] firmware: google: Unregister driver_info on failure and exit in gsmi patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 3/3] firmware: google: Probe for a GSMI handler in firmware patrick.rudolph
2 siblings, 0 replies; 4+ messages in thread
From: patrick.rudolph @ 2019-11-18 10:19 UTC (permalink / raw)
To: linux-kernel
Cc: coreboot, Patrick Rudolph, Allison Randal, Thomas Gleixner,
Greg Kroah-Hartman, Alexios Zavras, Arthur Heymans
From: Patrick Rudolph <patrick.rudolph@9elements.com>
Fix a bug where the kernel module can't be loaded after it has been
unloaded as the devices are still present and conflicting with the
to be created coreboot devices.
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
---
-v2:
Add missing return statement.
-v3:
Add missing patch changelog.
---
drivers/firmware/google/coreboot_table.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/firmware/google/coreboot_table.c b/drivers/firmware/google/coreboot_table.c
index 8d132e4f008a..0205987a4fd4 100644
--- a/drivers/firmware/google/coreboot_table.c
+++ b/drivers/firmware/google/coreboot_table.c
@@ -163,8 +163,15 @@ static int coreboot_table_probe(struct platform_device *pdev)
return ret;
}
+static int __cb_dev_unregister(struct device *dev, void *dummy)
+{
+ device_unregister(dev);
+ return 0;
+}
+
static int coreboot_table_remove(struct platform_device *pdev)
{
+ bus_for_each_dev(&coreboot_bus_type, NULL, NULL, __cb_dev_unregister);
bus_unregister(&coreboot_bus_type);
return 0;
}
--
2.21.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 2/3] firmware: google: Unregister driver_info on failure and exit in gsmi
2019-11-18 10:19 [PATCH v3 0/3] firmware: google: Fix minor bugs patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 1/3] firmware: google: Release devices before unregistering the bus patrick.rudolph
@ 2019-11-18 10:19 ` patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 3/3] firmware: google: Probe for a GSMI handler in firmware patrick.rudolph
2 siblings, 0 replies; 4+ messages in thread
From: patrick.rudolph @ 2019-11-18 10:19 UTC (permalink / raw)
To: linux-kernel
Cc: coreboot, Arthur Heymans, Patrick Rudolph, Thomas Gleixner,
Allison Randal, Greg Kroah-Hartman, Alexios Zavras
From: Arthur Heymans <arthur@aheymans.xyz>
Fix a bug where the kernel module couldn't be loaded after unloading,
as the platform driver wasn't released on exit.
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
---
-v2:
Add missing s-o-b.
-v3:
No changes.
---
drivers/firmware/google/gsmi.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/firmware/google/gsmi.c b/drivers/firmware/google/gsmi.c
index edaa4e5d84ad..974c769b75cf 100644
--- a/drivers/firmware/google/gsmi.c
+++ b/drivers/firmware/google/gsmi.c
@@ -1016,6 +1016,9 @@ static __init int gsmi_init(void)
dma_pool_destroy(gsmi_dev.dma_pool);
platform_device_unregister(gsmi_dev.pdev);
pr_info("gsmi: failed to load: %d\n", ret);
+#ifdef CONFIG_PM
+ platform_driver_unregister(&gsmi_driver_info);
+#endif
return ret;
}
@@ -1037,6 +1040,9 @@ static void __exit gsmi_exit(void)
gsmi_buf_free(gsmi_dev.name_buf);
dma_pool_destroy(gsmi_dev.dma_pool);
platform_device_unregister(gsmi_dev.pdev);
+#ifdef CONFIG_PM
+ platform_driver_unregister(&gsmi_driver_info);
+#endif
}
module_init(gsmi_init);
--
2.21.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 3/3] firmware: google: Probe for a GSMI handler in firmware
2019-11-18 10:19 [PATCH v3 0/3] firmware: google: Fix minor bugs patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 1/3] firmware: google: Release devices before unregistering the bus patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 2/3] firmware: google: Unregister driver_info on failure and exit in gsmi patrick.rudolph
@ 2019-11-18 10:19 ` patrick.rudolph
2 siblings, 0 replies; 4+ messages in thread
From: patrick.rudolph @ 2019-11-18 10:19 UTC (permalink / raw)
To: linux-kernel
Cc: coreboot, Arthur Heymans, Patrick Rudolph, Allison Randal,
Alexios Zavras, Greg Kroah-Hartman, Thomas Gleixner
From: Arthur Heymans <arthur@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 <arthur@aheymans.xyz>
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
---
-v2:
Add missing s-o-b and add define for reserved command.
-v3:
No changes.
---
drivers/firmware/google/gsmi.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/firmware/google/gsmi.c b/drivers/firmware/google/gsmi.c
index 974c769b75cf..5b2011ebbe26 100644
--- a/drivers/firmware/google/gsmi.c
+++ b/drivers/firmware/google/gsmi.c
@@ -76,6 +76,7 @@
#define GSMI_CMD_LOG_S0IX_RESUME 0x0b
#define GSMI_CMD_CLEAR_CONFIG 0x20
#define GSMI_CMD_HANDSHAKE_TYPE 0xC1
+#define GSMI_CMD_RESERVED 0xff
/* Magic entry type for kernel events */
#define GSMI_LOG_ENTRY_TYPE_KERNEL 0xDEAD
@@ -746,6 +747,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 +782,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 | GSMI_CMD_RESERVED << 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
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-11-18 10:20 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-18 10:19 [PATCH v3 0/3] firmware: google: Fix minor bugs patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 1/3] firmware: google: Release devices before unregistering the bus patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 2/3] firmware: google: Unregister driver_info on failure and exit in gsmi patrick.rudolph
2019-11-18 10:19 ` [PATCH v3 3/3] firmware: google: Probe for a GSMI handler in firmware patrick.rudolph
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.