drm/i915/gvt: add sprite plane flip done support.
authorXu Han <xu.han@intel.com>
Tue, 14 Feb 2017 06:50:47 +0000 (14:50 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Tue, 14 Feb 2017 09:09:19 +0000 (17:09 +0800)
* Add flip done event support for sprite plane on SKL platform.
* Fix bug #1452, "Call Trace:handle_default_event_virt+0xef/0x100
[i915]" while booting up guest.

Signed-off-by: Xu Han <xu.han@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/cmd_parser.c
drivers/gpu/drm/i915/gvt/interrupt.c

index 9a4b23c3ee97d5d87556d04bc0c5068fe6454eb1..7bb11a555b767fd5cabe1c1234e3c64ebe989f93 100644 (file)
@@ -1135,6 +1135,8 @@ static int skl_decode_mi_display_flip(struct parser_exec_state *s,
        u32 dword2 = cmd_val(s, 2);
        u32 plane = (dword0 & GENMASK(12, 8)) >> 8;
 
+       info->plane = PRIMARY_PLANE;
+
        switch (plane) {
        case MI_DISPLAY_FLIP_SKL_PLANE_1_A:
                info->pipe = PIPE_A;
@@ -1148,12 +1150,28 @@ static int skl_decode_mi_display_flip(struct parser_exec_state *s,
                info->pipe = PIPE_C;
                info->event = PRIMARY_C_FLIP_DONE;
                break;
+
+       case MI_DISPLAY_FLIP_SKL_PLANE_2_A:
+               info->pipe = PIPE_A;
+               info->event = SPRITE_A_FLIP_DONE;
+               info->plane = SPRITE_PLANE;
+               break;
+       case MI_DISPLAY_FLIP_SKL_PLANE_2_B:
+               info->pipe = PIPE_B;
+               info->event = SPRITE_B_FLIP_DONE;
+               info->plane = SPRITE_PLANE;
+               break;
+       case MI_DISPLAY_FLIP_SKL_PLANE_2_C:
+               info->pipe = PIPE_C;
+               info->event = SPRITE_C_FLIP_DONE;
+               info->plane = SPRITE_PLANE;
+               break;
+
        default:
                gvt_err("unknown plane code %d\n", plane);
                return -EINVAL;
        }
 
-       info->pipe = PRIMARY_PLANE;
        info->stride_val = (dword1 & GENMASK(15, 6)) >> 6;
        info->tile_val = (dword1 & GENMASK(2, 0));
        info->surf_val = (dword2 & GENMASK(31, 12)) >> 12;
index af0b86b2cd94f18859a9f1ae9a76c275a82f45bf..92bb247e3478606dc295d30c9e89315b95baf163 100644 (file)
@@ -588,6 +588,10 @@ static void gen8_init_irq(
                SET_BIT_INFO(irq, 3, PRIMARY_A_FLIP_DONE, INTEL_GVT_IRQ_INFO_DE_PIPE_A);
                SET_BIT_INFO(irq, 3, PRIMARY_B_FLIP_DONE, INTEL_GVT_IRQ_INFO_DE_PIPE_B);
                SET_BIT_INFO(irq, 3, PRIMARY_C_FLIP_DONE, INTEL_GVT_IRQ_INFO_DE_PIPE_C);
+
+               SET_BIT_INFO(irq, 4, SPRITE_A_FLIP_DONE, INTEL_GVT_IRQ_INFO_DE_PIPE_A);
+               SET_BIT_INFO(irq, 4, SPRITE_B_FLIP_DONE, INTEL_GVT_IRQ_INFO_DE_PIPE_B);
+               SET_BIT_INFO(irq, 4, SPRITE_C_FLIP_DONE, INTEL_GVT_IRQ_INFO_DE_PIPE_C);
        }
 
        /* GEN8 interrupt PCU events */