devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/3] coresight: Add preferred trace id support
@ 2024-06-26  6:07 Mao Jinlong
  2024-06-26  6:07 ` [PATCH v3 1/3] dt-bindings: arm: Add arm,trace-id for coresight dummy source Mao Jinlong
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Mao Jinlong @ 2024-06-26  6:07 UTC (permalink / raw)
  To: Suzuki K Poulose, Mike Leach, James Clark, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Mao Jinlong,
	Alexander Shishkin
  Cc: coresight, linux-arm-kernel, devicetree, linux-kernel,
	linux-arm-msm, Tingwei Zhang, Yuanfang Zhang, Tao Zhang, songchai

Some HW has static trace id which cannot be changed via
software programming. For this case, configure the trace id
in device tree with "arm,trace-id = <xxx>", and
call coresight_trace_id_get_system_id with the trace id value
in device probe function. The id will be reserved for the HW
all the time if the device is probed.

Changes since V2:
1. Change "trace-id" to "arm,trace-id".
2. Add trace id flag for getting preferred id or ODD id.

Changes since V1:
1. Add argument to coresight_trace_id_get_system_id for preferred id
instead of adding new function coresight_trace_id_reserve_system_id.
2. Add constraint to trace-id in dt-binding file.

Mao Jinlong (3):
  dt-bindings: arm: Add arm,trace-id for coresight dummy source
  coresight: Add support to get preferred id for system trace sources
  coresight: dummy: Add reserve atid support for dummy source

 .../sysfs-bus-coresight-devices-dummy-source  | 15 +++++
 .../arm/arm,coresight-dummy-source.yaml       |  6 ++
 drivers/hwtracing/coresight/coresight-dummy.c | 59 +++++++++++++++++--
 .../hwtracing/coresight/coresight-platform.c  | 25 ++++++++
 drivers/hwtracing/coresight/coresight-stm.c   |  2 +-
 drivers/hwtracing/coresight/coresight-tpda.c  |  2 +-
 .../hwtracing/coresight/coresight-trace-id.c  | 35 +++++++----
 .../hwtracing/coresight/coresight-trace-id.h  | 11 +++-
 include/linux/coresight.h                     |  1 +
 9 files changed, 137 insertions(+), 19 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-bus-coresight-devices-dummy-source

-- 
2.41.0


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v3 1/3] dt-bindings: arm: Add arm,trace-id for coresight dummy source
  2024-06-26  6:07 [PATCH v3 0/3] coresight: Add preferred trace id support Mao Jinlong
@ 2024-06-26  6:07 ` Mao Jinlong
  2024-06-28 21:47   ` Rob Herring (Arm)
  2024-07-18 15:57   ` Mike Leach
  2024-06-26  6:07 ` [PATCH v3 2/3] coresight: Add support to get preferred id for system trace sources Mao Jinlong
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 9+ messages in thread
From: Mao Jinlong @ 2024-06-26  6:07 UTC (permalink / raw)
  To: Suzuki K Poulose, Mike Leach, James Clark, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Mao Jinlong,
	Alexander Shishkin
  Cc: coresight, linux-arm-kernel, devicetree, linux-kernel,
	linux-arm-msm, Tingwei Zhang, Yuanfang Zhang, Tao Zhang, songchai

Some dummy source HW has static trace id which cannot be changed via
software programming. Add arm,trace-id for static id support to
coresight dummy source.

Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
---
 .../devicetree/bindings/arm/arm,coresight-dummy-source.yaml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/arm,coresight-dummy-source.yaml b/Documentation/devicetree/bindings/arm/arm,coresight-dummy-source.yaml
index 6745b4cc8f1c..b18cfd8e137e 100644
--- a/Documentation/devicetree/bindings/arm/arm,coresight-dummy-source.yaml
+++ b/Documentation/devicetree/bindings/arm/arm,coresight-dummy-source.yaml
@@ -38,6 +38,12 @@ properties:
     enum:
       - arm,coresight-dummy-source
 
+  arm,trace-id:
+    description: If dummy source needs static id support, use this to set trace id.
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 1
+    maximum: 111
+
   out-ports:
     $ref: /schemas/graph.yaml#/properties/ports
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v3 2/3] coresight: Add support to get preferred id for system trace sources
  2024-06-26  6:07 [PATCH v3 0/3] coresight: Add preferred trace id support Mao Jinlong
  2024-06-26  6:07 ` [PATCH v3 1/3] dt-bindings: arm: Add arm,trace-id for coresight dummy source Mao Jinlong
@ 2024-06-26  6:07 ` Mao Jinlong
  2024-07-18 15:57   ` Mike Leach
  2024-06-26  6:07 ` [PATCH v3 3/3] coresight: dummy: Add reserve atid support for dummy source Mao Jinlong
  2024-07-18 15:57 ` [PATCH v3 0/3] coresight: Add preferred trace id support Mike Leach
  3 siblings, 1 reply; 9+ messages in thread
