Re: [PATCH 3/5] drm/i915: Track pinned vma in intel_plane_state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Nov 15, 2016 at 08:58:15AM +0000, Chris Wilson wrote:
> With atomic plane states we are able to track an allocation right from
> preparation, during use and through to the final free after being
> swapped out for a new plane. We can couple the VMA we pin for the
> framebuffer (and its rotation) to this lifetime and avoid all the clumsy
> lookups in between.
> 
> Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>

A few questions and comments below. Of course review assumes some form of
patch 2 lands first (but leaning towards just reverting the core one for
that).
-Daniel

> ---
>  drivers/gpu/drm/i915/i915_drv.h           | 16 ++---
>  drivers/gpu/drm/i915/intel_atomic_plane.c |  2 +
>  drivers/gpu/drm/i915/intel_display.c      | 97 +++++++++++++------------------
>  drivers/gpu/drm/i915/intel_drv.h          |  9 ++-
>  drivers/gpu/drm/i915/intel_fbc.c          | 52 +++++++----------
>  drivers/gpu/drm/i915/intel_fbdev.c        |  4 +-
>  drivers/gpu/drm/i915/intel_sprite.c       |  8 +--
>  7 files changed, 78 insertions(+), 110 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 4e7148a3ee8b..2bc285e2ff82 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -989,6 +989,8 @@ struct intel_fbc {
>  	struct work_struct underrun_work;
>  
>  	struct intel_fbc_state_cache {
> +		struct i915_vma *vma;
> +
>  		struct {
>  			unsigned int mode_flags;
>  			uint32_t hsw_bdw_pixel_rate;
> @@ -1002,15 +1004,14 @@ struct intel_fbc {
>  		} plane;
>  
>  		struct {
> -			u64 ilk_ggtt_offset;
>  			uint32_t pixel_format;
>  			unsigned int stride;
> -			int fence_reg;
> -			unsigned int tiling_mode;
>  		} fb;
>  	} state_cache;
>  
>  	struct intel_fbc_reg_params {
> +		struct i915_vma *vma;
> +
>  		struct {
>  			enum pipe pipe;
>  			enum plane plane;
> @@ -1018,10 +1019,8 @@ struct intel_fbc {
>  		} crtc;
>  
>  		struct {
> -			u64 ggtt_offset;
>  			uint32_t pixel_format;
>  			unsigned int stride;
> -			int fence_reg;
>  		} fb;
>  
>  		int cfb_size;
> @@ -3150,13 +3149,6 @@ i915_gem_object_to_ggtt(struct drm_i915_gem_object *obj,
>  	return i915_gem_obj_to_vma(obj, &to_i915(obj->base.dev)->ggtt.base, view);
>  }
>  
> -static inline unsigned long
> -i915_gem_object_ggtt_offset(struct drm_i915_gem_object *o,
> -			    const struct i915_ggtt_view *view)
> -{
> -	return i915_ggtt_offset(i915_gem_object_to_ggtt(o, view));
> -}
> -
>  /* i915_gem_fence_reg.c */
>  int __must_check i915_vma_get_fence(struct i915_vma *vma);
>  int __must_check i915_vma_put_fence(struct i915_vma *vma);
> diff --git a/drivers/gpu/drm/i915/intel_atomic_plane.c b/drivers/gpu/drm/i915/intel_atomic_plane.c
> index 89a34350a35d..5a86e0d52409 100644
> --- a/drivers/gpu/drm/i915/intel_atomic_plane.c
> +++ b/drivers/gpu/drm/i915/intel_atomic_plane.c
> @@ -85,6 +85,8 @@ intel_plane_duplicate_state(struct drm_plane *plane)
>  
>  	__drm_atomic_helper_plane_duplicate_state(plane, state);
>  
> +	intel_state->vma = NULL;
> +
>  	return state;
>  }
>  
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index dca1e0b512e5..cb52116f8577 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -2241,24 +2241,19 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb, unsigned int rotation)
>  			i915_vma_pin_fence(vma);
>  	}
>  
> +	i915_vma_get(vma);

I'm not entirely clear on why we no need a refcount for this? Vestige code
from when you wanted to refcount plane_state->fb like other refcounted
state pointers? If we restrict the lifetime to just in between
prepare_plane/cleanup_plane like you do I don't think this is needed ...

>  err:
>  	intel_runtime_pm_put(dev_priv);
>  	return vma;
>  }
>  
> -void intel_unpin_fb_obj(struct drm_framebuffer *fb, unsigned int rotation)
> +void intel_unpin_fb_vma(struct i915_vma *vma)
>  {
> -	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
> -	struct i915_ggtt_view view;
> -	struct i915_vma *vma;
> -
> -	WARN_ON(!mutex_is_locked(&obj->base.dev->struct_mutex));
> -
> -	intel_fill_fb_ggtt_view(&view, fb, rotation);
> -	vma = i915_gem_object_to_ggtt(obj, &view);
> +	lockdep_assert_held(&vma->vm->dev->struct_mutex);
>  
>  	i915_vma_unpin_fence(vma);
>  	i915_gem_object_unpin_from_display_plane(vma);
> +	i915_vma_put(vma);
>  }
>  
>  static int intel_fb_pitch(const struct drm_framebuffer *fb, int plane,
> @@ -2752,7 +2747,6 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
>  	struct drm_device *dev = intel_crtc->base.dev;
>  	struct drm_i915_private *dev_priv = to_i915(dev);
>  	struct drm_crtc *c;
> -	struct intel_crtc *i;
>  	struct drm_i915_gem_object *obj;
>  	struct drm_plane *primary = intel_crtc->base.primary;
>  	struct drm_plane_state *plane_state = primary->state;
> @@ -2777,20 +2771,20 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
>  	 * an fb with another CRTC instead
>  	 */
>  	for_each_crtc(dev, c) {
> -		i = to_intel_crtc(c);
> +		struct intel_plane_state *state;
>  
>  		if (c == &intel_crtc->base)
>  			continue;
>  
> -		if (!i->active)
> +		if (!to_intel_crtc(c)->active)
>  			continue;
>  
> -		fb = c->primary->fb;
> -		if (!fb)
> +		state = to_intel_plane_state(c->primary->state);
> +		if (!state->vma)
>  			continue;
>  
> -		obj = intel_fb_obj(fb);
> -		if (i915_gem_object_ggtt_offset(obj, NULL) == plane_config->base) {
> +		if (i915_ggtt_offset(state->vma) == plane_config->base) {
> +			fb = c->primary->fb;
>  			drm_framebuffer_reference(fb);
>  			goto valid_fb;
>  		}
> @@ -2830,6 +2824,12 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
>  
>  	drm_framebuffer_reference(fb);
>  	primary->fb = primary->state->fb = fb;
> +
> +	mutex_lock(&dev->struct_mutex);
> +	intel_state->vma =
> +		intel_pin_and_fence_fb_obj(fb, primary->state->rotation);
> +	mutex_unlock(&dev->struct_mutex);
> +
>  	primary->crtc = primary->state->crtc = &intel_crtc->base;
>  	intel_crtc->base.state->plane_mask |= (1 << drm_plane_index(primary));
>  	atomic_or(to_intel_plane(primary)->frontbuffer_bit,
> @@ -3104,13 +3104,13 @@ static void i9xx_update_primary_plane(struct drm_plane *primary,
>  	I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]);
>  	if (INTEL_INFO(dev)->gen >= 4) {
>  		I915_WRITE(DSPSURF(plane),
> -			   intel_fb_gtt_offset(fb, rotation) +
> +			   intel_plane_ggtt_offset(plane_state) +
>  			   intel_crtc->dspaddr_offset);
>  		I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
>  		I915_WRITE(DSPLINOFF(plane), linear_offset);
>  	} else {
>  		I915_WRITE(DSPADDR(plane),
> -			   intel_fb_gtt_offset(fb, rotation) +
> +			   intel_plane_ggtt_offset(plane_state) +
>  			   intel_crtc->dspaddr_offset);
>  	}
>  	POSTING_READ(reg);
> @@ -3207,7 +3207,7 @@ static void ironlake_update_primary_plane(struct drm_plane *primary,
>  
>  	I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]);
>  	I915_WRITE(DSPSURF(plane),
> -		   intel_fb_gtt_offset(fb, rotation) +
> +		   intel_plane_ggtt_offset(plane_state) +
>  		   intel_crtc->dspaddr_offset);
>  	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
>  		I915_WRITE(DSPOFFSET(plane), (y << 16) | x);
> @@ -3230,23 +3230,6 @@ u32 intel_fb_stride_alignment(const struct drm_i915_private *dev_priv,
>  	}
>  }
>  
> -u32 intel_fb_gtt_offset(struct drm_framebuffer *fb,
> -			unsigned int rotation)
> -{
> -	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
> -	struct i915_ggtt_view view;
> -	struct i915_vma *vma;
> -
> -	intel_fill_fb_ggtt_view(&view, fb, rotation);
> -
> -	vma = i915_gem_object_to_ggtt(obj, &view);
> -	if (WARN(!vma, "ggtt vma for display object not found! (view=%u)\n",
> -		 view.type))
> -		return -1;
> -
> -	return i915_ggtt_offset(vma);
> -}
> -
>  static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
>  {
>  	struct drm_device *dev = intel_crtc->base.dev;
> @@ -3447,7 +3430,7 @@ static void skylake_update_primary_plane(struct drm_plane *plane,
>  	}
>  
>  	I915_WRITE(PLANE_SURF(pipe, 0),
> -		   intel_fb_gtt_offset(fb, rotation) + surf_addr);
> +		   intel_plane_ggtt_offset(plane_state) + surf_addr);
>  
>  	POSTING_READ(PLANE_SURF(pipe, 0));
>  }
> @@ -11576,7 +11559,7 @@ static void intel_unpin_work_fn(struct work_struct *__work)
>  		flush_work(&work->mmio_work);
>  
>  	mutex_lock(&dev->struct_mutex);
> -	intel_unpin_fb_obj(work->old_fb, primary->state->rotation);
> +	intel_unpin_fb_vma(work->old_vma);
>  	i915_gem_object_put(work->pending_flip_obj);
>  	mutex_unlock(&dev->struct_mutex);
>  
> @@ -12286,8 +12269,10 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
>  		goto cleanup_pending;
>  	}
>  
> -	work->gtt_offset = intel_fb_gtt_offset(fb, primary->state->rotation);
> -	work->gtt_offset += intel_crtc->dspaddr_offset;
> +	work->old_vma = to_intel_plane_state(primary->state)->vma;
> +	to_intel_plane_state(primary->state)->vma = vma;
> +
> +	work->gtt_offset = i915_ggtt_offset(vma) + intel_crtc->dspaddr_offset;
>  	work->rotation = crtc->primary->state->rotation;
>  
>  	/*
> @@ -12340,7 +12325,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
>  cleanup_request:
>  	i915_add_request_no_flush(request);
>  cleanup_unpin:
> -	intel_unpin_fb_obj(fb, crtc->primary->state->rotation);
> +	to_intel_plane_state(primary->state)->vma = work->old_vma;
> +	intel_unpin_fb_vma(vma);
>  cleanup_pending:
>  	atomic_dec(&intel_crtc->unpin_work_count);
>  	mutex_unlock(&dev->struct_mutex);
> @@ -14234,10 +14220,10 @@ intel_prepare_plane_fb(struct drm_plane *plane,
>  		struct i915_vma *vma;
>  
>  		vma = intel_pin_and_fence_fb_obj(fb, new_state->rotation);
> -		if (IS_ERR(vma)) {
> -			DRM_DEBUG_KMS("failed to pin object\n");
> -			return PTR_ERR(vma);
> -		}
> +		if (IS_ERR(vma))
> +			ret = PTR_ERR(vma);
> +
> +		to_intel_plane_state(new_state)->vma = vma;
>  	}
>  
>  	return 0;
> @@ -14256,19 +14242,12 @@ static void
>  intel_cleanup_plane_fb(struct drm_plane *plane,
>  		       struct drm_plane_state *old_state)
>  {
> -	struct drm_i915_private *dev_priv = to_i915(plane->dev);
> -	struct intel_plane_state *old_intel_state;
> -	struct drm_i915_gem_object *old_obj = intel_fb_obj(old_state->fb);
> -	struct drm_i915_gem_object *obj = intel_fb_obj(plane->state->fb);
> -
> -	old_intel_state = to_intel_plane_state(old_state);
> -
> -	if (!obj && !old_obj)
> -		return;
> +	struct i915_vma *vma;
>  
> -	if (old_obj && (plane->type != DRM_PLANE_TYPE_CURSOR ||
> -	    !INTEL_INFO(dev_priv)->cursor_needs_physical))
> -		intel_unpin_fb_obj(old_state->fb, old_state->rotation);
> +	/* Should only called after a successful intel_prepare_plane_fb()! */
> +	vma = fetch_and_zero(&to_intel_plane_state(old_state)->vma);
> +	if (vma)

WARN_ON(!vma); maybe even instead of the comment?

> +		intel_unpin_fb_vma(vma);
>  }
>  
>  static int intel_atomic_commit_prepare_planes(struct drm_atomic_state *state)
> @@ -15215,7 +15194,7 @@ intel_update_cursor_plane(struct drm_plane *plane,
>  	if (!obj)
>  		addr = 0;
>  	else if (!INTEL_INFO(dev_priv)->cursor_needs_physical)
> -		addr = i915_gem_object_ggtt_offset(obj, NULL);
> +		addr = i915_ggtt_offset(state->vma);
>  	else
>  		addr = obj->phys_handle->busaddr;
>  
> @@ -17135,6 +17114,8 @@ void intel_modeset_gem_init(struct drm_device *dev)
>  			update_state_fb(c->primary);
>  			c->state->plane_mask &= ~(1 << drm_plane_index(c->primary));
>  		}
> +
> +		to_intel_plane_state(c->primary->state)->vma = vma;
>  	}
>  }
>  
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index fff55d93ca73..d3d26d69930a 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -372,6 +372,7 @@ struct intel_atomic_state {
>  struct intel_plane_state {
>  	struct drm_plane_state base;
>  	struct drm_rect clip;

I think a comment here about the special refcounting rules for this would
be good, e.g.

"Note that despite that vmas are refcounted using i915_vma_get() and
i915_vma_put() we don't refcount them as part of the state like other
objects. Instead their lifetime is only between prepare_planes and
cleanup_planes, and hence vma must be set to NULL when duplicating the
plane state."

> +	struct i915_vma *vma;
>  
>  	struct {
>  		u32 offset;
> @@ -1046,6 +1047,7 @@ struct intel_flip_work {
>  	struct work_struct mmio_work;
>  
>  	struct drm_crtc *crtc;
> +	struct i915_vma *old_vma;
>  	struct drm_framebuffer *old_fb;
>  	struct drm_i915_gem_object *pending_flip_obj;
>  	struct drm_pending_vblank_event *event;
> @@ -1273,7 +1275,7 @@ void intel_release_load_detect_pipe(struct drm_connector *connector,
>  				    struct drm_modeset_acquire_ctx *ctx);
>  struct i915_vma *
>  intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb, unsigned int rotation);
> -void intel_unpin_fb_obj(struct drm_framebuffer *fb, unsigned int rotation);
> +void intel_unpin_fb_vma(struct i915_vma *vma);
>  struct drm_framebuffer *
>  __intel_framebuffer_create(struct drm_device *dev,
>  			   struct drm_mode_fb_cmd2 *mode_cmd,
> @@ -1358,7 +1360,10 @@ void intel_mode_from_pipe_config(struct drm_display_mode *mode,
>  int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state);
>  int skl_max_scale(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state);
>  
> -u32 intel_fb_gtt_offset(struct drm_framebuffer *fb, unsigned int rotation);
> +static inline u32 intel_plane_ggtt_offset(const struct intel_plane_state *state)
> +{
> +	return i915_ggtt_offset(state->vma);
> +}
>  
>  u32 skl_plane_ctl_format(uint32_t pixel_format);
>  u32 skl_plane_ctl_tiling(uint64_t fb_modifier);
> diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c
> index 62f215b12eb5..f3a1d6a5cabe 100644
> --- a/drivers/gpu/drm/i915/intel_fbc.c
> +++ b/drivers/gpu/drm/i915/intel_fbc.c
> @@ -173,7 +173,7 @@ static void i8xx_fbc_activate(struct drm_i915_private *dev_priv)
>  	if (IS_I945GM(dev_priv))
>  		fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */
>  	fbc_ctl |= (cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT;
> -	fbc_ctl |= params->fb.fence_reg;
> +	fbc_ctl |= params->vma->fence->id;
>  	I915_WRITE(FBC_CONTROL, fbc_ctl);
>  }
>  
> @@ -193,8 +193,8 @@ static void g4x_fbc_activate(struct drm_i915_private *dev_priv)
>  	else
>  		dpfc_ctl |= DPFC_CTL_LIMIT_1X;
>  
> -	if (params->fb.fence_reg != I915_FENCE_REG_NONE) {
> -		dpfc_ctl |= DPFC_CTL_FENCE_EN | params->fb.fence_reg;
> +	if (params->vma->fence) {
> +		dpfc_ctl |= DPFC_CTL_FENCE_EN | params->vma->fence->id;
>  		I915_WRITE(DPFC_FENCE_YOFF, params->crtc.fence_y_offset);
>  	} else {
>  		I915_WRITE(DPFC_FENCE_YOFF, 0);
> @@ -251,13 +251,14 @@ static void ilk_fbc_activate(struct drm_i915_private *dev_priv)
>  		break;
>  	}
>  
> -	if (params->fb.fence_reg != I915_FENCE_REG_NONE) {
> +	if (params->vma->fence) {
>  		dpfc_ctl |= DPFC_CTL_FENCE_EN;
>  		if (IS_GEN5(dev_priv))
> -			dpfc_ctl |= params->fb.fence_reg;
> +			dpfc_ctl |= params->vma->fence->id;
>  		if (IS_GEN6(dev_priv)) {
>  			I915_WRITE(SNB_DPFC_CTL_SA,
> -				   SNB_CPU_FENCE_ENABLE | params->fb.fence_reg);
> +				   SNB_CPU_FENCE_ENABLE |
> +				   params->vma->fence->id);
>  			I915_WRITE(DPFC_CPU_FENCE_OFFSET,
>  				   params->crtc.fence_y_offset);
>  		}
> @@ -269,7 +270,8 @@ static void ilk_fbc_activate(struct drm_i915_private *dev_priv)
>  	}
>  
>  	I915_WRITE(ILK_DPFC_FENCE_YOFF, params->crtc.fence_y_offset);
> -	I915_WRITE(ILK_FBC_RT_BASE, params->fb.ggtt_offset | ILK_FBC_RT_VALID);
> +	I915_WRITE(ILK_FBC_RT_BASE,
> +		   i915_ggtt_offset(params->vma) | ILK_FBC_RT_VALID);
>  	/* enable it... */
>  	I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
>  
> @@ -319,10 +321,11 @@ static void gen7_fbc_activate(struct drm_i915_private *dev_priv)
>  		break;
>  	}
>  
> -	if (params->fb.fence_reg != I915_FENCE_REG_NONE) {
> +	if (params->vma->fence) {
>  		dpfc_ctl |= IVB_DPFC_CTL_FENCE_EN;
>  		I915_WRITE(SNB_DPFC_CTL_SA,
> -			   SNB_CPU_FENCE_ENABLE | params->fb.fence_reg);
> +			   SNB_CPU_FENCE_ENABLE |
> +			   params->vma->fence->id);
>  		I915_WRITE(DPFC_CPU_FENCE_OFFSET, params->crtc.fence_y_offset);
>  	} else {
>  		I915_WRITE(SNB_DPFC_CTL_SA,0);
> @@ -727,14 +730,6 @@ static bool intel_fbc_hw_tracking_covers_screen(struct intel_crtc *crtc)
>  	return effective_w <= max_w && effective_h <= max_h;
>  }
>  
> -/* XXX replace me when we have VMA tracking for intel_plane_state */
> -static int get_fence_id(struct drm_framebuffer *fb)
> -{
> -	struct i915_vma *vma = i915_gem_object_to_ggtt(intel_fb_obj(fb), NULL);
> -
> -	return vma && vma->fence ? vma->fence->id : I915_FENCE_REG_NONE;
> -}
> -
>  static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
>  					 struct intel_crtc_state *crtc_state,
>  					 struct intel_plane_state *plane_state)
> @@ -743,7 +738,8 @@ static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
>  	struct intel_fbc *fbc = &dev_priv->fbc;
>  	struct intel_fbc_state_cache *cache = &fbc->state_cache;
>  	struct drm_framebuffer *fb = plane_state->base.fb;
> -	struct drm_i915_gem_object *obj;
> +
> +	cache->vma = NULL;
>  
>  	cache->crtc.mode_flags = crtc_state->base.adjusted_mode.flags;
>  	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
> @@ -758,16 +754,10 @@ static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
>  	if (!cache->plane.visible)
>  		return;
>  
> -	obj = intel_fb_obj(fb);
> -
> -	/* FIXME: We lack the proper locking here, so only run this on the
> -	 * platforms that need. */
> -	if (IS_GEN(dev_priv, 5, 6))
> -		cache->fb.ilk_ggtt_offset = i915_gem_object_ggtt_offset(obj, NULL);
>  	cache->fb.pixel_format = fb->pixel_format;
>  	cache->fb.stride = fb->pitches[0];
> -	cache->fb.fence_reg = get_fence_id(fb);
> -	cache->fb.tiling_mode = i915_gem_object_get_tiling(obj);
> +
> +	cache->vma = plane_state->vma;
>  }
>  
>  static bool intel_fbc_can_activate(struct intel_crtc *crtc)
> @@ -784,7 +774,7 @@ static bool intel_fbc_can_activate(struct intel_crtc *crtc)
>  		return false;
>  	}
>  
> -	if (!cache->plane.visible) {
> +	if (!cache->vma) {
>  		fbc->no_fbc_reason = "primary plane not visible";
>  		return false;
>  	}
> @@ -807,8 +797,7 @@ static bool intel_fbc_can_activate(struct intel_crtc *crtc)
>  	 * so have no fence associated with it) due to aperture constaints
>  	 * at the time of pinning.
>  	 */
> -	if (cache->fb.tiling_mode != I915_TILING_X ||
> -	    cache->fb.fence_reg == I915_FENCE_REG_NONE) {
> +	if (!cache->vma->fence) {
>  		fbc->no_fbc_reason = "framebuffer not tiled or fenced";
>  		return false;
>  	}
> @@ -888,17 +877,16 @@ static void intel_fbc_get_reg_params(struct intel_crtc *crtc,
>  	 * zero. */
>  	memset(params, 0, sizeof(*params));
>  
> +	params->vma = cache->vma;
> +
>  	params->crtc.pipe = crtc->pipe;
>  	params->crtc.plane = crtc->plane;
>  	params->crtc.fence_y_offset = get_crtc_fence_y_offset(crtc);
>  
>  	params->fb.pixel_format = cache->fb.pixel_format;
>  	params->fb.stride = cache->fb.stride;
> -	params->fb.fence_reg = cache->fb.fence_reg;
>  
>  	params->cfb_size = intel_fbc_calculate_cfb_size(dev_priv, cache);
> -
> -	params->fb.ggtt_offset = cache->fb.ilk_ggtt_offset;
>  }
>  
>  static bool intel_fbc_reg_params_equal(struct intel_fbc_reg_params *params1,
> diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
> index fc958d5ed0dc..ca29a5314f0e 100644
> --- a/drivers/gpu/drm/i915/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/intel_fbdev.c
> @@ -284,7 +284,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
>  out_destroy_fbi:
>  	drm_fb_helper_release_fbi(helper);
>  out_unpin:
> -	intel_unpin_fb_obj(&ifbdev->fb->base, DRM_ROTATE_0);
> +	intel_unpin_fb_vma(vma);
>  out_unlock:
>  	mutex_unlock(&dev->struct_mutex);
>  	return ret;
> @@ -549,7 +549,7 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev)
>  
>  	if (ifbdev->fb) {
>  		mutex_lock(&ifbdev->helper.dev->struct_mutex);
> -		intel_unpin_fb_obj(&ifbdev->fb->base, DRM_ROTATE_0);
> +		intel_unpin_fb_vma(ifbdev->vma);
>  		mutex_unlock(&ifbdev->helper.dev->struct_mutex);
>  
>  		drm_framebuffer_remove(&ifbdev->fb->base);
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> index 8b2fc67acbba..ae8ce621e3fc 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -281,7 +281,7 @@ skl_update_plane(struct drm_plane *drm_plane,
>  
>  	I915_WRITE(PLANE_CTL(pipe, plane), plane_ctl);
>  	I915_WRITE(PLANE_SURF(pipe, plane),
> -		   intel_fb_gtt_offset(fb, rotation) + surf_addr);
> +		   intel_plane_ggtt_offset(plane_state) + surf_addr);
>  	POSTING_READ(PLANE_SURF(pipe, plane));
>  }
>  
> @@ -476,7 +476,7 @@ vlv_update_plane(struct drm_plane *dplane,
>  	I915_WRITE(SPSIZE(pipe, plane), (crtc_h << 16) | crtc_w);
>  	I915_WRITE(SPCNTR(pipe, plane), sprctl);
>  	I915_WRITE(SPSURF(pipe, plane),
> -		   intel_fb_gtt_offset(fb, rotation) + sprsurf_offset);
> +		   intel_plane_ggtt_offset(plane_state) + sprsurf_offset);
>  	POSTING_READ(SPSURF(pipe, plane));
>  }
>  
> @@ -612,7 +612,7 @@ ivb_update_plane(struct drm_plane *plane,
>  		I915_WRITE(SPRSCALE(pipe), sprscale);
>  	I915_WRITE(SPRCTL(pipe), sprctl);
>  	I915_WRITE(SPRSURF(pipe),
> -		   intel_fb_gtt_offset(fb, rotation) + sprsurf_offset);
> +		   intel_plane_ggtt_offset(plane_state) + sprsurf_offset);
>  	POSTING_READ(SPRSURF(pipe));
>  }
>  
> @@ -739,7 +739,7 @@ ilk_update_plane(struct drm_plane *plane,
>  	I915_WRITE(DVSSCALE(pipe), dvsscale);
>  	I915_WRITE(DVSCNTR(pipe), dvscntr);
>  	I915_WRITE(DVSSURF(pipe),
> -		   intel_fb_gtt_offset(fb, rotation) + dvssurf_offset);
> +		   intel_plane_ggtt_offset(plane_state) + dvssurf_offset);
>  	POSTING_READ(DVSSURF(pipe));
>  }
>  
> -- 
> 2.10.2
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux