public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm: Add drm_crtc_vblank_waitqueue()
@ 2014-05-22 15:39 ville.syrjala
  2014-05-22 15:39 ` [PATCH 2/2] drm/i915: Kill intel_crtc->vbl_wait ville.syrjala
  2014-05-22 16:06 ` [Intel-gfx] [PATCH 1/2] drm: Add drm_crtc_vblank_waitqueue() Daniel Vetter
  0 siblings, 2 replies; 10+ messages in thread
From: ville.syrjala @ 2014-05-22 15:39 UTC (permalink / raw)
  To: intel-gfx; +Cc: dri-devel

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Add a small static inline helper to grab the vblank wait queue based on
the drm_crtc.

Suggested-by: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 include/drm/drmP.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 76ccaab..c294560 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1378,6 +1378,10 @@ extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
 extern void drm_calc_timestamping_constants(struct drm_crtc *crtc,
 					    const struct drm_display_mode *mode);
 
+static inline wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc)
+{
+	return &crtc->dev->vblank[drm_crtc_index(crtc)].queue;
+}
 
 /* Modesetting support */
 extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);
-- 
1.8.5.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/2] drm/i915: Kill intel_crtc->vbl_wait
  2014-05-22 15:39 [PATCH 1/2] drm: Add drm_crtc_vblank_waitqueue() ville.syrjala
