On Thu, Mar 19, 2026 at 03:17:36PM +0000, Liviu Dudau wrote:
> On Thu, Mar 19, 2026 at 01:39:40PM +0100, Marcin Ślusarz wrote:
> > On Thu, Mar 19, 2026 at 11:43:45AM +0000, Liviu Dudau wrote:
> > > Hi Marcin,
> > > 
> > > On Thu, Mar 19, 2026 at 12:00:53PM +0100, Marcin Slusarz wrote:
> > > > ...
> > > > +#define VALID_TIMESTAMP_QUERY_FLAGS \
> > > > +               (DRM_PANTHOR_TIMESTAMP_GPU | \
> > > > +                DRM_PANTHOR_TIMESTAMP_CPU_TYPE_MASK | \
> > > > +                DRM_PANTHOR_TIMESTAMP_GPU_OFFSET | \
> > > > +                DRM_PANTHOR_TIMESTAMP_GPU_CYCLE_COUNT | \
> > > > +                DRM_PANTHOR_TIMESTAMP_FREQ | \
> > > > +                DRM_PANTHOR_TIMESTAMP_DURATION)
> > > > +
> > > >  static int panthor_query_timestamp_info(struct panthor_device *ptdev,
> > > >                                         struct 
> > > > drm_panthor_timestamp_info *arg)
> > > >  {
> > > >         int ret;
> > > > +       u32 flags;
> > > > +       unsigned long irq_flags;
> > > > +       struct timespec64 cpu_ts;
> > > > +       u64 query_start_time;
> > > > +       bool minimize_interruption;
> > > > +       u32 timestamp_types = 0;
> > > > +
> > > > +       if (arg->flags != 0) {
> > > > +               flags = arg->flags;
> > > > +       } else {
> > > > +               /*
> > > > +                * If flags are 0, then ask for the same things that we 
> > > > asked
> > > > +                * for before flags were added.
> > > > +                */
> > > > +               flags = DRM_PANTHOR_TIMESTAMP_GPU |
> > > > +                       DRM_PANTHOR_TIMESTAMP_GPU_OFFSET |
> > > > +                       DRM_PANTHOR_TIMESTAMP_FREQ;
> > > > +       }
> > > > +
> > > > +       switch (flags & DRM_PANTHOR_TIMESTAMP_CPU_TYPE_MASK) {
> > > > +       case 0:
> > 
> > Umm, this should be DRM_PANTHOR_TIMESTAMP_CPU_NONE.
> > 
> > > > +               break;
> > > > +       case DRM_PANTHOR_TIMESTAMP_CPU_MONOTONIC:
> > > > +       case DRM_PANTHOR_TIMESTAMP_CPU_MONOTONIC_RAW:
> > > > +               timestamp_types++;
> > > > +               break;
> > > > +       default:
> > > > +               return -EINVAL;
> > > > +       }
> > > > +
> > > > +       if (flags & ~VALID_TIMESTAMP_QUERY_FLAGS)
> > > > +               return -EINVAL;
> > > 
> > > Can we move this check before the switch and simplify the switch itself 
> > > to only do the timestamp_types increment?
> > 
> > DRM_PANTHOR_TIMESTAMP_CPU_TYPE_MASK is bit field that holds individual
> > clock type values, so we still need to validate the bit field.
> 
> The if () test eliminates the default case, and if you change the switch to:
> 
>       switch (flags & DRM_PANTHOR_TIMESTAMP_CPU_NONE) {
>       case DRM_PANTHOR_TIMESTAMP_CPU_MONOTONIC:
>       case DRM_PANTHOR_TIMESTAMP_CPU_MONOTONIC_RAW:
>               timestamp_types++;
>               break;
>       }
> 
> then it should be equivalent, right?

We need the default case to detect garbage values in the part of flags
that ands with DRM_PANTHOR_TIMESTAMP_CPU_TYPE_MASK.

DRM_PANTHOR_TIMESTAMP_CPU_TYPE_MASK is 7 << 1,
DRM_PANTHOR_TIMESTAMP_CPU_MONOTONIC is 1 << 1,
DRM_PANTHOR_TIMESTAMP_CPU_MONOTONIC_RAW is 2 << 1,
so 3 << 1, 4 << 1, 5 << 1, 6 << 1, 7 << 1 are all invalid values that need
to be rejected.

And since DRM_PANTHOR_TIMESTAMP_CPU_NONE is 0 << 1, we need it too in
the switch to not be caught by the default case.

> > 
> > > > +
> > > > +       if (flags & DRM_PANTHOR_TIMESTAMP_GPU)
> > > > +               timestamp_types++;
> > > > +       if (flags & DRM_PANTHOR_TIMESTAMP_GPU_CYCLE_COUNT)
> > > > +               timestamp_types++;
> > > > +
> > > > +       /* If user asked to obtain timestamps from more than one source,
> > > > +        * then it very likely means they want them to be as close as 
> > > > possible.
> > > > +        * If they asked for duration, then that likely means that they
> > > > +        * want to know how long obtaining timestamp takes, without 
> > > > random
> > > > +        * events, like process scheduling or interrupts.
> > > > +        */
> > > 
> > > This comment makes me think that user can ask for both CPU_MONOTONIC and
> > > CPU_MONOTONIC_RAW timestamps, but the code is built to make them 
> > > exclusive.
> > > Can we document better what sources can be requested simultaneously?
> > 
> > Somethine like this?
> > 
> > diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h
> > index 8a46ef040c3d..0e455d91e77d 100644
> > --- a/include/uapi/drm/panthor_drm.h
> > +++ b/include/uapi/drm/panthor_drm.h
> > @@ -466,6 +466,11 @@ struct drm_panthor_timestamp_info {
> >          *  DRM_PANTHOR_TIMESTAMP_GPU |
> >          *  DRM_PANTHOR_TIMESTAMP_GPU_OFFSET |
> >          *  DRM_PANTHOR_TIMESTAMP_FREQ
> > +        *
> > +        * Note: these flags are exclusive to each other (only one can be 
> > used):
> > +        * - DRM_PANTHOR_TIMESTAMP_CPU_NONE
> > +        * - DRM_PANTHOR_TIMESTAMP_CPU_MONOTONIC
> > +        * - DRM_PANTHOR_TIMESTAMP_CPU_MONOTONIC_RAW
> 
> Yes, looks good to me.
> 
> Best regards,
> Liviu
> 
> >          */
> >         __u32 flags;
> >  
> 
> -- 
> ====================
> | I would like to |
> | fix the world,  |
> | but they're not |
> | giving me the   |
>  \ source code!  /
>   ---------------
>     ¯\_(ツ)_/¯

Reply via email to