Commit 14af293f authored by Gustavo Padovan's avatar Gustavo Padovan Committed by Daniel Vetter
Browse files

drm/i915: create a prepare step for primary planes updates



Take out the pin_fb code so commit phase can't fail anymore.

Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent d288f65f
Loading
Loading
Loading
Loading
+26 −9
Original line number Diff line number Diff line
@@ -11403,20 +11403,16 @@ intel_check_primary_plane(struct drm_plane *plane,
}

static int
intel_commit_primary_plane(struct drm_plane *plane,
intel_prepare_primary_plane(struct drm_plane *plane,
			    struct intel_plane_state *state)
{
	struct drm_crtc *crtc = state->crtc;
	struct drm_framebuffer *fb = state->fb;
	struct drm_device *dev = crtc->dev;
	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 = plane->fb;
	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
	struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->fb);
	struct intel_plane *intel_plane = to_intel_plane(plane);
	struct drm_rect *src = &state->src;
	int ret;

	intel_crtc_wait_for_pending_flips(crtc);
@@ -11426,7 +11422,7 @@ intel_commit_primary_plane(struct drm_plane *plane,
		return -EBUSY;
	}

	if (plane->fb != fb) {
	if (old_obj != obj) {
		mutex_lock(&dev->struct_mutex);
		ret = intel_pin_and_fence_fb_obj(dev, obj, NULL);
		if (ret == 0)
@@ -11439,6 +11435,25 @@ intel_commit_primary_plane(struct drm_plane *plane,
		}
	}

	return 0;
}

static void
intel_commit_primary_plane(struct drm_plane *plane,
			   struct intel_plane_state *state)
{
	struct drm_crtc *crtc = state->crtc;
	struct drm_framebuffer *fb = state->fb;
	struct drm_device *dev = crtc->dev;
	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 = plane->fb;
	struct drm_i915_gem_object *obj = intel_fb_obj(fb);
	struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->fb);
	struct intel_plane *intel_plane = to_intel_plane(plane);
	struct drm_rect *src = &state->src;

	crtc->primary->fb = fb;
	crtc->x = src->x1;
	crtc->y = src->y1;
@@ -11515,8 +11530,6 @@ intel_commit_primary_plane(struct drm_plane *plane,
		intel_unpin_fb_obj(old_obj);
		mutex_unlock(&dev->struct_mutex);
	}

	return 0;
}

static int
@@ -11557,6 +11570,10 @@ intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc,
	if (ret)
		return ret;

	ret = intel_prepare_primary_plane(plane, &state);
	if (ret)
		return ret;

	intel_commit_primary_plane(plane, &state);

	return 0;