aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/gvt/handlers.c90
1 files changed, 29 insertions, 61 deletions
diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c
index fd96898db71d..ab2ea157da4c 100644
--- a/drivers/gpu/drm/i915/gvt/handlers.c
+++ b/drivers/gpu/drm/i915/gvt/handlers.c
@@ -231,77 +231,45 @@ static int mul_force_wake_write(struct intel_vgpu *vgpu,
231 return 0; 231 return 0;
232} 232}
233 233
234static int handle_device_reset(struct intel_vgpu *vgpu, unsigned int offset,
235 void *p_data, unsigned int bytes, unsigned long bitmap)
236{
237 struct intel_gvt_workload_scheduler *scheduler =
238 &vgpu->gvt->scheduler;
239
240 vgpu->resetting = true;
241
242 intel_vgpu_stop_schedule(vgpu);
243 /*
244 * The current_vgpu will set to NULL after stopping the
245 * scheduler when the reset is triggered by current vgpu.
246 */
247 if (scheduler->current_vgpu == NULL) {
248 mutex_unlock(&vgpu->gvt->lock);
249 intel_gvt_wait_vgpu_idle(vgpu);
250 mutex_lock(&vgpu->gvt->lock);
251 }
252
253 intel_vgpu_reset_execlist(vgpu, bitmap);
254
255 /* full GPU reset */
256 if (bitmap == 0xff) {
257 mutex_unlock(&vgpu->gvt->lock);
258 intel_vgpu_clean_gtt(vgpu);
259 mutex_lock(&vgpu->gvt->lock);
260 intel_vgpu_init_mmio(vgpu);
261 populate_pvinfo_page(vgpu);
262 intel_vgpu_init_gtt(vgpu);
263 }
264
265 vgpu->resetting = false;
266
267 return 0;
268}
269
270static int gdrst_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, 234static int gdrst_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
271 void *p_data, unsigned int bytes) 235 void *p_data, unsigned int bytes)
272{ 236{
237 unsigned int engine_mask = 0;
273 u32 data; 238 u32 data;
274 u64 bitmap = 0;
275 239
276 write_vreg(vgpu, offset, p_data, bytes); 240 write_vreg(vgpu, offset, p_data, bytes);
277 data = vgpu_vreg(vgpu, offset); 241 data = vgpu_vreg(vgpu, offset);
278 242
279 if (data & GEN6_GRDOM_FULL) { 243 if (data & GEN6_GRDOM_FULL) {
280 gvt_dbg_mmio("vgpu%d: request full GPU reset\n", vgpu->id); 244 gvt_dbg_mmio("vgpu%d: request full GPU reset\n", vgpu->id);
281 bitmap = 0xff; 245 engine_mask = ALL_ENGINES;
282 } 246 } else {
283 if (data & GEN6_GRDOM_RENDER) { 247 if (data & GEN6_GRDOM_RENDER) {
284 gvt_dbg_mmio("vgpu%d: request RCS reset\n", vgpu->id); 248 gvt_dbg_mmio("vgpu%d: request RCS reset\n", vgpu->id);
285 bitmap |= (1 << RCS); 249 engine_mask |= (1 << RCS);
286 } 250 }
287 if (data & GEN6_GRDOM_MEDIA) { 251 if (data & GEN6_GRDOM_MEDIA) {
288 gvt_dbg_mmio("vgpu%d: request VCS reset\n", vgpu->id); 252 gvt_dbg_mmio("vgpu%d: request VCS reset\n", vgpu->id);
289 bitmap |= (1 << VCS); 253 engine_mask |= (1 << VCS);
290 } 254 }
291 if (data & GEN6_GRDOM_BLT) { 255 if (data & GEN6_GRDOM_BLT) {
292 gvt_dbg_mmio("vgpu%d: request BCS Reset\n", vgpu->id); 256 gvt_dbg_mmio("vgpu%d: request BCS Reset\n", vgpu->id);
293 bitmap |= (1 << BCS); 257 engine_mask |= (1 << BCS);
294 } 258 }
295 if (data & GEN6_GRDOM_VECS) { 259 if (data & GEN6_GRDOM_VECS) {
296 gvt_dbg_mmio("vgpu%d: request VECS Reset\n", vgpu->id); 260 gvt_dbg_mmio("vgpu%d: request VECS Reset\n", vgpu->id);
297 bitmap |= (1 << VECS); 261 engine_mask |= (1 << VECS);
298 } 262 }
299 if (data & GEN8_GRDOM_MEDIA2) { 263 if (data & GEN8_GRDOM_MEDIA2) {
300 gvt_dbg_mmio("vgpu%d: request VCS2 Reset\n", vgpu->id); 264 gvt_dbg_mmio("vgpu%d: request VCS2 Reset\n", vgpu->id);
301 if (HAS_BSD2(vgpu->gvt->dev_priv)) 265 if (HAS_BSD2(vgpu->gvt->dev_priv))
302 bitmap |= (1 << VCS2); 266 engine_mask |= (1 << VCS2);
267 }
303 } 268 }
304 return handle_device_reset(vgpu, offset, p_data, bytes, bitmap); 269
270 intel_gvt_reset_vgpu_locked(vgpu, false, engine_mask);
271
272 return 0;
305} 273}
306 274
307static int gmbus_mmio_read(struct intel_vgpu *vgpu, unsigned int offset, 275static int gmbus_mmio_read(struct intel_vgpu *vgpu, unsigned int offset,