From: Mao Jinlong @ 2024-06-26  6:07 UTC (permalink / raw)
  To: Suzuki K Poulose, Mike Leach, James Clark, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Mao Jinlong,
	Alexander Shishkin
  Cc: coresight, linux-arm-kernel, devicetree, linux-kernel,
	linux-arm-msm, Tingwei Zhang, Yuanfang Zhang, Tao Zhang, songchai

Dynamic trace id was introduced in coresight subsystem, so trace id is
allocated dynamically. However, some hardware ATB source has static trace
id and it cannot be changed via software programming. For such source,
it can call coresight_get_source_traceid to get the fixed trace id from
device node and pass id to coresight_trace_id_get_system_id to reserve
the id.

Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
---
 .../hwtracing/coresight/coresight-platform.c  | 25 +++++++++++++
 drivers/hwtracing/coresight/coresight-stm.c   |  2 +-
 drivers/hwtracing/coresight/coresight-tpda.c  |  2 +-
 .../hwtracing/coresight/coresight-trace-id.c  | 35 ++++++++++++-------
 .../hwtracing/coresight/coresight-trace-id.h  | 11 +++++-
 include/linux/coresight.h                     |  1 +
 6 files changed, 61 insertions(+), 15 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-platform.c b/drivers/hwtracing/coresight/coresight-platform.c
index 9d550f5697fa..df169f3f367e 100644
--- a/drivers/hwtracing/coresight/coresight-platform.c
+++ b/drivers/hwtracing/coresight/coresight-platform.c
@@ -183,6 +183,17 @@ static int of_coresight_get_cpu(struct device *dev)
 	return cpu;
 }
 
+/*
+ * of_coresight_get_trace_id: Get the atid of a source device.
+ *
+ * Returns 0 on success.
+ */
+static int of_coresight_get_trace_id(struct device *dev, u32 *id)
+{
+
+	return of_property_read_u32(dev->of_node, "arm,trace-id", id);
+}
+
 /*
  * of_coresight_parse_endpoint : Parse the given output endpoint @ep
  * and fill the connection information in @pdata->out_conns
@@ -315,6 +326,11 @@ static inline int of_coresight_get_cpu(struct device *dev)
 {
 	return -ENODEV;
 }
+
+static inline int of_coresight_get_trace_id(struct device *dev, u32 *id)
+{
+	return -ENODEV;
+}
 #endif
 
 #ifdef CONFIG_ACPI
@@ -794,6 +810,15 @@ int coresight_get_cpu(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(coresight_get_cpu);
 
+int coresight_get_source_traceid(struct device *dev, u32 *id)
+{
+	if (!is_of_node(dev->fwnode))
+		return -EINVAL;
+
+	return of_coresight_get_trace_id(dev, id);
+}
+EXPORT_SYMBOL_GPL(coresight_get_source_traceid);
+
 struct coresight_platform_data *
 coresight_get_platform_data(struct device *dev)
 {
diff --git a/drivers/hwtracing/coresight/coresight-stm.c b/drivers/hwtracing/coresight/coresight-stm.c
index e1c62820dfda..34fab2ce9a76 100644
--- a/drivers/hwtracing/coresight/coresight-stm.c
+++ b/drivers/hwtracing/coresight/coresight-stm.c
@@ -901,7 +901,7 @@ static int __stm_probe(struct device *dev, struct resource *res)
 		goto stm_unregister;
 	}
 
-	trace_id = coresight_trace_id_get_system_id();
+	trace_id = coresight_trace_id_get_system_id(TRACE_ID_ANY);
 	if (trace_id < 0) {
 		ret = trace_id;
 		goto cs_unregister;
diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c
index 7739bc7adc44..46161cadb9e5 100644
--- a/drivers/hwtracing/coresight/coresight-tpda.c
+++ b/drivers/hwtracing/coresight/coresight-tpda.c
@@ -251,7 +251,7 @@ static int tpda_init_default_data(struct tpda_drvdata *drvdata)
 	 * same trace-id. When TPDA does packetization, different
 	 * port will have unique channel number for decoding.
 	 */
-	atid = coresight_trace_id_get_system_id();
+	atid = coresight_trace_id_get_system_id(TRACE_ID_ANY);
 	if (atid < 0)
 		return atid;
 
diff --git a/drivers/hwtracing/coresight/coresight-trace-id.c b/drivers/hwtracing/coresight/coresight-trace-id.c
index af5b4ef59cea..59194f60362c 100644
--- a/drivers/hwtracing/coresight/coresight-trace-id.c
+++ b/drivers/hwtracing/coresight/coresight-trace-id.c
@@ -75,21 +75,26 @@ static int coresight_trace_id_find_odd_id(struct coresight_trace_id_map *id_map)
  * Allocate new ID and set in use
  *
  * if @preferred_id is a valid id then try to use that value if available.