@ 2014-05-22 15:39 ` ville.syrjala
  2014-05-22 15:49   ` Chris Wilson
  2014-05-22 16:06 ` [Intel-gfx] [PATCH 1/2] drm: Add drm_crtc_vblank_waitqueue() Daniel Vetter
  1 sibling, 1 reply; 10+ messages in thread
From: ville.syrjala @ 2014-05-22 15:39 UTC (permalink / raw)
  To: intel-gfx; +Cc: dri-devel

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Share the waitqueue that drm_irq uses when performing the vblank evade
trick for atomic pipe updates.

Suggested-by: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_irq.c      | 25 ++++++-------------------
 drivers/gpu/drm/i915/intel_display.c |  2 --
 drivers/gpu/drm/i915/intel_drv.h     |  2 --
 drivers/gpu/drm/i915/intel_sprite.c  |  5 +++--
 4 files changed, 9 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 304f86a..5905a9d 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1724,19 +1724,6 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
 	}
 }
 
-static bool intel_pipe_handle_vblank(struct drm_device *dev, enum pipe pipe)
-{
-	struct intel_crtc *crtc;
-
-	if (!drm_handle_vblank(dev, pipe))
-		return false;
-
-	crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev, pipe));
-	wake_up(&crtc->vbl_wait);
-
-	return true;
-}
-
 static void valleyview_pipestat_irq_handler(struct drm_device *dev, u32 iir)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
@@ -1791,7 +1778,7 @@ static void valleyview_pipestat_irq_handler(struct drm_device *dev, u32 iir)
 
 	for_each_pipe(pipe) {
 		if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS)
-			intel_pipe_handle_vblank(dev, pipe);
+			drm_handle_vblank(dev, pipe);
 
 		if (pipe_stats[pipe] & PLANE_FLIP_DONE_INT_STATUS_VLV) {
 			intel_prepare_page_flip(dev, pipe);
@@ -2068,7 +2055,7 @@ static void ilk_display_irq_handler(struct drm_device *dev, u32 de_iir)
 
 	for_each_pipe(pipe) {
 		if (de_iir & DE_PIPE_VBLANK(pipe))
-			intel_pipe_handle_vblank(dev, pipe);
+			drm_handle_vblank(dev, pipe);
 
 		if (de_iir & DE_PIPE_FIFO_UNDERRUN(pipe))
 			if (intel_set_cpu_fifo_underrun_reporting(dev, pipe, false))
@@ -2118,7 +2105,7 @@ static void ivb_display_irq_handler(struct drm_device *dev, u32 de_iir)
 
 	for_each_pipe(pipe) {
 		if (de_iir & (DE_PIPE_VBLANK_IVB(pipe)))
-			intel_pipe_handle_vblank(dev, pipe);
+			drm_handle_vblank(dev, pipe);
 
 		/* plane/pipes map 1:1 on ilk+ */
 		if (de_iir & DE_PLANE_FLIP_DONE_IVB(pipe)) {
@@ -2261,7 +2248,7 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
 
 		pipe_iir = I915_READ(GEN8_DE_PIPE_IIR(pipe));
 		if (pipe_iir & GEN8_PIPE_VBLANK)
-			intel_pipe_handle_vblank(dev, pipe);
+			drm_handle_vblank(dev, pipe);
 
 		if (pipe_iir & GEN8_PIPE_PRIMARY_FLIP_DONE) {
 			intel_prepare_page_flip(dev, pipe);
@@ -3731,7 +3718,7 @@ static bool i8xx_handle_vblank(struct drm_device *dev,
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	u16 flip_pending = DISPLAY_PLANE_FLIP_PENDING(plane);
 
-	if (!intel_pipe_handle_vblank(dev, pipe))
+	if (!drm_handle_vblank(dev, pipe))
 		return false;
 
 	if ((iir & flip_pending) == 0)
@@ -3916,7 +3903,7 @@ static bool i915_handle_vblank(struct drm_device *dev,
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	u32 flip_pending = DISPLAY_PLANE_FLIP_PENDING(plane);
 
-	if (!intel_pipe_handle_vblank(dev, pipe))
+	if (!drm_handle_vblank(dev, pipe))
 		return false;
 
 	if ((iir & flip_pending) == 0)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 019e9e1..aab638c 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -10966,8 +10966,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
 		intel_crtc->plane = !pipe;
 	}
 
-	init_waitqueue_head(&intel_crtc->vbl_wait);
-
 	BUG_ON(pipe >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) ||
 	       dev_priv->plane_to_crtc_mapping[intel_crtc->plane] != NULL);
 	dev_priv->plane_to_crtc_mapping[intel_crtc->plane] = &intel_crtc->base;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index d7c52b2..0071138 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -408,8 +408,6 @@ struct intel_crtc {
 		struct intel_pipe_wm active;
 	} wm;
 
-	wait_queue_head_t vbl_wait;
-
 	int scanline_offset;
 };
 
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index d6acd6b..7cd6a4f 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -53,6 +53,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl
 	enum pipe pipe = crtc->pipe;
 	long timeout = msecs_to_jiffies_timeout(1);
 	int scanline, min, max, vblank_start;
+	wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base);
 	DEFINE_WAIT(wait);
 
 	WARN_ON(!mutex_is_locked(&crtc->base.mutex));
@@ -81,7 +82,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl
 		 * other CPUs can see the task state update by the time we
 		 * read the scanline.
 		 */
-		prepare_to_wait(&crtc->vbl_wait, &wait, TASK_UNINTERRUPTIBLE);
+		prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
 
 		scanline = intel_get_crtc_scanline(crtc);
 		if (scanline < min || scanline > max)
@@ -100,7 +101,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl
 		local_irq_disable();
 	}
 
-	finish_wait(&crtc->vbl_wait, &wait);
+	finish_wait(wq, &wait);
 
 	drm_vblank_put(dev, pipe);
 
-- 
1.8.5.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] drm/i915: Kill intel_crtc->vbl_wait
  2014-05-22 15:39 ` [PATCH 2/2] drm/i915: Kill intel_crtc->vbl_wait ville.syrjala
