Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55a08b3f authored by Maarten Lankhorst's avatar Maarten Lankhorst
Browse files

drm/i915: Use the plane state for cursor updates.



Cursor planes grab the state from plane->state instead of the state
that was passed. The only updates are atomic now, so use the plane_state
that's passed in.

Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1452164052-21752-6-git-send-email-maarten.lankhorst@linux.intel.com


Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
parent f2858021
Loading
Loading
Loading
Loading
+46 −46
Original line number Diff line number Diff line
@@ -10112,16 +10112,17 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
	return true;
}

static void i845_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
static void i845_update_cursor(struct drm_crtc *crtc, u32 base,
			       const struct intel_plane_state *plane_state)
{
	struct drm_device *dev = crtc->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
	uint32_t cntl = 0, size = 0;

	if (on) {
		unsigned int width = intel_crtc->base.cursor->state->crtc_w;
		unsigned int height = intel_crtc->base.cursor->state->crtc_h;
	if (plane_state && plane_state->visible) {
		unsigned int width = plane_state->base.crtc_w;
		unsigned int height = plane_state->base.crtc_h;
		unsigned int stride = roundup_pow_of_two(width) * 4;

		switch (stride) {
@@ -10174,7 +10175,8 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
	}
}

static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base,
			       const struct intel_plane_state *plane_state)
{
	struct drm_device *dev = crtc->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
@@ -10182,9 +10184,9 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
	int pipe = intel_crtc->pipe;
	uint32_t cntl = 0;

	if (on) {
	if (plane_state && plane_state->visible) {
		cntl = MCURSOR_GAMMA_ENABLE;
		switch (intel_crtc->base.cursor->state->crtc_w) {
		switch (plane_state->base.crtc_w) {
			case 64:
				cntl |= CURSOR_MODE_64_ARGB_AX;
				break;
@@ -10195,17 +10197,17 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
				cntl |= CURSOR_MODE_256_ARGB_AX;
				break;
			default:
				MISSING_CASE(intel_crtc->base.cursor->state->crtc_w);
				MISSING_CASE(plane_state->base.crtc_w);
				return;
		}
		cntl |= pipe << 28; /* Connect to correct pipe */

		if (HAS_DDI(dev))
			cntl |= CURSOR_PIPE_CSC_ENABLE;
	}

	if (crtc->cursor->state->rotation == BIT(DRM_ROTATE_180))
		if (plane_state->base.rotation == BIT(DRM_ROTATE_180))
			cntl |= CURSOR_ROTATE_180;
	}

	if (intel_crtc->cursor_cntl != cntl) {
		I915_WRITE(CURCNTR(pipe), cntl);
@@ -10222,18 +10224,18 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on)

/* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */
static void intel_crtc_update_cursor(struct drm_crtc *crtc,
				     bool on)
				     const struct intel_plane_state *plane_state)
{
	struct drm_device *dev = crtc->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
	int pipe = intel_crtc->pipe;
	struct drm_plane_state *cursor_state = crtc->cursor->state;
	int x = cursor_state->crtc_x;
	int y = cursor_state->crtc_y;
	u32 base = 0, pos = 0;
	u32 base = intel_crtc->cursor_addr;
	u32 pos = 0;

	base = intel_crtc->cursor_addr;
	if (plane_state) {
		int x = plane_state->base.crtc_x;
		int y = plane_state->base.crtc_y;

		if (x < 0) {
			pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT;
@@ -10247,19 +10249,20 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc,
		}
		pos |= y << CURSOR_Y_SHIFT;

	I915_WRITE(CURPOS(pipe), pos);

		/* ILK+ do this automagically */
		if (HAS_GMCH_DISPLAY(dev) &&
	    crtc->cursor->state->rotation == BIT(DRM_ROTATE_180)) {
		base += (cursor_state->crtc_h *
			 cursor_state->crtc_w - 1) * 4;
		    plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
			base += (plane_state->base.crtc_h *
				 plane_state->base.crtc_w - 1) * 4;
		}
	}

	I915_WRITE(CURPOS(pipe), pos);

	if (IS_845G(dev) || IS_I865G(dev))
		i845_update_cursor(crtc, base, on);
		i845_update_cursor(crtc, base, plane_state);
	else
		i9xx_update_cursor(crtc, base, on);
		i9xx_update_cursor(crtc, base, plane_state);
}

static bool cursor_size_ok(struct drm_device *dev,
@@ -14259,22 +14262,20 @@ intel_disable_cursor_plane(struct drm_plane *plane,
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);

	intel_crtc->cursor_addr = 0;
	intel_crtc_update_cursor(crtc, false);
	intel_crtc_update_cursor(crtc, NULL);
}

static void
intel_commit_cursor_plane(struct drm_plane *plane,
			  struct intel_plane_state *state)
intel_update_cursor_plane(struct drm_plane *plane,
			  const struct intel_crtc_state *crtc_state,
			  const struct intel_plane_state *state)
{
	struct drm_crtc *crtc = state->base.crtc;
	struct drm_crtc *crtc = crtc_state->base.crtc;
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
	struct drm_device *dev = plane->dev;
	struct intel_crtc *intel_crtc;
	struct drm_i915_gem_object *obj = intel_fb_obj(state->base.fb);
	uint32_t addr;

	crtc = crtc ? crtc : plane->crtc;
	intel_crtc = to_intel_crtc(crtc);

	if (!obj)
		addr = 0;
	else if (!INTEL_INFO(dev)->cursor_needs_physical)
@@ -14283,8 +14284,7 @@ intel_commit_cursor_plane(struct drm_plane *plane,
		addr = obj->phys_handle->busaddr;

	intel_crtc->cursor_addr = addr;

	intel_crtc_update_cursor(crtc, state->visible);
	intel_crtc_update_cursor(crtc, state);
}

static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
@@ -14310,7 +14310,7 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
	cursor->plane = pipe;
	cursor->frontbuffer_bit = INTEL_FRONTBUFFER_CURSOR(pipe);
	cursor->check_plane = intel_check_cursor_plane;
	cursor->commit_plane = intel_commit_cursor_plane;
	cursor->update_plane = intel_update_cursor_plane;
	cursor->disable_plane = intel_disable_cursor_plane;

	drm_universal_plane_init(dev, &cursor->base, 0,