- * if @preferred_id is not valid and @prefer_odd_id is true, try for odd id.
+ * if TRACE_ID_WANT_PREFERRED is set, @preferred_id must be free, otherwise return
+ * error -EINVAL.
+ * if @preferred_id is not valid and TRACE_ID_WANT_ODD is true, try for odd id.
  *
  * Otherwise allocate next available ID.
  */
 static int coresight_trace_id_alloc_new_id(struct coresight_trace_id_map *id_map,
-					   int preferred_id, bool prefer_odd_id)
+			   int preferred_id, unsigned int flags)
 {
 	int id = 0;
 
 	/* for backwards compatibility, cpu IDs may use preferred value */
-	if (IS_VALID_CS_TRACE_ID(preferred_id) &&
-	    !test_bit(preferred_id, id_map->used_ids)) {
-		id = preferred_id;
-		goto trace_id_allocated;
-	} else if (prefer_odd_id) {
+	if (IS_VALID_CS_TRACE_ID(preferred_id)) {
+		if (!test_bit(preferred_id, id_map->used_ids)) {
+			id = preferred_id;
+			goto trace_id_allocated;
+		} else if (WARN((flags & TRACE_ID_WANT_PREFERRED), "Trace ID %d is used.\n",
+					preferred_id))
+			return -EINVAL;
+	} else if (flags & TRACE_ID_WANT_ODD) {
 	/* may use odd ids to avoid preferred legacy cpu IDs */
 		id = coresight_trace_id_find_odd_id(id_map);
 		if (id)
@@ -175,7 +180,7 @@ static int coresight_trace_id_map_get_cpu_id(int cpu, struct coresight_trace_id_
 	 */
 	id = coresight_trace_id_alloc_new_id(id_map,
 					     CORESIGHT_LEGACY_CPU_TRACE_ID(cpu),
-					     false);
+					     TRACE_ID_ANY);
 	if (!IS_VALID_CS_TRACE_ID(id))
 		goto get_cpu_id_out_unlock;
 
@@ -222,14 +227,20 @@ static void coresight_trace_id_map_put_cpu_id(int cpu, struct coresight_trace_id
 	DUMP_ID_MAP(id_map);
 }
 
-static int coresight_trace_id_map_get_system_id(struct coresight_trace_id_map *id_map)
+static int coresight_trace_id_map_get_system_id(struct coresight_trace_id_map *id_map,
+				int preferred_id)
 {
 	unsigned long flags;
 	int id;
+	unsigned int traceid_flags = 0;
 
 	spin_lock_irqsave(&id_map_lock, flags);
+
 	/* prefer odd IDs for system components to avoid legacy CPU IDS */
-	id = coresight_trace_id_alloc_new_id(id_map, 0, true);
+	traceid_flags = TRACE_ID_WANT_ODD;
+	traceid_flags |= preferred_id > 0 ? TRACE_ID_WANT_PREFERRED : 0;
+
+	id = coresight_trace_id_alloc_new_id(id_map, preferred_id, traceid_flags);
 	spin_unlock_irqrestore(&id_map_lock, flags);
 
 	DUMP_ID(id);
@@ -269,9 +280,9 @@ int coresight_trace_id_read_cpu_id(int cpu)
 }
 EXPORT_SYMBOL_GPL(coresight_trace_id_read_cpu_id);
 
-int coresight_trace_id_get_system_id(void)
+int coresight_trace_id_get_system_id(int id)
 {
-	return coresight_trace_id_map_get_system_id(&id_map_default);
+	return coresight_trace_id_map_get_system_id(&id_map_default, id);
 }
 EXPORT_SYMBOL_GPL(coresight_trace_id_get_system_id);
 
diff --git a/drivers/hwtracing/coresight/coresight-trace-id.h b/drivers/hwtracing/coresight/coresight-trace-id.h
index 3797777d367e..a236cf87c169 100644
--- a/drivers/hwtracing/coresight/coresight-trace-id.h
+++ b/drivers/hwtracing/coresight/coresight-trace-id.h
@@ -61,6 +61,12 @@ struct coresight_trace_id_map {
 	DECLARE_BITMAP(pend_rel_ids, CORESIGHT_TRACE_IDS_MAX);
 };
 
+enum trace_id_flags {
+	TRACE_ID_ANY = 0x0,
+	TRACE_ID_WANT_ODD = 0x1,
+	TRACE_ID_WANT_PREFERRED = 0x2,
+};
+
 /* Allocate and release IDs for a single default trace ID map */
 
 /**
@@ -118,9 +124,12 @@ int coresight_trace_id_read_cpu_id(int cpu);
  *
  * Used to allocate IDs for system trace sources such as STM.
  *
+ * @id: Preferred id value. If id is TRACE_ID_ANY, get a free id from id map.
+ * If id is greater than TRACE_ID_ANY, get a preferred id.
+ *
  * return: Trace ID or -EINVAL if allocation is impossible.
  */
-int coresight_trace_id_get_system_id(void);
+int coresight_trace_id_get_system_id(int id);
 
 /**
  * Release an allocated system trace ID.
diff --git a/include/linux/coresight.h b/include/linux/coresight.h
index f09ace92176e..0599303be326 100644
--- a/include/linux/coresight.h
+++ b/include/linux/coresight.h
@@ -643,6 +643,7 @@ void coresight_relaxed_write64(struct coresight_device *csdev,
 void coresight_write64(struct coresight_device *csdev, u64 val, u32 offset);
 
 extern int coresight_get_cpu(struct device *dev);
+extern int coresight_get_source_traceid(struct device *dev, u32 *id);
 
 struct coresight_platform_data *coresight_get_platform_data(struct device *dev);
 struct coresight_connection *
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v3 3/3] coresight: dummy: Add reserve atid support for dummy source
  2024-06-26  6:07 [PATCH v3 0/3] coresight: Add preferred trace id support Mao Jinlong
  2024-06-26  6:07 ` [PATCH v3 1/3] dt-bindings: arm: Add arm,trace-id for coresight dummy source Mao Jinlong
  2024-06-26  6:07 ` [PATCH v3 2/3] coresight: Add support to get preferred id for system trace sources Mao Jinlong
@ 2024-06-26  6:07 ` Mao Jinlong
  2024-07-18 15:57 ` [PATCH v3 0/3] coresight: Add preferred trace id support Mike Leach
  3 siblings, 0 replies; 9+ messages in thread
From: Mao Jinlong @ 2024-06-26  6:07 UTC (permalink / raw)
  To: Suzuki K Poulose, Mike Leach, James Clark, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Mao Jinlong,
	Alexander Shishkin
  Cc: coresight, linux-arm-kernel, devicetree, linux-kernel,
	linux-arm-msm, Tingwei Zhang, Yuanfang Zhang, Tao Zhang, songchai

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 | 59 +++++++++++++++++--
 2 files changed, 70 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..dff31c304b5b
--- /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..5bff3baae1b5 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,25 @@ 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) {
+			/* Get the preferred id if id is set in device tree. */
+			ret = coresight_trace_id_get_system_id(trace_id);
+			if (ret < 0)
+				return ret;
+
+		} else {
+			/* Get next available id if id is not set in device tree. */
+			trace_id = coresight_trace_id_get_system_id(TRACE_ID_ANY);
+			if (trace_id < 0) {
+				ret = trace_id;
+				return ret;
+			}
+		}
+		drvdata->traceid = (u8)trace_id;
+
 	} 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 +155,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 +174,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"))
+		coresight_trace_id_put_system_id(drvdata->traceid);
 	pm_runtime_disable(dev);
 	coresight_unregister(drvdata->csdev);
 }
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 1/3] dt-bindings: arm: Add arm,trace-id for coresight dummy source
  2024-06-26  6:07 ` [PATCH v3 1/3] dt-bindings: arm: Add arm,trace-id for coresight dummy source Mao Jinlong
@ 2024-06-28 21:47   ` Rob Herring (Arm)
  2024-07-18 15:57   ` Mike Leach
  1 sibling, 0 replies; 9+ messages in thread
From: Rob Herring (Arm) @ 2024-06-28 21:47 UTC (permalink / raw)
  To: Mao Jinlong
  Cc: Yuanfang Zhang, coresight, Suzuki K Poulose, Mike Leach,
	linux-arm-kernel, James Clark, devicetree, Tingwei Zhang,
	Krzysztof Kozlowski, Conor Dooley, Tao Zhang, songchai,
	linux-kernel, Alexander Shishkin, linux-arm-msm


On Tue, 25 Jun 2024 23:07:20 -0700, Mao Jinlong wrote:
> Some dummy source HW has static trace id which cannot be changed via
> software programming. Add arm,trace-id for static id support to
> coresight dummy source.
> 
> Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
> ---
>  .../devicetree/bindings/arm/arm,coresight-dummy-source.yaml | 6 ++++++
>  1 file changed, 6 insertions(+)
> 

Reviewed-by: Rob Herring (Arm) <robh@kernel.org>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 2/3] coresight: Add support to get preferred id for system trace sources
  2024-06-26  6:07 ` [PATCH v3 2/3] coresight: Add support to get preferred id for system trace sources Mao Jinlong
