platform-driver-x86.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFCv3 0/1] x86: allow to notify host about guest entering s2idle
@ 2023-02-13 10:09 Grzegorz Jaszczyk
  2023-02-13 10:09 ` [RFCv3 1/1] platform/x86: Add virtual PMC driver used for S2Idle Grzegorz Jaszczyk
  0 siblings, 1 reply; 5+ messages in thread
From: Grzegorz Jaszczyk @ 2023-02-13 10:09 UTC (permalink / raw)
  To: linux-kernel, rafael
  Cc: dmy, tn, dbehr, zide.chen, seanjc, upstream, hdegoede, markgross,
	dtor, mario.limonciello, linux-pm, x86, platform-driver-x86,
	Grzegorz Jaszczyk

According to the mailing list discussion [1] about the preferred approach
for notifying hypervisor/VMM about guest entering s2idle state this RFC was
implemented.

Instead of original hypercall based approach, which involves KVM change [2]
and makes it hypervisor specific, implement different mechanism, which
takes advantage of MMIO/PIO trapping and makes it hypervisor independent.

For the RFCv1 [3]:
  Patch #1 extends S2Idle ops by new notify handler which will be invoked as a
  very last command before system actually enters S2Idle states. It also allows
  to register and use driver specific notification hook which is used in
  patch #2.

  Patch #2 introduces new driver for virtual PMC, which registers
  acpi_s2idle_dev_ops's notify handler. Its implementation is based on an
  ACPI _DSM evaluation, which in turn can perform MMIO access and allow to
  trap and therefore notify the VMM about guest entering S2Idle state.

For the RFCv2 [4]: the patch #1 was dropped as in the meantime Mario Limonciello
introduced a very similar patch [5] which uses s/notify/check and invokes the
callback a bit earlier just before s2idle_entry. Mentioned patch has already
been merged.

This patchset is marked as RFC since patch #2 implements driver for non
existing device "HYPE0001", which ACPI ID was not registered yet.
Furthermore the required registration process [6] will not be started
before getting positive feedback about this patchset.

[1] https://patchwork.kernel.org/project/linux-pm/patch/20220609110337.1238762-2-jaz@semihalf.com/
[2] https://patchwork.kernel.org/project/linux-pm/patch/20220609110337.1238762-3-jaz@semihalf.com/
[3] https://patchwork.kernel.org/project/linux-pm/cover/20220707125329.378277-1-jaz@semihalf.com/
[4] https://patchwork.kernel.org/project/linux-pm/cover/20230209152123.3186930-1-jaz@semihalf.com/
[5] https://patchwork.kernel.org/project/linux-pm/patch/20220829162953.5947-2-mario.limonciello@amd.com
[6] https://uefi.org/PNP_ACPI_Registry

Grzegorz Jaszczyk (1):
  platform/x86: Add virtual PMC driver used for S2Idle

 drivers/platform/x86/Kconfig    |  7 +++
 drivers/platform/x86/Makefile   |  3 ++
 drivers/platform/x86/virt_pmc.c | 83 +++++++++++++++++++++++++++++++++
 3 files changed, 93 insertions(+)
 create mode 100644 drivers/platform/x86/virt_pmc.c

-- 
2.39.1.581.gbfd45094c4-goog


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

* [RFCv3 1/1] platform/x86: Add virtual PMC driver used for S2Idle
  2023-02-13 10:09 [RFCv3 0/1] x86: allow to notify host about guest entering s2idle Grzegorz Jaszczyk
@ 2023-02-13 10:09 ` Grzegorz Jaszczyk
  2023-03-29 12:33   ` Grzegorz Jaszczyk
  0 siblings, 1 reply; 5+ messages in thread
From: Grzegorz Jaszczyk @ 2023-02-13 10:09 UTC (permalink / raw)
  To: linux-kernel, rafael
  Cc: dmy, tn, dbehr, zide.chen, seanjc, upstream, hdegoede, markgross,
	dtor, mario.limonciello, linux-pm, x86, platform-driver-x86,
	Grzegorz Jaszczyk

Virtual PMC driver is meant for the guest VMs for the S2Idle
notification. Its purpose is to register S2Idle dev ops check handler,
which will evaluate ACPI _DSM just 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 <jaz@semihalf.com>
---
Changelog v1..v2:
- Take advantage of acpi_s2idle_dev_ops's check() instead of notify()

Changelog v2..v3:
- Add MODULE_LICENSE
- Remove "amd" prefixes
- Be more verbose in VIRT_PMC config description and make it
  HYPERVISOR_GUEST dependent
- Add extra check ensuring that DSM method supports ACPI_VIRT_PMC_NOTIFY function
---
 drivers/platform/x86/Kconfig    |  7 +++
 drivers/platform/x86/Makefile   |  3 ++
 drivers/platform/x86/virt_pmc.c | 83 +++++++++++++++++++++++++++++++++
 3 files changed, 93 insertions(+)
 create mode 100644 drivers/platform/x86/virt_pmc.c

diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index 5692385e2d26..837ce201b68b 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -1099,6 +1099,13 @@ config WINMATE_FM07_KEYS
 	  buttons below the display. This module adds an input device
 	  that delivers key events when these buttons are pressed.
 
+config VIRT_PMC
+	tristate "Virtual Power Management Controller"
+	depends on ACPI && SUSPEND && HYPERVISOR_GUEST
+	help
+	  The Virtual PMC driver is meant for the guest VMs and its main
+	  purpose is to notify about guest entering s2idle state.
+
 endif # X86_PLATFORM_DEVICES
 
 config P2SB
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index 1d3d1b02541b..c4d3056cf4ea 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -129,6 +129,9 @@ obj-$(CONFIG_INTEL_SCU_WDT)		+= intel_scu_wdt.o
 obj-$(CONFIG_INTEL_SCU_IPC_UTIL)	+= intel_scu_ipcutil.o
 obj-$(CONFIG_X86_INTEL_LPSS)		+= pmc_atom.o
 
+# Virtual PMC
+obj-$(CONFIG_VIRT_PMC)			+= virt_pmc.o
+
 # Siemens Simatic Industrial PCs
 obj-$(CONFIG_SIEMENS_SIMATIC_IPC)	+= simatic-ipc.o
 
diff --git a/drivers/platform/x86/virt_pmc.c b/drivers/platform/x86/virt_pmc.c
new file mode 100644
index 000000000000..a5966bb9048f
--- /dev/null
+++ b/drivers/platform/x86/virt_pmc.c
@@ -0,0 +1,83 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Virtual Power Management Controller Driver
+ *
+ * Author: Grzegorz Jaszczyk <jaz@semihalf.com>
+ */
+
+#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;
+	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 pmc_s2idle_dev_ops = {
+	.check = virt_pmc_s2idle_notify,
+};
+
+static int virt_pmc_probe(struct platform_device *pdev)
+{
+	int err = 0;
+	guid_t dsm_guid;
+
+	virt_pmc_handle = ACPI_HANDLE(&pdev->dev);
+
+	guid_parse(ACPI_VIRT_PMC_DSM_UUID, &dsm_guid);
+
+	if (!acpi_check_dsm(virt_pmc_handle, &dsm_guid, 0,
+			    1 << ACPI_VIRT_PMC_NOTIFY)) {
+		dev_err(&pdev->dev, "DSM method doesn't support ACPI_VIRT_PMC_NOTIFY\n");
+		return -ENODEV;
+	}
+
+	err = acpi_register_lps0_dev(&pmc_s2idle_dev_ops);
+	if (err)
+		dev_err(&pdev->dev, "failed to register LPS0 sleep handler\n");
+
+	return err;
+}
+
+static int virt_pmc_remove(struct platform_device *pdev)
+{
+	acpi_unregister_lps0_dev(&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_LICENSE("GPL");
+MODULE_DESCRIPTION("Virtual PMC Driver");
-- 
2.39.1.581.gbfd45094c4-goog


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

* Re: [RFCv3 1/1] platform/x86: Add virtual PMC driver used for S2Idle
  2023-02-13 10:09 ` [RFCv3 1/1] platform/x86: Add virtual PMC driver used for S2Idle Grzegorz Jaszczyk
