drm/i915/gvt: let force_to_nonpriv cmd handler only valid for LRI cmd
[muen/linux.git] / drivers / gpu / drm / i915 / gvt / cmd_parser.c
index 536cb691a543b8ea7db59731c0eaa88e02f63e07..36c6180e57693d79c0edb39fa1a243d13d9e8912 100644 (file)
@@ -813,14 +813,22 @@ static inline bool is_force_nonpriv_mmio(unsigned int offset)
 }
 
 static int force_nonpriv_reg_handler(struct parser_exec_state *s,
-                                    unsigned int offset, unsigned int index)
+               unsigned int offset, unsigned int index, char *cmd)
 {
        struct intel_gvt *gvt = s->vgpu->gvt;
-       unsigned int data = cmd_val(s, index + 1);
+       unsigned int data;
        u32 ring_base;
        u32 nopid;
        struct drm_i915_private *dev_priv = s->vgpu->gvt->dev_priv;
 
+       if (!strcmp(cmd, "lri"))
+               data = cmd_val(s, index + 1);
+       else {
+               gvt_err("Unexpected forcenonpriv 0x%x write from cmd %s\n",
+                       offset, cmd);
+               return -EINVAL;
+       }
+
        ring_base = dev_priv->engine[s->ring_id]->mmio_base;
        nopid = i915_mmio_reg_offset(RING_NOPID(ring_base));
 
@@ -877,7 +885,7 @@ static int cmd_reg_handler(struct parser_exec_state *s,
                return -EINVAL;
 
        if (is_force_nonpriv_mmio(offset) &&
-               force_nonpriv_reg_handler(s, offset, index))
+               force_nonpriv_reg_handler(s, offset, index, cmd))
                return -EPERM;
 
        if (offset == i915_mmio_reg_offset(DERRMR) ||