@ 2024-07-18 15:57   ` Mike Leach
  0 siblings, 0 replies; 9+ messages in thread
From: Mike Leach @ 2024-07-18 15:57 UTC (permalink / raw)
  To: Mao Jinlong
  Cc: Suzuki K Poulose, James Clark, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Alexander Shishkin, coresight, linux-arm-kernel,
	devicetree, linux-kernel, linux-arm-msm, Tingwei Zhang,
	Yuanfang Zhang, Tao Zhang, songchai

Hi,

On Wed, 26 Jun 2024 at 07:07, Mao Jinlong <quic_jinlmao@quicinc.com> wrote:
>
> Dynamic trace id was introduced in coresight subsystem, so trace id is
> allocated dynamically. However, some hardware ATB source has static trace
> id and it cannot be changed via software programming. For such source,
> it can call coresight_get_source_traceid to get the fixed trace id from
> device node and pass id to coresight_trace_id_get_system_id to reserve
> the id.
>
> Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
> ---
>  .../hwtracing/coresight/coresight-platform.c  | 25 +++++++++++++
>  drivers/hwtracing/coresight/coresight-stm.c   |  2 +-
>  drivers/hwtracing/coresight/coresight-tpda.c  |  2 +-
>  .../hwtracing/coresight/coresight-trace-id.c  | 35 ++++++++++++-------
>  .../hwtracing/coresight/coresight-trace-id.h  | 11 +++++-
>  include/linux/coresight.h                     |  1 +
>  6 files changed, 61 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-platform.c b/drivers/hwtracing/coresight/coresight-platform.c
> index 9d550f5697fa..df169f3f367e 100644
> --- a/drivers/hwtracing/coresight/coresight-platform.c
> +++ b/drivers/hwtracing/coresight/coresight-platform.c
> @@ -183,6 +183,17 @@ static int of_coresight_get_cpu(struct device *dev)
>         return cpu;
>  }
>
> +/*
> + * of_coresight_get_trace_id: Get the atid of a source device.
> + *
> + * Returns 0 on success.
> + */
> +static int of_coresight_get_trace_id(struct device *dev, u32 *id)

name this "of_coresight_get_static_trace_id"

> +{
> +
> +       return of_property_read_u32(dev->of_node, "arm,trace-id", id);

should be "arm,static-trace-id" for consistency.

> +}
> +
>  /*
>   * of_coresight_parse_endpoint : Parse the given output endpoint @ep
>   * and fill the connection information in @pdata->out_conns
> @@ -315,6 +326,11 @@ static inline int of_coresight_get_cpu(struct device *dev)
>  {
>         return -ENODEV;
>  }
> +
> +static inline int of_coresight_get_trace_id(struct device *dev, u32 *id)
> +{
> +       return -ENODEV;
> +}
>  #endif
>
>  #ifdef CONFIG_ACPI
> @@ -794,6 +810,15 @@ int coresight_get_cpu(struct device *dev)
>  }
>  EXPORT_SYMBOL_GPL(coresight_get_cpu);
>
> +int coresight_get_source_traceid(struct device *dev, u32 *id)

This should be coresight_get_static_traceid.

> +{
> +       if (!is_of_node(dev->fwnode))
> +               return -EINVAL;
> +
> +       return of_coresight_get_trace_id(dev, id);
> +}
> +EXPORT_SYMBOL_GPL(coresight_get_source_traceid);
> +
>  struct coresight_platform_data *
>  coresight_get_platform_data(struct device *dev)
>  {
> diff --git a/drivers/hwtracing/coresight/coresight-stm.c b/drivers/hwtracing/coresight/coresight-stm.c
> index e1c62820dfda..34fab2ce9a76 100644
> --- a/drivers/hwtracing/coresight/coresight-stm.c
> +++ b/drivers/hwtracing/coresight/coresight-stm.c
> @@ -901,7 +901,7 @@ static int __stm_probe(struct device *dev, struct resource *res)
>                 goto stm_unregister;
>         }
>
> -       trace_id = coresight_trace_id_get_system_id();
> +       trace_id = coresight_trace_id_get_system_id(TRACE_ID_ANY);

implement a coresight_trace_id_get_static_system_id() function and
drop this change

>         if (trace_id < 0) {
>                 ret = trace_id;
>                 goto cs_unregister;
> diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c
> index 7739bc7adc44..46161cadb9e5 100644
> --- a/drivers/hwtracing/coresight/coresight-tpda.c
> +++ b/drivers/hwtracing/coresight/coresight-tpda.c
> @@ -251,7 +251,7 @@ static int tpda_init_default_data(struct tpda_drvdata *drvdata)
>          * same trace-id. When TPDA does packetization, different
>          * port will have unique channel number for decoding.
>          */
> -       atid = coresight_trace_id_get_system_id();
> +       atid = coresight_trace_id_get_system_id(TRACE_ID_ANY);

and here

>         if (atid < 0)
>                 return atid;
>
> diff --git a/drivers/hwtracing/coresight/coresight-trace-id.c b/drivers/hwtracing/coresight/coresight-trace-id.c
> index af5b4ef59cea..59194f60362c 100644
> --- a/drivers/hwtracing/coresight/coresight-trace-id.c
> +++ b/drivers/hwtracing/coresight/coresight-trace-id.c
> @@ -75,21 +75,26 @@ static int coresight_trace_id_find_odd_id(struct coresight_trace_id_map *id_map)
>   * Allocate new ID and set in use
>   *
>   * if @preferred_id is a valid id then try to use that value if available.
> - * if @preferred_id is not valid and @prefer_odd_id is true, try for odd id.
> + * if TRACE_ID_WANT_PREFERRED is set, @preferred_id must be free, otherwise return
> + * error -EINVAL.
> + * if @preferred_id is not valid and TRACE_ID_WANT_ODD is true, try for odd id.
>   *
>   * Otherwise allocate next available ID.
>   */
>  static int coresight_trace_id_alloc_new_id(struct coresight_trace_id_map *id_map,
> -                                          int preferred_id, bool prefer_odd_id)
> +                          int preferred_id, unsigned int flags)
>  {
>         int id = 0;
>
>         /* for backwards compatibility, cpu IDs may use preferred value */
> -       if (IS_VALID_CS_TRACE_ID(preferred_id) &&
> -           !test_bit(preferred_id, id_map->used_ids)) {
> -               id = preferred_id;
> -               goto trace_id_allocated;
> -       } else if (prefer_odd_id) {
> +       if (IS_VALID_CS_TRACE_ID(preferred_id)) {
> +               if (!test_bit(preferred_id, id_map->used_ids)) {
> +                       id = preferred_id;
> +                       goto trace_id_allocated;
> +               } else if (WARN((flags & TRACE_ID_WANT_PREFERRED), "Trace ID %d is used.\n",
> +                                       preferred_id))
> +                       return -EINVAL;
> +       } else if (flags & TRACE_ID_WANT_ODD) {
>         /* may use odd ids to avoid preferred legacy cpu IDs */
>                 id = coresight_trace_id_find_odd_id(id_map);
>                 if (id)
> @@ -175,7 +180,7 @@ static int coresight_trace_id_map_get_cpu_id(int cpu, struct coresight_trace_id_
>          */
>         id = coresight_trace_id_alloc_new_id(id_map,
>                                              CORESIGHT_LEGACY_CPU_TRACE_ID(cpu),
> -                                            false);
> +                                            TRACE_ID_ANY);
>         if (!IS_VALID_CS_TRACE_ID(id))
>                 goto get_cpu_id_out_unlock;
>
> @@ -222,14 +227,20 @@ static void coresight_trace_id_map_put_cpu_id(int cpu, struct coresight_trace_id
>         DUMP_ID_MAP(id_map);
>  }
>
> -static int coresight_trace_id_map_get_system_id(struct coresight_trace_id_map *id_map)
> +static int coresight_trace_id_map_get_system_id(struct coresight_trace_id_map *id_map,
> +                               int preferred_id)

Add a trace_id flags parameter here and call in with flags already set

>  {
>         unsigned long flags;
>         int id;
> +       unsigned int traceid_flags = 0;
>
>         spin_lock_irqsave(&id_map_lock, flags);
> +
>         /* prefer odd IDs for system components to avoid legacy CPU IDS */
> -       id = coresight_trace_id_alloc_new_id(id_map, 0, true);
> +       traceid_flags = TRACE_ID_WANT_ODD;
> +       traceid_flags |= preferred_id > 0 ? TRACE_ID_WANT_PREFERRED : 0;
> +

move the flags calculations to the calling functions

> +       id = coresight_trace_id_alloc_new_id(id_map, preferred_id, traceid_flags);
>         spin_unlock_irqrestore(&id_map_lock, flags);
>
>         DUMP_ID(id);
> @@ -269,9 +280,9 @@ int coresight_trace_id_read_cpu_id(int cpu)
>  }
>  EXPORT_SYMBOL_GPL(coresight_trace_id_read_cpu_id);
>
> -int coresight_trace_id_get_system_id(void)
> +int coresight_trace_id_get_system_id(int id)
>  {
> -       return coresight_trace_id_map_get_system_id(&id_map_default);

drop the change to this function header and the call becomes
trace_id_map_get_system_id(&id_map_default, 0, TRACE_ID_PREFER_ODD)

> +       return coresight_trace_id_map_get_system_id(&id_map_default, id);
>  }
>  EXPORT_SYMBOL_GPL(coresight_trace_id_get_system_id);
>

Add in a  coresight_trace_id_get_system_static_id(int trace_id) API
function and call
trace_id_map_get_system_id(&id_map_default, trace_id, TRACE_ID_REQ_STATIC)

> diff --git a/drivers/hwtracing/coresight/coresight-trace-id.h b/drivers/hwtracing/coresight/coresight-trace-id.h
> index 3797777d367e..a236cf87c169 100644
> --- a/drivers/hwtracing/coresight/coresight-trace-id.h
> +++ b/drivers/hwtracing/coresight/coresight-trace-id.h
> @@ -61,6 +61,12 @@ struct coresight_trace_id_map {
>         DECLARE_BITMAP(pend_rel_ids, CORESIGHT_TRACE_IDS_MAX);
>  };
>
> +enum trace_id_flags {
> +       TRACE_ID_ANY = 0x0,
> +       TRACE_ID_WANT_ODD = 0x1,
TRACE_ID_PREFER_ODD

> +       TRACE_ID_WANT_PREFERRED = 0x2,

TRACE_ID_REQ_STATIC

> +};

These flags can move to the coresight-trace-id.c file.

>  /* Allocate and release IDs for a single default trace ID map */
>
>  /**
> @@ -118,9 +124,12 @@ int coresight_trace_id_read_cpu_id(int cpu);
>   *
>   * Used to allocate IDs for system trace sources such as STM.
>   *
> + * @id: Preferred id value. If id is TRACE_ID_ANY, get a free id from id map.
> + * If id is greater than TRACE_ID_ANY, get a preferred id.
> + *
>   * return: Trace ID or -EINVAL if allocation is impossible.
>   */
> -int coresight_trace_id_get_system_id(void);
> +int coresight_trace_id_get_system_id(int id);
>
>  /**
>   * Release an allocated system trace ID.
> diff --git a/include/linux/coresight.h b/include/linux/coresight.h
> index f09ace92176e..0599303be326 100644
> --- a/include/linux/coresight.h
> +++ b/include/linux/coresight.h
> @@ -643,6 +643,7 @@ void coresight_relaxed_write64(struct coresight_device *csdev,
>  void coresight_write64(struct coresight_device *csdev, u64 val, u32 offset);
>
>  extern int coresight_get_cpu(struct device *dev);
> +extern int coresight_get_source_traceid(struct device *dev, u32 *id);
>
>  struct coresight_platform_data *coresight_get_platform_data(struct device *dev);
>  struct coresight_connection *
> --
> 2.41.0
>

Regards

Mike

-- 
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 0/3] coresight: Add preferred trace id support
  2024-06-26  6:07 [PATCH v3 0/3] coresight: Add preferred trace id support Mao Jinlong
                   ` (2 preceding siblings ...)
  2024-06-26  6:07 ` [PATCH v3 3/3] coresight: dummy: Add reserve atid support for dummy source Mao Jinlong
@ 2024-07-18 15:57 ` Mike Leach
  2024-07-22 10:34   ` Jinlong Mao
  3 siblings, 1 reply; 9+ messages in thread
From: Mike Leach @ 2024-07-18 15:57 UTC (permalink / raw)
  To: Mao Jinlong
  Cc: Suzuki K Poulose, James Clark, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Alexander Shishkin, coresight, linux-arm-kernel,
	devicetree, linux-kernel, linux-arm-msm, Tingwei Zhang,
	Yuanfang Zhang, Tao Zhang, songchai

Hi,

I have detailed comments in the following patches but in summary we should:
1) consistently use the term "static trace id" for these devices where
the hardware sets a non-programmable trace ID
2) Simplify the patch set by introducing a new API function
int coresight_trace_id_get_system_static_id(int trace_id)
This would avoid having to change drivers which use the existing
function where no static ID is required.

Regards

Mike


On Wed, 26 Jun 2024 at 07:07, Mao Jinlong <quic_jinlmao@quicinc.com> wrote:
>
> Some HW has static trace id which cannot be changed via
> software programming. For this case, configure the trace id
> in device tree with "arm,trace-id = <xxx>", and
> call coresight_trace_id_get_system_id with the trace id value
> in device probe function. The id will be reserved for the HW
> all the time if the device is probed.
>
> Changes since V2:
> 1. Change "trace-id" to "arm,trace-id".
> 2. Add trace id flag for getting preferred id or ODD id.
>
> Changes since V1:
> 1. Add argument to coresight_trace_id_get_system_id for preferred id
> instead of adding new function coresight_trace_id_reserve_system_id.
> 2. Add constraint to trace-id in dt-binding file.
>
> Mao Jinlong (3):
>   dt-bindings: arm: Add arm,trace-id for coresight dummy source
>   coresight: Add support to get preferred id for system trace sources
>   coresight: dummy: Add reserve atid support for dummy source
>
>  .../sysfs-bus-coresight-devices-dummy-source  | 15 +++++
>  .../arm/arm,coresight-dummy-source.yaml       |  6 ++
>  drivers/hwtracing/coresight/coresight-dummy.c | 59 +++++++++++++++++--
>  .../hwtracing/coresight/coresight-platform.c  | 25 ++++++++
>  drivers/hwtracing/coresight/coresight-stm.c   |  2 +-
>  drivers/hwtracing/coresight/coresight-tpda.c  |  2 +-
>  .../hwtracing/coresight/coresight-trace-id.c  | 35 +++++++----
>  .../hwtracing/coresight/coresight-trace-id.h  | 11 +++-
>  include/linux/coresight.h                     |  1 +
>  9 files changed, 137 insertions(+), 19 deletions(-)
>  create mode 100644 Documentation/ABI/testing/sysfs-bus-coresight-devices-dummy-source
>
> --
> 2.41.0
>


--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 1/3] dt-bindings: arm: Add arm,trace-id for coresight dummy source
  2024-06-26  6:07 ` [PATCH v3 1/3] dt-bindings: arm: Add arm,trace-id for coresight dummy source Mao Jinlong
  2024-06-28 21:47   ` Rob Herring (Arm)
@ 2024-07-18 15:57   ` Mike Leach
  1 sibling, 0 replies; 9+ messages in thread
