[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20250221-pm-debug-v1-1-e5bd815f7ca4@ti.com>
Date: Fri, 21 Feb 2025 19:18:10 +0530
From: Kamlesh Gurudasani <kamlesh@...com>
To: Ulf Hansson <ulf.hansson@...aro.org>
CC: <vigneshr@...com>, <d-gole@...com>, <linux-pm@...r.kernel.org>,
<linux-kernel@...r.kernel.org>, Kamlesh Gurudasani <kamlesh@...com>
Subject: [PATCH RFC] pmdomain: core: add support for writeble power domain
state
Add support for writeable power domain states from debugfs.
Defining GENPD_ALLOW_WRITE_DEBUGFS will enable writeable pd_state
node in debugfs.
Signed-off-by: Kamlesh Gurudasani <kamlesh@...com>
---
This has turn out to be really helpful when debugging SCMI protocol
for power domain management.
Reference has been taken from clock framework which provides similar
CLOCK_ALLOW_WRITE_DEBUGFS, which helps to test clocks from debugfs.
---
drivers/pmdomain/core.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c
index 9b2f28b34bb5..6aba0c672da0 100644
--- a/drivers/pmdomain/core.c
+++ b/drivers/pmdomain/core.c
@@ -1298,6 +1298,60 @@ late_initcall_sync(genpd_power_off_unused);
#ifdef CONFIG_PM_SLEEP
+#ifdef GENPD_ALLOW_WRITE_DEBUGFS
+/*
+ * This can be dangerous, therefore don't provide any real compile time
+ * configuration option for this feature.
+ * People who want to use this will need to modify the source code directly.
+ */
+static int genpd_state_set(void *data, u64 val)
+{
+
+ struct generic_pm_domain *genpd = data;
+ int ret = 0;
+
+ ret = genpd_lock_interruptible(genpd);
+ if (ret)
+ return -ERESTARTSYS;
+
+ if (val == 1) {
+ genpd->power_on(genpd);
+ genpd->status = GENPD_STATE_ON;
+ } else if (val == 0) {
+ genpd->power_off(genpd);
+ genpd->status = GENPD_STATE_OFF;
+ }
+
+ genpd_unlock(genpd);
+ return 0;
+}
+
+#define pd_state_mode 0644
+
+static int genpd_state_get(void *data, u64 *val)
+{
+
+ struct generic_pm_domain *genpd = data;
+ int ret = 0;
+
+ ret = genpd_lock_interruptible(genpd);
+ if (ret)
+ return -ERESTARTSYS;
+
+ if (genpd->status == GENPD_STATE_OFF)
+ *val = 0;
+ else
+ *val = 1;
+
+ genpd_unlock(genpd);
+ return ret;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(pd_state_fops, genpd_state_get,
+ genpd_state_set, "%llu\n");
+
+#endif /* GENPD_ALLOW_WRITE_DEBUGFS */
+
/**
* genpd_sync_power_off - Synchronously power off a PM domain and its parents.
* @genpd: PM domain to power off, if possible.
@@ -3639,6 +3693,11 @@ static void genpd_debug_add(struct generic_pm_domain *genpd)
if (genpd->set_performance_state)
debugfs_create_file("perf_state", 0444,
d, genpd, &perf_state_fops);
+#ifdef GENPD_ALLOW_WRITE_DEBUGFS
+ debugfs_create_file("pd_state", 0644, d, genpd,
+ &pd_state_fops);
+#endif /* GENPD_ALLOW_WRITE_DEBUGFS */
+
}
static int __init genpd_debug_init(void)
@@ -3653,6 +3712,24 @@ static int __init genpd_debug_init(void)
list_for_each_entry(genpd, &gpd_list, gpd_list_node)
genpd_debug_add(genpd);
+#ifdef GENPD_ALLOW_WRITE_DEBUGFS
+ pr_warn("\n");
+ pr_warn("********************************************************************\n");
+ pr_warn("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **\n");
+ pr_warn("** **\n");
+ pr_warn("** WRITEABLE POWER DOMAIN STATE DEBUGFS SUPPORT HAS BEEN ENABLED **\n");
+ pr_warn("** IN THIS KERNEL **\n");
+ pr_warn("** This means that this kernel is built to expose pd operations **\n");
+ pr_warn("** such as enabling, disabling, etc. **\n");
+ pr_warn("** to userspace, which may compromise security on your system. **\n");
+ pr_warn("** **\n");
+ pr_warn("** If you see this message and you are not debugging the **\n");
+ pr_warn("** kernel, report this immediately to your vendor! **\n");
+ pr_warn("** **\n");
+ pr_warn("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **\n");
+ pr_warn("********************************************************************\n");
+#endif /* GENPD_ALLOW_WRITE_DEBUGFS */
+
return 0;
}
late_initcall(genpd_debug_init);
---
base-commit: d4b0fd87ff0d4338b259dc79b2b3c6f7e70e8afa
change-id: 20250221-pm-debug-0824da30890f
Best regards,
--
Kamlesh Gurudasani <kamlesh@...com>
Powered by blists - more mailing lists