On Tue, Mar 24, 2026 at 10:41:56AM +0000, Liviu Dudau wrote:
> On Mon, Mar 23, 2026 at 05:12:01PM +0100, Marcin Ślusarz wrote:
> > On Mon, Mar 23, 2026 at 01:16:30PM +0000, Liviu Dudau wrote:
> > > On Thu, Mar 19, 2026 at 04:33:48PM +0100, Marcin Ślusarz wrote:
> > > > 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.
> > > 
> > > OK, are you going to re-spin?
> > 
> > Yes, as soon as we get to some conclusion.
> > 
> > > > > > 
> > > > > > > > +               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,
> > > 
> > > I understand that you want to make sure that user space doesn't insert 
> > > values into the
> > > flags and then pretends that because we didn't return an error that's now 
> > > part of the
> > > ABI. But then maybe you should not reserve the extra bit now if you don't 
> > > know how
> > > it's going to be used (in other words, why not make 
> > > TIMESTAMP_CPU_TYPE_MASK  3 << 1?).
> > 
> > I think it makes sense to reserve this bit now to make it easier to
> > extend the interface if we ever will need to. Changing uapi definition
> > is painful enough, so reserving this will rule out misuses of the current
> > value. Another point is that we would have to validate that the bit is 0
> > anyway, so I don't see why we can't include that bit in the field that
> > is supposed to go with.
> 
> You do validate the bits in the if (flags & ~VALID_TIMESTAMP_QUERY_FLAGS) 
> test if the
> QUERY_FLAGS bitfield is updated.
> 
> > 
> > > > 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.
> > > 
> > > I am confused about why TIMESTAMP_CPU is a continous range [0-7] while 
> > > the rest of the
> > > flags are bits in a bitmask. A note should be added to the panthor_drm.h 
> > > file to
> > > explain this.
> > 
> > Well, just look at the definition of struct drm_panthor_timestamp_info -
> > there's one to one relation between field and a DRM_PANTHOR_TIMESTAMP_* 
> > flag,
> > with an exception that CPU timestamp types have only one field (well,
> > a pair of "seconds" and "nanoseconds", but from logical perspective it's
> > only one value). There's no known reason why anyone would want to query
> > multiple CPU timestamps together with various GPU counters from _GPU_ query.
> 
> OK, so what I'm hearing is: we're reserving space for up to 6 CPU clock 
> sources (zero is
> no CPU clock) but you can have only one active at any time (because we can't 
> think of any
> reason why you would want more at the same time) and we currently only define 
> two sources
> because that's what user space cares about.
> 
> If you agree with this then this will be recorded in the thread and we can go 
> back in the
> future and reference it.

Up to 7 CPU clock sources and 0 as no CPU clock, but yes, this is the intent.

> 
> > 
> > > 
> > > > 
> > > > 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.
> > > 
> > > It only makes sense if you explain that TIMESTAMP_CPU values are in a 
> > > range. I kept reading
> > > the different versions of the patch thinking that they are bits in a 
> > > bitmask, with
> > > TIMESTAMP_CPU_NONE being the logical state of not selecting any of the 
> > > sources.
> > 
> > That should be resolved with the documentation update below, right?
> 
> The documentation doesn't say anything about the intent for future values for 
> CPU sources, but
> if you don't want to add more in the documentation at least we have this 
> thread as reference.

It's not that I don't want to add more documentation, I just don't
understand what else needs to be explained.

> 
> I don't want to turn this into a bikeshedding thread, so please do a v4 with 
> the switch case updated
> and the documentation addition and I will ACK that.

Done

Reply via email to