Commit c367a89d authored by Jie Gan's avatar Jie Gan Committed by Suzuki K Poulose
Browse files

Coresight: Add trace_id function to retrieving the trace ID



Add 'trace_id' function pointer in coresight_ops. It's responsible for retrieving
the device's trace ID.

Co-developed-by: default avatarJames Clark <james.clark@linaro.org>
Signed-off-by: default avatarJames Clark <james.clark@linaro.org>
Reviewed-by: default avatarJames Clark <james.clark@linaro.org>
Signed-off-by: default avatarJie Gan <quic_jiegan@quicinc.com>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250303032931.2500935-3-quic_jiegan@quicinc.com
parent dc872c5f
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -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>");
+12 −1
Original line number Diff line number Diff line
@@ -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,6 +72,7 @@ static const struct coresight_ops_source dummy_source_ops = {
};

static const struct coresight_ops dummy_source_cs_ops = {
	.trace_id	= dummy_source_trace_id,
	.source_ops	= &dummy_source_ops,
};

+1 −0
Original line number Diff line number Diff line
@@ -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,
};

+1 −0
Original line number Diff line number Diff line
@@ -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,
};

+11 −0
Original line number Diff line number Diff line
@@ -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,
};

Loading