1 /* 2 * Copyright(c) 2011-2016 Intel Corporation. All rights reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 * 23 * Authors: 24 * Zhi Wang <zhi.a.wang@intel.com> 25 * 26 * Contributors: 27 * Ping Gao <ping.a.gao@intel.com> 28 * Tina Zhang <tina.zhang@intel.com> 29 * Chanbin Du <changbin.du@intel.com> 30 * Min He <min.he@intel.com> 31 * Bing Niu <bing.niu@intel.com> 32 * Zhenyu Wang <zhenyuw@linux.intel.com> 33 * 34 */ 35 36 #include <linux/kthread.h> 37 38 #include "i915_drv.h" 39 #include "gvt.h" 40 41 #define RING_CTX_OFF(x) \ 42 offsetof(struct execlist_ring_context, x) 43 44 static void set_context_pdp_root_pointer( 45 struct execlist_ring_context *ring_context, 46 u32 pdp[8]) 47 { 48 struct execlist_mmio_pair *pdp_pair = &ring_context->pdp3_UDW; 49 int i; 50 51 for (i = 0; i < 8; i++) 52 pdp_pair[i].val = pdp[7 - i]; 53 } 54 55 static int populate_shadow_context(struct intel_vgpu_workload *workload) 56 { 57 struct intel_vgpu *vgpu = workload->vgpu; 58 struct intel_gvt *gvt = vgpu->gvt; 59 int ring_id = workload->ring_id; 60 struct i915_gem_context *shadow_ctx = vgpu->submission.shadow_ctx; 61 struct drm_i915_gem_object *ctx_obj = 62 shadow_ctx->engine[ring_id].state->obj; 63 struct execlist_ring_context *shadow_ring_context; 64 struct page *page; 65 void *dst; 66 unsigned long context_gpa, context_page_num; 67 int i; 68 69 gvt_dbg_sched("ring id %d workload lrca %x", ring_id, 70 workload->ctx_desc.lrca); 71 72 context_page_num = gvt->dev_priv->engine[ring_id]->context_size; 73 74 context_page_num = context_page_num >> PAGE_SHIFT; 75 76 if (IS_BROADWELL(gvt->dev_priv) && ring_id == RCS) 77 context_page_num = 19; 78 79 i = 2; 80 81 while (i < context_page_num) { 82 context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm, 83 (u32)((workload->ctx_desc.lrca + i) << 84 GTT_PAGE_SHIFT)); 85 if (context_gpa == INTEL_GVT_INVALID_ADDR) { 86 gvt_vgpu_err("Invalid guest context descriptor\n"); 87 return -EFAULT; 88 } 89 90 page = i915_gem_object_get_page(ctx_obj, LRC_HEADER_PAGES + i); 91 dst = kmap(page); 92 intel_gvt_hypervisor_read_gpa(vgpu, context_gpa, dst, 93 GTT_PAGE_SIZE); 94 kunmap(page); 95 i++; 96 } 97 98 page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN); 99 shadow_ring_context = kmap(page); 100 101 #define COPY_REG(name) \ 102 intel_gvt_hypervisor_read_gpa(vgpu, workload->ring_context_gpa \ 103 + RING_CTX_OFF(name.val), &shadow_ring_context->name.val, 4) 104 105 COPY_REG(ctx_ctrl); 106 COPY_REG(ctx_timestamp); 107 108 if (ring_id == RCS) { 109 COPY_REG(bb_per_ctx_ptr); 110 COPY_REG(rcs_indirect_ctx); 111 COPY_REG(rcs_indirect_ctx_offset); 112 } 113 #undef COPY_REG 114 115 set_context_pdp_root_pointer(shadow_ring_context, 116 workload->shadow_mm->shadow_page_table); 117 118 intel_gvt_hypervisor_read_gpa(vgpu, 119 workload->ring_context_gpa + 120 sizeof(*shadow_ring_context), 121 (void *)shadow_ring_context + 122 sizeof(*shadow_ring_context), 123 GTT_PAGE_SIZE - sizeof(*shadow_ring_context)); 124 125 kunmap(page); 126 return 0; 127 } 128 129 static inline bool is_gvt_request(struct drm_i915_gem_request *req) 130 { 131 return i915_gem_context_force_single_submission(req->ctx); 132 } 133 134 static int shadow_context_status_change(struct notifier_block *nb, 135 unsigned long action, void *data) 136 { 137 struct drm_i915_gem_request *req = (struct drm_i915_gem_request *)data; 138 struct intel_gvt *gvt = container_of(nb, struct intel_gvt, 139 shadow_ctx_notifier_block[req->engine->id]); 140 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; 141 enum intel_engine_id ring_id = req->engine->id; 142 struct intel_vgpu_workload *workload; 143 144 if (!is_gvt_request(req)) { 145 spin_lock_bh(&scheduler->mmio_context_lock); 146 if (action == INTEL_CONTEXT_SCHEDULE_IN && 147 scheduler->engine_owner[ring_id]) { 148 /* Switch ring from vGPU to host. */ 149 intel_gvt_switch_mmio(scheduler->engine_owner[ring_id], 150 NULL, ring_id); 151 scheduler->engine_owner[ring_id] = NULL; 152 } 153 spin_unlock_bh(&scheduler->mmio_context_lock); 154 155 return NOTIFY_OK; 156 } 157 158 workload = scheduler->current_workload[ring_id]; 159 if (unlikely(!workload)) 160 return NOTIFY_OK; 161 162 switch (action) { 163 case INTEL_CONTEXT_SCHEDULE_IN: 164 spin_lock_bh(&scheduler->mmio_context_lock); 165 if (workload->vgpu != scheduler->engine_owner[ring_id]) { 166 /* Switch ring from host to vGPU or vGPU to vGPU. */ 167 intel_gvt_switch_mmio(scheduler->engine_owner[ring_id], 168 workload->vgpu, ring_id); 169 scheduler->engine_owner[ring_id] = workload->vgpu; 170 } else 171 gvt_dbg_sched("skip ring %d mmio switch for vgpu%d\n", 172 ring_id, workload->vgpu->id); 173 spin_unlock_bh(&scheduler->mmio_context_lock); 174 atomic_set(&workload->shadow_ctx_active, 1); 175 break; 176 case INTEL_CONTEXT_SCHEDULE_OUT: 177 case INTEL_CONTEXT_SCHEDULE_PREEMPTED: 178 atomic_set(&workload->shadow_ctx_active, 0); 179 break; 180 default: 181 WARN_ON(1); 182 return NOTIFY_OK; 183 } 184 wake_up(&workload->shadow_ctx_status_wq); 185 return NOTIFY_OK; 186 } 187 188 static void shadow_context_descriptor_update(struct i915_gem_context *ctx, 189 struct intel_engine_cs *engine) 190 { 191 struct intel_context *ce = &ctx->engine[engine->id]; 192 u64 desc = 0; 193 194 desc = ce->lrc_desc; 195 196 /* Update bits 0-11 of the context descriptor which includes flags 197 * like GEN8_CTX_* cached in desc_template 198 */ 199 desc &= U64_MAX << 12; 200 desc |= ctx->desc_template & ((1ULL << 12) - 1); 201 202 ce->lrc_desc = desc; 203 } 204 205 static int copy_workload_to_ring_buffer(struct intel_vgpu_workload *workload) 206 { 207 struct intel_vgpu *vgpu = workload->vgpu; 208 void *shadow_ring_buffer_va; 209 u32 *cs; 210 211 /* allocate shadow ring buffer */ 212 cs = intel_ring_begin(workload->req, workload->rb_len / sizeof(u32)); 213 if (IS_ERR(cs)) { 214 gvt_vgpu_err("fail to alloc size =%ld shadow ring buffer\n", 215 workload->rb_len); 216 return PTR_ERR(cs); 217 } 218 219 shadow_ring_buffer_va = workload->shadow_ring_buffer_va; 220 221 /* get shadow ring buffer va */ 222 workload->shadow_ring_buffer_va = cs; 223 224 memcpy(cs, shadow_ring_buffer_va, 225 workload->rb_len); 226 227 cs += workload->rb_len / sizeof(u32); 228 intel_ring_advance(workload->req, cs); 229 230 return 0; 231 } 232 233 void release_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx) 234 { 235 if (!wa_ctx->indirect_ctx.obj) 236 return; 237 238 i915_gem_object_unpin_map(wa_ctx->indirect_ctx.obj); 239 i915_gem_object_put(wa_ctx->indirect_ctx.obj); 240 } 241 242 /** 243 * intel_gvt_scan_and_shadow_workload - audit the workload by scanning and 244 * shadow it as well, include ringbuffer,wa_ctx and ctx. 245 * @workload: an abstract entity for each execlist submission. 246 * 247 * This function is called before the workload submitting to i915, to make 248 * sure the content of the workload is valid. 249 */ 250 int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload) 251 { 252 struct intel_vgpu *vgpu = workload->vgpu; 253 struct intel_vgpu_submission *s = &vgpu->submission; 254 struct i915_gem_context *shadow_ctx = s->shadow_ctx; 255 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; 256 int ring_id = workload->ring_id; 257 struct intel_engine_cs *engine = dev_priv->engine[ring_id]; 258 struct drm_i915_gem_request *rq; 259 struct intel_ring *ring; 260 int ret; 261 262 lockdep_assert_held(&dev_priv->drm.struct_mutex); 263 264 if (workload->shadowed) 265 return 0; 266 267 shadow_ctx->desc_template &= ~(0x3 << GEN8_CTX_ADDRESSING_MODE_SHIFT); 268 shadow_ctx->desc_template |= workload->ctx_desc.addressing_mode << 269 GEN8_CTX_ADDRESSING_MODE_SHIFT; 270 271 if (!test_and_set_bit(ring_id, s->shadow_ctx_desc_updated)) 272 shadow_context_descriptor_update(shadow_ctx, 273 dev_priv->engine[ring_id]); 274 275 ret = intel_gvt_scan_and_shadow_ringbuffer(workload); 276 if (ret) 277 goto err_scan; 278 279 if ((workload->ring_id == RCS) && 280 (workload->wa_ctx.indirect_ctx.size != 0)) { 281 ret = intel_gvt_scan_and_shadow_wa_ctx(&workload->wa_ctx); 282 if (ret) 283 goto err_scan; 284 } 285 286 /* pin shadow context by gvt even the shadow context will be pinned 287 * when i915 alloc request. That is because gvt will update the guest 288 * context from shadow context when workload is completed, and at that 289 * moment, i915 may already unpined the shadow context to make the 290 * shadow_ctx pages invalid. So gvt need to pin itself. After update 291 * the guest context, gvt can unpin the shadow_ctx safely. 292 */ 293 ring = engine->context_pin(engine, shadow_ctx); 294 if (IS_ERR(ring)) { 295 ret = PTR_ERR(ring); 296 gvt_vgpu_err("fail to pin shadow context\n"); 297 goto err_shadow; 298 } 299 300 ret = populate_shadow_context(workload); 301 if (ret) 302 goto err_unpin; 303 304 rq = i915_gem_request_alloc(dev_priv->engine[ring_id], shadow_ctx); 305 if (IS_ERR(rq)) { 306 gvt_vgpu_err("fail to allocate gem request\n"); 307 ret = PTR_ERR(rq); 308 goto err_unpin; 309 } 310 311 gvt_dbg_sched("ring id %d get i915 gem request %p\n", ring_id, rq); 312 313 workload->req = i915_gem_request_get(rq); 314 ret = copy_workload_to_ring_buffer(workload); 315 if (ret) 316 goto err_unpin; 317 workload->shadowed = true; 318 return 0; 319 320 err_unpin: 321 engine->context_unpin(engine, shadow_ctx); 322 err_shadow: 323 release_shadow_wa_ctx(&workload->wa_ctx); 324 err_scan: 325 return ret; 326 } 327 328 static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload) 329 { 330 struct intel_gvt *gvt = workload->vgpu->gvt; 331 const int gmadr_bytes = gvt->device_info.gmadr_bytes_in_cmd; 332 struct intel_shadow_bb_entry *entry_obj; 333 334 /* pin the gem object to ggtt */ 335 list_for_each_entry(entry_obj, &workload->shadow_bb, list) { 336 struct i915_vma *vma; 337 338 vma = i915_gem_object_ggtt_pin(entry_obj->obj, NULL, 0, 4, 0); 339 if (IS_ERR(vma)) 340 return PTR_ERR(vma); 341 342 /* FIXME: we are not tracking our pinned VMA leaving it 343 * up to the core to fix up the stray pin_count upon 344 * free. 345 */ 346 347 /* update the relocate gma with shadow batch buffer*/ 348 entry_obj->bb_start_cmd_va[1] = i915_ggtt_offset(vma); 349 if (gmadr_bytes == 8) 350 entry_obj->bb_start_cmd_va[2] = 0; 351 } 352 return 0; 353 } 354 355 static int update_wa_ctx_2_shadow_ctx(struct intel_shadow_wa_ctx *wa_ctx) 356 { 357 struct intel_vgpu_workload *workload = container_of(wa_ctx, 358 struct intel_vgpu_workload, 359 wa_ctx); 360 int ring_id = workload->ring_id; 361 struct intel_vgpu_submission *s = &workload->vgpu->submission; 362 struct i915_gem_context *shadow_ctx = s->shadow_ctx; 363 struct drm_i915_gem_object *ctx_obj = 364 shadow_ctx->engine[ring_id].state->obj; 365 struct execlist_ring_context *shadow_ring_context; 366 struct page *page; 367 368 page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN); 369 shadow_ring_context = kmap_atomic(page); 370 371 shadow_ring_context->bb_per_ctx_ptr.val = 372 (shadow_ring_context->bb_per_ctx_ptr.val & 373 (~PER_CTX_ADDR_MASK)) | wa_ctx->per_ctx.shadow_gma; 374 shadow_ring_context->rcs_indirect_ctx.val = 375 (shadow_ring_context->rcs_indirect_ctx.val & 376 (~INDIRECT_CTX_ADDR_MASK)) | wa_ctx->indirect_ctx.shadow_gma; 377 378 kunmap_atomic(shadow_ring_context); 379 return 0; 380 } 381 382 static int prepare_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx) 383 { 384 struct i915_vma *vma; 385 unsigned char *per_ctx_va = 386 (unsigned char *)wa_ctx->indirect_ctx.shadow_va + 387 wa_ctx->indirect_ctx.size; 388 389 if (wa_ctx->indirect_ctx.size == 0) 390 return 0; 391 392 vma = i915_gem_object_ggtt_pin(wa_ctx->indirect_ctx.obj, NULL, 393 0, CACHELINE_BYTES, 0); 394 if (IS_ERR(vma)) 395 return PTR_ERR(vma); 396 397 /* FIXME: we are not tracking our pinned VMA leaving it 398 * up to the core to fix up the stray pin_count upon 399 * free. 400 */ 401 402 wa_ctx->indirect_ctx.shadow_gma = i915_ggtt_offset(vma); 403 404 wa_ctx->per_ctx.shadow_gma = *((unsigned int *)per_ctx_va + 1); 405 memset(per_ctx_va, 0, CACHELINE_BYTES); 406 407 update_wa_ctx_2_shadow_ctx(wa_ctx); 408 return 0; 409 } 410 411 static void release_shadow_batch_buffer(struct intel_vgpu_workload *workload) 412 { 413 /* release all the shadow batch buffer */ 414 if (!list_empty(&workload->shadow_bb)) { 415 struct intel_shadow_bb_entry *entry_obj = 416 list_first_entry(&workload->shadow_bb, 417 struct intel_shadow_bb_entry, 418 list); 419 struct intel_shadow_bb_entry *temp; 420 421 list_for_each_entry_safe(entry_obj, temp, &workload->shadow_bb, 422 list) { 423 i915_gem_object_unpin_map(entry_obj->obj); 424 i915_gem_object_put(entry_obj->obj); 425 list_del(&entry_obj->list); 426 kfree(entry_obj); 427 } 428 } 429 } 430 431 static int prepare_workload(struct intel_vgpu_workload *workload) 432 { 433 struct intel_vgpu *vgpu = workload->vgpu; 434 int ret = 0; 435 436 ret = intel_vgpu_pin_mm(workload->shadow_mm); 437 if (ret) { 438 gvt_vgpu_err("fail to vgpu pin mm\n"); 439 return ret; 440 } 441 442 ret = intel_vgpu_sync_oos_pages(workload->vgpu); 443 if (ret) { 444 gvt_vgpu_err("fail to vgpu sync oos pages\n"); 445 goto err_unpin_mm; 446 } 447 448 ret = intel_vgpu_flush_post_shadow(workload->vgpu); 449 if (ret) { 450 gvt_vgpu_err("fail to flush post shadow\n"); 451 goto err_unpin_mm; 452 } 453 454 ret = prepare_shadow_batch_buffer(workload); 455 if (ret) { 456 gvt_vgpu_err("fail to prepare_shadow_batch_buffer\n"); 457 goto err_unpin_mm; 458 } 459 460 ret = prepare_shadow_wa_ctx(&workload->wa_ctx); 461 if (ret) { 462 gvt_vgpu_err("fail to prepare_shadow_wa_ctx\n"); 463 goto err_shadow_batch; 464 } 465 466 if (workload->prepare) { 467 ret = workload->prepare(workload); 468 if (ret) 469 goto err_shadow_wa_ctx; 470 } 471 472 return 0; 473 err_shadow_wa_ctx: 474 release_shadow_wa_ctx(&workload->wa_ctx); 475 err_shadow_batch: 476 release_shadow_batch_buffer(workload); 477 err_unpin_mm: 478 intel_vgpu_unpin_mm(workload->shadow_mm); 479 return ret; 480 } 481 482 static int dispatch_workload(struct intel_vgpu_workload *workload) 483 { 484 struct intel_vgpu *vgpu = workload->vgpu; 485 struct intel_vgpu_submission *s = &vgpu->submission; 486 struct i915_gem_context *shadow_ctx = s->shadow_ctx; 487 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; 488 int ring_id = workload->ring_id; 489 struct intel_engine_cs *engine = dev_priv->engine[ring_id]; 490 int ret = 0; 491 492 gvt_dbg_sched("ring id %d prepare to dispatch workload %p\n", 493 ring_id, workload); 494 495 mutex_lock(&dev_priv->drm.struct_mutex); 496 497 ret = intel_gvt_scan_and_shadow_workload(workload); 498 if (ret) 499 goto out; 500 501 ret = prepare_workload(workload); 502 if (ret) { 503 engine->context_unpin(engine, shadow_ctx); 504 goto out; 505 } 506 507 out: 508 if (ret) 509 workload->status = ret; 510 511 if (!IS_ERR_OR_NULL(workload->req)) { 512 gvt_dbg_sched("ring id %d submit workload to i915 %p\n", 513 ring_id, workload->req); 514 i915_add_request(workload->req); 515 workload->dispatched = true; 516 } 517 518 mutex_unlock(&dev_priv->drm.struct_mutex); 519 return ret; 520 } 521 522 static struct intel_vgpu_workload *pick_next_workload( 523 struct intel_gvt *gvt, int ring_id) 524 { 525 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; 526 struct intel_vgpu_workload *workload = NULL; 527 528 mutex_lock(&gvt->lock); 529 530 /* 531 * no current vgpu / will be scheduled out / no workload 532 * bail out 533 */ 534 if (!scheduler->current_vgpu) { 535 gvt_dbg_sched("ring id %d stop - no current vgpu\n", ring_id); 536 goto out; 537 } 538 539 if (scheduler->need_reschedule) { 540 gvt_dbg_sched("ring id %d stop - will reschedule\n", ring_id); 541 goto out; 542 } 543 544 if (list_empty(workload_q_head(scheduler->current_vgpu, ring_id))) 545 goto out; 546 547 /* 548 * still have current workload, maybe the workload disptacher 549 * fail to submit it for some reason, resubmit it. 550 */ 551 if (scheduler->current_workload[ring_id]) { 552 workload = scheduler->current_workload[ring_id]; 553 gvt_dbg_sched("ring id %d still have current workload %p\n", 554 ring_id, workload); 555 goto out; 556 } 557 558 /* 559 * pick a workload as current workload 560 * once current workload is set, schedule policy routines 561 * will wait the current workload is finished when trying to 562 * schedule out a vgpu. 563 */ 564 scheduler->current_workload[ring_id] = container_of( 565 workload_q_head(scheduler->current_vgpu, ring_id)->next, 566 struct intel_vgpu_workload, list); 567 568 workload = scheduler->current_workload[ring_id]; 569 570 gvt_dbg_sched("ring id %d pick new workload %p\n", ring_id, workload); 571 572 atomic_inc(&workload->vgpu->submission.running_workload_num); 573 out: 574 mutex_unlock(&gvt->lock); 575 return workload; 576 } 577 578 static void update_guest_context(struct intel_vgpu_workload *workload) 579 { 580 struct intel_vgpu *vgpu = workload->vgpu; 581 struct intel_gvt *gvt = vgpu->gvt; 582 struct intel_vgpu_submission *s = &vgpu->submission; 583 struct i915_gem_context *shadow_ctx = s->shadow_ctx; 584 int ring_id = workload->ring_id; 585 struct drm_i915_gem_object *ctx_obj = 586 shadow_ctx->engine[ring_id].state->obj; 587 struct execlist_ring_context *shadow_ring_context; 588 struct page *page; 589 void *src; 590 unsigned long context_gpa, context_page_num; 591 int i; 592 593 gvt_dbg_sched("ring id %d workload lrca %x\n", ring_id, 594 workload->ctx_desc.lrca); 595 596 context_page_num = gvt->dev_priv->engine[ring_id]->context_size; 597 598 context_page_num = context_page_num >> PAGE_SHIFT; 599 600 if (IS_BROADWELL(gvt->dev_priv) && ring_id == RCS) 601 context_page_num = 19; 602 603 i = 2; 604 605 while (i < context_page_num) { 606 context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm, 607 (u32)((workload->ctx_desc.lrca + i) << 608 GTT_PAGE_SHIFT)); 609 if (context_gpa == INTEL_GVT_INVALID_ADDR) { 610 gvt_vgpu_err("invalid guest context descriptor\n"); 611 return; 612 } 613 614 page = i915_gem_object_get_page(ctx_obj, LRC_HEADER_PAGES + i); 615 src = kmap(page); 616 intel_gvt_hypervisor_write_gpa(vgpu, context_gpa, src, 617 GTT_PAGE_SIZE); 618 kunmap(page); 619 i++; 620 } 621 622 intel_gvt_hypervisor_write_gpa(vgpu, workload->ring_context_gpa + 623 RING_CTX_OFF(ring_header.val), &workload->rb_tail, 4); 624 625 page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN); 626 shadow_ring_context = kmap(page); 627 628 #define COPY_REG(name) \ 629 intel_gvt_hypervisor_write_gpa(vgpu, workload->ring_context_gpa + \ 630 RING_CTX_OFF(name.val), &shadow_ring_context->name.val, 4) 631 632 COPY_REG(ctx_ctrl); 633 COPY_REG(ctx_timestamp); 634 635 #undef COPY_REG 636 637 intel_gvt_hypervisor_write_gpa(vgpu, 638 workload->ring_context_gpa + 639 sizeof(*shadow_ring_context), 640 (void *)shadow_ring_context + 641 sizeof(*shadow_ring_context), 642 GTT_PAGE_SIZE - sizeof(*shadow_ring_context)); 643 644 kunmap(page); 645 } 646 647 static void complete_current_workload(struct intel_gvt *gvt, int ring_id) 648 { 649 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; 650 struct intel_vgpu_workload *workload = 651 scheduler->current_workload[ring_id]; 652 struct intel_vgpu *vgpu = workload->vgpu; 653 struct intel_vgpu_submission *s = &vgpu->submission; 654 int event; 655 656 mutex_lock(&gvt->lock); 657 658 /* For the workload w/ request, needs to wait for the context 659 * switch to make sure request is completed. 660 * For the workload w/o request, directly complete the workload. 661 */ 662 if (workload->req) { 663 struct drm_i915_private *dev_priv = 664 workload->vgpu->gvt->dev_priv; 665 struct intel_engine_cs *engine = 666 dev_priv->engine[workload->ring_id]; 667 wait_event(workload->shadow_ctx_status_wq, 668 !atomic_read(&workload->shadow_ctx_active)); 669 670 /* If this request caused GPU hang, req->fence.error will 671 * be set to -EIO. Use -EIO to set workload status so 672 * that when this request caused GPU hang, didn't trigger 673 * context switch interrupt to guest. 674 */ 675 if (likely(workload->status == -EINPROGRESS)) { 676 if (workload->req->fence.error == -EIO) 677 workload->status = -EIO; 678 else 679 workload->status = 0; 680 } 681 682 i915_gem_request_put(fetch_and_zero(&workload->req)); 683 684 if (!workload->status && !(vgpu->resetting_eng & 685 ENGINE_MASK(ring_id))) { 686 update_guest_context(workload); 687 688 for_each_set_bit(event, workload->pending_events, 689 INTEL_GVT_EVENT_MAX) 690 intel_vgpu_trigger_virtual_event(vgpu, event); 691 } 692 mutex_lock(&dev_priv->drm.struct_mutex); 693 /* unpin shadow ctx as the shadow_ctx update is done */ 694 engine->context_unpin(engine, s->shadow_ctx); 695 mutex_unlock(&dev_priv->drm.struct_mutex); 696 } 697 698 gvt_dbg_sched("ring id %d complete workload %p status %d\n", 699 ring_id, workload, workload->status); 700 701 scheduler->current_workload[ring_id] = NULL; 702 703 list_del_init(&workload->list); 704 705 if (!workload->status) { 706 release_shadow_batch_buffer(workload); 707 release_shadow_wa_ctx(&workload->wa_ctx); 708 } 709 710 workload->complete(workload); 711 712 atomic_dec(&s->running_workload_num); 713 wake_up(&scheduler->workload_complete_wq); 714 715 if (gvt->scheduler.need_reschedule) 716 intel_gvt_request_service(gvt, INTEL_GVT_REQUEST_EVENT_SCHED); 717 718 mutex_unlock(&gvt->lock); 719 } 720 721 struct workload_thread_param { 722 struct intel_gvt *gvt; 723 int ring_id; 724 }; 725 726 static int workload_thread(void *priv) 727 { 728 struct workload_thread_param *p = (struct workload_thread_param *)priv; 729 struct intel_gvt *gvt = p->gvt; 730 int ring_id = p->ring_id; 731 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; 732 struct intel_vgpu_workload *workload = NULL; 733 struct intel_vgpu *vgpu = NULL; 734 int ret; 735 bool need_force_wake = IS_SKYLAKE(gvt->dev_priv) 736 || IS_KABYLAKE(gvt->dev_priv); 737 DEFINE_WAIT_FUNC(wait, woken_wake_function); 738 739 kfree(p); 740 741 gvt_dbg_core("workload thread for ring %d started\n", ring_id); 742 743 while (!kthread_should_stop()) { 744 add_wait_queue(&scheduler->waitq[ring_id], &wait); 745 do { 746 workload = pick_next_workload(gvt, ring_id); 747 if (workload) 748 break; 749 wait_woken(&wait, TASK_INTERRUPTIBLE, 750 MAX_SCHEDULE_TIMEOUT); 751 } while (!kthread_should_stop()); 752 remove_wait_queue(&scheduler->waitq[ring_id], &wait); 753 754 if (!workload) 755 break; 756 757 gvt_dbg_sched("ring id %d next workload %p vgpu %d\n", 758 workload->ring_id, workload, 759 workload->vgpu->id); 760 761 intel_runtime_pm_get(gvt->dev_priv); 762 763 gvt_dbg_sched("ring id %d will dispatch workload %p\n", 764 workload->ring_id, workload); 765 766 if (need_force_wake) 767 intel_uncore_forcewake_get(gvt->dev_priv, 768 FORCEWAKE_ALL); 769 770 mutex_lock(&gvt->lock); 771 ret = dispatch_workload(workload); 772 mutex_unlock(&gvt->lock); 773 774 if (ret) { 775 vgpu = workload->vgpu; 776 gvt_vgpu_err("fail to dispatch workload, skip\n"); 777 goto complete; 778 } 779 780 gvt_dbg_sched("ring id %d wait workload %p\n", 781 workload->ring_id, workload); 782 i915_wait_request(workload->req, 0, MAX_SCHEDULE_TIMEOUT); 783 784 complete: 785 gvt_dbg_sched("will complete workload %p, status: %d\n", 786 workload, workload->status); 787 788 complete_current_workload(gvt, ring_id); 789 790 if (need_force_wake) 791 intel_uncore_forcewake_put(gvt->dev_priv, 792 FORCEWAKE_ALL); 793 794 intel_runtime_pm_put(gvt->dev_priv); 795 if (ret && (vgpu_is_vm_unhealthy(ret))) 796 enter_failsafe_mode(vgpu, GVT_FAILSAFE_GUEST_ERR); 797 } 798 return 0; 799 } 800 801 void intel_gvt_wait_vgpu_idle(struct intel_vgpu *vgpu) 802 { 803 struct intel_vgpu_submission *s = &vgpu->submission; 804 struct intel_gvt *gvt = vgpu->gvt; 805 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; 806 807 if (atomic_read(&s->running_workload_num)) { 808 gvt_dbg_sched("wait vgpu idle\n"); 809 810 wait_event(scheduler->workload_complete_wq, 811 !atomic_read(&s->running_workload_num)); 812 } 813 } 814 815 void intel_gvt_clean_workload_scheduler(struct intel_gvt *gvt) 816 { 817 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; 818 struct intel_engine_cs *engine; 819 enum intel_engine_id i; 820 821 gvt_dbg_core("clean workload scheduler\n"); 822 823 for_each_engine(engine, gvt->dev_priv, i) { 824 atomic_notifier_chain_unregister( 825 &engine->context_status_notifier, 826 &gvt->shadow_ctx_notifier_block[i]); 827 kthread_stop(scheduler->thread[i]); 828 } 829 } 830 831 int intel_gvt_init_workload_scheduler(struct intel_gvt *gvt) 832 { 833 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; 834 struct workload_thread_param *param = NULL; 835 struct intel_engine_cs *engine; 836 enum intel_engine_id i; 837 int ret; 838 839 gvt_dbg_core("init workload scheduler\n"); 840 841 init_waitqueue_head(&scheduler->workload_complete_wq); 842 843 for_each_engine(engine, gvt->dev_priv, i) { 844 init_waitqueue_head(&scheduler->waitq[i]); 845 846 param = kzalloc(sizeof(*param), GFP_KERNEL); 847 if (!param) { 848 ret = -ENOMEM; 849 goto err; 850 } 851 852 param->gvt = gvt; 853 param->ring_id = i; 854 855 scheduler->thread[i] = kthread_run(workload_thread, param, 856 "gvt workload %d", i); 857 if (IS_ERR(scheduler->thread[i])) { 858 gvt_err("fail to create workload thread\n"); 859 ret = PTR_ERR(scheduler->thread[i]); 860 goto err; 861 } 862 863 gvt->shadow_ctx_notifier_block[i].notifier_call = 864 shadow_context_status_change; 865 atomic_notifier_chain_register(&engine->context_status_notifier, 866 &gvt->shadow_ctx_notifier_block[i]); 867 } 868 return 0; 869 err: 870 intel_gvt_clean_workload_scheduler(gvt); 871 kfree(param); 872 param = NULL; 873 return ret; 874 } 875 876 /** 877 * intel_vgpu_clean_submission - free submission-related resource for vGPU 878 * @vgpu: a vGPU 879 * 880 * This function is called when a vGPU is being destroyed. 881 * 882 */ 883 void intel_vgpu_clean_submission(struct intel_vgpu *vgpu) 884 { 885 struct intel_vgpu_submission *s = &vgpu->submission; 886 887 i915_gem_context_put(s->shadow_ctx); 888 kmem_cache_destroy(s->workloads); 889 } 890 891 /** 892 * intel_vgpu_setup_submission - setup submission-related resource for vGPU 893 * @vgpu: a vGPU 894 * 895 * This function is called when a vGPU is being created. 896 * 897 * Returns: 898 * Zero on success, negative error code if failed. 899 * 900 */ 901 int intel_vgpu_setup_submission(struct intel_vgpu *vgpu) 902 { 903 struct intel_vgpu_submission *s = &vgpu->submission; 904 enum intel_engine_id i; 905 struct intel_engine_cs *engine; 906 int ret; 907 908 s->shadow_ctx = i915_gem_context_create_gvt( 909 &vgpu->gvt->dev_priv->drm); 910 if (IS_ERR(s->shadow_ctx)) 911 return PTR_ERR(s->shadow_ctx); 912 913 bitmap_zero(s->shadow_ctx_desc_updated, I915_NUM_ENGINES); 914 915 s->workloads = kmem_cache_create("gvt-g_vgpu_workload", 916 sizeof(struct intel_vgpu_workload), 0, 917 SLAB_HWCACHE_ALIGN, 918 NULL); 919 920 if (!s->workloads) { 921 ret = -ENOMEM; 922 goto out_shadow_ctx; 923 } 924 925 for_each_engine(engine, vgpu->gvt->dev_priv, i) 926 INIT_LIST_HEAD(&s->workload_q_head[i]); 927 928 atomic_set(&s->running_workload_num, 0); 929 bitmap_zero(s->tlb_handle_pending, I915_NUM_ENGINES); 930 931 return 0; 932 933 out_shadow_ctx: 934 i915_gem_context_put(s->shadow_ctx); 935 return ret; 936 } 937 938 /** 939 * intel_vgpu_destroy_workload - destroy a vGPU workload 940 * @vgpu: a vGPU 941 * 942 * This function is called when destroy a vGPU workload. 943 * 944 */ 945 void intel_vgpu_destroy_workload(struct intel_vgpu_workload *workload) 946 { 947 struct intel_vgpu_submission *s = &workload->vgpu->submission; 948 949 if (workload->shadow_mm) 950 intel_gvt_mm_unreference(workload->shadow_mm); 951 952 kmem_cache_free(s->workloads, workload); 953 } 954 955 static struct intel_vgpu_workload * 956 alloc_workload(struct intel_vgpu *vgpu) 957 { 958 struct intel_vgpu_submission *s = &vgpu->submission; 959 struct intel_vgpu_workload *workload; 960 961 workload = kmem_cache_zalloc(s->workloads, GFP_KERNEL); 962 if (!workload) 963 return ERR_PTR(-ENOMEM); 964 965 INIT_LIST_HEAD(&workload->list); 966 INIT_LIST_HEAD(&workload->shadow_bb); 967 968 init_waitqueue_head(&workload->shadow_ctx_status_wq); 969 atomic_set(&workload->shadow_ctx_active, 0); 970 971 workload->status = -EINPROGRESS; 972 workload->shadowed = false; 973 workload->vgpu = vgpu; 974 975 return workload; 976 } 977 978 #define RING_CTX_OFF(x) \ 979 offsetof(struct execlist_ring_context, x) 980 981 static void read_guest_pdps(struct intel_vgpu *vgpu, 982 u64 ring_context_gpa, u32 pdp[8]) 983 { 984 u64 gpa; 985 int i; 986 987 gpa = ring_context_gpa + RING_CTX_OFF(pdp3_UDW.val); 988 989 for (i = 0; i < 8; i++) 990 intel_gvt_hypervisor_read_gpa(vgpu, 991 gpa + i * 8, &pdp[7 - i], 4); 992 } 993 994 static int prepare_mm(struct intel_vgpu_workload *workload) 995 { 996 struct execlist_ctx_descriptor_format *desc = &workload->ctx_desc; 997 struct intel_vgpu_mm *mm; 998 struct intel_vgpu *vgpu = workload->vgpu; 999 int page_table_level; 1000 u32 pdp[8]; 1001 1002 if (desc->addressing_mode == 1) { /* legacy 32-bit */ 1003 page_table_level = 3; 1004 } else if (desc->addressing_mode == 3) { /* legacy 64 bit */ 1005 page_table_level = 4; 1006 } else { 1007 gvt_vgpu_err("Advanced Context mode(SVM) is not supported!\n"); 1008 return -EINVAL; 1009 } 1010 1011 read_guest_pdps(workload->vgpu, workload->ring_context_gpa, pdp); 1012 1013 mm = intel_vgpu_find_ppgtt_mm(workload->vgpu, page_table_level, pdp); 1014 if (mm) { 1015 intel_gvt_mm_reference(mm); 1016 } else { 1017 1018 mm = intel_vgpu_create_mm(workload->vgpu, INTEL_GVT_MM_PPGTT, 1019 pdp, page_table_level, 0); 1020 if (IS_ERR(mm)) { 1021 gvt_vgpu_err("fail to create mm object.\n"); 1022 return PTR_ERR(mm); 1023 } 1024 } 1025 workload->shadow_mm = mm; 1026 return 0; 1027 } 1028 1029 #define same_context(a, b) (((a)->context_id == (b)->context_id) && \ 1030 ((a)->lrca == (b)->lrca)) 1031 1032 #define get_last_workload(q) \ 1033 (list_empty(q) ? NULL : container_of(q->prev, \ 1034 struct intel_vgpu_workload, list)) 1035 /** 1036 * intel_vgpu_create_workload - create a vGPU workload 1037 * @vgpu: a vGPU 1038 * @desc: a guest context descriptor 1039 * 1040 * This function is called when creating a vGPU workload. 1041 * 1042 * Returns: 1043 * struct intel_vgpu_workload * on success, negative error code in 1044 * pointer if failed. 1045 * 1046 */ 1047 struct intel_vgpu_workload * 1048 intel_vgpu_create_workload(struct intel_vgpu *vgpu, int ring_id, 1049 struct execlist_ctx_descriptor_format *desc) 1050 { 1051 struct intel_vgpu_submission *s = &vgpu->submission; 1052 struct list_head *q = workload_q_head(vgpu, ring_id); 1053 struct intel_vgpu_workload *last_workload = get_last_workload(q); 1054 struct intel_vgpu_workload *workload = NULL; 1055 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; 1056 u64 ring_context_gpa; 1057 u32 head, tail, start, ctl, ctx_ctl, per_ctx, indirect_ctx; 1058 int ret; 1059 1060 ring_context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm, 1061 (u32)((desc->lrca + 1) << GTT_PAGE_SHIFT)); 1062 if (ring_context_gpa == INTEL_GVT_INVALID_ADDR) { 1063 gvt_vgpu_err("invalid guest context LRCA: %x\n", desc->lrca); 1064 return ERR_PTR(-EINVAL); 1065 } 1066 1067 intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa + 1068 RING_CTX_OFF(ring_header.val), &head, 4); 1069 1070 intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa + 1071 RING_CTX_OFF(ring_tail.val), &tail, 4); 1072 1073 head &= RB_HEAD_OFF_MASK; 1074 tail &= RB_TAIL_OFF_MASK; 1075 1076 if (last_workload && same_context(&last_workload->ctx_desc, desc)) { 1077 gvt_dbg_el("ring id %d cur workload == last\n", ring_id); 1078 gvt_dbg_el("ctx head %x real head %lx\n", head, 1079 last_workload->rb_tail); 1080 /* 1081 * cannot use guest context head pointer here, 1082 * as it might not be updated at this time 1083 */ 1084 head = last_workload->rb_tail; 1085 } 1086 1087 gvt_dbg_el("ring id %d begin a new workload\n", ring_id); 1088 1089 /* record some ring buffer register values for scan and shadow */ 1090 intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa + 1091 RING_CTX_OFF(rb_start.val), &start, 4); 1092 intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa + 1093 RING_CTX_OFF(rb_ctrl.val), &ctl, 4); 1094 intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa + 1095 RING_CTX_OFF(ctx_ctrl.val), &ctx_ctl, 4); 1096 1097 workload = alloc_workload(vgpu); 1098 if (IS_ERR(workload)) 1099 return workload; 1100 1101 workload->ring_id = ring_id; 1102 workload->ctx_desc = *desc; 1103 workload->ring_context_gpa = ring_context_gpa; 1104 workload->rb_head = head; 1105 workload->rb_tail = tail; 1106 workload->rb_start = start; 1107 workload->rb_ctl = ctl; 1108 1109 if (ring_id == RCS) { 1110 intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa + 1111 RING_CTX_OFF(bb_per_ctx_ptr.val), &per_ctx, 4); 1112 intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa + 1113 RING_CTX_OFF(rcs_indirect_ctx.val), &indirect_ctx, 4); 1114 1115 workload->wa_ctx.indirect_ctx.guest_gma = 1116 indirect_ctx & INDIRECT_CTX_ADDR_MASK; 1117 workload->wa_ctx.indirect_ctx.size = 1118 (indirect_ctx & INDIRECT_CTX_SIZE_MASK) * 1119 CACHELINE_BYTES; 1120 workload->wa_ctx.per_ctx.guest_gma = 1121 per_ctx & PER_CTX_ADDR_MASK; 1122 workload->wa_ctx.per_ctx.valid = per_ctx & 1; 1123 } 1124 1125 gvt_dbg_el("workload %p ring id %d head %x tail %x start %x ctl %x\n", 1126 workload, ring_id, head, tail, start, ctl); 1127 1128 ret = prepare_mm(workload); 1129 if (ret) { 1130 kmem_cache_free(s->workloads, workload); 1131 return ERR_PTR(ret); 1132 } 1133 1134 /* Only scan and shadow the first workload in the queue 1135 * as there is only one pre-allocated buf-obj for shadow. 1136 */ 1137 if (list_empty(workload_q_head(vgpu, ring_id))) { 1138 intel_runtime_pm_get(dev_priv); 1139 mutex_lock(&dev_priv->drm.struct_mutex); 1140 ret = intel_gvt_scan_and_shadow_workload(workload); 1141 mutex_unlock(&dev_priv->drm.struct_mutex); 1142 intel_runtime_pm_put(dev_priv); 1143 } 1144 1145 if (ret && (vgpu_is_vm_unhealthy(ret))) { 1146 enter_failsafe_mode(vgpu, GVT_FAILSAFE_GUEST_ERR); 1147 intel_vgpu_destroy_workload(workload); 1148 return ERR_PTR(ret); 1149 } 1150 1151 return workload; 1152 } 1153