From: Mike Leach @ 2024-07-18 15:57 UTC (permalink / raw)
  To: Mao Jinlong
  Cc: Suzuki K Poulose, James Clark, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Alexander Shishkin, coresight, linux-arm-kernel,
	devicetree, linux-kernel, linux-arm-msm, Tingwei Zhang,
	Yuanfang Zhang, Tao Zhang, songchai

Hi,

On Wed, 26 Jun 2024 at 07:07, Mao Jinlong <quic_jinlmao@quicinc.com> wrote:
>
> Some dummy source HW has static trace id which cannot be changed via
> software programming. Add arm,trace-id for static id support to
> coresight dummy source.
>
> Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
> ---
>  .../devicetree/bindings/arm/arm,coresight-dummy-source.yaml | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/arm/arm,coresight-dummy-source.yaml b/Documentation/devicetree/bindings/arm/arm,coresight-dummy-source.yaml
> index 6745b4cc8f1c..b18cfd8e137e 100644
> --- a/Documentation/devicetree/bindings/arm/arm,coresight-dummy-source.yaml
> +++ b/Documentation/devicetree/bindings/arm/arm,coresight-dummy-source.yaml
> @@ -38,6 +38,12 @@ properties:
>      enum:
>        - arm,coresight-dummy-source
>
> +  arm,trace-id:

