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" ? 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)