drm/i915/gvt: update vreg on inhibit context lri command
Commit cd7e 61b9"init mmio by lri command in vgpu inhibit context" initializes registers saved/restored in context with its vreg value through lri command in ring buffer. It relies on vreg got updated on every guest access. There is a case found that Linux guest uses lri command in inhibit-ctx to update the register. This patch adds vreg update on this case. v2: move mmio_attribute functions to gvt.h (Zhenyu) v3: use mask_mmio_write in vreg update v4: refine codes and add more comments (Zhenyu) Fixes: cd7e61b9("drm/i915/gvt: init mmio by lri command in vgpu inhibit context") Signed-off-by: Hang Yuan <hang.yuan@linux.intel.com> Signed-off-by: Weinan Li <weinan.z.li@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
This commit is contained in:
@@ -3045,6 +3045,30 @@ int intel_vgpu_default_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_vgpu_mask_mmio_write - write mask register
|
||||
* @vgpu: a vGPU
|
||||
* @offset: access offset
|
||||
* @p_data: write data buffer
|
||||
* @bytes: access data length
|
||||
*
|
||||
* Returns:
|
||||
* Zero on success, negative error code if failed.
|
||||
*/
|
||||
int intel_vgpu_mask_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
|
||||
void *p_data, unsigned int bytes)
|
||||
{
|
||||
u32 mask, old_vreg;
|
||||
|
||||
old_vreg = vgpu_vreg(vgpu, offset);
|
||||
write_vreg(vgpu, offset, p_data, bytes);
|
||||
mask = vgpu_vreg(vgpu, offset) >> 16;
|
||||
vgpu_vreg(vgpu, offset) = (old_vreg & ~mask) |
|
||||
(vgpu_vreg(vgpu, offset) & mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_gvt_in_force_nonpriv_whitelist - if a mmio is in whitelist to be
|
||||
* force-nopriv register
|
||||
|
Reference in New Issue
Block a user