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

Commit 7b832b56 authored by Keith Packard's avatar Keith Packard Committed by Dave Airlie
Browse files

drm/i915: Handle tiled buffers in vblank tasklet



The vblank tasklet update code must build 2D blt commands with the appropriate
tiled flags

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent a36b7dcc
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -566,6 +566,8 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
#define XY_SRC_COPY_BLT_CMD		((2<<29)|(0x53<<22)|6)
#define XY_SRC_COPY_BLT_CMD		((2<<29)|(0x53<<22)|6)
#define XY_SRC_COPY_BLT_WRITE_ALPHA	(1<<21)
#define XY_SRC_COPY_BLT_WRITE_ALPHA	(1<<21)
#define XY_SRC_COPY_BLT_WRITE_RGB	(1<<20)
#define XY_SRC_COPY_BLT_WRITE_RGB	(1<<20)
#define XY_SRC_COPY_BLT_SRC_TILED	(1<<15)
#define XY_SRC_COPY_BLT_DST_TILED	(1<<11)


#define MI_BATCH_BUFFER		((0x30<<23)|1)
#define MI_BATCH_BUFFER		((0x30<<23)|1)
#define MI_BATCH_BUFFER_START	(0x31<<23)
#define MI_BATCH_BUFFER_START	(0x31<<23)
+14 −4
Original line number Original line Diff line number Diff line
@@ -57,10 +57,20 @@ static void i915_vblank_tasklet(struct drm_device *dev)
				XY_SRC_COPY_BLT_WRITE_ALPHA |
				XY_SRC_COPY_BLT_WRITE_ALPHA |
				XY_SRC_COPY_BLT_WRITE_RGB)
				XY_SRC_COPY_BLT_WRITE_RGB)
			     : XY_SRC_COPY_BLT_CMD;
			     : XY_SRC_COPY_BLT_CMD;
	u32 pitchropcpp = (sarea_priv->pitch * cpp) | (0xcc << 16) |
	u32 src_pitch = sarea_priv->pitch * cpp;
			  (cpp << 23) | (1 << 24);
	u32 dst_pitch = sarea_priv->pitch * cpp;
	u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
	RING_LOCALS;
	RING_LOCALS;


	if (sarea_priv->front_tiled) {
		cmd |= XY_SRC_COPY_BLT_DST_TILED;
		dst_pitch >>= 2;
	}
	if (sarea_priv->back_tiled) {
		cmd |= XY_SRC_COPY_BLT_SRC_TILED;
		src_pitch >>= 2;
	}

	DRM_DEBUG("\n");
	DRM_DEBUG("\n");


	INIT_LIST_HEAD(&hits);
	INIT_LIST_HEAD(&hits);
@@ -194,12 +204,12 @@ static void i915_vblank_tasklet(struct drm_device *dev)
				BEGIN_LP_RING(8);
				BEGIN_LP_RING(8);


				OUT_RING(cmd);
				OUT_RING(cmd);
				OUT_RING(pitchropcpp);
				OUT_RING(ropcpp | dst_pitch);
				OUT_RING((y1 << 16) | rect->x1);
				OUT_RING((y1 << 16) | rect->x1);
				OUT_RING((y2 << 16) | rect->x2);
				OUT_RING((y2 << 16) | rect->x2);
				OUT_RING(sarea_priv->front_offset);
				OUT_RING(sarea_priv->front_offset);
				OUT_RING((y1 << 16) | rect->x1);
				OUT_RING((y1 << 16) | rect->x1);
				OUT_RING(pitchropcpp & 0xffff);
				OUT_RING(src_pitch);
				OUT_RING(sarea_priv->back_offset);
				OUT_RING(sarea_priv->back_offset);


				ADVANCE_LP_RING();
				ADVANCE_LP_RING();