[PATCH 2/3] platform/x86/intel: vsec: Enable runtime D3

From: David E. Box
Date: Mon Feb 14 2022 - 16:35:25 EST


Add pm_runtime helpers to allow the PCI device to go to D3 when
not in use.

Signed-off-by: David E. Box <david.e.box@xxxxxxxxxxxxxxx>
---
drivers/platform/x86/intel/pmt/class.c | 5 +++++
drivers/platform/x86/intel/pmt/class.h | 3 +++
drivers/platform/x86/intel/vsec.c | 23 +++++++++++++++++++++++
3 files changed, 31 insertions(+)

diff --git a/drivers/platform/x86/intel/pmt/class.c b/drivers/platform/x86/intel/pmt/class.c
index 85fc159961c1..a3ec09fe2f38 100644
--- a/drivers/platform/x86/intel/pmt/class.c
+++ b/drivers/platform/x86/intel/pmt/class.c
@@ -12,6 +12,7 @@
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/pci.h>
+#include <linux/pm_runtime.h>

#include "../vsec.h"
#include "class.h"
@@ -63,7 +64,10 @@ intel_pmt_read(struct file *filp, struct kobject *kobj,
if (count > entry->size - off)
count = entry->size - off;

+ pm_runtime_get_sync(&entry->pdev->dev);
memcpy_fromio(buf, entry->base + off, count);
+ pm_runtime_mark_last_busy(&entry->pdev->dev);
+ pm_runtime_put_autosuspend(&entry->pdev->dev);

return count;
}
@@ -209,6 +213,7 @@ static int intel_pmt_dev_register(struct intel_pmt_entry *entry,
}

entry->kobj = &dev->kobj;
+ entry->pdev = to_pci_dev(parent->parent);

if (ns->attr_grp) {
ret = sysfs_create_group(entry->kobj, ns->attr_grp);
diff --git a/drivers/platform/x86/intel/pmt/class.h b/drivers/platform/x86/intel/pmt/class.h
index db11d58867ce..b4df7ee91c51 100644
--- a/drivers/platform/x86/intel/pmt/class.h
+++ b/drivers/platform/x86/intel/pmt/class.h
@@ -18,9 +18,12 @@
#define GET_BIR(v) ((v) & GENMASK(2, 0))
#define GET_ADDRESS(v) ((v) & GENMASK(31, 3))

+struct pci_dev;
+
struct intel_pmt_entry {
struct bin_attribute pmt_bin_attr;
struct kobject *kobj;
+ struct pci_dev *pdev;
void __iomem *disc_table;
void __iomem *base;
unsigned long base_addr;
diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c
index c3bdd75ed690..d182122c261d 100644
--- a/drivers/platform/x86/intel/vsec.c
+++ b/drivers/platform/x86/intel/vsec.c
@@ -19,6 +19,7 @@
#include <linux/idr.h>
#include <linux/module.h>
#include <linux/pci.h>
+#include <linux/pm_runtime.h>
#include <linux/types.h>

#include "vsec.h"
@@ -355,9 +356,21 @@ static int intel_vsec_pci_probe(struct pci_dev *pdev, const struct pci_device_id
if (!have_devices)
return -ENODEV;

+ pm_runtime_put(&pdev->dev);
+ pm_runtime_use_autosuspend(&pdev->dev);
+ pm_runtime_set_autosuspend_delay(&pdev->dev, 1000);
+ pm_runtime_allow(&pdev->dev);
+
return 0;
}

+static void intel_vsec_pci_remove(struct pci_dev *pdev)
+{
+ pm_runtime_forbid(&pdev->dev);
+ pm_runtime_dont_use_autosuspend(&pdev->dev);
+ pm_runtime_get(&pdev->dev);
+}
+
/* TGL info */
static const struct intel_vsec_platform_info tgl_info = {
.quirks = VSEC_QUIRK_NO_WATCHER | VSEC_QUIRK_NO_CRASHLOG | VSEC_QUIRK_TABLE_SHIFT,
@@ -383,6 +396,10 @@ static const struct intel_vsec_platform_info dg1_info = {
.quirks = VSEC_QUIRK_NO_DVSEC,
};

+#ifdef CONFIG_PM_SLEEP
+static const struct dev_pm_ops intel_vsec_pm_ops = {};
+#endif
+
#define PCI_DEVICE_ID_INTEL_VSEC_ADL 0x467d
#define PCI_DEVICE_ID_INTEL_VSEC_DG1 0x490e
#define PCI_DEVICE_ID_INTEL_VSEC_OOBMSM 0x09a7
@@ -400,6 +417,12 @@ static struct pci_driver intel_vsec_pci_driver = {
.name = "intel_vsec",
.id_table = intel_vsec_pci_ids,
.probe = intel_vsec_pci_probe,
+ .remove = intel_vsec_pci_remove,
+ .driver = {
+#ifdef CONFIG_PM_SLEEP
+ .pm = &intel_vsec_pm_ops,
+#endif
+ },
};
module_pci_driver(intel_vsec_pci_driver);

--
2.25.1