On 03/06/2024 10:43, Mao Jinlong wrote:
Some dummy source has static trace id configured in HW and it cannot be changed via software programming. Configure the trace id in device tree and reserve the id when device probe.
Signed-off-by: Mao Jinlong quic_jinlmao@quicinc.com
.../sysfs-bus-coresight-devices-dummy-source | 15 +++++ drivers/hwtracing/coresight/coresight-dummy.c | 58 +++++++++++++++++-- 2 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-bus-coresight-devices-dummy-source
diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-dummy-source b/Documentation/ABI/testing/sysfs-bus-coresight-devices-dummy-source new file mode 100644 index 000000000000..d93c198115c9 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-dummy-source @@ -0,0 +1,15 @@ +What: /sys/bus/coresight/devices/dummy_source<N>/enable_source +Date: June 2024 +KernelVersion: 6.9 +Contact: Mao Jinlong quic_jinlmao@quicinc.com +Description: (RW) Enable/disable tracing of dummy source. A sink should be activated
before enabling the source. The path of coresight components linking
the source to the sink is configured and managed automatically by the
coresight framework.
+What: /sys/bus/coresight/devices/dummy_source<N>/traceid +Date: June 2024 +KernelVersion: 6.9 +Contact: Mao Jinlong quic_jinlmao@quicinc.com +Description: (R) Show the trace ID that will appear in the trace stream
coming from this trace entity.
diff --git a/drivers/hwtracing/coresight/coresight-dummy.c b/drivers/hwtracing/coresight/coresight-dummy.c index ac70c0b491be..1f7133ac2c0b 100644 --- a/drivers/hwtracing/coresight/coresight-dummy.c +++ b/drivers/hwtracing/coresight/coresight-dummy.c @@ -11,10 +11,12 @@ #include <linux/pm_runtime.h> #include "coresight-priv.h" +#include "coresight-trace-id.h" struct dummy_drvdata { struct device *dev; struct coresight_device *csdev;
- u8 traceid;
}; DEFINE_CORESIGHT_DEVLIST(source_devs, "dummy_source"); @@ -67,6 +69,32 @@ static const struct coresight_ops dummy_sink_cs_ops = { .sink_ops = &dummy_sink_ops, }; +/* User can get the trace id of dummy source from this node. */ +static ssize_t traceid_show(struct device *dev,
struct device_attribute *attr, char *buf)
+{
- unsigned long val;
- struct dummy_drvdata *drvdata = dev_get_drvdata(dev->parent);
- val = drvdata->traceid;
- return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
+} +static DEVICE_ATTR_RO(traceid);
+static struct attribute *coresight_dummy_attrs[] = {
- &dev_attr_traceid.attr,
- NULL,
+};
+static const struct attribute_group coresight_dummy_group = {
- .attrs = coresight_dummy_attrs,
+};
+static const struct attribute_group *coresight_dummy_groups[] = {
- &coresight_dummy_group,
- NULL,
+};
static int dummy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -74,6 +102,11 @@ static int dummy_probe(struct platform_device *pdev) struct coresight_platform_data *pdata; struct dummy_drvdata *drvdata; struct coresight_desc desc = { 0 };
- int ret, trace_id;
- drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
- if (!drvdata)
return -ENOMEM;
if (of_device_is_compatible(node, "arm,coresight-dummy-source")) { @@ -85,6 +118,24 @@ static int dummy_probe(struct platform_device *pdev) desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_OTHERS; desc.ops = &dummy_source_cs_ops;
desc.groups = coresight_dummy_groups;
ret = coresight_get_source_traceid(dev, &trace_id);
if (!ret) {
ret = coresight_trace_id_get_system_id(trace_id);
if (ret < 0)
return ret;
drvdata->traceid = ret;
} else {
trace_id = coresight_trace_id_get_system_id(0);
if (trace_id < 0) {
ret = trace_id;
return ret;
}
drvdata->traceid = (u8)trace_id;
}
It's a bit weird to use ret in one version and trace_id in the other. And one casts to (u8) but the other doesn't. I'm sure it all compiles to the same in the end but it would be a bit more readable if it was more consistent.
} else if (of_device_is_compatible(node, "arm,coresight-dummy-sink")) { desc.name = coresight_alloc_device_name(&sink_devs, dev); if (!desc.name) @@ -103,10 +154,6 @@ static int dummy_probe(struct platform_device *pdev) return PTR_ERR(pdata); pdev->dev.platform_data = pdata;
- drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
- if (!drvdata)
return -ENOMEM;
- drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata);
@@ -126,7 +173,10 @@ static void dummy_remove(struct platform_device *pdev) { struct dummy_drvdata *drvdata = platform_get_drvdata(pdev); struct device *dev = &pdev->dev;
- struct device_node *node = dev->of_node;
- if (of_device_is_compatible(node, "arm,coresight-dummy-source"))
pm_runtime_disable(dev); coresight_unregister(drvdata->csdev);coresight_trace_id_put_system_id(drvdata->traceid);
}