Could we name this:-

  arm,static-trace-id

This is then consistent with the terminology used in the comments.

Thanks

Mike


> +    description: If dummy source needs static id support, use this to set trace id.
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 1
> +    maximum: 111
> +
>    out-ports:
>      $ref: /schemas/graph.yaml#/properties/ports
>
> --
> 2.41.0
>


--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 0/3] coresight: Add preferred trace id support
  2024-07-18 15:57 ` [PATCH v3 0/3] coresight: Add preferred trace id support Mike Leach
@ 2024-07-22 10:34   ` Jinlong Mao
  0 siblings, 0 replies; 9+ messages in thread
From: Jinlong Mao @ 2024-07-22 10:34 UTC (permalink / raw)
  To: Mike Leach
  Cc: Suzuki K Poulose, James Clark, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Alexander Shishkin, coresight, linux-arm-kernel,
	devicetree, linux-kernel, linux-arm-msm, Tingwei Zhang,
	Yuanfang Zhang, Tao Zhang, songchai



On 2024/7/18 23:57, Mike Leach wrote:
> Hi,
> 
> I have detailed comments in the following patches but in summary we should:
> 1) consistently use the term "static trace id" for these devices where
> the hardware sets a non-programmable trace ID
> 2) Simplify the patch set by introducing a new API function
> int coresight_trace_id_get_system_static_id(int trace_id)
> This would avoid having to change drivers which use the existing
> function where no static ID is required.
> 

