|
@@ -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) ||
|