aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/gvt/aperture_gm.c29
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.h1
2 files changed, 28 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/gvt/aperture_gm.c b/drivers/gpu/drm/i915/gvt/aperture_gm.c
index 65200313515c..f7bce8603958 100644
--- a/drivers/gpu/drm/i915/gvt/aperture_gm.c
+++ b/drivers/gpu/drm/i915/gvt/aperture_gm.c
@@ -158,6 +158,14 @@ void intel_vgpu_write_fence(struct intel_vgpu *vgpu,
158 POSTING_READ(fence_reg_lo); 158 POSTING_READ(fence_reg_lo);
159} 159}
160 160
161static void _clear_vgpu_fence(struct intel_vgpu *vgpu)
162{
163 int i;
164
165 for (i = 0; i < vgpu_fence_sz(vgpu); i++)
166 intel_vgpu_write_fence(vgpu, i, 0);
167}
168
161static void free_vgpu_fence(struct intel_vgpu *vgpu) 169static void free_vgpu_fence(struct intel_vgpu *vgpu)
162{ 170{
163 struct intel_gvt *gvt = vgpu->gvt; 171 struct intel_gvt *gvt = vgpu->gvt;
@@ -171,9 +179,9 @@ static void free_vgpu_fence(struct intel_vgpu *vgpu)
171 intel_runtime_pm_get(dev_priv); 179 intel_runtime_pm_get(dev_priv);
172 180
173 mutex_lock(&dev_priv->drm.struct_mutex); 181 mutex_lock(&dev_priv->drm.struct_mutex);
182 _clear_vgpu_fence(vgpu);
174 for (i = 0; i < vgpu_fence_sz(vgpu); i++) { 183 for (i = 0; i < vgpu_fence_sz(vgpu); i++) {
175 reg = vgpu->fence.regs[i]; 184 reg = vgpu->fence.regs[i];
176 intel_vgpu_write_fence(vgpu, i, 0);
177 list_add_tail(&reg->link, 185 list_add_tail(&reg->link,
178 &dev_priv->mm.fence_list); 186 &dev_priv->mm.fence_list);
179 } 187 }
@@ -201,13 +209,14 @@ static int alloc_vgpu_fence(struct intel_vgpu *vgpu)
201 continue; 209 continue;
202 list_del(pos); 210 list_del(pos);
203 vgpu->fence.regs[i] = reg; 211 vgpu->fence.regs[i] = reg;
204 intel_vgpu_write_fence(vgpu, i, 0);
205 if (++i == vgpu_fence_sz(vgpu)) 212 if (++i == vgpu_fence_sz(vgpu))
206 break; 213 break;
207 } 214 }
208 if (i != vgpu_fence_sz(vgpu)) 215 if (i != vgpu_fence_sz(vgpu))
209 goto out_free_fence; 216 goto out_free_fence;
210 217
218 _clear_vgpu_fence(vgpu);
219
211 mutex_unlock(&dev_priv->drm.struct_mutex); 220 mutex_unlock(&dev_priv->drm.struct_mutex);
212 intel_runtime_pm_put(dev_priv); 221 intel_runtime_pm_put(dev_priv);
213 return 0; 222 return 0;
@@ -307,6 +316,22 @@ void intel_vgpu_free_resource(struct intel_vgpu *vgpu)
307} 316}
308 317
309/** 318/**
319 * intel_vgpu_reset_resource - reset resource state owned by a vGPU
320 * @vgpu: a vGPU
321 *
322 * This function is used to reset resource state owned by a vGPU.
323 *
324 */
325void intel_vgpu_reset_resource(struct intel_vgpu *vgpu)
326{
327 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
328
329 intel_runtime_pm_get(dev_priv);
330 _clear_vgpu_fence(vgpu);
331 intel_runtime_pm_put(dev_priv);
332}
333
334/**
310 * intel_alloc_vgpu_resource - allocate HW resource for a vGPU 335 * intel_alloc_vgpu_resource - allocate HW resource for a vGPU
311 * @vgpu: vGPU 336 * @vgpu: vGPU
312 * @param: vGPU creation params 337 * @param: vGPU creation params
diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index 0af17016f33f..455281d07d75 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -323,6 +323,7 @@ struct intel_vgpu_creation_params {
323 323
324int intel_vgpu_alloc_resource(struct intel_vgpu *vgpu, 324int intel_vgpu_alloc_resource(struct intel_vgpu *vgpu,
325 struct intel_vgpu_creation_params *param); 325 struct intel_vgpu_creation_params *param);
326void intel_vgpu_reset_resource(struct intel_vgpu *vgpu);
326void intel_vgpu_free_resource(struct intel_vgpu *vgpu); 327void intel_vgpu_free_resource(struct intel_vgpu *vgpu);
327void intel_vgpu_write_fence(struct intel_vgpu *vgpu, 328void intel_vgpu_write_fence(struct intel_vgpu *vgpu,
328 u32 fence, u64 value); 329 u32 fence, u64 value);