[PATCH 07/24] gtrace: Parse RISC-V Trace encoder config from perf event

Zane Leung liangzhen at linux.spacemit.com
Thu Oct 22 20:14:48 PDT 2026


Parse the hardware trace encoder configurations (timestamp, context,
syncmode, and syncmax) from perf event attributes when operating
in GTRACE_COMPONENT_MODE_PERF.

Signed-off-by: Zane Leung <liangzhen at linux.spacemit.com>
---
 .../hwtracing/gtrace/rvtrace-encoder-core.c   | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/hwtracing/gtrace/rvtrace-encoder-core.c b/drivers/hwtracing/gtrace/rvtrace-encoder-core.c
index 01925ebdfbde..817535ff9558 100644
--- a/drivers/hwtracing/gtrace/rvtrace-encoder-core.c
+++ b/drivers/hwtracing/gtrace/rvtrace-encoder-core.c
@@ -140,13 +140,33 @@ static int rvtrace_encoder_probe(struct gtrace_component *comp)
 	return 0;
 }
 
+static void rvtrace_encoder_parse_event_config(struct rvtrace_encoder_priv *priv,
+					       struct perf_event *event)
+{
+	u64 config = event->attr.config;
+	enum rvtrace_encoder_syncmode syncmode;
+
+	if (priv->has_context)
+		priv->context = config & BIT(GTRACE_PMU_ATTR_CFG_CONTEXT_SHIFT);
+
+	syncmode = FIELD_GET(GTRACE_PMU_ATTR_CFG_SYNCMODE_MASK, config);
+	if (priv->syncmode_hw[syncmode]) {
+		priv->syncmode = syncmode;
+		priv->syncmax = FIELD_GET(GTRACE_PMU_ATTR_CFG_SYNCMAX_MASK, config);
+	}
+}
+
 static int rvtrace_encoder_start(struct gtrace_component *comp)
 {
 	struct rvtrace_encoder_priv *priv = dev_get_drvdata(&comp->dev);
 	struct gtrace_platform_data *pdata = comp->pdata;
+	struct gtrace_path *path = comp->path;
 	int ret;
 	u32 val;
 
+	if (path->mode == GTRACE_COMPONENT_MODE_PERF)
+		rvtrace_encoder_parse_event_config(priv, path->event);
+
 	if (priv->srcbits)
 		rvtrace_encoder_set_srcid(pdata, priv->srcbits);
 
-- 
2.34.1





More information about the linux-riscv mailing list