@ 2014-05-22 15:49   ` Chris Wilson
  2014-05-22 16:00     ` [PATCH v2 " ville.syrjala
  2014-05-22 16:05     ` [Intel-gfx] [PATCH " Daniel Vetter
  0 siblings, 2 replies; 10+ messages in thread
From: Chris Wilson @ 2014-05-22 15:49 UTC (permalink / raw)
  To: ville.syrjala; +Cc: intel-gfx, dri-devel

On Thu, May 22, 2014 at 06:39:33PM +0300, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Share the waitqueue that drm_irq uses when performing the vblank evade
> trick for atomic pipe updates.
> 
> Suggested-by: Daniel Vetter <daniel@ffwll.ch>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_irq.c      | 25 ++++++-------------------
>  drivers/gpu/drm/i915/intel_display.c |  2 --
>  drivers/gpu/drm/i915/intel_drv.h     |  2 --
>  drivers/gpu/drm/i915/intel_sprite.c  |  5 +++--
>  4 files changed, 9 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 304f86a..5905a9d 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -1724,19 +1724,6 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
>  	}
>  }
>  
> -static bool intel_pipe_handle_vblank(struct drm_device *dev, enum pipe pipe)
> -{
> -	struct intel_crtc *crtc;
> -
> -	if (!drm_handle_vblank(dev, pipe))
> -		return false;
> -
> -	crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev, pipe));
> -	wake_up(&crtc->vbl_wait);
> -
> -	return true;
> -}

Can we keep this bare wrapper? It is quite useful for hooking in vblank
checks - i.e. saves me having to reinrtoduce it.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 2/2] drm/i915: Kill intel_crtc->vbl_wait
  2014-05-22 15:49   ` Chris Wilson
@ 2014-05-22 16:00     ` ville.syrjala
  2014-07-25 21:10       ` Daniel Vetter
  2014-05-22 16:05     ` [Intel-gfx] [PATCH " Daniel Vetter
  1 sibling, 1 reply; 10+ messages in thread
From: ville.syrjala @ 2014-05-22 16:00 UTC (permalink / raw)
  To: intel-gfx; +Cc: dri-devel

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Share the waitqueue that drm_irq uses when performing the vblank evade
trick for atomic pipe updates.

v2: Keep intel_pipe_handle_vblank() (Chris)

Suggested-by: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_irq.c      | 5 -----
 drivers/gpu/drm/i915/intel_display.c | 2 --
 drivers/gpu/drm/i915/intel_drv.h     | 2 --
 drivers/gpu/drm/i915/intel_sprite.c  | 5 +++--
 4 files changed, 3 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 304f86a..bc4cdbd 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1726,14 +1726,9 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
 
 static bool intel_pipe_handle_vblank(struct drm_device *dev, enum pipe pipe)
 {
-	struct intel_crtc *crtc;
-
 	if (!drm_handle_vblank(dev, pipe))
 		return false;
 
-	crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev, pipe));
-	wake_up(&crtc->vbl_wait);
-
 	return true;
 }
 
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 019e9e1..aab638c 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -10966,8 +10966,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
 		intel_crtc->plane = !pipe;
 	}
 
-	init_waitqueue_head(&intel_crtc->vbl_wait);
-
 	BUG_ON(pipe >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) ||
 	       dev_priv->plane_to_crtc_mapping[intel_crtc->plane] != NULL);
 	dev_priv->plane_to_crtc_mapping[intel_crtc->plane] = &intel_crtc->base;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index d7c52b2..0071138 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -408,8 +408,6 @@ struct intel_crtc {
 		struct intel_pipe_wm active;
 	} wm;
 
-	wait_queue_head_t vbl_wait;
-
 	int scanline_offset;
 };
 
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index d6acd6b..7cd6a4f 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -53,6 +53,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl
 	enum pipe pipe = crtc->pipe;
 	long timeout = msecs_to_jiffies_timeout(1);
 	int scanline, min, max, vblank_start;
+	wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base);
 	DEFINE_WAIT(wait);
 
 	WARN_ON(!mutex_is_locked(&crtc->base.mutex));
@@ -81,7 +82,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl
 		 * other CPUs can see the task state update by the time we
 		 * read the scanline.
 		 */
-		prepare_to_wait(&crtc->vbl_wait, &wait, TASK_UNINTERRUPTIBLE);
+		prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
 
 		scanline = intel_get_crtc_scanline(crtc);
 		if (scanline < min || scanline > max)
@@ -100,7 +101,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl
 		local_irq_disable();
 	}
 
-	finish_wait(&crtc->vbl_wait, &wait);
+	finish_wait(wq, &wait);
 
 	drm_vblank_put(dev, pipe);
 
-- 
1.8.5.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [Intel-gfx] [PATCH 2/2] drm/i915: Kill intel_crtc->vbl_wait
  2014-05-22 15:49   ` Chris Wilson
  2014-05-22 16:00     ` [PATCH v2 " ville.syrjala
@ 2014-05-22 16:05     ` Daniel Vetter
  2014-05-22 19:30       ` Chris Wilson
  1 sibling, 1 reply; 10+ messages in thread
From: Daniel Vetter @ 2014-05-22 16:05 UTC (permalink / raw)
  To: Chris Wilson, ville.syrjala, intel-gfx, dri-devel

On Thu, May 22, 2014 at 04:49:03PM +0100, Chris Wilson wrote:
> On Thu, May 22, 2014 at 06:39:33PM +0300, ville.syrjala@linux.intel.com wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > 
> > Share the waitqueue that drm_irq uses when performing the vblank evade
> > trick for atomic pipe updates.
> > 
> > Suggested-by: Daniel Vetter <daniel@ffwll.ch>
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> >  drivers/gpu/drm/i915/i915_irq.c      | 25 ++++++-------------------
> >  drivers/gpu/drm/i915/intel_display.c |  2 --
> >  drivers/gpu/drm/i915/intel_drv.h     |  2 --
> >  drivers/gpu/drm/i915/intel_sprite.c  |  5 +++--
> >  4 files changed, 9 insertions(+), 25 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> > index 304f86a..5905a9d 100644
> > --- a/drivers/gpu/drm/i915/i915_irq.c
> > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > @@ -1724,19 +1724,6 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
> >  	}
> >  }
> >  
> > -static bool intel_pipe_handle_vblank(struct drm_device *dev, enum pipe pipe)
> > -{
> > -	struct intel_crtc *crtc;
> > -
> > -	if (!drm_handle_vblank(dev, pipe))
> > -		return false;
> > -
> > -	crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev, pipe));
> > -	wake_up(&crtc->vbl_wait);
> > -
> > -	return true;
> > -}
> 
> Can we keep this bare wrapper? It is quite useful for hooking in vblank
> checks - i.e. saves me having to reinrtoduce it.

Just smash them into drm_handle_vblank?
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Intel-gfx] [PATCH 1/2] drm: Add drm_crtc_vblank_waitqueue()
  2014-05-22 15:39 [PATCH 1/2] drm: Add drm_crtc_vblank_waitqueue() ville.syrjala
  2014-05-22 15:39 ` [PATCH 2/2] drm/i915: Kill intel_crtc->vbl_wait ville.syrjala
@ 2014-05-22 16:06 ` Daniel Vetter
  2014-05-22 16:36   ` [PATCH v2 " ville.syrjala
  1 sibling, 1 reply; 10+ messages in thread
From: Daniel Vetter @ 2014-05-22 16:06 UTC (permalink / raw)
  To: ville.syrjala; +Cc: intel-gfx, dri-devel

On Thu, May 22, 2014 at 06:39:32PM +0300, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Add a small static inline helper to grab the vblank wait queue based on
> the drm_crtc.

Maybe add that this is useful for drivers to do internal vblank waits
using wait event.

> Suggested-by: Daniel Vetter <daniel@ffwll.ch>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  include/drm/drmP.h | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 76ccaab..c294560 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1378,6 +1378,10 @@ extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
>  extern void drm_calc_timestamping_constants(struct drm_crtc *crtc,
>  					    const struct drm_display_mode *mode);
>  
> +static inline wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc)

Kerneldoc + pulling into the drm_irq docs missing. I guess we need to do
an include directive which exactly names this function ... No other way
with the drm header mess :(
-Daniel

> +{
> +	return &crtc->dev->vblank[drm_crtc_index(crtc)].queue;
> +}
>  
>  /* Modesetting support */
>  extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);
> -- 
> 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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 1/2] drm: Add drm_crtc_vblank_waitqueue()
  2014-05-22 16:06 ` [Intel-gfx] [PATCH 1/2] drm: Add drm_crtc_vblank_waitqueue() Daniel Vetter
@ 2014-05-22 16:36   ` ville.syrjala
  0 siblings, 0 replies; 10+ messages in thread