Thanks for the comments, Mike.
I will address your comments in next version.

Thanks
Jinlong Mao

> Regards
> 
> Mike
> 
> 
> On Wed, 26 Jun 2024 at 07:07, Mao Jinlong <quic_jinlmao@quicinc.com> wrote:
>>
>> Some HW has static trace id which cannot be changed via
>> software programming. For this case, configure the trace id
>> in device tree with "arm,trace-id = <xxx>", and
>> call coresight_trace_id_get_system_id with the trace id value
>> in device probe function. The id will be reserved for the HW
>> all the time if the device is probed.
>>
>> Changes since V2:
>> 1. Change "trace-id" to "arm,trace-id".
>> 2. Add trace id flag for getting preferred id or ODD id.
>>
>> Changes since V1:
>> 1. Add argument to coresight_trace_id_get_system_id for preferred id
>> instead of adding new function coresight_trace_id_reserve_system_id.
>> 2. Add constraint to trace-id in dt-binding file.
>>
>> Mao Jinlong (3):
>>    dt-bindings: arm: Add arm,trace-id for coresight dummy source
>>    coresight: Add support to get preferred id for system trace sources
>>    coresight: dummy: Add reserve atid support for dummy source
>>
>>   .../sysfs-bus-coresight-devices-dummy-source  | 15 +++++
>>   .../arm/arm,coresight-dummy-source.yaml       |  6 ++
>>   drivers/hwtracing/coresight/coresight-dummy.c | 59 +++++++++++++++++--
>>   .../hwtracing/coresight/coresight-platform.c  | 25 ++++++++
>>   drivers/hwtracing/coresight/coresight-stm.c   |  2 +-
>>   drivers/hwtracing/coresight/coresight-tpda.c  |  2 +-
>>   .../hwtracing/coresight/coresight-trace-id.c  | 35 +++++++----
>>   .../hwtracing/coresight/coresight-trace-id.h  | 11 +++-
>>   include/linux/coresight.h                     |  1 +
>>   9 files changed, 137 insertions(+), 19 deletions(-)
>>   create mode 100644 Documentation/ABI/testing/sysfs-bus-coresight-devices-dummy-source
>>
>> --
>> 2.41.0
>>
> 
> 
> --
> Mike Leach
> Principal Engineer, ARM Ltd.
> Manchester Design Centre. UK

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-07-22 10:35 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-26  6:07 [PATCH v3 0/3] coresight: Add preferred trace id support Mao Jinlong
2024-06-26  6:07 ` [PATCH v3 1/3] dt-bindings: arm: Add arm,trace-id for coresight dummy source Mao Jinlong
2024-06-28 21:47   ` Rob Herring (Arm)
2024-07-18 15:57   ` Mike Leach
2024-06-26  6:07 ` [PATCH v3 2/3] coresight: Add support to get preferred id for system trace sources Mao Jinlong
2024-07-18 15:57   ` Mike Leach
2024-06-26  6:07 ` [PATCH v3 3/3] coresight: dummy: Add reserve atid support for dummy source Mao Jinlong
2024-07-18 15:57 ` [PATCH v3 0/3] coresight: Add preferred trace id support Mike Leach
2024-07-22 10:34   ` Jinlong Mao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).