[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAJ9a7VgQX0ZGxLyVDtBrymi0tpqS_r1TKx3k4Wo1Ea35j9k+dA@mail.gmail.com>
Date: Tue, 22 Oct 2024 10:42:55 +0100
From: Mike Leach <mike.leach@...aro.org>
To: Suzuki K Poulose <suzuki.poulose@....com>
Cc: Mao Jinlong <quic_jinlmao@...cinc.com>, James Clark <james.clark@....com>,
Rob Herring <robh@...nel.org>, Krzysztof Kozlowski <krzk+dt@...nel.org>, Conor Dooley <conor+dt@...nel.org>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>, coresight@...ts.linaro.org,
linux-arm-kernel@...ts.infradead.org, devicetree@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-arm-msm@...r.kernel.org
Subject: Re: [PATCH v5 2/3] coresight: Add support to get static id for system
trace sources
On Mon, 21 Oct 2024 at 13:09, Suzuki K Poulose <suzuki.poulose@....com> wrote:
>
> On 18/10/2024 04:22, Mao Jinlong wrote:
> > Dynamic trace id was introduced in coresight subsystem, so trace id is
> > allocated dynamically. However, some hardware ATB source has static trace
> > id and it cannot be changed via software programming. For such source,
> > it can call coresight_get_static_trace_id to get the fixed trace id from
> > device node and pass id to coresight_trace_id_get_static_system_id to
> > reserve the id.
> >
> > Signed-off-by: Mao Jinlong <quic_jinlmao@...cinc.com>
> > ---
> > .../hwtracing/coresight/coresight-platform.c | 9 +++++
> > .../hwtracing/coresight/coresight-trace-id.c | 38 ++++++++++++++-----
> > .../hwtracing/coresight/coresight-trace-id.h | 9 +++++
> > include/linux/coresight.h | 1 +
> > 4 files changed, 47 insertions(+), 10 deletions(-)
> >
> > diff --git a/drivers/hwtracing/coresight/coresight-platform.c b/drivers/hwtracing/coresight/coresight-platform.c
> > index 64e171eaad82..b03aa43d3cba 100644
> > --- a/drivers/hwtracing/coresight/coresight-platform.c
> > +++ b/drivers/hwtracing/coresight/coresight-platform.c
> > @@ -796,6 +796,15 @@ int coresight_get_cpu(struct device *dev)
> > }
> > EXPORT_SYMBOL_GPL(coresight_get_cpu);
> >
> > +int coresight_get_static_trace_id(struct device *dev, u32 *id)
> > +{
> > + if (!is_of_node(dev->fwnode))
> > + return -EINVAL;
> > +
>
> You don't need this check, with the fwnode_property_read(). Rest looks
> fine to me.
>
> Suzuki
>
>
>
> > + return fwnode_property_read_u32(dev_fwnode(dev), "arm,static-trace-id", id);
> > +}
> > +EXPORT_SYMBOL_GPL(coresight_get_static_trace_id);
> > +
> > struct coresight_platform_data *
> > coresight_get_platform_data(struct device *dev)
> > {
> > diff --git a/drivers/hwtracing/coresight/coresight-trace-id.c b/drivers/hwtracing/coresight/coresight-trace-id.c
> > index d98e12cb30ec..269a5f7b279f 100644
> > --- a/drivers/hwtracing/coresight/coresight-trace-id.c
> > +++ b/drivers/hwtracing/coresight/coresight-trace-id.c
> > @@ -12,6 +12,12 @@
> >
> > #include "coresight-trace-id.h"
> >
> > +enum trace_id_flags {
> > + TRACE_ID_ANY = 0x0,
> > + TRACE_ID_PREFER_ODD = 0x1,
> > + TRACE_ID_REQ_STATIC = 0x2,
> > +};
> > +
> > /* Default trace ID map. Used in sysfs mode and for system sources */
> > static DEFINE_PER_CPU(atomic_t, id_map_default_cpu_ids) = ATOMIC_INIT(0);
> > static struct coresight_trace_id_map id_map_default = {
> > @@ -74,16 +80,19 @@ static int coresight_trace_id_find_odd_id(struct coresight_trace_id_map *id_map)
> > * Otherwise allocate next available ID.
> > */
> > static int coresight_trace_id_alloc_new_id(struct coresight_trace_id_map *id_map,
> > - int preferred_id, bool prefer_odd_id)
> > + int preferred_id, unsigned int flags)
> > {
> > int id = 0;
> >
> > /* for backwards compatibility, cpu IDs may use preferred value */
> > - if (IS_VALID_CS_TRACE_ID(preferred_id) &&
> > - !test_bit(preferred_id, id_map->used_ids)) {
> > - id = preferred_id;
> > - goto trace_id_allocated;
> > - } else if (prefer_odd_id) {
> > + if (IS_VALID_CS_TRACE_ID(preferred_id)) {
> > + if (!test_bit(preferred_id, id_map->used_ids)) {
> > + id = preferred_id;
> > + goto trace_id_allocated;
> > + } else if (WARN((flags & TRACE_ID_REQ_STATIC), "Trace ID %d is used.\n",
If another version of this set is done, then consider making this
message more specific - e.g. "Requested Static Trace ID %d is not
available"
> > + preferred_id))
> > + return -EINVAL;
> > + } else if (flags & TRACE_ID_PREFER_ODD) {
> > /* may use odd ids to avoid preferred legacy cpu IDs */
> > id = coresight_trace_id_find_odd_id(id_map);
> > if (id)
> > @@ -153,7 +162,7 @@ static int _coresight_trace_id_get_cpu_id(int cpu, struct coresight_trace_id_map
> > */
> > id = coresight_trace_id_alloc_new_id(id_map,
> > CORESIGHT_LEGACY_CPU_TRACE_ID(cpu),
> > - false);
> > + TRACE_ID_ANY);
> > if (!IS_VALID_CS_TRACE_ID(id))
> > goto get_cpu_id_out_unlock;
> >
> > @@ -188,14 +197,15 @@ static void _coresight_trace_id_put_cpu_id(int cpu, struct coresight_trace_id_ma
> > DUMP_ID_MAP(id_map);
> > }
> >
> > -static int coresight_trace_id_map_get_system_id(struct coresight_trace_id_map *id_map)
> > +static int coresight_trace_id_map_get_system_id(struct coresight_trace_id_map *id_map,
> > + int preferred_id, unsigned int traceid_flags)
> > {
> > unsigned long flags;
> > int id;
> >
> > spin_lock_irqsave(&id_map->lock, flags);
> > /* prefer odd IDs for system components to avoid legacy CPU IDS */
This comment now belongs in coresight_trace_id_get_system_id()
> > - id = coresight_trace_id_alloc_new_id(id_map, 0, true);
> > + id = coresight_trace_id_alloc_new_id(id_map, preferred_id, traceid_flags);
> > spin_unlock_irqrestore(&id_map->lock, flags);
> >
> > DUMP_ID(id);
> > @@ -255,10 +265,18 @@ EXPORT_SYMBOL_GPL(coresight_trace_id_read_cpu_id_map);
> >
> > int coresight_trace_id_get_system_id(void)
> > {
> > - return coresight_trace_id_map_get_system_id(&id_map_default);
> > + return coresight_trace_id_map_get_system_id(&id_map_default, 0,
> > + TRACE_ID_PREFER_ODD);
> > }
> > EXPORT_SYMBOL_GPL(coresight_trace_id_get_system_id);
> >
> > +int coresight_trace_id_get_static_system_id(int trace_id)
> > +{
> > + return coresight_trace_id_map_get_system_id(&id_map_default,
> > + trace_id, TRACE_ID_REQ_STATIC);
> > +}
> > +EXPORT_SYMBOL_GPL(coresight_trace_id_get_static_system_id);
> > +
> > void coresight_trace_id_put_system_id(int id)
> > {
> > coresight_trace_id_map_put_system_id(&id_map_default, id);
> > diff --git a/drivers/hwtracing/coresight/coresight-trace-id.h b/drivers/hwtracing/coresight/coresight-trace-id.h
> > index 9aae50a553ca..db68e1ec56b6 100644
> > --- a/drivers/hwtracing/coresight/coresight-trace-id.h
> > +++ b/drivers/hwtracing/coresight/coresight-trace-id.h
> > @@ -116,6 +116,15 @@ int coresight_trace_id_read_cpu_id_map(int cpu, struct coresight_trace_id_map *i
> > */
> > int coresight_trace_id_get_system_id(void);
> >
> > +/**
> > + * Allocate a CoreSight static trace ID for a system component.
> > + *
> > + * Used to allocate static IDs for system trace sources such as dummy source.
> > + *
> > + * return: Trace ID or -EINVAL if allocation is impossible.
> > + */
> > +int coresight_trace_id_get_static_system_id(int id);
> > +
> > /**
> > * Release an allocated system trace ID.
> > *
> > diff --git a/include/linux/coresight.h b/include/linux/coresight.h
> > index c13342594278..129795873072 100644
> > --- a/include/linux/coresight.h
> > +++ b/include/linux/coresight.h
> > @@ -662,6 +662,7 @@ void coresight_relaxed_write64(struct coresight_device *csdev,
> > void coresight_write64(struct coresight_device *csdev, u64 val, u32 offset);
> >
> > extern int coresight_get_cpu(struct device *dev);
> > +extern int coresight_get_static_trace_id(struct device *dev, u32 *id);
> >
> > struct coresight_platform_data *coresight_get_platform_data(struct device *dev);
> > struct coresight_connection *
>
Other than minor issues above...
Reviewed-by: Mike Leach <mike.leach@...aro.org>
--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK
Powered by blists - more mailing lists