[PATCH v5 05/19] coresight: Add callback to determine if PM is needed
Leo Yan
leo.yan at arm.com
Wed Nov 19 07:49:03 PST 2025
Add a callback in the source device that returns a boolean indicating
whether power management operations are required. The save and restore
flow is skipped if the callback returns false.
The ETMv4 driver implements its own version's callback.
Reviewed-by: James Clark <james.clark at linaro.org>
Tested-by: James Clark <james.clark at linaro.org>
Signed-off-by: Leo Yan <leo.yan at arm.com>
---
drivers/hwtracing/coresight/coresight-core.c | 9 ++++++++-
drivers/hwtracing/coresight/coresight-etm4x-core.c | 16 ++++++++++++++++
include/linux/coresight.h | 1 +
3 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c
index 2aa1bbc53731637cccbf82ff83702ddc5ff80069..b2118a49ee688e194930de888b5283c4a6c33e2f 100644
--- a/drivers/hwtracing/coresight/coresight-core.c
+++ b/drivers/hwtracing/coresight/coresight-core.c
@@ -1601,7 +1601,14 @@ static bool coresight_pm_is_needed(struct coresight_device *csdev)
!coresight_ops(csdev)->pm_restore_enable)
return false;
- return true;
+ /*
+ * PM callbacks are provided but pm_is_neended() is absent, it means
+ * no extra check is needed.
+ */
+ if (!coresight_ops(csdev)->pm_is_needed)
+ return true;
+
+ return coresight_ops(csdev)->pm_is_needed(csdev);
}
static int coresight_pm_save(struct coresight_device *csdev)
diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
index 5d308afe737e9061ab75ee1c59c2b84a4a66e349..1c95484d7e2de2d0980e897f7f615b86ddd89f55 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
@@ -1832,6 +1832,21 @@ static int etm4_dying_cpu(unsigned int cpu)
return 0;
}
+static bool etm4_need_save_restore_context(struct coresight_device *csdev)
+{
+ if (pm_save_enable != PARAM_PM_SAVE_SELF_HOSTED)
+ return false;
+
+ /*
+ * Save and restore the ETM Trace registers only if
+ * the ETM is active.
+ */
+ if (coresight_get_mode(csdev))
+ return true;
+
+ return false;
+}
+
static int __etm4_cpu_save(struct etmv4_drvdata *drvdata)
{
int i, ret = 0;
@@ -2107,6 +2122,7 @@ static const struct coresight_ops etm4_cs_ops = {
.trace_id = coresight_etm_get_trace_id,
.pm_save_disable = etm4_cpu_save,
.pm_restore_enable = etm4_cpu_restore,
+ .pm_is_needed = etm4_need_save_restore_context,
.source_ops = &etm4_source_ops,
};
diff --git a/include/linux/coresight.h b/include/linux/coresight.h
index 25a31a4dd1486cefe6b442ad127954f8411ce949..e5ce9b956deeac1a303a7250b48a4083d580f55a 100644
--- a/include/linux/coresight.h
+++ b/include/linux/coresight.h
@@ -444,6 +444,7 @@ struct coresight_ops {
struct coresight_device *sink);
int (*pm_save_disable)(struct coresight_device *csdev);
void (*pm_restore_enable)(struct coresight_device *csdev);
+ bool (*pm_is_needed)(struct coresight_device *csdev);
const struct coresight_ops_sink *sink_ops;
const struct coresight_ops_link *link_ops;
const struct coresight_ops_source *source_ops;
--
2.34.1
More information about the linux-arm-kernel
mailing list