Re: [PATCH v5 2/3] coresight: Add support to get static id for system trace sources

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 21 Oct 2024 at 13:09, Suzuki K Poulose <suzuki.poulose@xxxxxxx> 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@xxxxxxxxxxx>
> > ---
> >   .../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@xxxxxxxxxx>

-- 
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux