diff mbox

[2/2] drm/i915: Make use of intel_fb_obj()

Message ID 1404782508-9007-2-git-send-email-matthew.d.roper@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Matt Roper July 8, 2014, 1:21 a.m. UTC
This should hopefully simplify the display code slightly and also
solves at least one mistake in intel_pipe_set_base() where
to_intel_framebuffer(fb)->obj is referenced during local variable
initialization, before 'if (!fb)' gets checked.

Potential uses of this macro were identified via the following
Coccinelle patch:

        @@
        expression E;
        @@
        * to_intel_framebuffer(E)->obj

        @@
        expression E;
        identifier I;
        @@
          I = to_intel_framebuffer(E);
          ...
        * I->obj

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/i915/intel_display.c | 69 +++++++++++++-----------------------
 drivers/gpu/drm/i915/intel_dp.c      |  3 +-
 drivers/gpu/drm/i915/intel_pm.c      | 24 +++++--------
 3 files changed, 35 insertions(+), 61 deletions(-)

Comments

Chris Wilson July 8, 2014, 6:47 a.m. UTC | #1
On Mon, Jul 07, 2014 at 06:21:48PM -0700, Matt Roper wrote:
> This should hopefully simplify the display code slightly and also
> solves at least one mistake in intel_pipe_set_base() where
> to_intel_framebuffer(fb)->obj is referenced during local variable
> initialization, before 'if (!fb)' gets checked.
> 
> Potential uses of this macro were identified via the following
> Coccinelle patch:
> 
>         @@
>         expression E;
>         @@
>         * to_intel_framebuffer(E)->obj
> 
>         @@
>         expression E;
>         identifier I;
>         @@
>           I = to_intel_framebuffer(E);
>           ...
>         * I->obj
> 
> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

The only drawback is that I am suddenly nervous of potential NULL
objs...

> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 8c3dcdf..bc2519f 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -2356,7 +2356,7 @@ static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
>  	struct drm_device *dev = intel_crtc->base.dev;
>  	struct drm_crtc *c;
>  	struct intel_crtc *i;
> -	struct intel_framebuffer *fb;
> +	struct drm_i915_gem_object *obj;
>  
>  	if (!intel_crtc->base.primary->fb)
>  		return;
> @@ -2380,11 +2380,11 @@ static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
>  		if (!i->active || !c->primary->fb)
>  			continue;
>  
> -		fb = to_intel_framebuffer(c->primary->fb);
> -		if (i915_gem_obj_ggtt_offset(fb->obj) == plane_config->base) {
> +		obj = intel_fb_obj(c->primary->fb);

I would move this before the c->primary->fb test and rewrite the check
in terms of obj.

if (!i->active)
  continue;

obj = intel_fb_obj(c->primary->fb);
if (obj == NULL)
  continue;

> +		if (i915_gem_obj_ggtt_offset(obj) == plane_config->base) {
>  			drm_framebuffer_reference(c->primary->fb);
>  			intel_crtc->base.primary->fb = c->primary->fb;
> -			fb->obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
> +			obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
>  			break;
>  		}
>  	}
>  

> @@ -9613,7 +9601,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
>  
>  	work->event = event;
>  	work->crtc = crtc;
> -	work->old_fb_obj = to_intel_framebuffer(old_fb)->obj;
> +	work->old_fb_obj = intel_fb_obj(old_fb);
>  	INIT_WORK(&work->work, intel_unpin_work_fn);

Here I would appreciate an
if (WARN_ON(intel_fb_obj(old_fb) == NULL))
  return -EBUSY;
at the start of intel_crtc_page_flip.
>  
>  	ret = drm_crtc_vblank_get(crtc);

> @@ -12971,8 +12952,8 @@ void intel_modeset_gem_init(struct drm_device *dev)
>  		if (!c->primary->fb)
>  			continue;
>  
> -		fb = to_intel_framebuffer(c->primary->fb);
> -		if (intel_pin_and_fence_fb_obj(dev, fb->obj, NULL)) {
> +		obj = intel_fb_obj(c->primary->fb);

Same again, change the check on primary->fb to be a check on obj.

> +		if (intel_pin_and_fence_fb_obj(dev, obj, NULL)) {
>  			DRM_ERROR("failed to pin boot fb on pipe %d\n",
>  				  to_intel_crtc(c)->pipe);
>  			drm_framebuffer_unreference(c->primary->fb);

Elsewhere a GPF for a NULL pointer is reasonable.
-Chris
Daniel Vetter July 8, 2014, 9:51 a.m. UTC | #2
On Tue, Jul 08, 2014 at 07:47:13AM +0100, Chris Wilson wrote:
> On Mon, Jul 07, 2014 at 06:21:48PM -0700, Matt Roper wrote:
> > This should hopefully simplify the display code slightly and also
> > solves at least one mistake in intel_pipe_set_base() where
> > to_intel_framebuffer(fb)->obj is referenced during local variable
> > initialization, before 'if (!fb)' gets checked.
> > 
> > Potential uses of this macro were identified via the following
> > Coccinelle patch:
> > 
> >         @@
> >         expression E;
> >         @@
> >         * to_intel_framebuffer(E)->obj
> > 
> >         @@
> >         expression E;
> >         identifier I;
> >         @@
> >           I = to_intel_framebuffer(E);
> >           ...
> >         * I->obj
> > 
> > Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> 
> The only drawback is that I am suddenly nervous of potential NULL
> objs...

I concur with Chris here, I think intel_fb_obj should be a static inline
and first check for fb == NULL. To catch abuse we could do an

if (WARN_ON(!fb))
	return NULL;

return to_intel_framebuffer(fb)->obj;

The most likely abuse is that we call intel_fb_obj before checking fb for
NULL, so the WARN is better than a BUG_ON. With that I don't think we need
to change the checks as Chris suggested here.
-Daniel

> 
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index 8c3dcdf..bc2519f 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -2356,7 +2356,7 @@ static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
> >  	struct drm_device *dev = intel_crtc->base.dev;
> >  	struct drm_crtc *c;
> >  	struct intel_crtc *i;
> > -	struct intel_framebuffer *fb;
> > +	struct drm_i915_gem_object *obj;
> >  
> >  	if (!intel_crtc->base.primary->fb)
> >  		return;
> > @@ -2380,11 +2380,11 @@ static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
> >  		if (!i->active || !c->primary->fb)
> >  			continue;
> >  
> > -		fb = to_intel_framebuffer(c->primary->fb);
> > -		if (i915_gem_obj_ggtt_offset(fb->obj) == plane_config->base) {
> > +		obj = intel_fb_obj(c->primary->fb);
> 
> I would move this before the c->primary->fb test and rewrite the check
> in terms of obj.
> 
> if (!i->active)
>   continue;
> 
> obj = intel_fb_obj(c->primary->fb);
> if (obj == NULL)
>   continue;
> 
> > +		if (i915_gem_obj_ggtt_offset(obj) == plane_config->base) {
> >  			drm_framebuffer_reference(c->primary->fb);
> >  			intel_crtc->base.primary->fb = c->primary->fb;
> > -			fb->obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
> > +			obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
> >  			break;
> >  		}
> >  	}
> >  
> 
> > @@ -9613,7 +9601,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
> >  
> >  	work->event = event;
> >  	work->crtc = crtc;
> > -	work->old_fb_obj = to_intel_framebuffer(old_fb)->obj;
> > +	work->old_fb_obj = intel_fb_obj(old_fb);
> >  	INIT_WORK(&work->work, intel_unpin_work_fn);
> 
> Here I would appreciate an
> if (WARN_ON(intel_fb_obj(old_fb) == NULL))
>   return -EBUSY;
> at the start of intel_crtc_page_flip.
> >  
> >  	ret = drm_crtc_vblank_get(crtc);
> 
> > @@ -12971,8 +12952,8 @@ void intel_modeset_gem_init(struct drm_device *dev)
> >  		if (!c->primary->fb)
> >  			continue;
> >  
> > -		fb = to_intel_framebuffer(c->primary->fb);
> > -		if (intel_pin_and_fence_fb_obj(dev, fb->obj, NULL)) {
> > +		obj = intel_fb_obj(c->primary->fb);
> 
> Same again, change the check on primary->fb to be a check on obj.
> 
> > +		if (intel_pin_and_fence_fb_obj(dev, obj, NULL)) {
> >  			DRM_ERROR("failed to pin boot fb on pipe %d\n",
> >  				  to_intel_crtc(c)->pipe);
> >  			drm_framebuffer_unreference(c->primary->fb);
> 
> Elsewhere a GPF for a NULL pointer is reasonable.
> -Chris
> 
> -- 
> Chris Wilson, Intel Open Source Technology Centre
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Chris Wilson July 8, 2014, 10:06 a.m. UTC | #3
On Tue, Jul 08, 2014 at 11:51:18AM +0200, Daniel Vetter wrote:
> On Tue, Jul 08, 2014 at 07:47:13AM +0100, Chris Wilson wrote:
> > On Mon, Jul 07, 2014 at 06:21:48PM -0700, Matt Roper wrote:
> > > This should hopefully simplify the display code slightly and also
> > > solves at least one mistake in intel_pipe_set_base() where
> > > to_intel_framebuffer(fb)->obj is referenced during local variable
> > > initialization, before 'if (!fb)' gets checked.
> > > 
> > > Potential uses of this macro were identified via the following
> > > Coccinelle patch:
> > > 
> > >         @@
> > >         expression E;
> > >         @@
> > >         * to_intel_framebuffer(E)->obj
> > > 
> > >         @@
> > >         expression E;
> > >         identifier I;
> > >         @@
> > >           I = to_intel_framebuffer(E);
> > >           ...
> > >         * I->obj
> > > 
> > > Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> > 
> > The only drawback is that I am suddenly nervous of potential NULL
> > objs...
> 
> I concur with Chris here, I think intel_fb_obj should be a static inline
> and first check for fb == NULL. To catch abuse we could do an
> 
> if (WARN_ON(!fb))
> 	return NULL;
> 
> return to_intel_framebuffer(fb)->obj;
> 
> The most likely abuse is that we call intel_fb_obj before checking fb for
> NULL, so the WARN is better than a BUG_ON. With that I don't think we need
> to change the checks as Chris suggested here.

This came about because of one path where we should have expected fb to
be NULL. Having a WARN followed by a GPF isn't any better than the GPF,
in which case this patch is superfluous and you would rather just fix
the single callsite where the bug occurred.
-Chris
Daniel Vetter July 8, 2014, 11:14 a.m. UTC | #4
On Tue, Jul 08, 2014 at 11:06:49AM +0100, Chris Wilson wrote:
> On Tue, Jul 08, 2014 at 11:51:18AM +0200, Daniel Vetter wrote:
> > On Tue, Jul 08, 2014 at 07:47:13AM +0100, Chris Wilson wrote:
> > > On Mon, Jul 07, 2014 at 06:21:48PM -0700, Matt Roper wrote:
> > > > This should hopefully simplify the display code slightly and also
> > > > solves at least one mistake in intel_pipe_set_base() where
> > > > to_intel_framebuffer(fb)->obj is referenced during local variable
> > > > initialization, before 'if (!fb)' gets checked.
> > > > 
> > > > Potential uses of this macro were identified via the following
> > > > Coccinelle patch:
> > > > 
> > > >         @@
> > > >         expression E;
> > > >         @@
> > > >         * to_intel_framebuffer(E)->obj
> > > > 
> > > >         @@
> > > >         expression E;
> > > >         identifier I;
> > > >         @@
> > > >           I = to_intel_framebuffer(E);
> > > >           ...
> > > >         * I->obj
> > > > 
> > > > Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> > > 
> > > The only drawback is that I am suddenly nervous of potential NULL
> > > objs...
> > 
> > I concur with Chris here, I think intel_fb_obj should be a static inline
> > and first check for fb == NULL. To catch abuse we could do an
> > 
> > if (WARN_ON(!fb))
> > 	return NULL;
> > 
> > return to_intel_framebuffer(fb)->obj;
> > 
> > The most likely abuse is that we call intel_fb_obj before checking fb for
> > NULL, so the WARN is better than a BUG_ON. With that I don't think we need
> > to change the checks as Chris suggested here.
> 
> This came about because of one path where we should have expected fb to
> be NULL. Having a WARN followed by a GPF isn't any better than the GPF,
> in which case this patch is superfluous and you would rather just fix
> the single callsite where the bug occurred.

Ok, I've missed the context then. Anyway I like the idea of intel_fb_obj
and that it'll make the code more robust against misorderings of fb ==
NULL checks. Please ignore me and proceed ;-)
-Daniel
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 8c3dcdf..bc2519f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2356,7 +2356,7 @@  static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
 	struct drm_device *dev = intel_crtc->base.dev;
 	struct drm_crtc *c;
 	struct intel_crtc *i;
-	struct intel_framebuffer *fb;
+	struct drm_i915_gem_object *obj;
 
 	if (!intel_crtc->base.primary->fb)
 		return;
@@ -2380,11 +2380,11 @@  static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
 		if (!i->active || !c->primary->fb)
 			continue;
 
-		fb = to_intel_framebuffer(c->primary->fb);
-		if (i915_gem_obj_ggtt_offset(fb->obj) == plane_config->base) {
+		obj = intel_fb_obj(c->primary->fb);
+		if (i915_gem_obj_ggtt_offset(obj) == plane_config->base) {
 			drm_framebuffer_reference(c->primary->fb);
 			intel_crtc->base.primary->fb = c->primary->fb;
-			fb->obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
+			obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
 			break;
 		}
 	}
@@ -2397,16 +2397,12 @@  static void i9xx_update_primary_plane(struct drm_crtc *crtc,
 	struct drm_device *dev = crtc->dev;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-	struct intel_framebuffer *intel_fb;
-	struct drm_i915_gem_object *obj;
+	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 	int plane = intel_crtc->plane;
 	unsigned long linear_offset;
 	u32 dspcntr;
 	u32 reg;
 
-	intel_fb = to_intel_framebuffer(fb);
-	obj = intel_fb->obj;
-
 	reg = DSPCNTR(plane);
 	dspcntr = I915_READ(reg);
 	/* Mask out pixel format bits in case we change it */
@@ -2487,16 +2483,12 @@  static void ironlake_update_primary_plane(struct drm_crtc *crtc,
 	struct drm_device *dev = crtc->dev;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-	struct intel_framebuffer *intel_fb;
-	struct drm_i915_gem_object *obj;
+	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 	int plane = intel_crtc->plane;
 	unsigned long linear_offset;
 	u32 dspcntr;
 	u32 reg;
 
-	intel_fb = to_intel_framebuffer(fb);
-	obj = intel_fb->obj;
-
 	reg = DSPCNTR(plane);
 	dspcntr = I915_READ(reg);
 	/* Mask out pixel format bits in case we change it */
@@ -2627,7 +2619,7 @@  void intel_display_handle_reset(struct drm_device *dev)
 static int
 intel_finish_fb(struct drm_framebuffer *old_fb)
 {
-	struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj;
+	struct drm_i915_gem_object *obj = intel_fb_obj(old_fb);
 	struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
 	bool was_interruptible = dev_priv->mm.interruptible;
 	int ret;
@@ -2674,9 +2666,9 @@  intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 	enum pipe pipe = intel_crtc->pipe;
-	struct drm_framebuffer *old_fb;
-	struct drm_i915_gem_object *obj = to_intel_framebuffer(fb)->obj;
-	struct drm_i915_gem_object *old_obj;
+	struct drm_framebuffer *old_fb = crtc->primary->fb;
+	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
+	struct drm_i915_gem_object *old_obj = intel_fb_obj(old_fb);
 	int ret;
 
 	if (intel_crtc_has_pending_flip(crtc)) {
@@ -2697,9 +2689,6 @@  intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
 		return -EINVAL;
 	}
 
-	old_fb = crtc->primary->fb;
-	old_obj = old_fb ? to_intel_framebuffer(old_fb)->obj : NULL;
-
 	mutex_lock(&dev->struct_mutex);
 	ret = intel_pin_and_fence_fb_obj(dev, obj, NULL);
 	if (ret == 0)
@@ -2755,7 +2744,7 @@  intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
 		if (intel_crtc->active && old_fb != fb)
 			intel_wait_for_vblank(dev, intel_crtc->pipe);
 		mutex_lock(&dev->struct_mutex);
-		intel_unpin_fb_obj(to_intel_framebuffer(old_fb)->obj);
+		intel_unpin_fb_obj(old_obj);
 		mutex_unlock(&dev->struct_mutex);
 	}
 
@@ -4929,7 +4918,7 @@  static void intel_crtc_disable(struct drm_crtc *crtc)
 	struct drm_device *dev = crtc->dev;
 	struct drm_connector *connector;
 	struct drm_i915_private *dev_priv = dev->dev_private;
-	struct drm_i915_gem_object *old_obj;
+	struct drm_i915_gem_object *old_obj = intel_fb_obj(crtc->primary->fb);
 	enum pipe pipe = to_intel_crtc(crtc)->pipe;
 
 	/* crtc should still be enabled when we disable it. */
@@ -4944,7 +4933,6 @@  static void intel_crtc_disable(struct drm_crtc *crtc)
 	assert_pipe_disabled(dev->dev_private, pipe);
 
 	if (crtc->primary->fb) {
-		old_obj = to_intel_framebuffer(crtc->primary->fb)->obj;
 		mutex_lock(&dev->struct_mutex);
 		intel_unpin_fb_obj(old_obj);
 		i915_gem_track_fb(old_obj, NULL,
@@ -9583,7 +9571,7 @@  static int intel_crtc_page_flip(struct drm_crtc *crtc,
 	struct drm_device *dev = crtc->dev;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_framebuffer *old_fb = crtc->primary->fb;
-	struct drm_i915_gem_object *obj = to_intel_framebuffer(fb)->obj;
+	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 	enum pipe pipe = intel_crtc->pipe;
 	struct intel_unpin_work *work;
@@ -9613,7 +9601,7 @@  static int intel_crtc_page_flip(struct drm_crtc *crtc,
 
 	work->event = event;
 	work->crtc = crtc;
-	work->old_fb_obj = to_intel_framebuffer(old_fb)->obj;
+	work->old_fb_obj = intel_fb_obj(old_fb);
 	INIT_WORK(&work->work, intel_unpin_work_fn);
 
 	ret = drm_crtc_vblank_get(crtc);
@@ -10750,10 +10738,9 @@  static int __intel_set_mode(struct drm_crtc *crtc,
 	 * on the DPLL.
 	 */
 	for_each_intel_crtc_masked(dev, modeset_pipes, intel_crtc) {
-		struct drm_framebuffer *old_fb;
-		struct drm_i915_gem_object *old_obj = NULL;
-		struct drm_i915_gem_object *obj =
-			to_intel_framebuffer(fb)->obj;
+		struct drm_framebuffer *old_fb = crtc->primary->fb;
+		struct drm_i915_gem_object *old_obj = intel_fb_obj(old_fb);
+		struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 
 		mutex_lock(&dev->struct_mutex);
 		ret = intel_pin_and_fence_fb_obj(dev,
@@ -10764,11 +10751,8 @@  static int __intel_set_mode(struct drm_crtc *crtc,
 			mutex_unlock(&dev->struct_mutex);
 			goto done;
 		}
-		old_fb = crtc->primary->fb;
-		if (old_fb) {
-			old_obj = to_intel_framebuffer(old_fb)->obj;
+		if (old_fb)
 			intel_unpin_fb_obj(old_obj);
-		}
 		i915_gem_track_fb(old_obj, obj,
 				  INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe));
 		mutex_unlock(&dev->struct_mutex);
@@ -11386,9 +11370,9 @@  intel_primary_plane_disable(struct drm_plane *plane)
 	intel_disable_primary_hw_plane(dev_priv, intel_plane->plane,
 				       intel_plane->pipe);
 disable_unpin:
-	i915_gem_track_fb(to_intel_framebuffer(plane->fb)->obj, NULL,
+	i915_gem_track_fb(intel_fb_obj(plane->fb), NULL,
 			  INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe));
-	intel_unpin_fb_obj(to_intel_framebuffer(plane->fb)->obj);
+	intel_unpin_fb_obj(intel_fb_obj(plane->fb));
 	plane->fb = NULL;
 
 	return 0;
@@ -11405,7 +11389,8 @@  intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc,
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 	struct intel_plane *intel_plane = to_intel_plane(plane);
-	struct drm_i915_gem_object *obj, *old_obj = NULL;
+	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
+	struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->fb);
 	struct drm_rect dest = {
 		/* integer pixels */
 		.x1 = crtc_x,
@@ -11437,10 +11422,6 @@  intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc,
 	if (ret)
 		return ret;
 
-	if (plane->fb)
-		old_obj = to_intel_framebuffer(plane->fb)->obj;
-	obj = to_intel_framebuffer(fb)->obj;
-
 	/*
 	 * If the CRTC isn't enabled, we're just pinning the framebuffer,
 	 * updating the fb pointer, and returning without touching the
@@ -12951,7 +12932,7 @@  void intel_modeset_setup_hw_state(struct drm_device *dev,
 void intel_modeset_gem_init(struct drm_device *dev)
 {
 	struct drm_crtc *c;
-	struct intel_framebuffer *fb;
+	struct drm_i915_gem_object *obj;
 
 	mutex_lock(&dev->struct_mutex);
 	intel_init_gt_powersave(dev);
@@ -12971,8 +12952,8 @@  void intel_modeset_gem_init(struct drm_device *dev)
 		if (!c->primary->fb)
 			continue;
 
-		fb = to_intel_framebuffer(c->primary->fb);
-		if (intel_pin_and_fence_fb_obj(dev, fb->obj, NULL)) {
+		obj = intel_fb_obj(c->primary->fb);
+		if (intel_pin_and_fence_fb_obj(dev, obj, NULL)) {
 			DRM_ERROR("failed to pin boot fb on pipe %d\n",
 				  to_intel_crtc(c)->pipe);
 			drm_framebuffer_unreference(c->primary->fb);
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index faca6d3..a2a81d2 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1751,7 +1751,7 @@  static bool intel_edp_psr_match_conditions(struct intel_dp *intel_dp)
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_crtc *crtc = dig_port->base.base.crtc;
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-	struct drm_i915_gem_object *obj = to_intel_framebuffer(crtc->primary->fb)->obj;
+	struct drm_i915_gem_object *obj = intel_fb_obj(crtc->primary->fb);
 	struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
 
 	dev_priv->psr.source_ok = false;
@@ -1784,7 +1784,6 @@  static bool intel_edp_psr_match_conditions(struct intel_dp *intel_dp)
 		return false;
 	}
 
-	obj = to_intel_framebuffer(crtc->primary->fb)->obj;
 	if (obj->tiling_mode != I915_TILING_X ||
 	    obj->fence_reg == I915_FENCE_REG_NONE) {
 		DRM_DEBUG_KMS("PSR condition failed: fb not tiled or fenced\n");
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index f2a4056..cb31e18 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -93,8 +93,7 @@  static void i8xx_enable_fbc(struct drm_crtc *crtc)
 	struct drm_device *dev = crtc->dev;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_framebuffer *fb = crtc->primary->fb;
-	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
-	struct drm_i915_gem_object *obj = intel_fb->obj;
+	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 	int cfb_pitch;
 	int i;
@@ -150,8 +149,7 @@  static void g4x_enable_fbc(struct drm_crtc *crtc)
 	struct drm_device *dev = crtc->dev;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_framebuffer *fb = crtc->primary->fb;
-	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
-	struct drm_i915_gem_object *obj = intel_fb->obj;
+	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 	u32 dpfc_ctl;
 
@@ -222,8 +220,7 @@  static void ironlake_enable_fbc(struct drm_crtc *crtc)
 	struct drm_device *dev = crtc->dev;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_framebuffer *fb = crtc->primary->fb;
-	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
-	struct drm_i915_gem_object *obj = intel_fb->obj;
+	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 	u32 dpfc_ctl;
 
@@ -289,8 +286,7 @@  static void gen7_enable_fbc(struct drm_crtc *crtc)
 	struct drm_device *dev = crtc->dev;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_framebuffer *fb = crtc->primary->fb;
-	struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
-	struct drm_i915_gem_object *obj = intel_fb->obj;
+	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 	u32 dpfc_ctl;
 
@@ -485,7 +481,6 @@  void intel_update_fbc(struct drm_device *dev)
 	struct drm_crtc *crtc = NULL, *tmp_crtc;
 	struct intel_crtc *intel_crtc;
 	struct drm_framebuffer *fb;
-	struct intel_framebuffer *intel_fb;
 	struct drm_i915_gem_object *obj;
 	const struct drm_display_mode *adjusted_mode;
 	unsigned int max_width, max_height;
@@ -530,8 +525,7 @@  void intel_update_fbc(struct drm_device *dev)
 
 	intel_crtc = to_intel_crtc(crtc);
 	fb = crtc->primary->fb;
-	intel_fb = to_intel_framebuffer(fb);
-	obj = intel_fb->obj;
+	obj = intel_fb_obj(fb);
 	adjusted_mode = &intel_crtc->config.adjusted_mode;
 
 	if (i915.enable_fbc < 0) {
@@ -589,7 +583,7 @@  void intel_update_fbc(struct drm_device *dev)
 	if (in_dbg_master())
 		goto out_disable;
 
-	if (i915_gem_stolen_setup_compression(dev, intel_fb->obj->base.size,
+	if (i915_gem_stolen_setup_compression(dev, obj->base.size,
 					      drm_format_plane_cpp(fb->pixel_format, 0))) {
 		if (set_no_fbc_reason(dev_priv, FBC_STOLEN_TOO_SMALL))
 			DRM_DEBUG_KMS("framebuffer too large, disabling compression\n");
@@ -1599,12 +1593,12 @@  static void i9xx_update_wm(struct drm_crtc *unused_crtc)
 	DRM_DEBUG_KMS("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm);
 
 	if (IS_I915GM(dev) && enabled) {
-		struct intel_framebuffer *fb;
+		struct drm_i915_gem_object *obj;
 
-		fb = to_intel_framebuffer(enabled->primary->fb);
+		obj = intel_fb_obj(enabled->primary->fb);
 
 		/* self-refresh seems busted with untiled */
-		if (fb->obj->tiling_mode == I915_TILING_NONE)
+		if (obj->tiling_mode == I915_TILING_NONE)
 			enabled = NULL;
 	}