Guest User

xf86-video-intel-2.17-sna-xv_sync_to_vblank.patch

a guest
Jan 24th, 2012
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 2.46 KB | None | 0 0
  1. 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
  2. --- xf86-video-intel-2.17.0.orig/src/sna/sna_display.c  2011-12-30 14:43:50.612948756 +0900
  3. +++ xf86-video-intel-2.17.0/src/sna/sna_display.c   2011-12-31 23:04:36.275064383 +0900
  4. @@ -2032,10 +2032,19 @@
  5.  
  6.  /* Gen6 wait for scan line support */
  7.  #define MI_LOAD_REGISTER_IMM           (0x22<<23)
  8. +#define MI_DISPLAY_PIPEA_SCAN_LINE_WAIT        (1)
  9. +#define MI_DISPLAY_PIPEB_SCAN_LINE_WAIT        (1<<8)
  10. +#define MI_DISPLAY_PIPEA_VBLANK_WAIT       (1<<3)
  11. +#define MI_DISPLAY_PIPEB_VBLANK_WAIT       (1<<11)
  12.  
  13.  /* gen6: Scan lines register */
  14.  #define GEN6_PIPEA_SLC         (0x70004)
  15.  #define GEN6_PIPEB_SLC         (0x71004)
  16. +#define DE_LOAD_SL_ADDR            (0x4f100)
  17. +#define DE_LOAD_SL_PIPEA       (0x110<<29)
  18. +#define DE_LOAD_SL_PIPEB       (0x111<<29)
  19. +#define DERRMR_ADDR            (0x44050)
  20. +#define DERRMR_DEFAULT         (0x0000ffff)
  21.  
  22.  static void sna_emit_wait_for_scanline_gen6(struct sna *sna,
  23.                         int pipe, int y1, int y2,
  24. @@ -2048,20 +2057,34 @@
  25.  
  26.     /* We just wait until the trace passes the roi */
  27.     if (pipe == 0) {
  28. -       pipe = GEN6_PIPEA_SLC;
  29. -       event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
  30. +       pipe = DE_LOAD_SL_PIPEA;
  31. +       event = MI_DISPLAY_PIPEA_SCAN_LINE_WAIT;
  32. +       if (full_height)
  33. +           event = MI_DISPLAY_PIPEA_VBLANK_WAIT;
  34.     } else {
  35. -       pipe = GEN6_PIPEB_SLC;
  36. -       event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
  37. +       pipe = DE_LOAD_SL_PIPEB;
  38. +       event = MI_DISPLAY_PIPEB_SCAN_LINE_WAIT;
  39. +       if (full_height)
  40. +           event = MI_DISPLAY_PIPEB_VBLANK_WAIT;
  41.     }
  42.  
  43. +   /* According to docs only upper 10 bits are significant */
  44. +   y1 &= 0x1ff8;
  45. +   y2 &= 0x1ff8;
  46. +
  47.     kgem_set_mode(&sna->kgem, KGEM_RENDER);
  48. -   b = kgem_get_batch(&sna->kgem, 4);
  49. +   b = kgem_get_batch(&sna->kgem, 10);
  50.     b[0] = MI_LOAD_REGISTER_IMM | 1;
  51. -   b[1] = pipe;
  52. -   b[2] = y2 - 1;
  53. -   b[3] = MI_WAIT_FOR_EVENT | event;
  54. -   kgem_advance_batch(&sna->kgem, 4);
  55. +   b[1] = DERRMR_ADDR;
  56. +   b[2] = DERRMR_DEFAULT & ~event;
  57. +   b[3] = MI_LOAD_REGISTER_IMM | 1;
  58. +   b[4] = DE_LOAD_SL_ADDR;
  59. +   b[5] = pipe | (y1 << 16) | y2;
  60. +   b[6] = MI_WAIT_FOR_EVENT | event;
  61. +   b[7] = MI_LOAD_REGISTER_IMM | 1;
  62. +   b[8] = DERRMR_ADDR;
  63. +   b[9] = DERRMR_DEFAULT;
  64. +   kgem_advance_batch(&sna->kgem, 10);
  65.  }
  66.  
  67.  static void sna_emit_wait_for_scanline_gen2(struct sna *sna,
  68. @@ -2112,10 +2135,6 @@
  69.     Bool full_height;
  70.     int y1, y2, pipe;
  71.  
  72. -   /* XXX WAIT_EVENT is still causing hangs on SNB */
  73. -   if (sna->kgem.gen >= 60)
  74. -       return false;
  75. -
  76.     if (!pixmap_is_scanout(pixmap))
  77.         return false;
Advertisement
Add Comment
Please, Sign In to add comment