xf86-video-intel: 3 commits - src/sna/sna_blt.c src/sna/sna_display.c

Chris Wilson ickle at kemper.freedesktop.org
Mon Sep 9 08:27:09 PDT 2013


 src/sna/sna_blt.c     |    2 +-
 src/sna/sna_display.c |   40 ++++++++++++++++++++++++++++++++--------
 2 files changed, 33 insertions(+), 9 deletions(-)

New commits:
commit 8ff8eb2b38dc705f5c86f524c1cd74a811a7b04c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Sep 9 16:23:04 2013 +0100

    sna/hsw: Scanline waits require both DERRMR and forcewake
    
    Oh my, bspec is missing a few details on how to perform a scanline wait
    on Haswell. But by using the extra steps required for Ivybridge, we can
    successfully send events from the scanout to the BCS ring. Sadly this
    again means that to use vsync on Haswell requires preventing the GPU
    from sleeping whilst it waits for the scanout to advance.
    
    Reported-by: Dan Doel <dan.doel at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=69119
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 78aa09a..1d1022e 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3381,6 +3381,8 @@ sna_covering_crtc(struct sna *sna, const BoxRec *box, xf86CrtcPtr desired)
 	return best_crtc;
 }
 
+#define MI_LOAD_REGISTER_IMM			(0x22<<23)
+
 static bool sna_emit_wait_for_scanline_hsw(struct sna *sna,
 					   xf86CrtcPtr crtc,
 					   int pipe, int y1, int y2,
@@ -3389,8 +3391,25 @@ static bool sna_emit_wait_for_scanline_hsw(struct sna *sna,
 	uint32_t event;
 	uint32_t *b;
 
+	if (!sna->kgem.has_secure_batches)
+		return false;
+
 	b = kgem_get_batch(&sna->kgem);
-	sna->kgem.nbatch += 5;
+	sna->kgem.nbatch += 17;
+
+	switch (pipe) {
+	default: assert(0);
+	case 0: event = 1 << 0; break;
+	case 1: event = 1 << 8; break;
+	case 2: event = 1 << 14; break;
+	}
+
+	b[0] = MI_LOAD_REGISTER_IMM | 1;
+	b[1] = 0x44050; /* DERRMR */
+	b[2] = ~event;
+	b[3] = MI_LOAD_REGISTER_IMM | 1;
+	b[4] = 0xa188; /* FORCEWAKE_MT */
+	b[5] = 2 << 16 | 2;
 
 	/* The documentation says that the LOAD_SCAN_LINES command
 	 * always comes in pairs. Don't ask me why. */
@@ -3400,8 +3419,8 @@ static bool sna_emit_wait_for_scanline_hsw(struct sna *sna,
 	case 1: event = 1 << 19; break;
 	case 2: event = 4 << 19; break;
 	}
-	b[2] = b[0] = MI_LOAD_SCAN_LINES_INCL | event;
-	b[3] = b[1] = (y1 << 16) | (y2-1);
+	b[8] = b[6] = MI_LOAD_SCAN_LINES_INCL | event;
+	b[9] = b[7] = (y1 << 16) | (y2-1);
 
 	switch (pipe) {
 	default: assert(0);
@@ -3409,13 +3428,18 @@ static bool sna_emit_wait_for_scanline_hsw(struct sna *sna,
 	case 1: event = 1 << 8; break;
 	case 2: event = 1 << 14; break;
 	}
-	b[4] = MI_WAIT_FOR_EVENT | event;
+	b[10] = MI_WAIT_FOR_EVENT | event;
+
+	b[11] = MI_LOAD_REGISTER_IMM | 1;
+	b[12] = 0xa188; /* FORCEWAKE_MT */
+	b[13] = 2 << 16;
+	b[14] = MI_LOAD_REGISTER_IMM | 1;
+	b[15] = 0x44050; /* DERRMR */
+	b[16] = ~0;
 
 	return true;
 }
 
-#define MI_LOAD_REGISTER_IMM			(0x22<<23)
-
 static bool sna_emit_wait_for_scanline_ivb(struct sna *sna,
 					   xf86CrtcPtr crtc,
 					   int pipe, int y1, int y2,
commit dbe75982457cfe6bb1f7422a517ced32cc74f909
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Sep 9 15:35:42 2013 +0100

    sna/hsw: Fix the event selection for scanline waits on pipe A
    
    Hmm, this should have meant that we never actually waited for a
    scan-line on pipe A. I wonder if it even works...
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index be02a78..78aa09a 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3396,7 +3396,7 @@ static bool sna_emit_wait_for_scanline_hsw(struct sna *sna,
 	 * always comes in pairs. Don't ask me why. */
 	switch (pipe) {
 	default: assert(0);
-	case 0: event = 0; break;
+	case 0: event = 0 << 19; break;
 	case 1: event = 1 << 19; break;
 	case 2: event = 4 << 19; break;
 	}
@@ -3405,7 +3405,7 @@ static bool sna_emit_wait_for_scanline_hsw(struct sna *sna,
 
 	switch (pipe) {
 	default: assert(0);
-	case 0: event = 0; break;
+	case 0: event = 1 << 0; break;
 	case 1: event = 1 << 8; break;
 	case 2: event = 1 << 14; break;
 	}
commit 144d97046156a3f7785f98c4f7dbed3fd8f5b7af
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Sep 9 15:34:41 2013 +0100

    sna/gen6+: Only apply the BLT copy w/a for self-copies
    
    A missing check along the copy_boxes() path to bring the w/a into line
    with the other paths.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index af4a92a..94d8458 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -3000,7 +3000,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
 
 	if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
 		_kgem_submit(kgem);
-	} else if (kgem->gen >= 060 && kgem_check_batch(kgem, 3)) {
+	} else if (kgem->gen >= 060 && src_bo == dst_bo && kgem_check_batch(kgem, 3)) {
 		uint32_t *b = kgem->batch + kgem->nbatch;
 		b[0] = XY_SETUP_CLIP;
 		b[1] = b[2] = 0;


More information about the xorg-commit mailing list