Message ID | 1464792519-24530-5-git-send-email-Liviu.Dudau@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jun 01, 2016 at 03:48:38PM +0100, Liviu Dudau wrote: > Because the HDLCD lacks a hardware counter for vsync signal, the DRM > framework expects that the vsync interrupts are left running to feed > the internal software counter. Currently the HDLCD is masking/unmasking > the vsync interrupt on vblank enable/disable calls, which break that > expectation. Fix that. > > Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com> As discussed, this is actually not needed. The only thing you need to do is set max_vblank_count = 0. If vblank enable/disable is causing problems, then that would indicate an issue in the core drm_irq.c code, and should be fixed there. And if the docs are confusion, then please update those insted. This patch here shouldn't be needed at all. -Daniel > --- > drivers/gpu/drm/arm/hdlcd_drv.c | 15 +++++---------- > 1 file changed, 5 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c > index fb172d2..3f92dfa 100644 > --- a/drivers/gpu/drm/arm/hdlcd_drv.c > +++ b/drivers/gpu/drm/arm/hdlcd_drv.c > @@ -183,9 +183,13 @@ static int hdlcd_irq_postinstall(struct drm_device *drm) > > /* enable debug interrupts */ > irq_mask |= HDLCD_DEBUG_INT_MASK; > +#endif > + > + /* enable vsync interrupts */ > + irq_mask |= HDLCD_INTERRUPT_VSYNC; > > hdlcd_write(hdlcd, HDLCD_REG_INT_MASK, irq_mask); > -#endif > + > return 0; > } > > @@ -208,20 +212,11 @@ static void hdlcd_irq_uninstall(struct drm_device *drm) > > static int hdlcd_enable_vblank(struct drm_device *drm, unsigned int crtc) > { > - struct hdlcd_drm_private *hdlcd = drm->dev_private; > - unsigned int mask = hdlcd_read(hdlcd, HDLCD_REG_INT_MASK); > - > - hdlcd_write(hdlcd, HDLCD_REG_INT_MASK, mask | HDLCD_INTERRUPT_VSYNC); > - > return 0; > } > > static void hdlcd_disable_vblank(struct drm_device *drm, unsigned int crtc) > { > - struct hdlcd_drm_private *hdlcd = drm->dev_private; > - unsigned int mask = hdlcd_read(hdlcd, HDLCD_REG_INT_MASK); > - > - hdlcd_write(hdlcd, HDLCD_REG_INT_MASK, mask & ~HDLCD_INTERRUPT_VSYNC); > } > > #ifdef CONFIG_DEBUG_FS > -- > 2.8.2 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c index fb172d2..3f92dfa 100644 --- a/drivers/gpu/drm/arm/hdlcd_drv.c +++ b/drivers/gpu/drm/arm/hdlcd_drv.c @@ -183,9 +183,13 @@ static int hdlcd_irq_postinstall(struct drm_device *drm) /* enable debug interrupts */ irq_mask |= HDLCD_DEBUG_INT_MASK; +#endif + + /* enable vsync interrupts */ + irq_mask |= HDLCD_INTERRUPT_VSYNC; hdlcd_write(hdlcd, HDLCD_REG_INT_MASK, irq_mask); -#endif + return 0; } @@ -208,20 +212,11 @@ static void hdlcd_irq_uninstall(struct drm_device *drm) static int hdlcd_enable_vblank(struct drm_device *drm, unsigned int crtc) { - struct hdlcd_drm_private *hdlcd = drm->dev_private; - unsigned int mask = hdlcd_read(hdlcd, HDLCD_REG_INT_MASK); - - hdlcd_write(hdlcd, HDLCD_REG_INT_MASK, mask | HDLCD_INTERRUPT_VSYNC); - return 0; } static void hdlcd_disable_vblank(struct drm_device *drm, unsigned int crtc) { - struct hdlcd_drm_private *hdlcd = drm->dev_private; - unsigned int mask = hdlcd_read(hdlcd, HDLCD_REG_INT_MASK); - - hdlcd_write(hdlcd, HDLCD_REG_INT_MASK, mask & ~HDLCD_INTERRUPT_VSYNC); } #ifdef CONFIG_DEBUG_FS
Because the HDLCD lacks a hardware counter for vsync signal, the DRM framework expects that the vsync interrupts are left running to feed the internal software counter. Currently the HDLCD is masking/unmasking the vsync interrupt on vblank enable/disable calls, which break that expectation. Fix that. Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com> --- drivers/gpu/drm/arm/hdlcd_drv.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)