]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Coresight: Add trace_id function to retrieving the trace ID
authorJie Gan <quic_jiegan@quicinc.com>
Mon, 3 Mar 2025 03:29:23 +0000 (11:29 +0800)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Tue, 4 Mar 2025 14:48:49 +0000 (14:48 +0000)
Add 'trace_id' function pointer in coresight_ops. It's responsible for retrieving
the device's trace ID.

Co-developed-by: James Clark <james.clark@linaro.org>
Signed-off-by: James Clark <james.clark@linaro.org>
Reviewed-by: James Clark <james.clark@linaro.org>
Signed-off-by: Jie Gan <quic_jiegan@quicinc.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250303032931.2500935-3-quic_jiegan@quicinc.com
drivers/hwtracing/coresight/coresight-core.c
drivers/hwtracing/coresight/coresight-dummy.c
drivers/hwtracing/coresight/coresight-etm3x-core.c
drivers/hwtracing/coresight/coresight-etm4x-core.c
drivers/hwtracing/coresight/coresight-stm.c
drivers/hwtracing/coresight/coresight-tpda.c
include/linux/coresight.h

index 48bfb80369246b9400e83eb29f8de5eb54e707a8..44ad407817c140b660784d7b705fb8cf586071d4 100644 (file)
@@ -24,6 +24,7 @@
 #include "coresight-etm-perf.h"
 #include "coresight-priv.h"
 #include "coresight-syscfg.h"
+#include "coresight-trace-id.h"
 
 /*
  * Mutex used to lock all sysfs enable and disable actions and loading and
@@ -1567,6 +1568,35 @@ void coresight_remove_driver(struct amba_driver *amba_drv,
 }
 EXPORT_SYMBOL_GPL(coresight_remove_driver);
 
+int coresight_etm_get_trace_id(struct coresight_device *csdev, enum cs_mode mode,
+                              struct coresight_device *sink)
+{
+       int trace_id;
+       int cpu = source_ops(csdev)->cpu_id(csdev);
+
+       switch (mode) {
+       case CS_MODE_SYSFS:
+               trace_id = coresight_trace_id_get_cpu_id(cpu);
+               break;
+       case CS_MODE_PERF:
+               if (WARN_ON(!sink))
+                       return -EINVAL;
+
+               trace_id = coresight_trace_id_get_cpu_id_map(cpu, &sink->perf_sink_id_map);
+               break;
+       default:
+               trace_id = -EINVAL;
+               break;
+       }
+
+       if (!IS_VALID_CS_TRACE_ID(trace_id))
+               dev_err(&csdev->dev,
+                       "Failed to allocate trace ID on CPU%d\n", cpu);
+
+       return trace_id;
+}
+EXPORT_SYMBOL_GPL(coresight_etm_get_trace_id);
+
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Pratik Patel <pratikp@codeaurora.org>");
 MODULE_AUTHOR("Mathieu Poirier <mathieu.poirier@linaro.org>");
index 9be53be8964b5b589ccab6bb50f728a481690e00..b5692ba358c10a0fa6ca9926d74639a317a5f0d1 100644 (file)
@@ -41,6 +41,16 @@ static void dummy_source_disable(struct coresight_device *csdev,
        dev_dbg(csdev->dev.parent, "Dummy source disabled\n");
 }
 
+static int dummy_source_trace_id(struct coresight_device *csdev, __maybe_unused enum cs_mode mode,
+                                __maybe_unused struct coresight_device *sink)
+{
+       struct dummy_drvdata *drvdata;
+
+       drvdata = dev_get_drvdata(csdev->dev.parent);
+
+       return drvdata->traceid;
+}
+
 static int dummy_sink_enable(struct coresight_device *csdev, enum cs_mode mode,
                                void *data)
 {
@@ -62,7 +72,8 @@ static const struct coresight_ops_source dummy_source_ops = {
 };
 
 static const struct coresight_ops dummy_source_cs_ops = {
-       .source_ops = &dummy_source_ops,
+       .trace_id       = dummy_source_trace_id,
+       .source_ops     = &dummy_source_ops,
 };
 
 static const struct coresight_ops_sink dummy_sink_ops = {
index c103f4c70f5d075cdb2f9ad822ee3a9b8fb0f854..c1dda4bc4a2ffd8b3958cc6504f76b44a6143643 100644 (file)
@@ -704,6 +704,7 @@ static const struct coresight_ops_source etm_source_ops = {
 };
 
 static const struct coresight_ops etm_cs_ops = {
+       .trace_id       = coresight_etm_get_trace_id,
        .source_ops     = &etm_source_ops,
 };
 
index 335fa157f30fda4e0c7aaa316a6051a5e0e03f33..07e2dee54688f16be17eed813860b6c7c0deb629 100644 (file)
@@ -1104,6 +1104,7 @@ static const struct coresight_ops_source etm4_source_ops = {
 };
 
 static const struct coresight_ops etm4_cs_ops = {
+       .trace_id       = coresight_etm_get_trace_id,
        .source_ops     = &etm4_source_ops,
 };
 
index b581a30a1cd98d21dbacc4c94850fd412dbe7ae1..aca25b5e3be2c4ef4f89fbd1832572dd30f2b7d9 100644 (file)
@@ -281,12 +281,23 @@ static void stm_disable(struct coresight_device *csdev,
        }
 }
 
+static int stm_trace_id(struct coresight_device *csdev, __maybe_unused enum cs_mode mode,
+                       __maybe_unused struct coresight_device *sink)
+{
+       struct stm_drvdata *drvdata;
+
+       drvdata = dev_get_drvdata(csdev->dev.parent);
+
+       return drvdata->traceid;
+}
+
 static const struct coresight_ops_source stm_source_ops = {
        .enable         = stm_enable,
        .disable        = stm_disable,
 };
 
 static const struct coresight_ops stm_cs_ops = {
+       .trace_id       = stm_trace_id,
        .source_ops     = &stm_source_ops,
 };
 
index c88c548e6d491eac395c5958c4f2d4cb87e0e4ef..0633f04beb240b4415cf469b3296f52e0a5b1d05 100644 (file)
@@ -242,12 +242,23 @@ static void tpda_disable(struct coresight_device *csdev,
        dev_dbg(drvdata->dev, "TPDA inport %d disabled\n", in->dest_port);
 }
 
+static int tpda_trace_id(struct coresight_device *csdev, __maybe_unused enum cs_mode mode,
+                        __maybe_unused struct coresight_device *sink)
+{
+       struct tpda_drvdata *drvdata;
+
+       drvdata = dev_get_drvdata(csdev->dev.parent);
+
+       return drvdata->atid;
+}
+
 static const struct coresight_ops_link tpda_link_ops = {
        .enable         = tpda_enable,
        .disable        = tpda_disable,
 };
 
 static const struct coresight_ops tpda_cs_ops = {
+       .trace_id       = tpda_trace_id,
        .link_ops       = &tpda_link_ops,
 };
 
index 2e493d5288d8b550dcadfe3668c994e1392624c1..1396bda77f3fa9c4afed2f5f77b141f135d96c4f 100644 (file)
@@ -335,6 +335,7 @@ enum cs_mode {
        CS_MODE_PERF,
 };
 
+#define coresight_ops(csdev)   csdev->ops
 #define source_ops(csdev)      csdev->ops->source_ops
 #define sink_ops(csdev)                csdev->ops->sink_ops
 #define link_ops(csdev)                csdev->ops->link_ops
@@ -421,6 +422,8 @@ struct coresight_ops_panic {
 };
 
 struct coresight_ops {
+       int (*trace_id)(struct coresight_device *csdev, enum cs_mode mode,
+                       struct coresight_device *sink);
        const struct coresight_ops_sink *sink_ops;
        const struct coresight_ops_link *link_ops;
        const struct coresight_ops_source *source_ops;
@@ -713,4 +716,6 @@ int coresight_init_driver(const char *drv, struct amba_driver *amba_drv,
 
 void coresight_remove_driver(struct amba_driver *amba_drv,
                             struct platform_driver *pdev_drv);
+int coresight_etm_get_trace_id(struct coresight_device *csdev, enum cs_mode mode,
+                              struct coresight_device *sink);
 #endif         /* _LINUX_COREISGHT_H */