Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -ur xf86-video-intel-2.17.0.orig/src/sna/sna_display.c xf86-video-intel-2.17.0/src/sna/sna_display.c
- --- xf86-video-intel-2.17.0.orig/src/sna/sna_display.c 2011-12-30 14:43:50.612948756 +0900
- +++ xf86-video-intel-2.17.0/src/sna/sna_display.c 2011-12-31 23:04:36.275064383 +0900
- @@ -2032,10 +2032,19 @@
- /* Gen6 wait for scan line support */
- #define MI_LOAD_REGISTER_IMM (0x22<<23)
- +#define MI_DISPLAY_PIPEA_SCAN_LINE_WAIT (1)
- +#define MI_DISPLAY_PIPEB_SCAN_LINE_WAIT (1<<8)
- +#define MI_DISPLAY_PIPEA_VBLANK_WAIT (1<<3)
- +#define MI_DISPLAY_PIPEB_VBLANK_WAIT (1<<11)
- /* gen6: Scan lines register */
- #define GEN6_PIPEA_SLC (0x70004)
- #define GEN6_PIPEB_SLC (0x71004)
- +#define DE_LOAD_SL_ADDR (0x4f100)
- +#define DE_LOAD_SL_PIPEA (0x110<<29)
- +#define DE_LOAD_SL_PIPEB (0x111<<29)
- +#define DERRMR_ADDR (0x44050)
- +#define DERRMR_DEFAULT (0x0000ffff)
- static void sna_emit_wait_for_scanline_gen6(struct sna *sna,
- int pipe, int y1, int y2,
- @@ -2048,20 +2057,34 @@
- /* We just wait until the trace passes the roi */
- if (pipe == 0) {
- - pipe = GEN6_PIPEA_SLC;
- - event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
- + pipe = DE_LOAD_SL_PIPEA;
- + event = MI_DISPLAY_PIPEA_SCAN_LINE_WAIT;
- + if (full_height)
- + event = MI_DISPLAY_PIPEA_VBLANK_WAIT;
- } else {
- - pipe = GEN6_PIPEB_SLC;
- - event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
- + pipe = DE_LOAD_SL_PIPEB;
- + event = MI_DISPLAY_PIPEB_SCAN_LINE_WAIT;
- + if (full_height)
- + event = MI_DISPLAY_PIPEB_VBLANK_WAIT;
- }
- + /* According to docs only upper 10 bits are significant */
- + y1 &= 0x1ff8;
- + y2 &= 0x1ff8;
- +
- kgem_set_mode(&sna->kgem, KGEM_RENDER);
- - b = kgem_get_batch(&sna->kgem, 4);
- + b = kgem_get_batch(&sna->kgem, 10);
- b[0] = MI_LOAD_REGISTER_IMM | 1;
- - b[1] = pipe;
- - b[2] = y2 - 1;
- - b[3] = MI_WAIT_FOR_EVENT | event;
- - kgem_advance_batch(&sna->kgem, 4);
- + b[1] = DERRMR_ADDR;
- + b[2] = DERRMR_DEFAULT & ~event;
- + b[3] = MI_LOAD_REGISTER_IMM | 1;
- + b[4] = DE_LOAD_SL_ADDR;
- + b[5] = pipe | (y1 << 16) | y2;
- + b[6] = MI_WAIT_FOR_EVENT | event;
- + b[7] = MI_LOAD_REGISTER_IMM | 1;
- + b[8] = DERRMR_ADDR;
- + b[9] = DERRMR_DEFAULT;
- + kgem_advance_batch(&sna->kgem, 10);
- }
- static void sna_emit_wait_for_scanline_gen2(struct sna *sna,
- @@ -2112,10 +2135,6 @@
- Bool full_height;
- int y1, y2, pipe;
- - /* XXX WAIT_EVENT is still causing hangs on SNB */
- - if (sna->kgem.gen >= 60)
- - return false;
- -
- if (!pixmap_is_scanout(pixmap))
- return false;
Advertisement
Add Comment
Please, Sign In to add comment