From: ville.syrjala @ 2014-05-22 16:36 UTC (permalink / raw)
  To: intel-gfx; +Cc: dri-devel

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Add a small static inline helper to grab the vblank wait queue based on
the drm_crtc.

This is useful for drivers to do internal vblank waits using
wait_event() & co.

v2: Pimp commit message (Daniel)
    Add kernel doc (Daniel)

Suggested-by: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 Documentation/DocBook/drm.tmpl |  1 +
 include/drm/drmP.h             | 11 +++++++++++
 2 files changed, 12 insertions(+)

diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
index 9574bf2..527a3f9 100644
--- a/Documentation/DocBook/drm.tmpl
+++ b/Documentation/DocBook/drm.tmpl
@@ -2522,6 +2522,7 @@ void (*disable_vblank) (struct drm_device *dev, int crtc);</synopsis>
     <sect2>
       <title>Vertical Blanking and Interrupt Handling Functions Reference</title>
 !Edrivers/gpu/drm/drm_irq.c
+!Iinclude/drm/drmP.h drm_crtc_vblank_waitqueue
     </sect2>
   </sect1>
 
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 76ccaab..48dc3e5 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1378,6 +1378,17 @@ extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
 extern void drm_calc_timestamping_constants(struct drm_crtc *crtc,
 					    const struct drm_display_mode *mode);
 
