diff options
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/handlers.c | 90 |
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 | ||
| 234 | static 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 | |||
| 270 | static int gdrst_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, | 234 | static 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 | ||
| 307 | static int gmbus_mmio_read(struct intel_vgpu *vgpu, unsigned int offset, | 275 | static int gmbus_mmio_read(struct intel_vgpu *vgpu, unsigned int offset, |
