* [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers
@ 2025-10-28 2:02 Jie Gan
2025-10-28 2:02 ` [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration Jie Gan
` (5 more replies)
0 siblings, 6 replies; 13+ messages in thread
From: Jie Gan @ 2025-10-28 2:02 UTC (permalink / raw)
To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin,
Tingwei Zhang
Cc: coresight, linux-arm-kernel, linux-kernel, Jie Gan, Tao Zhang
Patchset 1 introduces configuration of the cross-trigger registers with
appropriate values to enable proper generation of cross-trigger packets.
Patchset 2 introduces a logic to configure the TPDA_SYNCR register,
which determines the frequency of ASYNC packet generation. These packets
assist userspace tools in accurately identifying each valid packet.
Patchset 3 introduces a sysfs node to initiate a flush request for the
specific port, forcing the data to synchronize and be transmitted to the
sink device.
Changes in V4:
1. Document sysfs nodes with correct kernel version and date.
Link to V3 - https://lore.kernel.org/linux-arm-kernel/20250827105545.7140-1-jie.gan@oss.qualcomm.com/
Changes in V3:
1. Optimizing codes according to James's comment.
Link to V2 - https://lore.kernel.org/all/20250827042042.6786-1-jie.gan@oss.qualcomm.com/
Changes in V2:
1. Refactoring the code based on James's comment for optimization.
Link to V1 - https://lore.kernel.org/all/20250826070150.5603-1-jie.gan@oss.qualcomm.com/
Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
---
Tao Zhang (3):
coresight: tpda: add sysfs nodes for tpda cross-trigger configuration
coresight: tpda: add logic to configure TPDA_SYNCR register
coresight: tpda: add sysfs node to flush specific port
.../ABI/testing/sysfs-bus-coresight-devices-tpda | 50 ++++
drivers/hwtracing/coresight/coresight-tpda.c | 278 +++++++++++++++++++++
drivers/hwtracing/coresight/coresight-tpda.h | 33 ++-
3 files changed, 360 insertions(+), 1 deletion(-)
---
base-commit: 8fec172c82c2b5f6f8e47ab837c1dc91ee3d1b87
change-id: 20251028-configure_tpda_reg-f3396f97f9a1
Best regards,
--
Jie Gan <jie.gan@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration 2025-10-28 2:02 [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan @ 2025-10-28 2:02 ` Jie Gan 2025-12-18 6:22 ` Jie Gan 2025-12-18 11:10 ` Suzuki K Poulose 2025-10-28 2:02 ` [PATCH v4 2/3] coresight: tpda: add logic to configure TPDA_SYNCR register Jie Gan ` (4 subsequent siblings) 5 siblings, 2 replies; 13+ messages in thread From: Jie Gan @ 2025-10-28 2:02 UTC (permalink / raw) To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Jie Gan, Tao Zhang From: Tao Zhang <tao.zhang@oss.qualcomm.com> Introduce sysfs nodes to configure cross-trigger parameters for TPDA. These registers define the characteristics of cross-trigger packets, including generation frequency and flag values. 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 | 43 ++++ drivers/hwtracing/coresight/coresight-tpda.c | 230 +++++++++++++++++++++ drivers/hwtracing/coresight/coresight-tpda.h | 27 ++- 3 files changed, 299 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda new file mode 100644 index 000000000000..80e4b05a1ab4 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda @@ -0,0 +1,43 @@ +What: /sys/bus/coresight/devices/<tpda-name>/trig_async_enable +Date: October 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) Enable/disable cross trigger synchronization sequence interface. + +What: /sys/bus/coresight/devices/<tpda-name>/trig_flag_ts_enable +Date: October 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) Enable/disable cross trigger FLAG packet request interface. + +What: /sys/bus/coresight/devices/<tpda-name>/trig_freq_enable +Date: October 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) Enable/disable cross trigger FREQ packet request interface. + +What: /sys/bus/coresight/devices/<tpda-name>/freq_ts_enable +Date: October 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) Enable/disable the timestamp for all FREQ packets. + +What: /sys/bus/coresight/devices/<tpda-name>/global_flush_req +Date: October 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) Set global (all ports) flush request bit. The bit remains set until a + global flush request sequence completes. + +What: /sys/bus/coresight/devices/<tpda-name>/cmbchan_mode +Date: October 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 CMB/MCMB channel mode for all enabled ports. + Value 0 means raw channel mapping mode. Value 1 means channel pair marking mode. diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c index 333b3cb23685..a9a27bcc65a1 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.c +++ b/drivers/hwtracing/coresight/coresight-tpda.c @@ -147,9 +147,37 @@ static void tpda_enable_pre_port(struct tpda_drvdata *drvdata) u32 val; val = readl_relaxed(drvdata->base + TPDA_CR); + val &= ~TPDA_CR_MID; val &= ~TPDA_CR_ATID; val |= FIELD_PREP(TPDA_CR_ATID, drvdata->atid); + if (drvdata->trig_async) + val |= TPDA_CR_SRIE; + else + val &= ~TPDA_CR_SRIE; + if (drvdata->trig_flag_ts) + val |= TPDA_CR_FLRIE; + else + val &= ~TPDA_CR_FLRIE; + if (drvdata->trig_freq) + val |= TPDA_CR_FRIE; + else + val &= ~TPDA_CR_FRIE; + if (drvdata->freq_ts) + val |= TPDA_CR_FREQTS; + else + val &= ~TPDA_CR_FREQTS; + if (drvdata->cmbchan_mode) + val |= TPDA_CR_CMBCHANMODE; + else + val &= ~TPDA_CR_CMBCHANMODE; writel_relaxed(val, drvdata->base + TPDA_CR); + + /* + * If FLRIE bit is set, set the master and channel + * id as zero + */ + if (drvdata->trig_flag_ts) + writel_relaxed(0x0, drvdata->base + TPDA_FPID_CR); } static int tpda_enable_port(struct tpda_drvdata *drvdata, int port) @@ -265,6 +293,206 @@ static const struct coresight_ops tpda_cs_ops = { .link_ops = &tpda_link_ops, }; +static ssize_t trig_async_enable_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_async); +} + +static ssize_t trig_async_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if (kstrtoul(buf, 0, &val)) + return -EINVAL; + + guard(spinlock)(&drvdata->spinlock); + drvdata->trig_async = !!val; + + return size; +} +static DEVICE_ATTR_RW(trig_async_enable); + +static ssize_t trig_flag_ts_enable_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_flag_ts); +} + +static ssize_t trig_flag_ts_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if (kstrtoul(buf, 0, &val)) + return -EINVAL; + + guard(spinlock)(&drvdata->spinlock); + drvdata->trig_flag_ts = !!val; + + return size; +} +static DEVICE_ATTR_RW(trig_flag_ts_enable); + +static ssize_t trig_freq_enable_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_freq); +} + +static ssize_t trig_freq_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if (kstrtoul(buf, 0, &val)) + return -EINVAL; + + guard(spinlock)(&drvdata->spinlock); + drvdata->trig_freq = !!val; + + return size; +} +static DEVICE_ATTR_RW(trig_freq_enable); + +static ssize_t freq_ts_enable_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->freq_ts); +} + +static ssize_t freq_ts_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if (kstrtoul(buf, 0, &val)) + return -EINVAL; + + guard(spinlock)(&drvdata->spinlock); + drvdata->freq_ts = !!val; + + return size; +} +static DEVICE_ATTR_RW(freq_ts_enable); + +static ssize_t global_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); + CS_UNLOCK(drvdata->base); + val = readl_relaxed(drvdata->base + TPDA_CR); + CS_LOCK(drvdata->base); + /* Only read value for bit 0 */ + val &= BIT(0); + + return sysfs_emit(buf, "%lu\n", val); +} + +static ssize_t global_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); + unsigned long val; + + if (kstrtoul(buf, 0, &val)) + return -EINVAL; + + if (!drvdata->csdev->refcnt || !val) + return -EINVAL; + + guard(spinlock)(&drvdata->spinlock); + CS_UNLOCK(drvdata->base); + val = readl_relaxed(drvdata->base + TPDA_CR); + /* Only set bit 0 */ + val |= BIT(0); + writel_relaxed(val, drvdata->base + TPDA_CR); + CS_LOCK(drvdata->base); + + return size; +} +static DEVICE_ATTR_RW(global_flush_req); + +static ssize_t cmbchan_mode_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->cmbchan_mode); +} + +static ssize_t cmbchan_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); + unsigned long val; + + if (kstrtoul(buf, 0, &val)) + return -EINVAL; + + guard(spinlock)(&drvdata->spinlock); + drvdata->cmbchan_mode = !!val; + + return size; +} +static DEVICE_ATTR_RW(cmbchan_mode); + +static struct attribute *tpda_attrs[] = { + &dev_attr_trig_async_enable.attr, + &dev_attr_trig_flag_ts_enable.attr, + &dev_attr_trig_freq_enable.attr, + &dev_attr_freq_ts_enable.attr, + &dev_attr_global_flush_req.attr, + &dev_attr_cmbchan_mode.attr, + NULL, +}; + +static struct attribute_group tpda_attr_grp = { + .attrs = tpda_attrs, +}; + +static const struct attribute_group *tpda_attr_grps[] = { + &tpda_attr_grp, + NULL, +}; + static int tpda_init_default_data(struct tpda_drvdata *drvdata) { int atid; @@ -280,6 +508,7 @@ static int tpda_init_default_data(struct tpda_drvdata *drvdata) return atid; drvdata->atid = atid; + drvdata->freq_ts = true; return 0; } @@ -323,6 +552,7 @@ static int tpda_probe(struct amba_device *adev, const struct amba_id *id) desc.ops = &tpda_cs_ops; desc.pdata = adev->dev.platform_data; desc.dev = &adev->dev; + desc.groups = tpda_attr_grps; desc.access = CSDEV_ACCESS_IOMEM(base); drvdata->csdev = coresight_register(&desc); if (IS_ERR(drvdata->csdev)) diff --git a/drivers/hwtracing/coresight/coresight-tpda.h b/drivers/hwtracing/coresight/coresight-tpda.h index c6af3d2da3ef..0be625fb52fd 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.h +++ b/drivers/hwtracing/coresight/coresight-tpda.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* - * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2023,2025 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _CORESIGHT_CORESIGHT_TPDA_H @@ -8,6 +8,19 @@ #define TPDA_CR (0x000) #define TPDA_Pn_CR(n) (0x004 + (n * 4)) +#define TPDA_FPID_CR (0x084) + +/* Cross trigger FREQ packets timestamp bit */ +#define TPDA_CR_FREQTS BIT(2) +/* Cross trigger FREQ packet request bit */ +#define TPDA_CR_FRIE BIT(3) +/* Cross trigger FLAG packet request interface bit */ +#define TPDA_CR_FLRIE BIT(4) +/* Cross trigger synchronization bit */ +#define TPDA_CR_SRIE BIT(5) +/* Packetize CMB/MCMB traffic bit */ +#define TPDA_CR_CMBCHANMODE BIT(20) + /* Aggregator port enable bit */ #define TPDA_Pn_CR_ENA BIT(0) /* Aggregator port CMB data set element size bit */ @@ -19,6 +32,8 @@ /* Bits 6 ~ 12 is for atid value */ #define TPDA_CR_ATID GENMASK(12, 6) +/* Bits 13 ~ 19 is for mid value */ +#define TPDA_CR_MID GENMASK(19, 13) /** * struct tpda_drvdata - specifics associated to an TPDA component @@ -29,6 +44,11 @@ * @enable: enable status of the component. * @dsb_esize Record the DSB element size. * @cmb_esize Record the CMB element size. + * @trig_async: Enable/disable cross trigger synchronization sequence interface. + * @trig_flag_ts: Enable/disable cross trigger FLAG packet request interface. + * @trig_freq: Enable/disable cross trigger FREQ packet request interface. + * @freq_ts: Enable/disable the timestamp for all FREQ packets. + * @cmbchan_mode: Configure the CMB/MCMB channel mode. */ struct tpda_drvdata { void __iomem *base; @@ -38,6 +58,11 @@ struct tpda_drvdata { u8 atid; u32 dsb_esize; u32 cmb_esize; + bool trig_async; + bool trig_flag_ts; + bool trig_freq; + bool freq_ts; + bool cmbchan_mode; }; #endif /* _CORESIGHT_CORESIGHT_TPDA_H */ -- 2.34.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration 2025-10-28 2:02 ` [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration Jie Gan @ 2025-12-18 6:22 ` Jie Gan 2025-12-18 9:19 ` Suzuki K Poulose 2025-12-18 11:10 ` Suzuki K Poulose 1 sibling, 1 reply; 13+ messages in thread From: Jie Gan @ 2025-12-18 6:22 UTC (permalink / raw) To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Tao Zhang On 10/28/2025 10:02 AM, Jie Gan wrote: > From: Tao Zhang <tao.zhang@oss.qualcomm.com> > > Introduce sysfs nodes to configure cross-trigger parameters for TPDA. > These registers define the characteristics of cross-trigger packets, > including generation frequency and flag values. > > 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 | 43 ++++ > drivers/hwtracing/coresight/coresight-tpda.c | 230 +++++++++++++++++++++ > drivers/hwtracing/coresight/coresight-tpda.h | 27 ++- > 3 files changed, 299 insertions(+), 1 deletion(-) > > diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda > new file mode 100644 > index 000000000000..80e4b05a1ab4 > --- /dev/null > +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda Gentle reminder. Do I need update the date and the kernelVersion of the sysfs node?(target 7.0?) Thanks, Jie > @@ -0,0 +1,43 @@ > +What: /sys/bus/coresight/devices/<tpda-name>/trig_async_enable > +Date: October 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) Enable/disable cross trigger synchronization sequence interface. > + > +What: /sys/bus/coresight/devices/<tpda-name>/trig_flag_ts_enable > +Date: October 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) Enable/disable cross trigger FLAG packet request interface. > + > +What: /sys/bus/coresight/devices/<tpda-name>/trig_freq_enable > +Date: October 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) Enable/disable cross trigger FREQ packet request interface. > + > +What: /sys/bus/coresight/devices/<tpda-name>/freq_ts_enable > +Date: October 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) Enable/disable the timestamp for all FREQ packets. > + > +What: /sys/bus/coresight/devices/<tpda-name>/global_flush_req > +Date: October 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) Set global (all ports) flush request bit. The bit remains set until a > + global flush request sequence completes. > + > +What: /sys/bus/coresight/devices/<tpda-name>/cmbchan_mode > +Date: October 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 CMB/MCMB channel mode for all enabled ports. > + Value 0 means raw channel mapping mode. Value 1 means channel pair marking mode. > diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c > index 333b3cb23685..a9a27bcc65a1 100644 > --- a/drivers/hwtracing/coresight/coresight-tpda.c > +++ b/drivers/hwtracing/coresight/coresight-tpda.c > @@ -147,9 +147,37 @@ static void tpda_enable_pre_port(struct tpda_drvdata *drvdata) > u32 val; > > val = readl_relaxed(drvdata->base + TPDA_CR); > + val &= ~TPDA_CR_MID; > val &= ~TPDA_CR_ATID; > val |= FIELD_PREP(TPDA_CR_ATID, drvdata->atid); > + if (drvdata->trig_async) > + val |= TPDA_CR_SRIE; > + else > + val &= ~TPDA_CR_SRIE; > + if (drvdata->trig_flag_ts) > + val |= TPDA_CR_FLRIE; > + else > + val &= ~TPDA_CR_FLRIE; > + if (drvdata->trig_freq) > + val |= TPDA_CR_FRIE; > + else > + val &= ~TPDA_CR_FRIE; > + if (drvdata->freq_ts) > + val |= TPDA_CR_FREQTS; > + else > + val &= ~TPDA_CR_FREQTS; > + if (drvdata->cmbchan_mode) > + val |= TPDA_CR_CMBCHANMODE; > + else > + val &= ~TPDA_CR_CMBCHANMODE; > writel_relaxed(val, drvdata->base + TPDA_CR); > + > + /* > + * If FLRIE bit is set, set the master and channel > + * id as zero > + */ > + if (drvdata->trig_flag_ts) > + writel_relaxed(0x0, drvdata->base + TPDA_FPID_CR); > } > > static int tpda_enable_port(struct tpda_drvdata *drvdata, int port) > @@ -265,6 +293,206 @@ static const struct coresight_ops tpda_cs_ops = { > .link_ops = &tpda_link_ops, > }; > > +static ssize_t trig_async_enable_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + > + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_async); > +} > + > +static ssize_t trig_async_enable_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, > + size_t size) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + unsigned long val; > + > + if (kstrtoul(buf, 0, &val)) > + return -EINVAL; > + > + guard(spinlock)(&drvdata->spinlock); > + drvdata->trig_async = !!val; > + > + return size; > +} > +static DEVICE_ATTR_RW(trig_async_enable); > + > +static ssize_t trig_flag_ts_enable_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + > + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_flag_ts); > +} > + > +static ssize_t trig_flag_ts_enable_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, > + size_t size) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + unsigned long val; > + > + if (kstrtoul(buf, 0, &val)) > + return -EINVAL; > + > + guard(spinlock)(&drvdata->spinlock); > + drvdata->trig_flag_ts = !!val; > + > + return size; > +} > +static DEVICE_ATTR_RW(trig_flag_ts_enable); > + > +static ssize_t trig_freq_enable_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + > + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_freq); > +} > + > +static ssize_t trig_freq_enable_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, > + size_t size) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + unsigned long val; > + > + if (kstrtoul(buf, 0, &val)) > + return -EINVAL; > + > + guard(spinlock)(&drvdata->spinlock); > + drvdata->trig_freq = !!val; > + > + return size; > +} > +static DEVICE_ATTR_RW(trig_freq_enable); > + > +static ssize_t freq_ts_enable_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + > + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->freq_ts); > +} > + > +static ssize_t freq_ts_enable_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, > + size_t size) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + unsigned long val; > + > + if (kstrtoul(buf, 0, &val)) > + return -EINVAL; > + > + guard(spinlock)(&drvdata->spinlock); > + drvdata->freq_ts = !!val; > + > + return size; > +} > +static DEVICE_ATTR_RW(freq_ts_enable); > + > +static ssize_t global_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); > + CS_UNLOCK(drvdata->base); > + val = readl_relaxed(drvdata->base + TPDA_CR); > + CS_LOCK(drvdata->base); > + /* Only read value for bit 0 */ > + val &= BIT(0); > + > + return sysfs_emit(buf, "%lu\n", val); > +} > + > +static ssize_t global_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); > + unsigned long val; > + > + if (kstrtoul(buf, 0, &val)) > + return -EINVAL; > + > + if (!drvdata->csdev->refcnt || !val) > + return -EINVAL; > + > + guard(spinlock)(&drvdata->spinlock); > + CS_UNLOCK(drvdata->base); > + val = readl_relaxed(drvdata->base + TPDA_CR); > + /* Only set bit 0 */ > + val |= BIT(0); > + writel_relaxed(val, drvdata->base + TPDA_CR); > + CS_LOCK(drvdata->base); > + > + return size; > +} > +static DEVICE_ATTR_RW(global_flush_req); > + > +static ssize_t cmbchan_mode_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + > + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->cmbchan_mode); > +} > + > +static ssize_t cmbchan_mode_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, > + size_t size) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + unsigned long val; > + > + if (kstrtoul(buf, 0, &val)) > + return -EINVAL; > + > + guard(spinlock)(&drvdata->spinlock); > + drvdata->cmbchan_mode = !!val; > + > + return size; > +} > +static DEVICE_ATTR_RW(cmbchan_mode); > + > +static struct attribute *tpda_attrs[] = { > + &dev_attr_trig_async_enable.attr, > + &dev_attr_trig_flag_ts_enable.attr, > + &dev_attr_trig_freq_enable.attr, > + &dev_attr_freq_ts_enable.attr, > + &dev_attr_global_flush_req.attr, > + &dev_attr_cmbchan_mode.attr, > + NULL, > +}; > + > +static struct attribute_group tpda_attr_grp = { > + .attrs = tpda_attrs, > +}; > + > +static const struct attribute_group *tpda_attr_grps[] = { > + &tpda_attr_grp, > + NULL, > +}; > + > static int tpda_init_default_data(struct tpda_drvdata *drvdata) > { > int atid; > @@ -280,6 +508,7 @@ static int tpda_init_default_data(struct tpda_drvdata *drvdata) > return atid; > > drvdata->atid = atid; > + drvdata->freq_ts = true; > return 0; > } > > @@ -323,6 +552,7 @@ static int tpda_probe(struct amba_device *adev, const struct amba_id *id) > desc.ops = &tpda_cs_ops; > desc.pdata = adev->dev.platform_data; > desc.dev = &adev->dev; > + desc.groups = tpda_attr_grps; > desc.access = CSDEV_ACCESS_IOMEM(base); > drvdata->csdev = coresight_register(&desc); > if (IS_ERR(drvdata->csdev)) > diff --git a/drivers/hwtracing/coresight/coresight-tpda.h b/drivers/hwtracing/coresight/coresight-tpda.h > index c6af3d2da3ef..0be625fb52fd 100644 > --- a/drivers/hwtracing/coresight/coresight-tpda.h > +++ b/drivers/hwtracing/coresight/coresight-tpda.h > @@ -1,6 +1,6 @@ > /* SPDX-License-Identifier: GPL-2.0 */ > /* > - * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. > + * Copyright (c) 2023,2025 Qualcomm Innovation Center, Inc. All rights reserved. > */ > > #ifndef _CORESIGHT_CORESIGHT_TPDA_H > @@ -8,6 +8,19 @@ > > #define TPDA_CR (0x000) > #define TPDA_Pn_CR(n) (0x004 + (n * 4)) > +#define TPDA_FPID_CR (0x084) > + > +/* Cross trigger FREQ packets timestamp bit */ > +#define TPDA_CR_FREQTS BIT(2) > +/* Cross trigger FREQ packet request bit */ > +#define TPDA_CR_FRIE BIT(3) > +/* Cross trigger FLAG packet request interface bit */ > +#define TPDA_CR_FLRIE BIT(4) > +/* Cross trigger synchronization bit */ > +#define TPDA_CR_SRIE BIT(5) > +/* Packetize CMB/MCMB traffic bit */ > +#define TPDA_CR_CMBCHANMODE BIT(20) > + > /* Aggregator port enable bit */ > #define TPDA_Pn_CR_ENA BIT(0) > /* Aggregator port CMB data set element size bit */ > @@ -19,6 +32,8 @@ > > /* Bits 6 ~ 12 is for atid value */ > #define TPDA_CR_ATID GENMASK(12, 6) > +/* Bits 13 ~ 19 is for mid value */ > +#define TPDA_CR_MID GENMASK(19, 13) > > /** > * struct tpda_drvdata - specifics associated to an TPDA component > @@ -29,6 +44,11 @@ > * @enable: enable status of the component. > * @dsb_esize Record the DSB element size. > * @cmb_esize Record the CMB element size. > + * @trig_async: Enable/disable cross trigger synchronization sequence interface. > + * @trig_flag_ts: Enable/disable cross trigger FLAG packet request interface. > + * @trig_freq: Enable/disable cross trigger FREQ packet request interface. > + * @freq_ts: Enable/disable the timestamp for all FREQ packets. > + * @cmbchan_mode: Configure the CMB/MCMB channel mode. > */ > struct tpda_drvdata { > void __iomem *base; > @@ -38,6 +58,11 @@ struct tpda_drvdata { > u8 atid; > u32 dsb_esize; > u32 cmb_esize; > + bool trig_async; > + bool trig_flag_ts; > + bool trig_freq; > + bool freq_ts; > + bool cmbchan_mode; > }; > > #endif /* _CORESIGHT_CORESIGHT_TPDA_H */ > ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration 2025-12-18 6:22 ` Jie Gan @ 2025-12-18 9:19 ` Suzuki K Poulose 0 siblings, 0 replies; 13+ messages in thread From: Suzuki K Poulose @ 2025-12-18 9:19 UTC (permalink / raw) To: Jie Gan, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Tao Zhang On 18/12/2025 06:22, Jie Gan wrote: > > > On 10/28/2025 10:02 AM, Jie Gan wrote: >> From: Tao Zhang <tao.zhang@oss.qualcomm.com> >> >> Introduce sysfs nodes to configure cross-trigger parameters for TPDA. >> These registers define the characteristics of cross-trigger packets, >> including generation frequency and flag values. >> >> 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 | 43 ++++ >> drivers/hwtracing/coresight/coresight-tpda.c | 230 +++++++++++ >> ++++++++++ >> drivers/hwtracing/coresight/coresight-tpda.h | 27 ++- >> 3 files changed, 299 insertions(+), 1 deletion(-) >> >> diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices- >> tpda b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda >> new file mode 100644 >> index 000000000000..80e4b05a1ab4 >> --- /dev/null >> +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda > > Gentle reminder. > > Do I need update the date and the kernelVersion of the sysfs node? > (target 7.0?) Leave it with me, I can fix it up. Apologies for missing this out. Suzuki > > Thanks, > Jie > > >> @@ -0,0 +1,43 @@ >> +What: /sys/bus/coresight/devices/<tpda-name>/trig_async_enable >> +Date: October 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) Enable/disable cross trigger synchronization sequence >> interface. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/trig_flag_ts_enable >> +Date: October 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) Enable/disable cross trigger FLAG packet request interface. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/trig_freq_enable >> +Date: October 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) Enable/disable cross trigger FREQ packet request interface. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/freq_ts_enable >> +Date: October 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) Enable/disable the timestamp for all FREQ packets. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/global_flush_req >> +Date: October 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) Set global (all ports) flush request bit. The bit >> remains set until a >> + global flush request sequence completes. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/cmbchan_mode >> +Date: October 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 CMB/MCMB channel mode for all enabled ports. >> + Value 0 means raw channel mapping mode. Value 1 means channel >> pair marking mode. >> diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/ >> hwtracing/coresight/coresight-tpda.c >> index 333b3cb23685..a9a27bcc65a1 100644 >> --- a/drivers/hwtracing/coresight/coresight-tpda.c >> +++ b/drivers/hwtracing/coresight/coresight-tpda.c >> @@ -147,9 +147,37 @@ static void tpda_enable_pre_port(struct >> tpda_drvdata *drvdata) >> u32 val; >> val = readl_relaxed(drvdata->base + TPDA_CR); >> + val &= ~TPDA_CR_MID; >> val &= ~TPDA_CR_ATID; >> val |= FIELD_PREP(TPDA_CR_ATID, drvdata->atid); >> + if (drvdata->trig_async) >> + val |= TPDA_CR_SRIE; >> + else >> + val &= ~TPDA_CR_SRIE; >> + if (drvdata->trig_flag_ts) >> + val |= TPDA_CR_FLRIE; >> + else >> + val &= ~TPDA_CR_FLRIE; >> + if (drvdata->trig_freq) >> + val |= TPDA_CR_FRIE; >> + else >> + val &= ~TPDA_CR_FRIE; >> + if (drvdata->freq_ts) >> + val |= TPDA_CR_FREQTS; >> + else >> + val &= ~TPDA_CR_FREQTS; >> + if (drvdata->cmbchan_mode) >> + val |= TPDA_CR_CMBCHANMODE; >> + else >> + val &= ~TPDA_CR_CMBCHANMODE; >> writel_relaxed(val, drvdata->base + TPDA_CR); >> + >> + /* >> + * If FLRIE bit is set, set the master and channel >> + * id as zero >> + */ >> + if (drvdata->trig_flag_ts) >> + writel_relaxed(0x0, drvdata->base + TPDA_FPID_CR); >> } >> static int tpda_enable_port(struct tpda_drvdata *drvdata, int port) >> @@ -265,6 +293,206 @@ static const struct coresight_ops tpda_cs_ops = { >> .link_ops = &tpda_link_ops, >> }; >> +static ssize_t trig_async_enable_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + >> + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_async); >> +} >> + >> +static ssize_t trig_async_enable_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, >> + size_t size) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + drvdata->trig_async = !!val; >> + >> + return size; >> +} >> +static DEVICE_ATTR_RW(trig_async_enable); >> + >> +static ssize_t trig_flag_ts_enable_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + >> + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_flag_ts); >> +} >> + >> +static ssize_t trig_flag_ts_enable_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, >> + size_t size) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + drvdata->trig_flag_ts = !!val; >> + >> + return size; >> +} >> +static DEVICE_ATTR_RW(trig_flag_ts_enable); >> + >> +static ssize_t trig_freq_enable_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + >> + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_freq); >> +} >> + >> +static ssize_t trig_freq_enable_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, >> + size_t size) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + drvdata->trig_freq = !!val; >> + >> + return size; >> +} >> +static DEVICE_ATTR_RW(trig_freq_enable); >> + >> +static ssize_t freq_ts_enable_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + >> + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->freq_ts); >> +} >> + >> +static ssize_t freq_ts_enable_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, >> + size_t size) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + drvdata->freq_ts = !!val; >> + >> + return size; >> +} >> +static DEVICE_ATTR_RW(freq_ts_enable); >> + >> +static ssize_t global_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); >> + CS_UNLOCK(drvdata->base); >> + val = readl_relaxed(drvdata->base + TPDA_CR); >> + CS_LOCK(drvdata->base); >> + /* Only read value for bit 0 */ >> + val &= BIT(0); >> + >> + return sysfs_emit(buf, "%lu\n", val); >> +} >> + >> +static ssize_t global_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); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + if (!drvdata->csdev->refcnt || !val) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + CS_UNLOCK(drvdata->base); >> + val = readl_relaxed(drvdata->base + TPDA_CR); >> + /* Only set bit 0 */ >> + val |= BIT(0); >> + writel_relaxed(val, drvdata->base + TPDA_CR); >> + CS_LOCK(drvdata->base); >> + >> + return size; >> +} >> +static DEVICE_ATTR_RW(global_flush_req); >> + >> +static ssize_t cmbchan_mode_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + >> + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->cmbchan_mode); >> +} >> + >> +static ssize_t cmbchan_mode_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, >> + size_t size) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + drvdata->cmbchan_mode = !!val; >> + >> + return size; >> +} >> +static DEVICE_ATTR_RW(cmbchan_mode); >> + >> +static struct attribute *tpda_attrs[] = { >> + &dev_attr_trig_async_enable.attr, >> + &dev_attr_trig_flag_ts_enable.attr, >> + &dev_attr_trig_freq_enable.attr, >> + &dev_attr_freq_ts_enable.attr, >> + &dev_attr_global_flush_req.attr, >> + &dev_attr_cmbchan_mode.attr, >> + NULL, >> +}; >> + >> +static struct attribute_group tpda_attr_grp = { >> + .attrs = tpda_attrs, >> +}; >> + >> +static const struct attribute_group *tpda_attr_grps[] = { >> + &tpda_attr_grp, >> + NULL, >> +}; >> + >> static int tpda_init_default_data(struct tpda_drvdata *drvdata) >> { >> int atid; >> @@ -280,6 +508,7 @@ static int tpda_init_default_data(struct >> tpda_drvdata *drvdata) >> return atid; >> drvdata->atid = atid; >> + drvdata->freq_ts = true; >> return 0; >> } >> @@ -323,6 +552,7 @@ static int tpda_probe(struct amba_device *adev, >> const struct amba_id *id) >> desc.ops = &tpda_cs_ops; >> desc.pdata = adev->dev.platform_data; >> desc.dev = &adev->dev; >> + desc.groups = tpda_attr_grps; >> desc.access = CSDEV_ACCESS_IOMEM(base); >> drvdata->csdev = coresight_register(&desc); >> if (IS_ERR(drvdata->csdev)) >> diff --git a/drivers/hwtracing/coresight/coresight-tpda.h b/drivers/ >> hwtracing/coresight/coresight-tpda.h >> index c6af3d2da3ef..0be625fb52fd 100644 >> --- a/drivers/hwtracing/coresight/coresight-tpda.h >> +++ b/drivers/hwtracing/coresight/coresight-tpda.h >> @@ -1,6 +1,6 @@ >> /* SPDX-License-Identifier: GPL-2.0 */ >> /* >> - * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights >> reserved. >> + * Copyright (c) 2023,2025 Qualcomm Innovation Center, Inc. All >> rights reserved. >> */ >> #ifndef _CORESIGHT_CORESIGHT_TPDA_H >> @@ -8,6 +8,19 @@ >> #define TPDA_CR (0x000) >> #define TPDA_Pn_CR(n) (0x004 + (n * 4)) >> +#define TPDA_FPID_CR (0x084) >> + >> +/* Cross trigger FREQ packets timestamp bit */ >> +#define TPDA_CR_FREQTS BIT(2) >> +/* Cross trigger FREQ packet request bit */ >> +#define TPDA_CR_FRIE BIT(3) >> +/* Cross trigger FLAG packet request interface bit */ >> +#define TPDA_CR_FLRIE BIT(4) >> +/* Cross trigger synchronization bit */ >> +#define TPDA_CR_SRIE BIT(5) >> +/* Packetize CMB/MCMB traffic bit */ >> +#define TPDA_CR_CMBCHANMODE BIT(20) >> + >> /* Aggregator port enable bit */ >> #define TPDA_Pn_CR_ENA BIT(0) >> /* Aggregator port CMB data set element size bit */ >> @@ -19,6 +32,8 @@ >> /* Bits 6 ~ 12 is for atid value */ >> #define TPDA_CR_ATID GENMASK(12, 6) >> +/* Bits 13 ~ 19 is for mid value */ >> +#define TPDA_CR_MID GENMASK(19, 13) >> /** >> * struct tpda_drvdata - specifics associated to an TPDA component >> @@ -29,6 +44,11 @@ >> * @enable: enable status of the component. >> * @dsb_esize Record the DSB element size. >> * @cmb_esize Record the CMB element size. >> + * @trig_async: Enable/disable cross trigger synchronization >> sequence interface. >> + * @trig_flag_ts: Enable/disable cross trigger FLAG packet request >> interface. >> + * @trig_freq: Enable/disable cross trigger FREQ packet request >> interface. >> + * @freq_ts: Enable/disable the timestamp for all FREQ packets. >> + * @cmbchan_mode: Configure the CMB/MCMB channel mode. >> */ >> struct tpda_drvdata { >> void __iomem *base; >> @@ -38,6 +58,11 @@ struct tpda_drvdata { >> u8 atid; >> u32 dsb_esize; >> u32 cmb_esize; >> + bool trig_async; >> + bool trig_flag_ts; >> + bool trig_freq; >> + bool freq_ts; >> + bool cmbchan_mode; >> }; >> #endif /* _CORESIGHT_CORESIGHT_TPDA_H */ >> > ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration 2025-10-28 2:02 ` [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration Jie Gan 2025-12-18 6:22 ` Jie Gan @ 2025-12-18 11:10 ` Suzuki K Poulose 2025-12-18 11:20 ` Suzuki K Poulose 2025-12-19 3:31 ` Jie Gan 1 sibling, 2 replies; 13+ messages in thread From: Suzuki K Poulose @ 2025-12-18 11:10 UTC (permalink / raw) To: Jie Gan, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Tao Zhang On 28/10/2025 02:02, Jie Gan wrote: > From: Tao Zhang <tao.zhang@oss.qualcomm.com> > > Introduce sysfs nodes to configure cross-trigger parameters for TPDA. > These registers define the characteristics of cross-trigger packets, > including generation frequency and flag values. > > 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 | 43 ++++ > drivers/hwtracing/coresight/coresight-tpda.c | 230 +++++++++++++++++++++ > drivers/hwtracing/coresight/coresight-tpda.h | 27 ++- > 3 files changed, 299 insertions(+), 1 deletion(-) > > diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda > new file mode 100644 > index 000000000000..80e4b05a1ab4 > --- /dev/null > +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda > @@ -0,0 +1,43 @@ > +What: /sys/bus/coresight/devices/<tpda-name>/trig_async_enable > +Date: October 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) Enable/disable cross trigger synchronization sequence interface. > + > +What: /sys/bus/coresight/devices/<tpda-name>/trig_flag_ts_enable > +Date: October 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) Enable/disable cross trigger FLAG packet request interface. > + > +What: /sys/bus/coresight/devices/<tpda-name>/trig_freq_enable > +Date: October 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) Enable/disable cross trigger FREQ packet request interface. > + > +What: /sys/bus/coresight/devices/<tpda-name>/freq_ts_enable > +Date: October 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) Enable/disable the timestamp for all FREQ packets. > + > +What: /sys/bus/coresight/devices/<tpda-name>/global_flush_req > +Date: October 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) Set global (all ports) flush request bit. The bit remains set until a > + global flush request sequence completes. > + > +What: /sys/bus/coresight/devices/<tpda-name>/cmbchan_mode > +Date: October 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 CMB/MCMB channel mode for all enabled ports. > + Value 0 means raw channel mapping mode. Value 1 means channel pair marking mode. > diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c > index 333b3cb23685..a9a27bcc65a1 100644 > --- a/drivers/hwtracing/coresight/coresight-tpda.c > +++ b/drivers/hwtracing/coresight/coresight-tpda.c > @@ -147,9 +147,37 @@ static void tpda_enable_pre_port(struct tpda_drvdata *drvdata) > u32 val; > > val = readl_relaxed(drvdata->base + TPDA_CR); > + val &= ~TPDA_CR_MID; > val &= ~TPDA_CR_ATID; See, below. > val |= FIELD_PREP(TPDA_CR_ATID, drvdata->atid); > + if (drvdata->trig_async) > + val |= TPDA_CR_SRIE; > + else > + val &= ~TPDA_CR_SRIE; > + if (drvdata->trig_flag_ts) > + val |= TPDA_CR_FLRIE; > + else > + val &= ~TPDA_CR_FLRIE; > + if (drvdata->trig_freq) > + val |= TPDA_CR_FRIE; > + else > + val &= ~TPDA_CR_FRIE; > + if (drvdata->freq_ts) > + val |= TPDA_CR_FREQTS; > + else > + val &= ~TPDA_CR_FREQTS; > + if (drvdata->cmbchan_mode) > + val |= TPDA_CR_CMBCHANMODE; > + else > + val &= ~TPDA_CR_CMBCHANMODE; Could we clear all of the bits that are configurable in one go in the beginning and set the appropriate ones based on the setting ? i.e.: Do we really need to retain any values ? And if not, why not start with a fresh set of values and avoid the read ? > writel_relaxed(val, drvdata->base + TPDA_CR); > + > + /* > + * If FLRIE bit is set, set the master and channel > + * id as zero > + */ > + if (drvdata->trig_flag_ts) > + writel_relaxed(0x0, drvdata->base + TPDA_FPID_CR); > } > > static int tpda_enable_port(struct tpda_drvdata *drvdata, int port) > @@ -265,6 +293,206 @@ static const struct coresight_ops tpda_cs_ops = { > .link_ops = &tpda_link_ops, > }; > > +static ssize_t trig_async_enable_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + > + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_async); > +} > + > +static ssize_t trig_async_enable_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, > + size_t size) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + unsigned long val; > + > + if (kstrtoul(buf, 0, &val)) > + return -EINVAL; > + > + guard(spinlock)(&drvdata->spinlock); > + drvdata->trig_async = !!val; > + > + return size; > +} > +static DEVICE_ATTR_RW(trig_async_enable); ... > +static DEVICE_ATTR_RW(trig_flag_ts_enable); ... > +static DEVICE_ATTR_RW(trig_freq_enable); ... > +static DEVICE_ATTR_RW(freq_ts_enable); These attribute are boolean and looks like we could save some space on code by using dev_ext_attribute. see tpdm_simple_dataset_rw()/tpdm_simple_dataset_ro() . You could #define TPDA_TRIG_ASYNC 0 #define TPDA_TRIG_FLAG_TS 1 #define TPDA_TRIG_FREQ 2 tpda_trig_sysfs_show/store() bool *ptr; switch (eattr->var) { case TPDA_TRIG_ASYNC: ptr = &drvdata->trig_async; break; case TPDA_TRIG_FLAG_TS: ptr = &drvdata->trig_flag_ts; break; ... } > + > +static ssize_t global_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); > + CS_UNLOCK(drvdata->base); > + val = readl_relaxed(drvdata->base + TPDA_CR); > + CS_LOCK(drvdata->base); > + /* Only read value for bit 0 */ > + val &= BIT(0); > + > + return sysfs_emit(buf, "%lu\n", val); > +} > + > +static ssize_t global_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); > + unsigned long val; > + > + if (kstrtoul(buf, 0, &val)) > + return -EINVAL; > + > + if (!drvdata->csdev->refcnt || !val) > + return -EINVAL; > + > + guard(spinlock)(&drvdata->spinlock); > + CS_UNLOCK(drvdata->base); > + val = readl_relaxed(drvdata->base + TPDA_CR); > + /* Only set bit 0 */ > + val |= BIT(0); What is BIT 0 ? Please document it > + writel_relaxed(val, drvdata->base + TPDA_CR); > + CS_LOCK(drvdata->base); > + > + return size; > +} > +static DEVICE_ATTR_RW(global_flush_req); > + > +static ssize_t cmbchan_mode_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + > + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->cmbchan_mode); > +} > + > +static ssize_t cmbchan_mode_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, > + size_t size) > +{ > + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); > + unsigned long val; > + > + if (kstrtoul(buf, 0, &val)) > + return -EINVAL; > + > + guard(spinlock)(&drvdata->spinlock); > + drvdata->cmbchan_mode = !!val; > + > + return size; > +} > +static DEVICE_ATTR_RW(cmbchan_mode); Even this could go to the dev_ext_attribute magic and reuse a single show/store. > + > +static struct attribute *tpda_attrs[] = { > + &dev_attr_trig_async_enable.attr, > + &dev_attr_trig_flag_ts_enable.attr, > + &dev_attr_trig_freq_enable.attr, > + &dev_attr_freq_ts_enable.attr, > + &dev_attr_global_flush_req.attr, > + &dev_attr_cmbchan_mode.attr, > + NULL, > +}; > diff --git a/drivers/hwtracing/coresight/coresight-tpda.h b/drivers/hwtracing/coresight/coresight-tpda.h > index c6af3d2da3ef..0be625fb52fd 100644 > --- a/drivers/hwtracing/coresight/coresight-tpda.h > +++ b/drivers/hwtracing/coresight/coresight-tpda.h > @@ -1,6 +1,6 @@ > /* SPDX-License-Identifier: GPL-2.0 */ > /* > - * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. > + * Copyright (c) 2023,2025 Qualcomm Innovation Center, Inc. All rights reserved. > */ > > #ifndef _CORESIGHT_CORESIGHT_TPDA_H > @@ -8,6 +8,19 @@ > > #define TPDA_CR (0x000) > #define TPDA_Pn_CR(n) (0x004 + (n * 4)) > +#define TPDA_FPID_CR (0x084) > + > +/* Cross trigger FREQ packets timestamp bit */ > +#define TPDA_CR_FREQTS BIT(2) > +/* Cross trigger FREQ packet request bit */ > +#define TPDA_CR_FRIE BIT(3) > +/* Cross trigger FLAG packet request interface bit */ > +#define TPDA_CR_FLRIE BIT(4) > +/* Cross trigger synchronization bit */ > +#define TPDA_CR_SRIE BIT(5) > +/* Packetize CMB/MCMB traffic bit */ > +#define TPDA_CR_CMBCHANMODE BIT(20) > + Why are these not clubbed with the other TPDA_CR_ defintions ? > /* Aggregator port enable bit */ > #define TPDA_Pn_CR_ENA BIT(0) > /* Aggregator port CMB data set element size bit */ > @@ -19,6 +32,8 @@ > > /* Bits 6 ~ 12 is for atid value */ > #define TPDA_CR_ATID GENMASK(12, 6) > +/* Bits 13 ~ 19 is for mid value */ > +#define TPDA_CR_MID GENMASK(19, 13) > > /** > * struct tpda_drvdata - specifics associated to an TPDA component > @@ -29,6 +44,11 @@ > * @enable: enable status of the component. > * @dsb_esize Record the DSB element size. > * @cmb_esize Record the CMB element size. > + * @trig_async: Enable/disable cross trigger synchronization sequence interface. > + * @trig_flag_ts: Enable/disable cross trigger FLAG packet request interface. > + * @trig_freq: Enable/disable cross trigger FREQ packet request interface. > + * @freq_ts: Enable/disable the timestamp for all FREQ packets. > + * @cmbchan_mode: Configure the CMB/MCMB channel mode. > */ > struct tpda_drvdata { > void __iomem *base; > @@ -38,6 +58,11 @@ struct tpda_drvdata { > u8 atid; > u32 dsb_esize; > u32 cmb_esize; > + bool trig_async; > + bool trig_flag_ts; > + bool trig_freq; > + bool freq_ts; > + bool cmbchan_mode; > }; > > #endif /* _CORESIGHT_CORESIGHT_TPDA_H */ Suzuki ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration 2025-12-18 11:10 ` Suzuki K Poulose @ 2025-12-18 11:20 ` Suzuki K Poulose 2025-12-19 4:53 ` Jie Gan 2025-12-19 3:31 ` Jie Gan 1 sibling, 1 reply; 13+ messages in thread From: Suzuki K Poulose @ 2025-12-18 11:20 UTC (permalink / raw) To: Jie Gan, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Tao Zhang On 18/12/2025 11:10, Suzuki K Poulose wrote: > On 28/10/2025 02:02, Jie Gan wrote: >> From: Tao Zhang <tao.zhang@oss.qualcomm.com> >> >> Introduce sysfs nodes to configure cross-trigger parameters for TPDA. >> These registers define the characteristics of cross-trigger packets, >> including generation frequency and flag values. >> >> 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 | 43 ++++ >> drivers/hwtracing/coresight/coresight-tpda.c | 230 +++++++++++ >> ++++++++++ >> drivers/hwtracing/coresight/coresight-tpda.h | 27 ++- >> 3 files changed, 299 insertions(+), 1 deletion(-) >> >> diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices- >> tpda b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda >> new file mode 100644 >> index 000000000000..80e4b05a1ab4 >> --- /dev/null >> +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda >> @@ -0,0 +1,43 @@ >> +What: /sys/bus/coresight/devices/<tpda-name>/trig_async_enable >> +Date: October 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) Enable/disable cross trigger synchronization sequence >> interface. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/trig_flag_ts_enable >> +Date: October 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) Enable/disable cross trigger FLAG packet request interface. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/trig_freq_enable >> +Date: October 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) Enable/disable cross trigger FREQ packet request interface. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/freq_ts_enable >> +Date: October 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) Enable/disable the timestamp for all FREQ packets. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/global_flush_req >> +Date: October 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) Set global (all ports) flush request bit. The bit >> remains set until a >> + global flush request sequence completes. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/cmbchan_mode >> +Date: October 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 CMB/MCMB channel mode for all enabled ports. >> + Value 0 means raw channel mapping mode. Value 1 means channel >> pair marking mode. >> diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/ >> hwtracing/coresight/coresight-tpda.c >> index 333b3cb23685..a9a27bcc65a1 100644 >> --- a/drivers/hwtracing/coresight/coresight-tpda.c >> +++ b/drivers/hwtracing/coresight/coresight-tpda.c >> @@ -147,9 +147,37 @@ static void tpda_enable_pre_port(struct >> tpda_drvdata *drvdata) >> u32 val; >> val = readl_relaxed(drvdata->base + TPDA_CR); >> + val &= ~TPDA_CR_MID; >> val &= ~TPDA_CR_ATID; > > See, below. > >> val |= FIELD_PREP(TPDA_CR_ATID, drvdata->atid); >> + if (drvdata->trig_async) >> + val |= TPDA_CR_SRIE; >> + else >> + val &= ~TPDA_CR_SRIE; >> + if (drvdata->trig_flag_ts) >> + val |= TPDA_CR_FLRIE; >> + else >> + val &= ~TPDA_CR_FLRIE; >> + if (drvdata->trig_freq) >> + val |= TPDA_CR_FRIE; >> + else >> + val &= ~TPDA_CR_FRIE; >> + if (drvdata->freq_ts) >> + val |= TPDA_CR_FREQTS; >> + else >> + val &= ~TPDA_CR_FREQTS; >> + if (drvdata->cmbchan_mode) >> + val |= TPDA_CR_CMBCHANMODE; >> + else >> + val &= ~TPDA_CR_CMBCHANMODE; > > Could we clear all of the bits that are configurable in one go in the > beginning and set the appropriate ones based on the setting ? i.e.: > > Do we really need to retain any values ? And if not, why not start > with a fresh set of values and avoid the read ? > >> writel_relaxed(val, drvdata->base + TPDA_CR); >> + >> + /* >> + * If FLRIE bit is set, set the master and channel >> + * id as zero >> + */ >> + if (drvdata->trig_flag_ts) >> + writel_relaxed(0x0, drvdata->base + TPDA_FPID_CR); >> } >> static int tpda_enable_port(struct tpda_drvdata *drvdata, int port) >> @@ -265,6 +293,206 @@ static const struct coresight_ops tpda_cs_ops = { >> .link_ops = &tpda_link_ops, >> }; >> +static ssize_t trig_async_enable_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + >> + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_async); >> +} >> + >> +static ssize_t trig_async_enable_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, >> + size_t size) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + drvdata->trig_async = !!val; >> + > > > >> + return size; >> +} >> +static DEVICE_ATTR_RW(trig_async_enable); > > ... > >> +static DEVICE_ATTR_RW(trig_flag_ts_enable); > > ... > >> +static DEVICE_ATTR_RW(trig_freq_enable); > > ... >> +static DEVICE_ATTR_RW(freq_ts_enable); > > These attribute are boolean and looks like we could save some space on > code by using dev_ext_attribute. > see tpdm_simple_dataset_rw()/tpdm_simple_dataset_ro() . You could > > #define TPDA_TRIG_ASYNC 0 > #define TPDA_TRIG_FLAG_TS 1 > #define TPDA_TRIG_FREQ 2 > > > tpda_trig_sysfs_show/store() > > bool *ptr; > switch (eattr->var) { > case TPDA_TRIG_ASYNC: > ptr = &drvdata->trig_async; > break; > case TPDA_TRIG_FLAG_TS: > ptr = &drvdata->trig_flag_ts; > break; > ... > > } > > > -->8-- Cut here >> + >> +static ssize_t global_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); >> + CS_UNLOCK(drvdata->base); >> + val = readl_relaxed(drvdata->base + TPDA_CR); >> + CS_LOCK(drvdata->base); >> + /* Only read value for bit 0 */ >> + val &= BIT(0); >> + >> + return sysfs_emit(buf, "%lu\n", val); >> +} >> + >> +static ssize_t global_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); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + if (!drvdata->csdev->refcnt || !val) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + CS_UNLOCK(drvdata->base); >> + val = readl_relaxed(drvdata->base + TPDA_CR); >> + /* Only set bit 0 */ >> + val |= BIT(0); > > What is BIT 0 ? Please document it > >> + writel_relaxed(val, drvdata->base + TPDA_CR); >> + CS_LOCK(drvdata->base); >> + >> + return size; >> +} Also this, global_flush_req seems to be a separate change from the rest of the additions in the patch. Why not split it into a separate patch with appropriate description of what this is for ? Suzuki ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration 2025-12-18 11:20 ` Suzuki K Poulose @ 2025-12-19 4:53 ` Jie Gan 0 siblings, 0 replies; 13+ messages in thread From: Jie Gan @ 2025-12-19 4:53 UTC (permalink / raw) To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Tao Zhang On 12/18/2025 7:20 PM, Suzuki K Poulose wrote: > On 18/12/2025 11:10, Suzuki K Poulose wrote: >> On 28/10/2025 02:02, Jie Gan wrote: >>> From: Tao Zhang <tao.zhang@oss.qualcomm.com> >>> >>> Introduce sysfs nodes to configure cross-trigger parameters for TPDA. >>> These registers define the characteristics of cross-trigger packets, >>> including generation frequency and flag values. >>> >>> 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 | 43 ++++ >>> drivers/hwtracing/coresight/coresight-tpda.c | 230 ++++++++++ >>> + ++++++++++ >>> drivers/hwtracing/coresight/coresight-tpda.h | 27 ++- >>> 3 files changed, 299 insertions(+), 1 deletion(-) >>> >>> diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices- >>> tpda b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda >>> new file mode 100644 >>> index 000000000000..80e4b05a1ab4 >>> --- /dev/null >>> +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda >>> @@ -0,0 +1,43 @@ >>> +What: /sys/bus/coresight/devices/<tpda-name>/trig_async_enable >>> +Date: October 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) Enable/disable cross trigger synchronization sequence >>> interface. >>> + >>> +What: /sys/bus/coresight/devices/<tpda-name>/trig_flag_ts_enable >>> +Date: October 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) Enable/disable cross trigger FLAG packet request >>> interface. >>> + >>> +What: /sys/bus/coresight/devices/<tpda-name>/trig_freq_enable >>> +Date: October 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) Enable/disable cross trigger FREQ packet request >>> interface. >>> + >>> +What: /sys/bus/coresight/devices/<tpda-name>/freq_ts_enable >>> +Date: October 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) Enable/disable the timestamp for all FREQ packets. >>> + >>> +What: /sys/bus/coresight/devices/<tpda-name>/global_flush_req >>> +Date: October 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) Set global (all ports) flush request bit. The bit >>> remains set until a >>> + global flush request sequence completes. >>> + >>> +What: /sys/bus/coresight/devices/<tpda-name>/cmbchan_mode >>> +Date: October 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 CMB/MCMB channel mode for all enabled ports. >>> + Value 0 means raw channel mapping mode. Value 1 means >>> channel pair marking mode. >>> diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/ >>> hwtracing/coresight/coresight-tpda.c >>> index 333b3cb23685..a9a27bcc65a1 100644 >>> --- a/drivers/hwtracing/coresight/coresight-tpda.c >>> +++ b/drivers/hwtracing/coresight/coresight-tpda.c >>> @@ -147,9 +147,37 @@ static void tpda_enable_pre_port(struct >>> tpda_drvdata *drvdata) >>> u32 val; >>> val = readl_relaxed(drvdata->base + TPDA_CR); >>> + val &= ~TPDA_CR_MID; >>> val &= ~TPDA_CR_ATID; >> >> See, below. >> >>> val |= FIELD_PREP(TPDA_CR_ATID, drvdata->atid); >>> + if (drvdata->trig_async) >>> + val |= TPDA_CR_SRIE; >>> + else >>> + val &= ~TPDA_CR_SRIE; >>> + if (drvdata->trig_flag_ts) >>> + val |= TPDA_CR_FLRIE; >>> + else >>> + val &= ~TPDA_CR_FLRIE; >>> + if (drvdata->trig_freq) >>> + val |= TPDA_CR_FRIE; >>> + else >>> + val &= ~TPDA_CR_FRIE; >>> + if (drvdata->freq_ts) >>> + val |= TPDA_CR_FREQTS; >>> + else >>> + val &= ~TPDA_CR_FREQTS; >>> + if (drvdata->cmbchan_mode) >>> + val |= TPDA_CR_CMBCHANMODE; >>> + else >>> + val &= ~TPDA_CR_CMBCHANMODE; >> >> Could we clear all of the bits that are configurable in one go in the >> beginning and set the appropriate ones based on the setting ? i.e.: >> >> Do we really need to retain any values ? And if not, why not start >> with a fresh set of values and avoid the read ? >> >>> writel_relaxed(val, drvdata->base + TPDA_CR); >>> + >>> + /* >>> + * If FLRIE bit is set, set the master and channel >>> + * id as zero >>> + */ >>> + if (drvdata->trig_flag_ts) >>> + writel_relaxed(0x0, drvdata->base + TPDA_FPID_CR); >>> } >>> static int tpda_enable_port(struct tpda_drvdata *drvdata, int port) >>> @@ -265,6 +293,206 @@ static const struct coresight_ops tpda_cs_ops = { >>> .link_ops = &tpda_link_ops, >>> }; >>> +static ssize_t trig_async_enable_show(struct device *dev, >>> + struct device_attribute *attr, >>> + char *buf) >>> +{ >>> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >>> + >>> + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_async); >>> +} >>> + >>> +static ssize_t trig_async_enable_store(struct device *dev, >>> + struct device_attribute *attr, >>> + const char *buf, >>> + size_t size) >>> +{ >>> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >>> + unsigned long val; >>> + >>> + if (kstrtoul(buf, 0, &val)) >>> + return -EINVAL; >>> + >>> + guard(spinlock)(&drvdata->spinlock); >>> + drvdata->trig_async = !!val; >>> + >> >> >> >>> + return size; >>> +} >>> +static DEVICE_ATTR_RW(trig_async_enable); >> >> ... >> >>> +static DEVICE_ATTR_RW(trig_flag_ts_enable); >> >> ... >> >>> +static DEVICE_ATTR_RW(trig_freq_enable); >> >> ... >>> +static DEVICE_ATTR_RW(freq_ts_enable); >> >> These attribute are boolean and looks like we could save some space on >> code by using dev_ext_attribute. >> see tpdm_simple_dataset_rw()/tpdm_simple_dataset_ro() . You could >> >> #define TPDA_TRIG_ASYNC 0 >> #define TPDA_TRIG_FLAG_TS 1 >> #define TPDA_TRIG_FREQ 2 >> >> >> tpda_trig_sysfs_show/store() >> >> bool *ptr; >> switch (eattr->var) { >> case TPDA_TRIG_ASYNC: >> ptr = &drvdata->trig_async; >> break; >> case TPDA_TRIG_FLAG_TS: >> ptr = &drvdata->trig_flag_ts; >> break; >> ... >> >> } >> >> >> > > -->8-- > > Cut here > >>> + >>> +static ssize_t global_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); >>> + CS_UNLOCK(drvdata->base); >>> + val = readl_relaxed(drvdata->base + TPDA_CR); >>> + CS_LOCK(drvdata->base); >>> + /* Only read value for bit 0 */ >>> + val &= BIT(0); >>> + >>> + return sysfs_emit(buf, "%lu\n", val); >>> +} >>> + >>> +static ssize_t global_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); >>> + unsigned long val; >>> + >>> + if (kstrtoul(buf, 0, &val)) >>> + return -EINVAL; >>> + >>> + if (!drvdata->csdev->refcnt || !val) >>> + return -EINVAL; >>> + >>> + guard(spinlock)(&drvdata->spinlock); >>> + CS_UNLOCK(drvdata->base); >>> + val = readl_relaxed(drvdata->base + TPDA_CR); >>> + /* Only set bit 0 */ >>> + val |= BIT(0); >> >> What is BIT 0 ? Please document it >> >>> + writel_relaxed(val, drvdata->base + TPDA_CR); >>> + CS_LOCK(drvdata->base); >>> + >>> + return size; >>> +} > > Also this, global_flush_req seems to be a separate change from the rest > of the additions in the patch. Why not split it into a separate patch > with appropriate description of what this is for ? Hi Suzuki, global_flush_req is part of the TPDA_CR register, it's the bit0 of the register. I should document it in header file: /* Cross trigger Global (all ports) flush request bit */ #define TPDA_CR_FLREQ BIT(0) We also have below bit that is not in use: #define TPDA_CR_FREQREQ BIT(1) It's frequency request bit, that determines the frequency for generating frequency packets. Thanks, Jie > > Suzuki ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration 2025-12-18 11:10 ` Suzuki K Poulose 2025-12-18 11:20 ` Suzuki K Poulose @ 2025-12-19 3:31 ` Jie Gan 1 sibling, 0 replies; 13+ messages in thread From: Jie Gan @ 2025-12-19 3:31 UTC (permalink / raw) To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Tao Zhang On 12/18/2025 7:10 PM, Suzuki K Poulose wrote: > On 28/10/2025 02:02, Jie Gan wrote: >> From: Tao Zhang <tao.zhang@oss.qualcomm.com> >> >> Introduce sysfs nodes to configure cross-trigger parameters for TPDA. >> These registers define the characteristics of cross-trigger packets, >> including generation frequency and flag values. >> >> 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 | 43 ++++ >> drivers/hwtracing/coresight/coresight-tpda.c | 230 +++++++++++ >> ++++++++++ >> drivers/hwtracing/coresight/coresight-tpda.h | 27 ++- >> 3 files changed, 299 insertions(+), 1 deletion(-) >> >> diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices- >> tpda b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda >> new file mode 100644 >> index 000000000000..80e4b05a1ab4 >> --- /dev/null >> +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda >> @@ -0,0 +1,43 @@ >> +What: /sys/bus/coresight/devices/<tpda-name>/trig_async_enable >> +Date: October 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) Enable/disable cross trigger synchronization sequence >> interface. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/trig_flag_ts_enable >> +Date: October 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) Enable/disable cross trigger FLAG packet request interface. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/trig_freq_enable >> +Date: October 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) Enable/disable cross trigger FREQ packet request interface. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/freq_ts_enable >> +Date: October 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) Enable/disable the timestamp for all FREQ packets. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/global_flush_req >> +Date: October 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) Set global (all ports) flush request bit. The bit >> remains set until a >> + global flush request sequence completes. >> + >> +What: /sys/bus/coresight/devices/<tpda-name>/cmbchan_mode >> +Date: October 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 CMB/MCMB channel mode for all enabled ports. >> + Value 0 means raw channel mapping mode. Value 1 means channel >> pair marking mode. >> diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/ >> hwtracing/coresight/coresight-tpda.c >> index 333b3cb23685..a9a27bcc65a1 100644 >> --- a/drivers/hwtracing/coresight/coresight-tpda.c >> +++ b/drivers/hwtracing/coresight/coresight-tpda.c >> @@ -147,9 +147,37 @@ static void tpda_enable_pre_port(struct >> tpda_drvdata *drvdata) >> u32 val; >> val = readl_relaxed(drvdata->base + TPDA_CR); >> + val &= ~TPDA_CR_MID; >> val &= ~TPDA_CR_ATID; > > See, below. > >> val |= FIELD_PREP(TPDA_CR_ATID, drvdata->atid); >> + if (drvdata->trig_async) >> + val |= TPDA_CR_SRIE; >> + else >> + val &= ~TPDA_CR_SRIE; >> + if (drvdata->trig_flag_ts) >> + val |= TPDA_CR_FLRIE; >> + else >> + val &= ~TPDA_CR_FLRIE; >> + if (drvdata->trig_freq) >> + val |= TPDA_CR_FRIE; >> + else >> + val &= ~TPDA_CR_FRIE; >> + if (drvdata->freq_ts) >> + val |= TPDA_CR_FREQTS; >> + else >> + val &= ~TPDA_CR_FREQTS; >> + if (drvdata->cmbchan_mode) >> + val |= TPDA_CR_CMBCHANMODE; >> + else >> + val &= ~TPDA_CR_CMBCHANMODE; > > Could we clear all of the bits that are configurable in one go in the > beginning and set the appropriate ones based on the setting ? i.e.: > > Do we really need to retain any values ? And if not, why not start > with a fresh set of values and avoid the read ? Got it. We can start with a clean value and set the required bits, without needing to read the register once. > >> writel_relaxed(val, drvdata->base + TPDA_CR); >> + >> + /* >> + * If FLRIE bit is set, set the master and channel >> + * id as zero >> + */ >> + if (drvdata->trig_flag_ts) >> + writel_relaxed(0x0, drvdata->base + TPDA_FPID_CR); >> } >> static int tpda_enable_port(struct tpda_drvdata *drvdata, int port) >> @@ -265,6 +293,206 @@ static const struct coresight_ops tpda_cs_ops = { >> .link_ops = &tpda_link_ops, >> }; >> +static ssize_t trig_async_enable_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + >> + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->trig_async); >> +} >> + >> +static ssize_t trig_async_enable_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, >> + size_t size) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + drvdata->trig_async = !!val; >> + > > > >> + return size; >> +} >> +static DEVICE_ATTR_RW(trig_async_enable); > > ... > >> +static DEVICE_ATTR_RW(trig_flag_ts_enable); > > ... > >> +static DEVICE_ATTR_RW(trig_freq_enable); > > ... >> +static DEVICE_ATTR_RW(freq_ts_enable); > > These attribute are boolean and looks like we could save some space on > code by using dev_ext_attribute. > see tpdm_simple_dataset_rw()/tpdm_simple_dataset_ro() . You could > > #define TPDA_TRIG_ASYNC 0 > #define TPDA_TRIG_FLAG_TS 1 > #define TPDA_TRIG_FREQ 2 > > > tpda_trig_sysfs_show/store() > > bool *ptr; > switch (eattr->var) { > case TPDA_TRIG_ASYNC: > ptr = &drvdata->trig_async; > break; > case TPDA_TRIG_FLAG_TS: > ptr = &drvdata->trig_flag_ts; > break; > ... > > } > Will wrap in tpda_trig_sysfs_show/store(). > > >> + >> +static ssize_t global_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); >> + CS_UNLOCK(drvdata->base); >> + val = readl_relaxed(drvdata->base + TPDA_CR); >> + CS_LOCK(drvdata->base); >> + /* Only read value for bit 0 */ >> + val &= BIT(0); >> + >> + return sysfs_emit(buf, "%lu\n", val); >> +} >> + >> +static ssize_t global_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); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + if (!drvdata->csdev->refcnt || !val) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + CS_UNLOCK(drvdata->base); >> + val = readl_relaxed(drvdata->base + TPDA_CR); >> + /* Only set bit 0 */ >> + val |= BIT(0); > > What is BIT 0 ? Please document it will document it. Bit0 is Global (all ports) flush request bit. Set 1 means a flush request is made for all ports. > >> + writel_relaxed(val, drvdata->base + TPDA_CR); >> + CS_LOCK(drvdata->base); >> + >> + return size; >> +} >> +static DEVICE_ATTR_RW(global_flush_req); > > > >> + >> +static ssize_t cmbchan_mode_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + >> + return sysfs_emit(buf, "%u\n", (unsigned int)drvdata->cmbchan_mode); >> +} >> + >> +static ssize_t cmbchan_mode_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, >> + size_t size) >> +{ >> + struct tpda_drvdata *drvdata = dev_get_drvdata(dev->parent); >> + unsigned long val; >> + >> + if (kstrtoul(buf, 0, &val)) >> + return -EINVAL; >> + >> + guard(spinlock)(&drvdata->spinlock); >> + drvdata->cmbchan_mode = !!val; >> + >> + return size; >> +} >> +static DEVICE_ATTR_RW(cmbchan_mode); > > Even this could go to the dev_ext_attribute magic and reuse a single > show/store. Got it. > >> + >> +static struct attribute *tpda_attrs[] = { >> + &dev_attr_trig_async_enable.attr, >> + &dev_attr_trig_flag_ts_enable.attr, >> + &dev_attr_trig_freq_enable.attr, >> + &dev_attr_freq_ts_enable.attr, >> + &dev_attr_global_flush_req.attr, >> + &dev_attr_cmbchan_mode.attr, >> + NULL, >> +}; > >> diff --git a/drivers/hwtracing/coresight/coresight-tpda.h b/drivers/ >> hwtracing/coresight/coresight-tpda.h >> index c6af3d2da3ef..0be625fb52fd 100644 >> --- a/drivers/hwtracing/coresight/coresight-tpda.h >> +++ b/drivers/hwtracing/coresight/coresight-tpda.h >> @@ -1,6 +1,6 @@ >> /* SPDX-License-Identifier: GPL-2.0 */ >> /* >> - * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights >> reserved. >> + * Copyright (c) 2023,2025 Qualcomm Innovation Center, Inc. All >> rights reserved. >> */ >> #ifndef _CORESIGHT_CORESIGHT_TPDA_H >> @@ -8,6 +8,19 @@ >> #define TPDA_CR (0x000) >> #define TPDA_Pn_CR(n) (0x004 + (n * 4)) >> +#define TPDA_FPID_CR (0x084) >> + >> +/* Cross trigger FREQ packets timestamp bit */ >> +#define TPDA_CR_FREQTS BIT(2) >> +/* Cross trigger FREQ packet request bit */ >> +#define TPDA_CR_FRIE BIT(3) >> +/* Cross trigger FLAG packet request interface bit */ >> +#define TPDA_CR_FLRIE BIT(4) >> +/* Cross trigger synchronization bit */ >> +#define TPDA_CR_SRIE BIT(5) >> +/* Packetize CMB/MCMB traffic bit */ >> +#define TPDA_CR_CMBCHANMODE BIT(20) >> + > > Why are these not clubbed with the other TPDA_CR_ defintions ? I should put this bit after: /* Bits 6 ~ 12 is for atid value */ #define TPDA_CR_ATID GENMASK(12, 6) +/* Bits 13 ~ 19 is for mid value */ +#define TPDA_CR_MID GENMASK(19, 13) MID here is the master ID which is used to identify the TPDA device itself in received packets when multiple tpda devices are enabled. Thanks, Jie > >> /* Aggregator port enable bit */ >> #define TPDA_Pn_CR_ENA BIT(0) >> /* Aggregator port CMB data set element size bit */ >> @@ -19,6 +32,8 @@ >> /* Bits 6 ~ 12 is for atid value */ >> #define TPDA_CR_ATID GENMASK(12, 6) >> +/* Bits 13 ~ 19 is for mid value */ >> +#define TPDA_CR_MID GENMASK(19, 13) >> /** >> * struct tpda_drvdata - specifics associated to an TPDA component >> @@ -29,6 +44,11 @@ >> * @enable: enable status of the component. >> * @dsb_esize Record the DSB element size. >> * @cmb_esize Record the CMB element size. >> + * @trig_async: Enable/disable cross trigger synchronization >> sequence interface. >> + * @trig_flag_ts: Enable/disable cross trigger FLAG packet request >> interface. >> + * @trig_freq: Enable/disable cross trigger FREQ packet request >> interface. >> + * @freq_ts: Enable/disable the timestamp for all FREQ packets. >> + * @cmbchan_mode: Configure the CMB/MCMB channel mode. >> */ >> struct tpda_drvdata { >> void __iomem *base; >> @@ -38,6 +58,11 @@ struct tpda_drvdata { >> u8 atid; >> u32 dsb_esize; >> u32 cmb_esize; >> + bool trig_async; >> + bool trig_flag_ts; >> + bool trig_freq; >> + bool freq_ts; >> + bool cmbchan_mode; >> }; >> #endif /* _CORESIGHT_CORESIGHT_TPDA_H */ > > Suzuki > ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 2/3] coresight: tpda: add logic to configure TPDA_SYNCR register 2025-10-28 2:02 [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan 2025-10-28 2:02 ` [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration Jie Gan @ 2025-10-28 2:02 ` Jie Gan 2025-10-28 2:02 ` [PATCH v4 3/3] coresight: tpda: add sysfs node to flush specific port Jie Gan ` (3 subsequent siblings) 5 siblings, 0 replies; 13+ messages in thread From: Jie Gan @ 2025-10-28 2:02 UTC (permalink / raw) To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Jie Gan, Tao Zhang From: Tao Zhang <tao.zhang@oss.qualcomm.com> The TPDA_SYNCR register defines the frequency at which TPDA generates ASYNC packets, enabling userspace tools to accurately parse each valid packet. 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> --- drivers/hwtracing/coresight/coresight-tpda.c | 7 +++++++ drivers/hwtracing/coresight/coresight-tpda.h | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c index a9a27bcc65a1..f079861da279 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.c +++ b/drivers/hwtracing/coresight/coresight-tpda.c @@ -178,6 +178,13 @@ static void tpda_enable_pre_port(struct tpda_drvdata *drvdata) */ if (drvdata->trig_flag_ts) writel_relaxed(0x0, drvdata->base + TPDA_FPID_CR); + + /* Program the counter value for TPDA_SYNCR */ + val = readl_relaxed(drvdata->base + TPDA_SYNCR); + /* Clear the mode */ + val &= ~TPDA_SYNCR_MODE_CTRL; + val |= TPDA_SYNCR_COUNTER_MASK; + writel_relaxed(val, drvdata->base + TPDA_SYNCR); } static int tpda_enable_port(struct tpda_drvdata *drvdata, int port) diff --git a/drivers/hwtracing/coresight/coresight-tpda.h b/drivers/hwtracing/coresight/coresight-tpda.h index 0be625fb52fd..0c9bf2fade56 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.h +++ b/drivers/hwtracing/coresight/coresight-tpda.h @@ -9,6 +9,7 @@ #define TPDA_CR (0x000) #define TPDA_Pn_CR(n) (0x004 + (n * 4)) #define TPDA_FPID_CR (0x084) +#define TPDA_SYNCR (0x08C) /* Cross trigger FREQ packets timestamp bit */ #define TPDA_CR_FREQTS BIT(2) @@ -27,6 +28,10 @@ #define TPDA_Pn_CR_CMBSIZE GENMASK(7, 6) /* Aggregator port DSB data set element size bit */ #define TPDA_Pn_CR_DSBSIZE BIT(8) +/* TPDA_SYNCR mode control bit */ +#define TPDA_SYNCR_MODE_CTRL BIT(12) +/* TPDA_SYNCR counter mask */ +#define TPDA_SYNCR_COUNTER_MASK GENMASK(11, 0) #define TPDA_MAX_INPORTS 32 -- 2.34.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 3/3] coresight: tpda: add sysfs node to flush specific port 2025-10-28 2:02 [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan 2025-10-28 2:02 ` [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration Jie Gan 2025-10-28 2:02 ` [PATCH v4 2/3] coresight: tpda: add logic to configure TPDA_SYNCR register Jie Gan @ 2025-10-28 2:02 ` Jie Gan 2025-11-06 5:21 ` [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan ` (2 subsequent siblings) 5 siblings, 0 replies; 13+ messages in thread From: Jie Gan @ 2025-10-28 2:02 UTC (permalink / raw) To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Jie Gan, Tao Zhang 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 | 41 ++++++++++++++++++++++ drivers/hwtracing/coresight/coresight-tpda.h | 1 + 3 files changed, 49 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda index 80e4b05a1ab4..e047f69fd5cc 100644 --- a/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda +++ b/Documentation/ABI/testing/sysfs-bus-coresight-devices-tpda @@ -41,3 +41,10 @@ Contact: Jinlong Mao <jinlong.mao@oss.qualcomm.com>, Tao Zhang <tao.zhang@oss.qu Description: (RW) Configure the CMB/MCMB channel mode for all enabled ports. Value 0 means raw channel mapping mode. Value 1 means channel pair marking mode. + +What: /sys/bus/coresight/devices/<tpda-name>/port_flush_req +Date: October 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. diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c index f079861da279..3121c4c527fa 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.c +++ b/drivers/hwtracing/coresight/coresight-tpda.c @@ -481,6 +481,46 @@ static ssize_t cmbchan_mode_store(struct device *dev, } static DEVICE_ATTR_RW(cmbchan_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); + CS_UNLOCK(drvdata->base); + val = readl_relaxed(drvdata->base + TPDA_FLUSH_CR); + CS_LOCK(drvdata->base); + 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_trig_async_enable.attr, &dev_attr_trig_flag_ts_enable.attr, @@ -488,6 +528,7 @@ static struct attribute *tpda_attrs[] = { &dev_attr_freq_ts_enable.attr, &dev_attr_global_flush_req.attr, &dev_attr_cmbchan_mode.attr, + &dev_attr_port_flush_req.attr, NULL, }; diff --git a/drivers/hwtracing/coresight/coresight-tpda.h b/drivers/hwtracing/coresight/coresight-tpda.h index 0c9bf2fade56..284ac63699ad 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 FREQ packets timestamp bit */ #define TPDA_CR_FREQTS BIT(2) -- 2.34.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers 2025-10-28 2:02 [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan ` (2 preceding siblings ...) 2025-10-28 2:02 ` [PATCH v4 3/3] coresight: tpda: add sysfs node to flush specific port Jie Gan @ 2025-11-06 5:21 ` Jie Gan 2025-11-17 5:38 ` Jie Gan 2025-11-21 8:28 ` Jie Gan 5 siblings, 0 replies; 13+ messages in thread From: Jie Gan @ 2025-11-06 5:21 UTC (permalink / raw) To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Tao Zhang On 10/28/2025 10:02 AM, Jie Gan wrote: > Patchset 1 introduces configuration of the cross-trigger registers with > appropriate values to enable proper generation of cross-trigger packets. > > Patchset 2 introduces a logic to configure the TPDA_SYNCR register, > which determines the frequency of ASYNC packet generation. These packets > assist userspace tools in accurately identifying each valid packet. > > Patchset 3 introduces a sysfs node to initiate a flush request for the > specific port, forcing the data to synchronize and be transmitted to the > sink device. > Gentle reminder. > Changes in V4: > 1. Document sysfs nodes with correct kernel version and date. > Link to V3 - https://lore.kernel.org/linux-arm-kernel/20250827105545.7140-1-jie.gan@oss.qualcomm.com/ > > Changes in V3: > 1. Optimizing codes according to James's comment. > Link to V2 - https://lore.kernel.org/all/20250827042042.6786-1-jie.gan@oss.qualcomm.com/ > > Changes in V2: > 1. Refactoring the code based on James's comment for optimization. > Link to V1 - https://lore.kernel.org/all/20250826070150.5603-1-jie.gan@oss.qualcomm.com/ > > Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com> > --- > Tao Zhang (3): > coresight: tpda: add sysfs nodes for tpda cross-trigger configuration > coresight: tpda: add logic to configure TPDA_SYNCR register > coresight: tpda: add sysfs node to flush specific port > > .../ABI/testing/sysfs-bus-coresight-devices-tpda | 50 ++++ > drivers/hwtracing/coresight/coresight-tpda.c | 278 +++++++++++++++++++++ > drivers/hwtracing/coresight/coresight-tpda.h | 33 ++- > 3 files changed, 360 insertions(+), 1 deletion(-) > --- > base-commit: 8fec172c82c2b5f6f8e47ab837c1dc91ee3d1b87 > change-id: 20251028-configure_tpda_reg-f3396f97f9a1 > > Best regards, ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers 2025-10-28 2:02 [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan ` (3 preceding siblings ...) 2025-11-06 5:21 ` [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan @ 2025-11-17 5:38 ` Jie Gan 2025-11-21 8:28 ` Jie Gan 5 siblings, 0 replies; 13+ messages in thread From: Jie Gan @ 2025-11-17 5:38 UTC (permalink / raw) To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Tao Zhang On 10/28/2025 10:02 AM, Jie Gan wrote: > Patchset 1 introduces configuration of the cross-trigger registers with > appropriate values to enable proper generation of cross-trigger packets. > > Patchset 2 introduces a logic to configure the TPDA_SYNCR register, > which determines the frequency of ASYNC packet generation. These packets > assist userspace tools in accurately identifying each valid packet. > > Patchset 3 introduces a sysfs node to initiate a flush request for the > specific port, forcing the data to synchronize and be transmitted to the > sink device. > Gentle reminder. > Changes in V4: > 1. Document sysfs nodes with correct kernel version and date. > Link to V3 - https://lore.kernel.org/linux-arm-kernel/20250827105545.7140-1-jie.gan@oss.qualcomm.com/ > > Changes in V3: > 1. Optimizing codes according to James's comment. > Link to V2 - https://lore.kernel.org/all/20250827042042.6786-1-jie.gan@oss.qualcomm.com/ > > Changes in V2: > 1. Refactoring the code based on James's comment for optimization. > Link to V1 - https://lore.kernel.org/all/20250826070150.5603-1-jie.gan@oss.qualcomm.com/ > > Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com> > --- > Tao Zhang (3): > coresight: tpda: add sysfs nodes for tpda cross-trigger configuration > coresight: tpda: add logic to configure TPDA_SYNCR register > coresight: tpda: add sysfs node to flush specific port > > .../ABI/testing/sysfs-bus-coresight-devices-tpda | 50 ++++ > drivers/hwtracing/coresight/coresight-tpda.c | 278 +++++++++++++++++++++ > drivers/hwtracing/coresight/coresight-tpda.h | 33 ++- > 3 files changed, 360 insertions(+), 1 deletion(-) > --- > base-commit: 8fec172c82c2b5f6f8e47ab837c1dc91ee3d1b87 > change-id: 20251028-configure_tpda_reg-f3396f97f9a1 > > Best regards, ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers 2025-10-28 2:02 [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan ` (4 preceding siblings ...) 2025-11-17 5:38 ` Jie Gan @ 2025-11-21 8:28 ` Jie Gan 5 siblings, 0 replies; 13+ messages in thread From: Jie Gan @ 2025-11-21 8:28 UTC (permalink / raw) To: Suzuki K Poulose, Mike Leach, James Clark, Alexander Shishkin, Tingwei Zhang Cc: coresight, linux-arm-kernel, linux-kernel, Tao Zhang On 10/28/2025 10:02 AM, Jie Gan wrote: > Patchset 1 introduces configuration of the cross-trigger registers with > appropriate values to enable proper generation of cross-trigger packets. > > Patchset 2 introduces a logic to configure the TPDA_SYNCR register, > which determines the frequency of ASYNC packet generation. These packets > assist userspace tools in accurately identifying each valid packet. > > Patchset 3 introduces a sysfs node to initiate a flush request for the > specific port, forcing the data to synchronize and be transmitted to the > sink device. Gentle reminder. > > Changes in V4: > 1. Document sysfs nodes with correct kernel version and date. > Link to V3 - https://lore.kernel.org/linux-arm-kernel/20250827105545.7140-1-jie.gan@oss.qualcomm.com/ > > Changes in V3: > 1. Optimizing codes according to James's comment. > Link to V2 - https://lore.kernel.org/all/20250827042042.6786-1-jie.gan@oss.qualcomm.com/ > > Changes in V2: > 1. Refactoring the code based on James's comment for optimization. > Link to V1 - https://lore.kernel.org/all/20250826070150.5603-1-jie.gan@oss.qualcomm.com/ > > Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com> > --- > Tao Zhang (3): > coresight: tpda: add sysfs nodes for tpda cross-trigger configuration > coresight: tpda: add logic to configure TPDA_SYNCR register > coresight: tpda: add sysfs node to flush specific port > > .../ABI/testing/sysfs-bus-coresight-devices-tpda | 50 ++++ > drivers/hwtracing/coresight/coresight-tpda.c | 278 +++++++++++++++++++++ > drivers/hwtracing/coresight/coresight-tpda.h | 33 ++- > 3 files changed, 360 insertions(+), 1 deletion(-) > --- > base-commit: 8fec172c82c2b5f6f8e47ab837c1dc91ee3d1b87 > change-id: 20251028-configure_tpda_reg-f3396f97f9a1 > > Best regards, ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-12-19 4:54 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-10-28 2:02 [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan 2025-10-28 2:02 ` [PATCH v4 1/3] coresight: tpda: add sysfs nodes for tpda cross-trigger configuration Jie Gan 2025-12-18 6:22 ` Jie Gan 2025-12-18 9:19 ` Suzuki K Poulose 2025-12-18 11:10 ` Suzuki K Poulose 2025-12-18 11:20 ` Suzuki K Poulose 2025-12-19 4:53 ` Jie Gan 2025-12-19 3:31 ` Jie Gan 2025-10-28 2:02 ` [PATCH v4 2/3] coresight: tpda: add logic to configure TPDA_SYNCR register Jie Gan 2025-10-28 2:02 ` [PATCH v4 3/3] coresight: tpda: add sysfs node to flush specific port Jie Gan 2025-11-06 5:21 ` [PATCH v4 0/3] add sysfs nodes to configure TPDA's registers Jie Gan 2025-11-17 5:38 ` Jie Gan 2025-11-21 8:28 ` Jie Gan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox