]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
platform/x86:intel/pmc: Add support to undo ltr_ignore
authorXi Pardee <xi.pardee@linux.intel.com>
Mon, 24 Jun 2024 20:32:18 +0000 (13:32 -0700)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 8 Jul 2024 07:44:03 +0000 (10:44 +0300)
Add ltr_restore support to undo the ltr_ignore action. It sets the
ltr_ignore bit of the corresponding IP to 0. Ltr_restore reuses some
functionality of pmc_core_ltr_ignore_write() so moved the common
functionality into a helper function.

Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
Link: https://lore.kernel.org/r/20240624203218.2428475-10-xi.pardee@linux.intel.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/pmc/core.c

index dcda4c0abe6b3eebab2ae044ee51cc9d8c8f3c96..01ae71c6df59d398df0b3a115c8188a871e04d30 100644 (file)
@@ -507,12 +507,10 @@ int pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value, int ignore)
        return 0;
 }
 
-static ssize_t pmc_core_ltr_ignore_write(struct file *file,
-                                        const char __user *userbuf,
-                                        size_t count, loff_t *ppos)
+static ssize_t pmc_core_ltr_write(struct pmc_dev *pmcdev,
+                                 const char __user *userbuf,
+                                 size_t count, int ignore)
 {
-       struct seq_file *s = file->private_data;
-       struct pmc_dev *pmcdev = s->private;
        u32 value;
        int err;
 
@@ -520,17 +518,43 @@ static ssize_t pmc_core_ltr_ignore_write(struct file *file,
        if (err)
                return err;
 
-       err = pmc_core_send_ltr_ignore(pmcdev, value, 1);
+       err = pmc_core_send_ltr_ignore(pmcdev, value, ignore);
 
        return err ?: count;
 }
 
+static ssize_t pmc_core_ltr_ignore_write(struct file *file,
+                                        const char __user *userbuf,
+                                        size_t count, loff_t *ppos)
+{
+       struct seq_file *s = file->private_data;
+       struct pmc_dev *pmcdev = s->private;
+
+       return pmc_core_ltr_write(pmcdev, userbuf, count, 1);
+}
+
 static int pmc_core_ltr_ignore_show(struct seq_file *s, void *unused)
 {
        return 0;
 }
 DEFINE_SHOW_STORE_ATTRIBUTE(pmc_core_ltr_ignore);
 
+static ssize_t pmc_core_ltr_restore_write(struct file *file,
+                                         const char __user *userbuf,
+                                         size_t count, loff_t *ppos)
+{
+       struct seq_file *s = file->private_data;
+       struct pmc_dev *pmcdev = s->private;
+
+       return pmc_core_ltr_write(pmcdev, userbuf, count, 0);
+}
+
+static int pmc_core_ltr_restore_show(struct seq_file *s, void *unused)
+{
+       return 0;
+}
+DEFINE_SHOW_STORE_ATTRIBUTE(pmc_core_ltr_restore);
+
 static void pmc_core_slps0_dbg_latch(struct pmc_dev *pmcdev, bool reset)
 {
        struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
@@ -1208,6 +1232,8 @@ static void pmc_core_dbgfs_register(struct pmc_dev *pmcdev)
        debugfs_create_file("ltr_ignore", 0644, dir, pmcdev,
                            &pmc_core_ltr_ignore_fops);
 
+       debugfs_create_file("ltr_restore", 0200, dir, pmcdev, &pmc_core_ltr_restore_fops);
+
        debugfs_create_file("ltr_show", 0444, dir, pmcdev, &pmc_core_ltr_fops);
 
        if (primary_pmc->map->s0ix_blocker_maps)