@ 2023-03-29 12:33   ` Grzegorz Jaszczyk
  2023-04-06 10:53     ` Hans de Goede
  0 siblings, 1 reply; 5+ messages in thread
From: Grzegorz Jaszczyk @ 2023-03-29 12:33 UTC (permalink / raw)
  To: linux-kernel, hdegoede
  Cc: dmy, tn, dbehr, zide.chen, seanjc, upstream, markgross, dtor,
	mario.limonciello, linux-pm, x86, platform-driver-x86, rafael

Hi Hans,

Do you think that this RFC is in good enough state to start the ACPI
ID registration process so after it will be completed we could land
this solution? Or maybe we could land it (of course if there are no
other remarks) even before and adjust if needed?

Thank you in advance,
Grzegorz





pon., 13 lut 2023 o 11:11 Grzegorz Jaszczyk <jaz@semihalf.com> napisał(a):
>
> Virtual PMC driver is meant for the guest VMs for the S2Idle
> notification. Its purpose is to register S2Idle dev ops check handler,
> which will evaluate ACPI _DSM just 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 <jaz@semihalf.com>
> ---
> Changelog v1..v2:
> - Take advantage of acpi_s2idle_dev_ops's check() instead of notify()
>
> Changelog v2..v3:
> - Add MODULE_LICENSE
> - Remove "amd" prefixes
> - Be more verbose in VIRT_PMC config description and make it
>   HYPERVISOR_GUEST dependent
> - Add extra check ensuring that DSM method supports ACPI_VIRT_PMC_NOTIFY function
> ---
>  drivers/platform/x86/Kconfig    |  7 +++
>  drivers/platform/x86/Makefile   |  3 ++
>  drivers/platform/x86/virt_pmc.c | 83 +++++++++++++++++++++++++++++++++
>  3 files changed, 93 insertions(+)
>  create mode 100644 drivers/platform/x86/virt_pmc.c
>
> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
> index 5692385e2d26..837ce201b68b 100644
> --- a/drivers/platform/x86/Kconfig
> +++ b/drivers/platform/x86/Kconfig
> @@ -1099,6 +1099,13 @@ config WINMATE_FM07_KEYS
>           buttons below the display. This module adds an input device
>           that delivers key events when these buttons are pressed.
>
> +config VIRT_PMC
> +       tristate "Virtual Power Management Controller"
> +       depends on ACPI && SUSPEND && HYPERVISOR_GUEST
> +       help
> +         The Virtual PMC driver is meant for the guest VMs and its main
> +         purpose is to notify about guest entering s2idle state.
> +
>  endif # X86_PLATFORM_DEVICES
>
>  config P2SB
> diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
> index 1d3d1b02541b..c4d3056cf4ea 100644
> --- a/drivers/platform/x86/Makefile
> +++ b/drivers/platform/x86/Makefile
> @@ -129,6 +129,9 @@ obj-$(CONFIG_INTEL_SCU_WDT)         += intel_scu_wdt.o
>  obj-$(CONFIG_INTEL_SCU_IPC_UTIL)       += intel_scu_ipcutil.o
>  obj-$(CONFIG_X86_INTEL_LPSS)           += pmc_atom.o
>
> +# Virtual PMC
> +obj-$(CONFIG_VIRT_PMC)                 += virt_pmc.o
> +
>  # Siemens Simatic Industrial PCs
>  obj-$(CONFIG_SIEMENS_SIMATIC_IPC)      += simatic-ipc.o
>
> diff --git a/drivers/platform/x86/virt_pmc.c b/drivers/platform/x86/virt_pmc.c
> new file mode 100644
> index 000000000000..a5966bb9048f
> --- /dev/null
> +++ b/drivers/platform/x86/virt_pmc.c
> @@ -0,0 +1,83 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Virtual Power Management Controller Driver
> + *
> + * Author: Grzegorz Jaszczyk <jaz@semihalf.com>
> + */
> +
> +#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;
> +       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 pmc_s2idle_dev_ops = {
> +       .check = virt_pmc_s2idle_notify,
> +};
> +
> +static int virt_pmc_probe(struct platform_device *pdev)
> +{
> +       int err = 0;
> +       guid_t dsm_guid;
> +
> +       virt_pmc_handle = ACPI_HANDLE(&pdev->dev);
> +
> +       guid_parse(ACPI_VIRT_PMC_DSM_UUID, &dsm_guid);
> +
> +       if (!acpi_check_dsm(virt_pmc_handle, &dsm_guid, 0,
> +                           1 << ACPI_VIRT_PMC_NOTIFY)) {
> +               dev_err(&pdev->dev, "DSM method doesn't support ACPI_VIRT_PMC_NOTIFY\n");
> +               return -ENODEV;
> +       }
> +
> +       err = acpi_register_lps0_dev(&pmc_s2idle_dev_ops);
> +       if (err)
> +               dev_err(&pdev->dev, "failed to register LPS0 sleep handler\n");
> +
> +       return err;
> +}
> +
> +static int virt_pmc_remove(struct platform_device *pdev)
> +{
> +       acpi_unregister_lps0_dev(&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_LICENSE("GPL");
> +MODULE_DESCRIPTION("Virtual PMC Driver");
> --
> 2.39.1.581.gbfd45094c4-goog
>

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

* Re: [RFCv3 1/1] platform/x86: Add virtual PMC driver used for S2Idle
  2023-03-29 12:33   ` Grzegorz Jaszczyk
@ 2023-04-06 10:53     ` Hans de Goede
  2023-04-06 13:59       ` Grzegorz Jaszczyk
  0 siblings, 1 reply; 5+ messages in thread
From: Hans de Goede @ 2023-04-06 10:53 UTC (permalink / raw)
  To: Grzegorz Jaszczyk, linux-kernel
  Cc: dmy, tn, dbehr, zide.chen, seanjc, upstream, markgross, dtor,
	mario.limonciello, linux-pm, x86, platform-driver-x86, rafael

Hi Grzegorz,

On 3/29/23 14:33, Grzegorz Jaszczyk wrote:
> Hi Hans,
> 
> Do you think that this RFC is in good enough state to start the ACPI
> ID registration process so after it will be completed we could land
> this solution? Or maybe we could land it (of course if there are no
> other remarks) even before and adjust if needed?

I see from the links in the cover-letter that most of
the previous discussion has happened on the linux-pm list
and I believe that the linux-pm folks are in a better place
to answer this question then I am.

I have no objections against the suggested approach,
but I don't really feel that it is my call to make if
we should move forward with this.

Regards,

Hans



> pon., 13 lut 2023 o 11:11 Grzegorz Jaszczyk <jaz@semihalf.com> napisał(a):
>>
>> Virtual PMC driver is meant for the guest VMs for the S2Idle
>> notification. Its purpose is to register S2Idle dev ops check handler,
>> which will evaluate ACPI _DSM just 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 <jaz@semihalf.com>
>> ---
>> Changelog v1..v2:
>> - Take advantage of acpi_s2idle_dev_ops's check() instead of notify()
>>
>> Changelog v2..v3:
>> - Add MODULE_LICENSE
>> - Remove "amd" prefixes
>> - Be more verbose in VIRT_PMC config description and make it
>>   HYPERVISOR_GUEST dependent
>> - Add extra check ensuring that DSM method supports ACPI_VIRT_PMC_NOTIFY function
>> ---
>>  drivers/platform/x86/Kconfig    |  7 +++
>>  drivers/platform/x86/Makefile   |  3 ++
>>  drivers/platform/x86/virt_pmc.c | 83 +++++++++++++++++++++++++++++++++
>>  3 files changed, 93 insertions(+)
>>  create mode 100644 drivers/platform/x86/virt_pmc.c
>>
>> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
>> index 5692385e2d26..837ce201b68b 100644
>> --- a/drivers/platform/x86/Kconfig
>> +++ b/drivers/platform/x86/Kconfig
>> @@ -1099,6 +1099,13 @@ config WINMATE_FM07_KEYS
>>           buttons below the display. This module adds an input device
>>           that delivers key events when these buttons are pressed.
>>
>> +config VIRT_PMC
>> +       tristate "Virtual Power Management Controller"
>> +       depends on ACPI && SUSPEND && HYPERVISOR_GUEST
>> +       help
>> +         The Virtual PMC driver is meant for the guest VMs and its main
>> +         purpose is to notify about guest entering s2idle state.
>> +
>>  endif # X86_PLATFORM_DEVICES
>>
>>  config P2SB
>> diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
>> index 1d3d1b02541b..c4d3056cf4ea 100644
>> --- a/drivers/platform/x86/Makefile
>> +++ b/drivers/platform/x86/Makefile
>> @@ -129,6 +129,9 @@ obj-$(CONFIG_INTEL_SCU_WDT)         += intel_scu_wdt.o
>>  obj-$(CONFIG_INTEL_SCU_IPC_UTIL)       += intel_scu_ipcutil.o
>>  obj-$(CONFIG_X86_INTEL_LPSS)           += pmc_atom.o
>>
>> +# Virtual PMC
>> +obj-$(CONFIG_VIRT_PMC)                 += virt_pmc.o
>> +
>>  # Siemens Simatic Industrial PCs
>>  obj-$(CONFIG_SIEMENS_SIMATIC_IPC)      += simatic-ipc.o
>>
>> diff --git a/drivers/platform/x86/virt_pmc.c b/drivers/platform/x86/virt_pmc.c
>> new file mode 100644
>> index 000000000000..a5966bb9048f
>> --- /dev/null
>> +++ b/drivers/platform/x86/virt_pmc.c
>> @@ -0,0 +1,83 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * Virtual Power Management Controller Driver
>> + *
>> + * Author: Grzegorz Jaszczyk <jaz@semihalf.com>
>> + */
>> +
>> +#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;
>> +       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 pmc_s2idle_dev_ops = {
>> +       .check = virt_pmc_s2idle_notify,
>> +};
>> +
>> +static int virt_pmc_probe(struct platform_device *pdev)
>> +{
>> +       int err = 0;
>> +       guid_t dsm_guid;
>> +
>> +       virt_pmc_handle = ACPI_HANDLE(&pdev->dev);
>> +
>> +       guid_parse(ACPI_VIRT_PMC_DSM_UUID, &dsm_guid);
>> +
>> +       if (!acpi_check_dsm(virt_pmc_handle, &dsm_guid, 0,
>> +                           1 << ACPI_VIRT_PMC_NOTIFY)) {
>> +               dev_err(&pdev->dev, "DSM method doesn't support ACPI_VIRT_PMC_NOTIFY\n");
>> +               return -ENODEV;
>> +       }
>> +
>> +       err = acpi_register_lps0_dev(&pmc_s2idle_dev_ops);
>> +       if (err)
>> +               dev_err(&pdev->dev, "failed to register LPS0 sleep handler\n");
>> +
>> +       return err;
>> +}
>> +
>> +static int virt_pmc_remove(struct platform_device *pdev)
>> +{
>> +       acpi_unregister_lps0_dev(&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_LICENSE("GPL");
>> +MODULE_DESCRIPTION("Virtual PMC Driver");
>> --
>> 2.39.1.581.gbfd45094c4-goog
>>
> 


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

* Re: [RFCv3 1/1] platform/x86: Add virtual PMC driver used for S2Idle
  2023-04-06 10:53     ` Hans de Goede
@ 2023-04-06 13:59       ` Grzegorz Jaszczyk
  0 siblings, 0 replies; 5+ messages in thread
From: Grzegorz Jaszczyk @ 2023-04-06 13:59 UTC (permalink / raw)
  To: Hans de Goede, rafael
  Cc: linux-kernel, dmy, tn, dbehr, zide.chen, seanjc, upstream,
	markgross, dtor, mario.limonciello, linux-pm, x86,
	platform-driver-x86, open list:ACPI

+linux-acpi@vger.kernel.org

Hi Hans, Rafael

czw., 6 kwi 2023 o 12:53 Hans de Goede <hdegoede@redhat.com> napisał(a):
>
> Hi Grzegorz,
>
> On 3/29/23 14:33, Grzegorz Jaszczyk wrote:
> > Hi Hans,
> >
> > Do you think that this RFC is in good enough state to start the ACPI
> > ID registration process so after it will be completed we could land
> > this solution? Or maybe we could land it (of course if there are no
> > other remarks) even before and adjust if needed?
>
> I see from the links in the cover-letter that most of
> the previous discussion has happened on the linux-pm list
> and I believe that the linux-pm folks are in a better place
> to answer this question then I am.
>
> I have no objections against the suggested approach,
> but I don't really feel that it is my call to make if
> we should move forward with this.

Hans: I see and thank you for your feedback.

Rafael: Could you please comment above?

Thank you in advance,
Grzegorz

>
> Regards,
>
> Hans
>
>
>
> > pon., 13 lut 2023 o 11:11 Grzegorz Jaszczyk <jaz@semihalf.com> napisał(a):
> >>
> >> Virtual PMC driver is meant for the guest VMs for the S2Idle
> >> notification. Its purpose is to register S2Idle dev ops check handler,
> >> which will evaluate ACPI _DSM just 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 <jaz@semihalf.com>
> >> ---
> >> Changelog v1..v2:
> >> - Take advantage of acpi_s2idle_dev_ops's check() instead of notify()
> >>
> >> Changelog v2..v3:
> >> - Add MODULE_LICENSE
> >> - Remove "amd" prefixes
> >> - Be more verbose in VIRT_PMC config description and make it
> >>   HYPERVISOR_GUEST dependent
> >> - Add extra check ensuring that DSM method supports ACPI_VIRT_PMC_NOTIFY function
> >> ---
> >>  drivers/platform/x86/Kconfig    |  7 +++
> >>  drivers/platform/x86/Makefile   |  3 ++
> >>  drivers/platform/x86/virt_pmc.c | 83 +++++++++++++++++++++++++++++++++
> >>  3 files changed, 93 insertions(+)
> >>  create mode 100644 drivers/platform/x86/virt_pmc.c
> >>
> >> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
> >> index 5692385e2d26..837ce201b68b 100644
> >> --- a/drivers/platform/x86/Kconfig
> >> +++ b/drivers/platform/x86/Kconfig
> >> @@ -1099,6 +1099,13 @@ config WINMATE_FM07_KEYS
> >>           buttons below the display. This module adds an input device
> >>           that delivers key events when these buttons are pressed.
> >>
> >> +config VIRT_PMC
> >> +       tristate "Virtual Power Management Controller"
> >> +       depends on ACPI && SUSPEND && HYPERVISOR_GUEST
> >> +       help
> >> +         The Virtual PMC driver is meant for the guest VMs and its main
> >> +         purpose is to notify about guest entering s2idle state.
> >> +
> >>  endif # X86_PLATFORM_DEVICES
> >>
> >>  config P2SB
> >> diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
> >> index 1d3d1b02541b..c4d3056cf4ea 100644
> >> --- a/drivers/platform/x86/Makefile
> >> +++ b/drivers/platform/x86/Makefile
> >> @@ -129,6 +129,9 @@ obj-$(CONFIG_INTEL_SCU_WDT)         += intel_scu_wdt.o
> >>  obj-$(CONFIG_INTEL_SCU_IPC_UTIL)       += intel_scu_ipcutil.o
> >>  obj-$(CONFIG_X86_INTEL_LPSS)           += pmc_atom.o
> >>
> >> +# Virtual PMC
> >> +obj-$(CONFIG_VIRT_PMC)                 += virt_pmc.o
> >> +
> >>  # Siemens Simatic Industrial PCs
> >>  obj-$(CONFIG_SIEMENS_SIMATIC_IPC)      += simatic-ipc.o
> >>
> >> diff --git a/drivers/platform/x86/virt_pmc.c b/drivers/platform/x86/virt_pmc.c
> >> new file mode 100644
> >> index 000000000000..a5966bb9048f
> >> --- /dev/null
> >> +++ b/drivers/platform/x86/virt_pmc.c
> >> @@ -0,0 +1,83 @@
> >> +// SPDX-License-Identifier: GPL-2.0-only
> >> +/*
> >> + * Virtual Power Management Controller Driver
> >> + *
> >> + * Author: Grzegorz Jaszczyk <jaz@semihalf.com>
> >> + */
> >> +
> >> +#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;
> >> +       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 pmc_s2idle_dev_ops = {
> >> +       .check = virt_pmc_s2idle_notify,
> >> +};
> >> +
> >> +static int virt_pmc_probe(struct platform_device *pdev)
> >> +{
> >> +       int err = 0;
> >> +       guid_t dsm_guid;
> >> +
> >> +       virt_pmc_handle = ACPI_HANDLE(&pdev->dev);
> >> +
> >> +       guid_parse(ACPI_VIRT_PMC_DSM_UUID, &dsm_guid);
> >> +
> >> +       if (!acpi_check_dsm(virt_pmc_handle, &dsm_guid, 0,
> >> +                           1 << ACPI_VIRT_PMC_NOTIFY)) {
> >> +               dev_err(&pdev->dev, "DSM method doesn't support ACPI_VIRT_PMC_NOTIFY\n");
> >> +               return -ENODEV;
> >> +       }
> >> +
> >> +       err = acpi_register_lps0_dev(&pmc_s2idle_dev_ops);
> >> +       if (err)
> >> +               dev_err(&pdev->dev, "failed to register LPS0 sleep handler\n");
> >> +
> >> +       return err;
> >> +}
> >> +
> >> +static int virt_pmc_remove(struct platform_device *pdev)
> >> +{
> >> +       acpi_unregister_lps0_dev(&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_LICENSE("GPL");
> >> +MODULE_DESCRIPTION("Virtual PMC Driver");
> >> --
> >> 2.39.1.581.gbfd45094c4-goog
> >>
> >
>

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

end of thread, other threads:[~2023-04-06 14:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-13 10:09 [RFCv3 0/1] x86: allow to notify host about guest entering s2idle Grzegorz Jaszczyk
2023-02-13 10:09 ` [RFCv3 1/1] platform/x86: Add virtual PMC driver used for S2Idle Grzegorz Jaszczyk
2023-03-29 12:33   ` Grzegorz Jaszczyk
2023-04-06 10:53     ` Hans de Goede
2023-04-06 13:59       ` Grzegorz Jaszczyk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).