Re: [PATCH v9 7/7] qcom-tgu: Add reset node to initialize

From: Songwei Chai

Date: Tue Jan 06 2026 - 02:22:52 EST




On 12/25/2025 1:56 PM, Jie Gan wrote:


On 12/19/2025 2:59 PM, Songwei Chai wrote:
Add reset node to initialize the value of
priority/condition_decode/condition_select/timer/counter nodes.

Signed-off-by: Songwei Chai <songwei.chai@xxxxxxxxxxxxxxxx>
---
  .../ABI/testing/sysfs-bus-amba-devices-tgu    |  7 ++
  drivers/hwtracing/qcom/tgu.c                  | 74 +++++++++++++++++++
  2 files changed, 81 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu b/ Documentation/ABI/testing/sysfs-bus-amba-devices-tgu
index 010eade0a1c5..0733b3e07b45 100644
--- a/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu
+++ b/Documentation/ABI/testing/sysfs-bus-amba-devices-tgu
@@ -42,3 +42,10 @@ KernelVersion    6.19
  Contact:    Jinlong Mao <jinlong.mao@xxxxxxxxxxxxxxxx>, Songwei Chai <songwei.chai@xxxxxxxxxxxxxxxx>
  Description:
          (RW) Set/Get the counter value with specific step for TGU.
+
+What:        /sys/bus/amba/devices/<tgu-name>/reset_tgu
+Date:        December 2025
+KernelVersion    6.19
+Contact:    Jinlong Mao <jinlong.mao@xxxxxxxxxxxxxxxx>, Songwei Chai <songwei.chai@xxxxxxxxxxxxxxxx>
+Description:
+        (Write) Write 1 to reset the dataset for TGU.
diff --git a/drivers/hwtracing/qcom/tgu.c b/drivers/hwtracing/qcom/tgu.c
index d4210869556e..5a8c6af9b719 100644
--- a/drivers/hwtracing/qcom/tgu.c
+++ b/drivers/hwtracing/qcom/tgu.c
@@ -425,8 +425,82 @@ static ssize_t enable_tgu_store(struct device *dev,
  }
  static DEVICE_ATTR_RW(enable_tgu);
+/* reset_tgu_store - Reset Trace and Gating Unit (TGU) configuration. */
+static ssize_t reset_tgu_store(struct device *dev,
+                   struct device_attribute *attr, const char *buf,
+                   size_t size)
+{
+    unsigned long value;
+    struct tgu_drvdata *drvdata = dev_get_drvdata(dev);
+    int i, j, ret;
+
+    if (kstrtoul(buf, 0, &value) || value == 0)
+        return -EINVAL;
+
+    if (!drvdata->enable) {
+        ret = pm_runtime_get_sync(drvdata->dev);
+        if (ret < 0) {
+            pm_runtime_put(drvdata->dev);
+            return ret;
+        }
+    }
+
+    guard(spinlock)(&drvdata->lock);
+    TGU_UNLOCK(drvdata->base);
+
+    writel(0, drvdata->base + TGU_CONTROL);

Better move TGU_LOCK(drvdata->base) here
Yeah.>
Thanks,
Jie

+
+    if (drvdata->value_table->priority)
+        memset(drvdata->value_table->priority, 0,
+                MAX_PRIORITY * drvdata->max_step *
+                drvdata->max_reg * sizeof(unsigned int));
+
+    if (drvdata->value_table->condition_decode)
+        memset(drvdata->value_table->condition_decode, 0,
+                drvdata->max_condition_decode * drvdata->max_step *
+                sizeof(unsigned int));
+
+        /* Initialize all condition registers to NOT(value=0x1000000) */
+    for (i = 0; i < drvdata->max_step; i++) {
+        for (j = 0; j < drvdata->max_condition_decode; j++) {
+            drvdata->value_table
+            ->condition_decode[calculate_array_location(
+            drvdata, i, TGU_CONDITION_DECODE, j)] =
+            0x1000000;
+        }
+    }
+
+    if (drvdata->value_table->condition_select)
+        memset(drvdata->value_table->condition_select, 0,
+                drvdata->max_condition_select * drvdata->max_step *
+                sizeof(unsigned int));
+
+    if (drvdata->value_table->timer)
+        memset(drvdata->value_table->timer, 0,
+                (drvdata->max_step) *
+                (drvdata->max_timer) *
+                sizeof(unsigned int));
+
+    if (drvdata->value_table->counter)
+        memset(drvdata->value_table->counter, 0,
+                (drvdata->max_step) *
+                (drvdata->max_counter) *
+                sizeof(unsigned int));
+
+    dev_dbg(dev, "Coresight-TGU reset complete\n");
+
+    TGU_LOCK(drvdata->base);
+
+    drvdata->enable = false;
+    pm_runtime_put(drvdata->dev);
+
+    return size;
+}
+static DEVICE_ATTR_WO(reset_tgu);
+
  static struct attribute *tgu_common_attrs[] = {
      &dev_attr_enable_tgu.attr,
+    &dev_attr_reset_tgu.attr,
      NULL,
  };