+/**
+ * drm_crtc_vblank_waitqueue - get vblank waitqueue for the CRTC
+ * @crtc: which CRTC's vblank waitqueue to retrieve
+ *
+ * This function returns a pointer to the vblank waitqueue for the CRTC.
+ * Drivers can use this to implement vblank waits using wait_event() & co.
+ */
+static inline wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc)
+{
+	return &crtc->dev->vblank[drm_crtc_index(crtc)].queue;
+}
 
 /* Modesetting support */
 extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);
-- 
1.8.5.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [Intel-gfx] [PATCH 2/2] drm/i915: Kill intel_crtc->vbl_wait
  2014-05-22 16:05     ` [Intel-gfx] [PATCH " Daniel Vetter
@ 2014-05-22 19:30       ` Chris Wilson
  2014-05-22 20:21         ` Daniel Vetter
  0 siblings, 1 reply; 10+ messages in thread
From: Chris Wilson @ 2014-05-22 19:30 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: intel-gfx, dri-devel

On Thu, May 22, 2014 at 06:05:34PM +0200, Daniel Vetter wrote:
> On Thu, May 22, 2014 at 04:49:03PM +0100, Chris Wilson wrote:
> > On Thu, May 22, 2014 at 06:39:33PM +0300, ville.syrjala@linux.intel.com wrote:
> > > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > > 
> > > Share the waitqueue that drm_irq uses when performing the vblank evade
> > > trick for atomic pipe updates.
> > > 
> > > Suggested-by: Daniel Vetter <daniel@ffwll.ch>
> > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/i915_irq.c      | 25 ++++++-------------------
> > >  drivers/gpu/drm/i915/intel_display.c |  2 --
> > >  drivers/gpu/drm/i915/intel_drv.h     |  2 --
> > >  drivers/gpu/drm/i915/intel_sprite.c  |  5 +++--
> > >  4 files changed, 9 insertions(+), 25 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> > > index 304f86a..5905a9d 100644
> > > --- a/drivers/gpu/drm/i915/i915_irq.c
> > > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > > @@ -1724,19 +1724,6 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
> > >  	}
> > >  }
> > >  
> > > -static bool intel_pipe_handle_vblank(struct drm_device *dev, enum pipe pipe)
> > > -{
> > > -	struct intel_crtc *crtc;
> > > -
> > > -	if (!drm_handle_vblank(dev, pipe))
> > > -		return false;
> > > -
> > > -	crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev, pipe));
> > > -	wake_up(&crtc->vbl_wait);
> > > -
> > > -	return true;
> > > -}
> > 
> > Can we keep this bare wrapper? It is quite useful for hooking in vblank
> > checks - i.e. saves me having to reinrtoduce it.
> 
> Just smash them into drm_handle_vblank?

The ones I have in mind the pageflip stall checks and gpu-boost for
missed pageflips, i.e. driver specific.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] drm/i915: Kill intel_crtc->vbl_wait
  2014-05-22 19:30       ` Chris Wilson
