Add a list to store allocated etr_buf.
The byte-cntr functionality requires two etr_buf to receive trace data.
The active etr_buf collects the trace data from source device, while the
byte-cntr reading function accesses the deactivated etr_buf after is
has been filled and synced, transferring data to the userspace.
Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
---
.../hwtracing/coresight/coresight-tmc-core.c | 1 +
drivers/hwtracing/coresight/coresight-tmc.h | 19 +++++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c
index be964656be93..4d249af93097 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-core.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-core.c
@@ -830,6 +830,7 @@ static int __tmc_probe(struct device *dev, struct resource *res)
idr_init(&drvdata->idr);
mutex_init(&drvdata->idr_mutex);
dev_list = &etr_devs;
+ INIT_LIST_HEAD(&drvdata->etr_buf_list);
break;
case TMC_CONFIG_TYPE_ETF:
desc.groups = coresight_etf_groups;
diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h
index 6541a27a018e..52ee5f8efe8c 100644
--- a/drivers/hwtracing/coresight/coresight-tmc.h
+++ b/drivers/hwtracing/coresight/coresight-tmc.h
@@ -208,6 +208,21 @@ struct tmc_resrv_buf {
s64 len;
};
+/**
+ * @sysfs_buf: Allocated sysfs_buf.
+ * @is_free: Indicates whether the buffer is free to choose.
+ * @reading: Indicates whether the buffer is reading.
+ * @pos: Position of the buffer.
+ * @node: Node in etr_buf_list.
+ */
+struct etr_buf_node {
+ struct etr_buf *sysfs_buf;
+ bool is_free;
+ bool reading;
+ loff_t pos;
+ struct list_head node;
+};
+
/**
* struct tmc_drvdata - specifics associated to an TMC component
* @pclk: APB clock if present, otherwise NULL
@@ -242,6 +257,8 @@ struct tmc_resrv_buf {
* (after crash) by default.
* @crash_mdata: Reserved memory for storing tmc crash metadata.
* Used by ETR/ETF.
+ * @etr_buf_list: List that is used to manage allocated etr_buf.
+ * @reading_node: Available buffer for byte-cntr reading.
*/
struct tmc_drvdata {
struct clk *pclk;
@@ -271,6 +288,8 @@ struct tmc_drvdata {
struct etr_buf *perf_buf;
struct tmc_resrv_buf resrv_buf;
struct tmc_resrv_buf crash_mdata;
+ struct list_head etr_buf_list;
+ struct etr_buf_node *reading_node;
};
struct etr_buf_operations {
--
2.34.1
Hi On Fri, 25 Jul 2025 at 11:08, Jie Gan <jie.gan@oss.qualcomm.com> wrote: > > Add a list to store allocated etr_buf. > > The byte-cntr functionality requires two etr_buf to receive trace data. > The active etr_buf collects the trace data from source device, while the > byte-cntr reading function accesses the deactivated etr_buf after is > has been filled and synced, transferring data to the userspace. > > Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com> > --- > .../hwtracing/coresight/coresight-tmc-core.c | 1 + > drivers/hwtracing/coresight/coresight-tmc.h | 19 +++++++++++++++++++ > 2 files changed, 20 insertions(+) > > diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c > index be964656be93..4d249af93097 100644 > --- a/drivers/hwtracing/coresight/coresight-tmc-core.c > +++ b/drivers/hwtracing/coresight/coresight-tmc-core.c > @@ -830,6 +830,7 @@ static int __tmc_probe(struct device *dev, struct resource *res) > idr_init(&drvdata->idr); > mutex_init(&drvdata->idr_mutex); > dev_list = &etr_devs; > + INIT_LIST_HEAD(&drvdata->etr_buf_list); > break; > case TMC_CONFIG_TYPE_ETF: > desc.groups = coresight_etf_groups; > diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h > index 6541a27a018e..52ee5f8efe8c 100644 > --- a/drivers/hwtracing/coresight/coresight-tmc.h > +++ b/drivers/hwtracing/coresight/coresight-tmc.h > @@ -208,6 +208,21 @@ struct tmc_resrv_buf { > s64 len; > }; > > +/** > + * @sysfs_buf: Allocated sysfs_buf. > + * @is_free: Indicates whether the buffer is free to choose. > + * @reading: Indicates whether the buffer is reading. > + * @pos: Position of the buffer. > + * @node: Node in etr_buf_list. > + */ > +struct etr_buf_node { > + struct etr_buf *sysfs_buf; > + bool is_free; > + bool reading; > + loff_t pos; > + struct list_head node; > +}; > + > /** > * struct tmc_drvdata - specifics associated to an TMC component > * @pclk: APB clock if present, otherwise NULL > @@ -242,6 +257,8 @@ struct tmc_resrv_buf { > * (after crash) by default. > * @crash_mdata: Reserved memory for storing tmc crash metadata. > * Used by ETR/ETF. > + * @etr_buf_list: List that is used to manage allocated etr_buf. > + * @reading_node: Available buffer for byte-cntr reading. > */ > struct tmc_drvdata { > struct clk *pclk; > @@ -271,6 +288,8 @@ struct tmc_drvdata { > struct etr_buf *perf_buf; > struct tmc_resrv_buf resrv_buf; > struct tmc_resrv_buf crash_mdata; > + struct list_head etr_buf_list; > + struct etr_buf_node *reading_node; Potential simplification:- do you need both reading_node here and reading in the etr_buf_node? reading_node handles the logic for which buffer is being read, while is_free handles the empty/full logic - reading seems unneeded? > }; > > struct etr_buf_operations { > -- > 2.34.1 > regards Mike -- Mike Leach Principal Engineer, ARM Ltd. Manchester Design Centre. UK
On 8/5/2025 6:15 PM, Mike Leach wrote: > Hi > > On Fri, 25 Jul 2025 at 11:08, Jie Gan <jie.gan@oss.qualcomm.com> wrote: >> >> Add a list to store allocated etr_buf. >> >> The byte-cntr functionality requires two etr_buf to receive trace data. >> The active etr_buf collects the trace data from source device, while the >> byte-cntr reading function accesses the deactivated etr_buf after is >> has been filled and synced, transferring data to the userspace. >> >> Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com> >> --- >> .../hwtracing/coresight/coresight-tmc-core.c | 1 + >> drivers/hwtracing/coresight/coresight-tmc.h | 19 +++++++++++++++++++ >> 2 files changed, 20 insertions(+) >> >> diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c >> index be964656be93..4d249af93097 100644 >> --- a/drivers/hwtracing/coresight/coresight-tmc-core.c >> +++ b/drivers/hwtracing/coresight/coresight-tmc-core.c >> @@ -830,6 +830,7 @@ static int __tmc_probe(struct device *dev, struct resource *res) >> idr_init(&drvdata->idr); >> mutex_init(&drvdata->idr_mutex); >> dev_list = &etr_devs; >> + INIT_LIST_HEAD(&drvdata->etr_buf_list); >> break; >> case TMC_CONFIG_TYPE_ETF: >> desc.groups = coresight_etf_groups; >> diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h >> index 6541a27a018e..52ee5f8efe8c 100644 >> --- a/drivers/hwtracing/coresight/coresight-tmc.h >> +++ b/drivers/hwtracing/coresight/coresight-tmc.h >> @@ -208,6 +208,21 @@ struct tmc_resrv_buf { >> s64 len; >> }; >> >> +/** >> + * @sysfs_buf: Allocated sysfs_buf. >> + * @is_free: Indicates whether the buffer is free to choose. >> + * @reading: Indicates whether the buffer is reading. >> + * @pos: Position of the buffer. >> + * @node: Node in etr_buf_list. >> + */ >> +struct etr_buf_node { >> + struct etr_buf *sysfs_buf; >> + bool is_free; >> + bool reading; >> + loff_t pos; >> + struct list_head node; >> +}; >> + >> /** >> * struct tmc_drvdata - specifics associated to an TMC component >> * @pclk: APB clock if present, otherwise NULL >> @@ -242,6 +257,8 @@ struct tmc_resrv_buf { >> * (after crash) by default. >> * @crash_mdata: Reserved memory for storing tmc crash metadata. >> * Used by ETR/ETF. >> + * @etr_buf_list: List that is used to manage allocated etr_buf. >> + * @reading_node: Available buffer for byte-cntr reading. >> */ >> struct tmc_drvdata { >> struct clk *pclk; >> @@ -271,6 +288,8 @@ struct tmc_drvdata { >> struct etr_buf *perf_buf; >> struct tmc_resrv_buf resrv_buf; >> struct tmc_resrv_buf crash_mdata; >> + struct list_head etr_buf_list; >> + struct etr_buf_node *reading_node; > > Potential simplification:- > do you need both reading_node here and reading in the etr_buf_node? > reading_node handles the logic for which buffer is being read, while > is_free handles the empty/full logic - reading seems unneeded? Yes, you are right. I checked the usage of reading. It can be replaced by reading_node in switch function. I will simplify this patch in next version. Thanks, Jie > >> }; >> >> struct etr_buf_operations { >> -- >> 2.34.1 >> > > regards > > Mike >
© 2016 - 2025 Red Hat, Inc.