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@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);