On 23/12/2025 02:16, Jie Gan wrote:
On 12/22/2025 9:12 PM, Suzuki K Poulose wrote:
On 22/12/2025 06:02, Jie Gan wrote:
From: Tao Zhang tao.zhang@oss.qualcomm.com
Setting bit i in the TPDA_FLUSH_CR register initiates a flush request for port i, forcing the data to synchronize and be transmitted to the sink device.
Signed-off-by: Tao Zhang tao.zhang@oss.qualcomm.com Reviewed-by: James Clark james.clark@linaro.org Co-developed-by: Jie Gan jie.gan@oss.qualcomm.com Signed-off-by: Jie Gan jie.gan@oss.qualcomm.com
.../ABI/testing/sysfs-bus-coresight-devices-tpda | 7 ++++ drivers/hwtracing/coresight/coresight-tpda.c | 40 +++++++++++
- ++++++++++
drivers/hwtracing/coresight/coresight-tpda.h | 1 + 3 files changed, 48 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices- tpda b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda index d359d90dca72..df8f03d4b573 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda @@ -51,3 +51,10 @@ Description: mode 0 - COUNT[11:0] value represents the approximate number of bytes moved between two ASYNC packet requests mode 1 - the bits COUNT[11:7] are used as a power of 2. for example, we could insert an async packet every 8K data by writing a value 13 to the COUNT[11:7] field.
+What: /sys/bus/coresight/devices/<tpda-name>/port_flush_req +Date: December 2025 +KernelVersion: 6.19 +Contact: Jinlong Mao jinlong.mao@oss.qualcomm.com, Tao Zhang tao.zhang@oss.qualcomm.com, Jie Gan jie.gan@oss.qualcomm.com +Description: + (RW) Configure the bit i to requests a flush operation of port i on the TPDA.
Does this have similar semantics as the "global_flush_req" for "Read" ?
Yes, global_flush_req triggers all ports at once, whereas this node initiates a flush request for specific port(s).
For reading, we can check whether the flush request has completed.
Please document it as such.
Suzuki
Thanks, Jie
i.e., the bit stays set until the request completes ? Otherwise, why isn't this Write only ?
I don't see the point of "Reading" this value back.
Suzuki
diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/ hwtracing/coresight/coresight-tpda.c index 7baa8a0965d3..f79fea4fbb2c 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.c +++ b/drivers/hwtracing/coresight/coresight-tpda.c @@ -430,9 +430,49 @@ static ssize_t syncr_mode_store(struct device *dev, } static DEVICE_ATTR_RW(syncr_mode); +static ssize_t port_flush_req_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val;
+ if (!drvdata->csdev->refcnt) + return -EINVAL;
+ guard(spinlock)(&drvdata->spinlock); + val = readl_relaxed(drvdata->base + TPDA_FLUSH_CR);
+ return sysfs_emit(buf, "0x%lx\n", val); +}
+static ssize_t port_flush_req_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + u32 val;
+ if (kstrtou32(buf, 0, &val)) + return -EINVAL;
+ if (!drvdata->csdev->refcnt || !val) + return -EINVAL;
+ guard(spinlock)(&drvdata->spinlock); + CS_UNLOCK(drvdata->base); + writel_relaxed(val, drvdata->base + TPDA_FLUSH_CR); + CS_LOCK(drvdata->base);
+ return size; +} +static DEVICE_ATTR_RW(port_flush_req);
static struct attribute *tpda_attrs[] = { &dev_attr_global_flush_req.attr, &dev_attr_syncr_mode.attr, + &dev_attr_port_flush_req.attr, tpda_trig_sysfs_rw(freq_ts_enable, FREQTS), tpda_trig_sysfs_rw(trig_freq_enable, FRIE), tpda_trig_sysfs_rw(trig_flag_ts_enable, FLRIE), diff --git a/drivers/hwtracing/coresight/coresight-tpda.h b/drivers/ hwtracing/coresight/coresight-tpda.h index 1d2de50bb9f9..ef1ce2ce36a9 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.h +++ b/drivers/hwtracing/coresight/coresight-tpda.h @@ -10,6 +10,7 @@ #define TPDA_Pn_CR(n) (0x004 + (n * 4)) #define TPDA_FPID_CR (0x084) #define TPDA_SYNCR (0x08C) +#define TPDA_FLUSH_CR (0x090) /* Cross trigger global (all ports) flush request bit */ #define TPDA_CR_FLREQ BIT(0)