Merge tag 'gvt-next-2018-09-04' of https://github.com/intel/gvt-linux into drm-intel...
[muen/linux.git] / drivers / gpu / drm / i915 / gvt / cmd_parser.c
index 0651e63b25fb7bc8a3c748810f2837a690504c1b..865d80919827390833d0222c7991e571b1ad7133 100644 (file)
@@ -1817,6 +1817,8 @@ static int cmd_handler_mi_batch_buffer_start(struct parser_exec_state *s)
        return ret;
 }
 
        return ret;
 }
 
+static int mi_noop_index;
+
 static struct cmd_info cmd_info[] = {
        {"MI_NOOP", OP_MI_NOOP, F_LEN_CONST, R_ALL, D_ALL, 0, 1, NULL},
 
 static struct cmd_info cmd_info[] = {
        {"MI_NOOP", OP_MI_NOOP, F_LEN_CONST, R_ALL, D_ALL, 0, 1, NULL},
 
@@ -2502,7 +2504,12 @@ static int cmd_parser_exec(struct parser_exec_state *s)
 
        cmd = cmd_val(s, 0);
 
 
        cmd = cmd_val(s, 0);
 
-       info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id);
+       /* fastpath for MI_NOOP */
+       if (cmd == MI_NOOP)
+               info = &cmd_info[mi_noop_index];
+       else
+               info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id);
+
        if (info == NULL) {
                gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x, addr_type=%s, ring %d, workload=%p\n",
                                cmd, get_opcode(cmd, s->ring_id),
        if (info == NULL) {
                gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x, addr_type=%s, ring %d, workload=%p\n",
                                cmd, get_opcode(cmd, s->ring_id),
@@ -2905,6 +2912,8 @@ static int init_cmd_table(struct intel_gvt *gvt)
                        kfree(e);
                        return -EEXIST;
                }
                        kfree(e);
                        return -EEXIST;
                }
+               if (cmd_info[i].opcode == OP_MI_NOOP)
+                       mi_noop_index = i;
 
                INIT_HLIST_NODE(&e->hlist);
                add_cmd_entry(gvt, e);
 
                INIT_HLIST_NODE(&e->hlist);
                add_cmd_entry(gvt, e);