2022-07-07 13:10:58

by Grzegorz Jaszczyk

[permalink] [raw]
Subject: [RFC PATCH 2/2] platform/x86: Add virtual PMC driver used for S2Idle

Virtual PMC driver is meant for the guest VMs for the S2Idle
notification. Its purpose is to register S2Idle dev ops notify handler,
which will evaluate ACPI _DSM as a very last command before the guest
enters S2Idle power state.

This allows to trap on MMIO access done as a consequence of _DSM
evaluation and therefore notify the VMM about the guest entering S2Idle
state.

Signed-off-by: Grzegorz Jaszczyk <[email protected]>
---
drivers/platform/x86/Kconfig | 7 ++++
drivers/platform/x86/Makefile | 1 +
drivers/platform/x86/virt_pmc.c | 73 +++++++++++++++++++++++++++++++++
3 files changed, 81 insertions(+)
create mode 100644 drivers/platform/x86/virt_pmc.c

diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index bc4013e950ed..dee974321b01 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -479,6 +479,13 @@ config WIRELESS_HOTKEY
To compile this driver as a module, choose M here: the module will
be called wireless-hotkey.

+config VIRT_PMC
+ tristate "Virt PMC"
+ depends on ACPI && SUSPEND
+ help
+ The Virtual PMC driver is meant for the guest VMs and it's main
+ purpose is to notify about guest entering s2idle state.
+
config HP_WMI
tristate "HP WMI extras"
depends on ACPI_WMI
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index 4a59f47a46e2..3c3e440f11bb 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -116,6 +116,7 @@ obj-$(CONFIG_MLX_PLATFORM) += mlx-platform.o
obj-$(CONFIG_TOUCHSCREEN_DMI) += touchscreen_dmi.o
obj-$(CONFIG_WIRELESS_HOTKEY) += wireless-hotkey.o
obj-$(CONFIG_X86_ANDROID_TABLETS) += x86-android-tablets.o
+obj-$(CONFIG_VIRT_PMC) += virt_pmc.o

# Intel uncore drivers
obj-$(CONFIG_INTEL_IPS) += intel_ips.o
diff --git a/drivers/platform/x86/virt_pmc.c b/drivers/platform/x86/virt_pmc.c
new file mode 100644
index 000000000000..d0607db6cd22
--- /dev/null
+++ b/drivers/platform/x86/virt_pmc.c
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Virtual Power Management Controller Driver
+ *
+ * Author: Grzegorz Jaszczyk <[email protected]>
+ */
+
+#include <linux/acpi.h>
+#include <linux/platform_device.h>
+
+#define ACPI_VIRT_PMC_DSM_UUID "9ea49ba3-434a-49a6-be30-37cc55c4d397"
+#define ACPI_VIRT_PMC_NOTIFY 1
+
+static acpi_handle virt_pmc_handle;
+
+static void virt_pmc_s2idle_notify(void)
+{
+ union acpi_object *out_obj;
+ static guid_t dsm_guid;
+
+ guid_parse(ACPI_VIRT_PMC_DSM_UUID, &dsm_guid);
+
+ out_obj = acpi_evaluate_dsm(virt_pmc_handle, &dsm_guid,
+ 0, ACPI_VIRT_PMC_NOTIFY, NULL);
+
+ acpi_handle_debug(virt_pmc_handle, "_DSM function %u evaluation %s\n",
+ ACPI_VIRT_PMC_NOTIFY, out_obj ? "successful" : "failed");
+
+ ACPI_FREE(out_obj);
+}
+
+static struct acpi_s2idle_dev_ops amd_pmc_s2idle_dev_ops = {
+ .notify = virt_pmc_s2idle_notify,
+};
+
+static int virt_pmc_probe(struct platform_device *pdev)
+{
+ int err = 0;
+
+ virt_pmc_handle = ACPI_HANDLE(&pdev->dev);
+
+ err = acpi_register_lps0_dev(&amd_pmc_s2idle_dev_ops);
+ if (err)
+ dev_warn(&pdev->dev, "failed to register LPS0 sleep handler\n");
+
+ return err;
+}
+
+static int virt_pmc_remove(struct platform_device *pdev)
+{
+ acpi_unregister_lps0_dev(&amd_pmc_s2idle_dev_ops);
+
+ return 0;
+}
+
+static const struct acpi_device_id virt_pmc_acpi_ids[] = {
+ {"HYPE0001", 0}, /* _HID for XXX Power Engine, _CID PNP0D80*/
+ { }
+};
+MODULE_DEVICE_TABLE(acpi, virt_pmc_acpi_ids);
+
+static struct platform_driver virt_pmc_driver = {
+ .driver = {
+ .name = "virtual_pmc",
+ .acpi_match_table = ACPI_PTR(virt_pmc_acpi_ids),
+ },
+ .probe = virt_pmc_probe,
+ .remove = virt_pmc_remove,
+};
+
+module_platform_driver(virt_pmc_driver);
+
+MODULE_DESCRIPTION("Virtual PMC Driver");
--
2.37.0.rc0.161.g10f37bed90-goog


2022-07-07 16:37:39

by Randy Dunlap

[permalink] [raw]
Subject: Re: [RFC PATCH 2/2] platform/x86: Add virtual PMC driver used for S2Idle



On 7/7/22 05:53, Grzegorz Jaszczyk wrote:
> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
> index bc4013e950ed..dee974321b01 100644
> --- a/drivers/platform/x86/Kconfig
> +++ b/drivers/platform/x86/Kconfig
> @@ -479,6 +479,13 @@ config WIRELESS_HOTKEY
> To compile this driver as a module, choose M here: the module will
> be called wireless-hotkey.
>
> +config VIRT_PMC
> + tristate "Virt PMC"
> + depends on ACPI && SUSPEND
> + help
> + The Virtual PMC driver is meant for the guest VMs and it's main

its main

> + purpose is to notify about guest entering s2idle state.

--
~Randy