[PATCH 10/11] drm/omap: use drm_send_vblank_event() helper

Mario Kleiner mario.kleiner at tuebingen.mpg.de
Fri Oct 12 16:38:38 PDT 2012


On 10.10.12 13:03, Rob Clark wrote:
> On Tue, Oct 9, 2012 at 10:33 PM, Mario Kleiner
> <mario.kleiner at tuebingen.mpg.de> wrote:
>> On 08.10.12 21:50, Rob Clark wrote:
>>>
>>> From: Rob Clark <rob at ti.com>
>>>
>>> Signed-off-by: Rob Clark <rob at ti.com>
>>> ---
>>>    drivers/staging/omapdrm/omap_crtc.c |   31
>>> ++++++-------------------------
>>>    1 file changed, 6 insertions(+), 25 deletions(-)
>>>
>>> diff --git a/drivers/staging/omapdrm/omap_crtc.c
>>> b/drivers/staging/omapdrm/omap_crtc.c
>>> index 732f2ad..74e019a 100644
>>> --- a/drivers/staging/omapdrm/omap_crtc.c
>>> +++ b/drivers/staging/omapdrm/omap_crtc.c
>>> @@ -114,40 +114,21 @@ static void omap_crtc_load_lut(struct drm_crtc
>>> *crtc)
>>>
>>>    static void vblank_cb(void *arg)
>>>    {
>>> -       static uint32_t sequence = 0;
>>>          struct drm_crtc *crtc = arg;
>>>          struct drm_device *dev = crtc->dev;
>>>          struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
>>> -       struct drm_pending_vblank_event *event = omap_crtc->event;
>>>          unsigned long flags;
>>> -       struct timeval now;
>>>
>>>          WARN_ON(!event);
>>> +       spin_lock_irqsave(&dev->event_lock, flags);
>>> +
>>> +       /* wakeup userspace */
>>> +       if (omap_crtc->event)
>>> +               drm_send_vblank_event(dev, -1, omap_crtc->event);
>>>
>>>          omap_crtc->event = NULL;
>>>
>>> -       /* wakeup userspace */
>>> -       if (event) {
>>> -               do_gettimeofday(&now);
>>> -
>>> -               spin_lock_irqsave(&dev->event_lock, flags);
>>> -               /* TODO: we can't yet use the vblank time accounting,
>>> -                * because omapdss lower layer is the one that knows
>>> -                * the irq # and registers the handler, which more or
>>> -                * less defeats how drm_irq works.. for now just fake
>>> -                * the sequence number and use gettimeofday..
>>> -                *
>>> -               event->event.sequence = drm_vblank_count_and_time(
>>> -                               dev, omap_crtc->id, &now);
>>> -                */
>>
>>
>> I think this TOO comment should be retained as a reminder that there is work
>> to do.
>>
>>
>>> -               event->event.sequence = sequence++;
>>
>>
>> This is problematic. You lose the pseudo vblank counter implemented here,
>> which is a violation of the spec, and from my own experience it causes extra
>> pain and the need for awful workarounds in userspace clients. Nouveau-kms
>> has the same problem for no good reason.
>>
>> But then, on second thought, the way it is implemented here in the original
>> is even more wrong, returning zero might be better.
>
> I was actually debating whether or not to bother sending the omap
> patches, because I'm in middle of a re-write of the kms code in
> omapdrm that will (among many other things) give us proper vblank
> accounting..
>

Cool, that makes me happy :)

> There are a surprising # of other drivers that are just using
> do_gettimeofday() + seqn=0..  I guess, at least to be consistent,
> using seqn=0 is better than the completely bogus seqn.  Esp. when you
> consider having multiple CRTCs, they would end up not even having
> successive sequence numbers with the existing scheme.  But like I
> said, it's about to be replaced with something sane anyways :-P
>

Yes, zero is better in the meantime. E.g., to cope with nouveau's 
deficiency there, my app takes zero as "vblank count unsupported" and 
uses a fallback path, instead of getting confused.

Thanks for this nice cleanup.
-mario


More information about the dri-devel mailing list