@ 2014-05-22 20:21         ` Daniel Vetter
  0 siblings, 0 replies; 10+ messages in thread
From: Daniel Vetter @ 2014-05-22 20:21 UTC (permalink / raw)
  To: Chris Wilson, Daniel Vetter, ville.syrjala, intel-gfx, dri-devel

On Thu, May 22, 2014 at 08:30:23PM +0100, Chris Wilson wrote:
> On Thu, May 22, 2014 at 06:05:34PM +0200, Daniel Vetter wrote:
> > On Thu, May 22, 2014 at 04:49:03PM +0100, Chris Wilson wrote:
> > > On Thu, May 22, 2014 at 06:39:33PM +0300, ville.syrjala@linux.intel.com wrote:
> > > > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > > > 
> > > > Share the waitqueue that drm_irq uses when performing the vblank evade
> > > > trick for atomic pipe updates.
> > > > 
> > > > Suggested-by: Daniel Vetter <daniel@ffwll.ch>
> > > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > > > ---
> > > >  drivers/gpu/drm/i915/i915_irq.c      | 25 ++++++-------------------
> > > >  drivers/gpu/drm/i915/intel_display.c |  2 --
> > > >  drivers/gpu/drm/i915/intel_drv.h     |  2 --
> > > >  drivers/gpu/drm/i915/intel_sprite.c  |  5 +++--
> > > >  4 files changed, 9 insertions(+), 25 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> > > > index 304f86a..5905a9d 100644
> > > > --- a/drivers/gpu/drm/i915/i915_irq.c
> > > > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > > > @@ -1724,19 +1724,6 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
> > > >  	}
> > > >  }
> > > >  
> > > > -static bool intel_pipe_handle_vblank(struct drm_device *dev, enum pipe pipe)
> > > > -{
> > > > -	struct intel_crtc *crtc;
> > > > -
> > > > -	if (!drm_handle_vblank(dev, pipe))
> > > > -		return false;
> > > > -
> > > > -	crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev, pipe));
> > > > -	wake_up(&crtc->vbl_wait);
> > > > -
> > > > -	return true;
> > > > -}
> > > 
> > > Can we keep this bare wrapper? It is quite useful for hooking in vblank
> > > checks - i.e. saves me having to reinrtoduce it.
> > 
> > Just smash them into drm_handle_vblank?
> 
> The ones I have in mind the pageflip stall checks and gpu-boost for
> missed pageflips, i.e. driver specific.

Hm yeah, the pageflip stall check should be in the vblank handler. And
yeah boosting harder in the vblank handler if an outstanding pageflip
hasn't been completed yet also makes sense. I'll augment Ville's patch v2
with these reasons and merge that one.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 2/2] drm/i915: Kill intel_crtc->vbl_wait
  2014-05-22 16:00     ` [PATCH v2 " ville.syrjala
@ 2014-07-25 21:10       ` Daniel Vetter
  0 siblings, 0 replies; 10+ messages in thread
From: Daniel Vetter @ 2014-07-25 21:10 UTC (permalink / raw)
  To: ville.syrjala; +Cc: intel-gfx, dri-devel

On Thu, May 22, 2014 at 07:00:50PM +0300, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Share the waitqueue that drm_irq uses when performing the vblank evade
> trick for atomic pipe updates.
> 
> v2: Keep intel_pipe_handle_vblank() (Chris)
> 
> Suggested-by: Daniel Vetter <daniel@ffwll.ch>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Both patches merged to dinq, thanks.
-Daniel

> ---
>  drivers/gpu/drm/i915/i915_irq.c      | 5 -----
>  drivers/gpu/drm/i915/intel_display.c | 2 --
>  drivers/gpu/drm/i915/intel_drv.h     | 2 --
>  drivers/gpu/drm/i915/intel_sprite.c  | 5 +++--
>  4 files changed, 3 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 304f86a..bc4cdbd 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -1726,14 +1726,9 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
>  
>  static bool intel_pipe_handle_vblank(struct drm_device *dev, enum pipe pipe)
>  {
> -	struct intel_crtc *crtc;
> -
>  	if (!drm_handle_vblank(dev, pipe))
>  		return false;
>  
> -	crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev, pipe));
> -	wake_up(&crtc->vbl_wait);
> -
>  	return true;
>  }
>  
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 019e9e1..aab638c 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -10966,8 +10966,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
>  		intel_crtc->plane = !pipe;
>  	}
>  
> -	init_waitqueue_head(&intel_crtc->vbl_wait);
> -
>  	BUG_ON(pipe >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) ||
>  	       dev_priv->plane_to_crtc_mapping[intel_crtc->plane] != NULL);
>  	dev_priv->plane_to_crtc_mapping[intel_crtc->plane] = &intel_crtc->base;
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index d7c52b2..0071138 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -408,8 +408,6 @@ struct intel_crtc {
>  		struct intel_pipe_wm active;
>  	} wm;
>  
> -	wait_queue_head_t vbl_wait;
> -
>  	int scanline_offset;
>  };
>  
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> index d6acd6b..7cd6a4f 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -53,6 +53,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl
>  	enum pipe pipe = crtc->pipe;
>  	long timeout = msecs_to_jiffies_timeout(1);
>  	int scanline, min, max, vblank_start;
> +	wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base);
>  	DEFINE_WAIT(wait);
>  
>  	WARN_ON(!mutex_is_locked(&crtc->base.mutex));
> @@ -81,7 +82,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl
>  		 * other CPUs can see the task state update by the time we
>  		 * read the scanline.
>  		 */
> -		prepare_to_wait(&crtc->vbl_wait, &wait, TASK_UNINTERRUPTIBLE);
> +		prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
>  
>  		scanline = intel_get_crtc_scanline(crtc);
>  		if (scanline < min || scanline > max)
> @@ -100,7 +101,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl
>  		local_irq_disable();
>  	}
>  
> -	finish_wait(&crtc->vbl_wait, &wait);
> +	finish_wait(wq, &wait);
>  
>  	drm_vblank_put(dev, pipe);
>  
> -- 
> 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

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-07-25 21:10 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-22 15:39 [PATCH 1/2] drm: Add drm_crtc_vblank_waitqueue() ville.syrjala
2014-05-22 15:39 ` [PATCH 2/2] drm/i915: Kill intel_crtc->vbl_wait ville.syrjala
2014-05-22 15:49   ` Chris Wilson
2014-05-22 16:00     ` [PATCH v2 " ville.syrjala
2014-07-25 21:10       ` Daniel Vetter
2014-05-22 16:05     ` [Intel-gfx] [PATCH " Daniel Vetter
2014-05-22 19:30       ` Chris Wilson
2014-05-22 20:21         ` Daniel Vetter
2014-05-22 16:06 ` [Intel-gfx] [PATCH 1/2] drm: Add drm_crtc_vblank_waitqueue() Daniel Vetter
2014-05-22 16:36   ` [PATCH v2 " ville.syrjala

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox