From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [Intel-gfx] [PATCH 7/9] drm: Disable vblank interrupt immediately when drm_vblank_offdelay==0 Date: Mon, 26 May 2014 15:02:28 +0200 Message-ID: <20140526130228.GH14357@phenom.ffwll.local> References: <1401104792-26560-1-git-send-email-ville.syrjala@linux.intel.com> <1401104792-26560-8-git-send-email-ville.syrjala@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Return-path: Received: from mail-we0-f179.google.com (mail-we0-f179.google.com [74.125.82.179]) by gabe.freedesktop.org (Postfix) with ESMTP id AEF116E2D5 for ; Mon, 26 May 2014 06:02:34 -0700 (PDT) Received: by mail-we0-f179.google.com with SMTP id q59so7929974wes.38 for ; Mon, 26 May 2014 06:02:33 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1401104792-26560-8-git-send-email-ville.syrjala@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: ville.syrjala@linux.intel.com Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org On Mon, May 26, 2014 at 02:46:30PM +0300, ville.syrjala@linux.intel.com wro= te: > From: Ville Syrj=E4l=E4 > = > Make drm_vblank_put() disable the vblank interrupt immediately when the > refcount drops to zero and drm_vblank_offdelay=3D=3D0. > = > Currently drm_vblank_put() would just leave vblank interrupts enabled all > the time if drm_vblank_offdelay=3D=3D0. In case someone might still want = that > behaviour drm_vblank_offdelay is now signed and a negative value will > allow the user to keep vblank interrupts on all the time. Well, since > the first drm_vblank_get() anyway. > = > Signed-off-by: Ville Syrj=E4l=E4 I think what we actually want is a new dev->vblank_is_race_free or something which is a boolean. Then we can keep the drm_vblank_offdelay as-is and seletively kill the entire logic for drivers where this works correctly. -Daniel > --- > Documentation/DocBook/drm.tmpl | 1 + > drivers/gpu/drm/drm_irq.c | 11 +++++++---- > drivers/gpu/drm/drm_stub.c | 4 ++-- > drivers/gpu/drm/exynos/exynos_drm_drv.h | 2 +- > include/drm/drmP.h | 2 +- > 5 files changed, 12 insertions(+), 8 deletions(-) > = > diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.t= mpl > index 9574bf2..25632b0 100644 > --- a/Documentation/DocBook/drm.tmpl > +++ b/Documentation/DocBook/drm.tmpl > @@ -2508,6 +2508,7 @@ void (*disable_vblank) (struct drm_device *dev, int= crtc); > by scheduling a timer. The delay is accessible through the vblanko= ffdelay > module parameter or the drm_vblank_offdelay glo= bal > variable and expressed in milliseconds. Its default value is 5000 = ms. > + Zero means disable immediately, and a negative value means never d= isable. > > > When a vertical blanking interrupt occurs drivers only need to cal= l the > diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c > index 54cb85d..54a56b2 100644 > --- a/drivers/gpu/drm/drm_irq.c > +++ b/drivers/gpu/drm/drm_irq.c > @@ -978,10 +978,13 @@ void drm_vblank_put(struct drm_device *dev, int crt= c) > BUG_ON(atomic_read(&dev->vblank[crtc].refcount) =3D=3D 0); > = > /* Last user schedules interrupt disable */ > - if (atomic_dec_and_test(&dev->vblank[crtc].refcount) && > - (drm_vblank_offdelay > 0)) > - mod_timer(&dev->vblank[crtc].disable_timer, > - jiffies + ((drm_vblank_offdelay * HZ)/1000)); > + if (atomic_dec_and_test(&dev->vblank[crtc].refcount)) { > + if (drm_vblank_offdelay > 0) > + mod_timer(&dev->vblank[crtc].disable_timer, > + jiffies + ((drm_vblank_offdelay * HZ)/1000)); > + else if (drm_vblank_offdelay =3D=3D 0) > + vblank_disable_fn((unsigned long)&dev->vblank[crtc]); > + } > } > EXPORT_SYMBOL(drm_vblank_put); > = > diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c > index 3727ac8..8758f81 100644 > --- a/drivers/gpu/drm/drm_stub.c > +++ b/drivers/gpu/drm/drm_stub.c > @@ -49,7 +49,7 @@ EXPORT_SYMBOL(drm_rnodes); > unsigned int drm_universal_planes =3D 0; > EXPORT_SYMBOL(drm_universal_planes); > = > -unsigned int drm_vblank_offdelay =3D 5000; /* Default to 5000 msecs. = */ > +int drm_vblank_offdelay =3D 5000; /* Default to 5000 msecs. */ > EXPORT_SYMBOL(drm_vblank_offdelay); > = > unsigned int drm_timestamp_precision =3D 20; /* Default to 20 usecs. */ > @@ -66,7 +66,7 @@ MODULE_DESCRIPTION(CORE_DESC); > MODULE_LICENSE("GPL and additional rights"); > MODULE_PARM_DESC(debug, "Enable debug output"); > MODULE_PARM_DESC(rnodes, "Enable experimental render nodes API"); > -MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [m= secs]"); > +MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [m= secs] (< 0 means never disable)"); > MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [us= ecs]"); > MODULE_PARM_DESC(timestamp_monotonic, "Use monotonic timestamps"); > = > diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/ex= ynos/exynos_drm_drv.h > index ce3e6a3..9734bec 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h > +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h > @@ -40,7 +40,7 @@ struct drm_device; > struct exynos_drm_overlay; > struct drm_connector; > = > -extern unsigned int drm_vblank_offdelay; > +extern int drm_vblank_offdelay; > = > /* this enumerates display type. */ > enum exynos_drm_output_type { > diff --git a/include/drm/drmP.h b/include/drm/drmP.h > index 76ccaab..979a498 100644 > --- a/include/drm/drmP.h > +++ b/include/drm/drmP.h > @@ -1404,7 +1404,7 @@ extern unsigned int drm_debug; > extern unsigned int drm_rnodes; > extern unsigned int drm_universal_planes; > = > -extern unsigned int drm_vblank_offdelay; > +extern int drm_vblank_offdelay; > extern unsigned int drm_timestamp_precision; > extern unsigned int drm_timestamp_monotonic; > = > -- = > 1.8.5.5 > = > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- = Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch