Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.16 810 lines 24 kB view raw
1/* 2 * Copyright © 2011-2012 Intel Corporation 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 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 * 23 * Authors: 24 * Ben Widawsky <ben@bwidawsk.net> 25 * 26 */ 27 28/* 29 * This file implements HW context support. On gen5+ a HW context consists of an 30 * opaque GPU object which is referenced at times of context saves and restores. 31 * With RC6 enabled, the context is also referenced as the GPU enters and exists 32 * from RC6 (GPU has it's own internal power context, except on gen5). Though 33 * something like a context does exist for the media ring, the code only 34 * supports contexts for the render ring. 35 * 36 * In software, there is a distinction between contexts created by the user, 37 * and the default HW context. The default HW context is used by GPU clients 38 * that do not request setup of their own hardware context. The default 39 * context's state is never restored to help prevent programming errors. This 40 * would happen if a client ran and piggy-backed off another clients GPU state. 41 * The default context only exists to give the GPU some offset to load as the 42 * current to invoke a save of the context we actually care about. In fact, the 43 * code could likely be constructed, albeit in a more complicated fashion, to 44 * never use the default context, though that limits the driver's ability to 45 * swap out, and/or destroy other contexts. 46 * 47 * All other contexts are created as a request by the GPU client. These contexts 48 * store GPU state, and thus allow GPU clients to not re-emit state (and 49 * potentially query certain state) at any time. The kernel driver makes 50 * certain that the appropriate commands are inserted. 51 * 52 * The context life cycle is semi-complicated in that context BOs may live 53 * longer than the context itself because of the way the hardware, and object 54 * tracking works. Below is a very crude representation of the state machine 55 * describing the context life. 56 * refcount pincount active 57 * S0: initial state 0 0 0 58 * S1: context created 1 0 0 59 * S2: context is currently running 2 1 X 60 * S3: GPU referenced, but not current 2 0 1 61 * S4: context is current, but destroyed 1 1 0 62 * S5: like S3, but destroyed 1 0 1 63 * 64 * The most common (but not all) transitions: 65 * S0->S1: client creates a context 66 * S1->S2: client submits execbuf with context 67 * S2->S3: other clients submits execbuf with context 68 * S3->S1: context object was retired 69 * S3->S2: clients submits another execbuf 70 * S2->S4: context destroy called with current context 71 * S3->S5->S0: destroy path 72 * S4->S5->S0: destroy path on current context 73 * 74 * There are two confusing terms used above: 75 * The "current context" means the context which is currently running on the 76 * GPU. The GPU has loaded its state already and has stored away the gtt 77 * offset of the BO. The GPU is not actively referencing the data at this 78 * offset, but it will on the next context switch. The only way to avoid this 79 * is to do a GPU reset. 80 * 81 * An "active context' is one which was previously the "current context" and is 82 * on the active list waiting for the next context switch to occur. Until this 83 * happens, the object must remain at the same gtt offset. It is therefore 84 * possible to destroy a context, but it is still active. 85 * 86 */ 87 88#include <drm/drmP.h> 89#include <drm/i915_drm.h> 90#include "i915_drv.h" 91 92/* This is a HW constraint. The value below is the largest known requirement 93 * I've seen in a spec to date, and that was a workaround for a non-shipping 94 * part. It should be safe to decrease this, but it's more future proof as is. 95 */ 96#define GEN6_CONTEXT_ALIGN (64<<10) 97#define GEN7_CONTEXT_ALIGN 4096 98 99static void do_ppgtt_cleanup(struct i915_hw_ppgtt *ppgtt) 100{ 101 struct drm_device *dev = ppgtt->base.dev; 102 struct drm_i915_private *dev_priv = dev->dev_private; 103 struct i915_address_space *vm = &ppgtt->base; 104 105 if (ppgtt == dev_priv->mm.aliasing_ppgtt || 106 (list_empty(&vm->active_list) && list_empty(&vm->inactive_list))) { 107 ppgtt->base.cleanup(&ppgtt->base); 108 return; 109 } 110 111 /* 112 * Make sure vmas are unbound before we take down the drm_mm 113 * 114 * FIXME: Proper refcounting should take care of this, this shouldn't be 115 * needed at all. 116 */ 117 if (!list_empty(&vm->active_list)) { 118 struct i915_vma *vma; 119 120 list_for_each_entry(vma, &vm->active_list, mm_list) 121 if (WARN_ON(list_empty(&vma->vma_link) || 122 list_is_singular(&vma->vma_link))) 123 break; 124 125 i915_gem_evict_vm(&ppgtt->base, true); 126 } else { 127 i915_gem_retire_requests(dev); 128 i915_gem_evict_vm(&ppgtt->base, false); 129 } 130 131 ppgtt->base.cleanup(&ppgtt->base); 132} 133 134static void ppgtt_release(struct kref *kref) 135{ 136 struct i915_hw_ppgtt *ppgtt = 137 container_of(kref, struct i915_hw_ppgtt, ref); 138 139 do_ppgtt_cleanup(ppgtt); 140 kfree(ppgtt); 141} 142 143static size_t get_context_alignment(struct drm_device *dev) 144{ 145 if (IS_GEN6(dev)) 146 return GEN6_CONTEXT_ALIGN; 147 148 return GEN7_CONTEXT_ALIGN; 149} 150 151static int get_context_size(struct drm_device *dev) 152{ 153 struct drm_i915_private *dev_priv = dev->dev_private; 154 int ret; 155 u32 reg; 156 157 switch (INTEL_INFO(dev)->gen) { 158 case 6: 159 reg = I915_READ(CXT_SIZE); 160 ret = GEN6_CXT_TOTAL_SIZE(reg) * 64; 161 break; 162 case 7: 163 reg = I915_READ(GEN7_CXT_SIZE); 164 if (IS_HASWELL(dev)) 165 ret = HSW_CXT_TOTAL_SIZE; 166 else 167 ret = GEN7_CXT_TOTAL_SIZE(reg) * 64; 168 break; 169 case 8: 170 ret = GEN8_CXT_TOTAL_SIZE; 171 break; 172 default: 173 BUG(); 174 } 175 176 return ret; 177} 178 179void i915_gem_context_free(struct kref *ctx_ref) 180{ 181 struct intel_context *ctx = container_of(ctx_ref, 182 typeof(*ctx), ref); 183 struct i915_hw_ppgtt *ppgtt = NULL; 184 185 if (ctx->obj) { 186 /* We refcount even the aliasing PPGTT to keep the code symmetric */ 187 if (USES_PPGTT(ctx->obj->base.dev)) 188 ppgtt = ctx_to_ppgtt(ctx); 189 190 /* XXX: Free up the object before tearing down the address space, in 191 * case we're bound in the PPGTT */ 192 drm_gem_object_unreference(&ctx->obj->base); 193 } 194 195 if (ppgtt) 196 kref_put(&ppgtt->ref, ppgtt_release); 197 list_del(&ctx->link); 198 kfree(ctx); 199} 200 201static struct i915_hw_ppgtt * 202create_vm_for_ctx(struct drm_device *dev, struct intel_context *ctx) 203{ 204 struct i915_hw_ppgtt *ppgtt; 205 int ret; 206 207 ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL); 208 if (!ppgtt) 209 return ERR_PTR(-ENOMEM); 210 211 ret = i915_gem_init_ppgtt(dev, ppgtt); 212 if (ret) { 213 kfree(ppgtt); 214 return ERR_PTR(ret); 215 } 216 217 ppgtt->ctx = ctx; 218 return ppgtt; 219} 220 221static struct intel_context * 222__create_hw_context(struct drm_device *dev, 223 struct drm_i915_file_private *file_priv) 224{ 225 struct drm_i915_private *dev_priv = dev->dev_private; 226 struct intel_context *ctx; 227 int ret; 228 229 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); 230 if (ctx == NULL) 231 return ERR_PTR(-ENOMEM); 232 233 kref_init(&ctx->ref); 234 list_add_tail(&ctx->link, &dev_priv->context_list); 235 236 if (dev_priv->hw_context_size) { 237 ctx->obj = i915_gem_alloc_object(dev, dev_priv->hw_context_size); 238 if (ctx->obj == NULL) { 239 ret = -ENOMEM; 240 goto err_out; 241 } 242 243 /* 244 * Try to make the context utilize L3 as well as LLC. 245 * 246 * On VLV we don't have L3 controls in the PTEs so we 247 * shouldn't touch the cache level, especially as that 248 * would make the object snooped which might have a 249 * negative performance impact. 250 */ 251 if (INTEL_INFO(dev)->gen >= 7 && !IS_VALLEYVIEW(dev)) { 252 ret = i915_gem_object_set_cache_level(ctx->obj, 253 I915_CACHE_L3_LLC); 254 /* Failure shouldn't ever happen this early */ 255 if (WARN_ON(ret)) 256 goto err_out; 257 } 258 } 259 260 /* Default context will never have a file_priv */ 261 if (file_priv != NULL) { 262 ret = idr_alloc(&file_priv->context_idr, ctx, 263 DEFAULT_CONTEXT_ID, 0, GFP_KERNEL); 264 if (ret < 0) 265 goto err_out; 266 } else 267 ret = DEFAULT_CONTEXT_ID; 268 269 ctx->file_priv = file_priv; 270 ctx->id = ret; 271 /* NB: Mark all slices as needing a remap so that when the context first 272 * loads it will restore whatever remap state already exists. If there 273 * is no remap info, it will be a NOP. */ 274 ctx->remap_slice = (1 << NUM_L3_SLICES(dev)) - 1; 275 276 return ctx; 277 278err_out: 279 i915_gem_context_unreference(ctx); 280 return ERR_PTR(ret); 281} 282 283/** 284 * The default context needs to exist per ring that uses contexts. It stores the 285 * context state of the GPU for applications that don't utilize HW contexts, as 286 * well as an idle case. 287 */ 288static struct intel_context * 289i915_gem_create_context(struct drm_device *dev, 290 struct drm_i915_file_private *file_priv, 291 bool create_vm) 292{ 293 const bool is_global_default_ctx = file_priv == NULL; 294 struct drm_i915_private *dev_priv = dev->dev_private; 295 struct intel_context *ctx; 296 int ret = 0; 297 298 BUG_ON(!mutex_is_locked(&dev->struct_mutex)); 299 300 ctx = __create_hw_context(dev, file_priv); 301 if (IS_ERR(ctx)) 302 return ctx; 303 304 if (is_global_default_ctx && ctx->obj) { 305 /* We may need to do things with the shrinker which 306 * require us to immediately switch back to the default 307 * context. This can cause a problem as pinning the 308 * default context also requires GTT space which may not 309 * be available. To avoid this we always pin the default 310 * context. 311 */ 312 ret = i915_gem_obj_ggtt_pin(ctx->obj, 313 get_context_alignment(dev), 0); 314 if (ret) { 315 DRM_DEBUG_DRIVER("Couldn't pin %d\n", ret); 316 goto err_destroy; 317 } 318 } 319 320 if (create_vm) { 321 struct i915_hw_ppgtt *ppgtt = create_vm_for_ctx(dev, ctx); 322 323 if (IS_ERR_OR_NULL(ppgtt)) { 324 DRM_DEBUG_DRIVER("PPGTT setup failed (%ld)\n", 325 PTR_ERR(ppgtt)); 326 ret = PTR_ERR(ppgtt); 327 goto err_unpin; 328 } else 329 ctx->vm = &ppgtt->base; 330 331 /* This case is reserved for the global default context and 332 * should only happen once. */ 333 if (is_global_default_ctx) { 334 if (WARN_ON(dev_priv->mm.aliasing_ppgtt)) { 335 ret = -EEXIST; 336 goto err_unpin; 337 } 338 339 dev_priv->mm.aliasing_ppgtt = ppgtt; 340 } 341 } else if (USES_PPGTT(dev)) { 342 /* For platforms which only have aliasing PPGTT, we fake the 343 * address space and refcounting. */ 344 ctx->vm = &dev_priv->mm.aliasing_ppgtt->base; 345 kref_get(&dev_priv->mm.aliasing_ppgtt->ref); 346 } else 347 ctx->vm = &dev_priv->gtt.base; 348 349 return ctx; 350 351err_unpin: 352 if (is_global_default_ctx && ctx->obj) 353 i915_gem_object_ggtt_unpin(ctx->obj); 354err_destroy: 355 i915_gem_context_unreference(ctx); 356 return ERR_PTR(ret); 357} 358 359void i915_gem_context_reset(struct drm_device *dev) 360{ 361 struct drm_i915_private *dev_priv = dev->dev_private; 362 int i; 363 364 /* Prevent the hardware from restoring the last context (which hung) on 365 * the next switch */ 366 for (i = 0; i < I915_NUM_RINGS; i++) { 367 struct intel_engine_cs *ring = &dev_priv->ring[i]; 368 struct intel_context *dctx = ring->default_context; 369 370 /* Do a fake switch to the default context */ 371 if (ring->last_context == dctx) 372 continue; 373 374 if (!ring->last_context) 375 continue; 376 377 if (dctx->obj && i == RCS) { 378 WARN_ON(i915_gem_obj_ggtt_pin(dctx->obj, 379 get_context_alignment(dev), 0)); 380 /* Fake a finish/inactive */ 381 dctx->obj->base.write_domain = 0; 382 dctx->obj->active = 0; 383 } 384 385 i915_gem_context_unreference(ring->last_context); 386 i915_gem_context_reference(dctx); 387 ring->last_context = dctx; 388 } 389} 390 391int i915_gem_context_init(struct drm_device *dev) 392{ 393 struct drm_i915_private *dev_priv = dev->dev_private; 394 struct intel_context *ctx; 395 int i; 396 397 /* Init should only be called once per module load. Eventually the 398 * restriction on the context_disabled check can be loosened. */ 399 if (WARN_ON(dev_priv->ring[RCS].default_context)) 400 return 0; 401 402 if (HAS_HW_CONTEXTS(dev)) { 403 dev_priv->hw_context_size = round_up(get_context_size(dev), 4096); 404 if (dev_priv->hw_context_size > (1<<20)) { 405 DRM_DEBUG_DRIVER("Disabling HW Contexts; invalid size %d\n", 406 dev_priv->hw_context_size); 407 dev_priv->hw_context_size = 0; 408 } 409 } 410 411 ctx = i915_gem_create_context(dev, NULL, USES_PPGTT(dev)); 412 if (IS_ERR(ctx)) { 413 DRM_ERROR("Failed to create default global context (error %ld)\n", 414 PTR_ERR(ctx)); 415 return PTR_ERR(ctx); 416 } 417 418 /* NB: RCS will hold a ref for all rings */ 419 for (i = 0; i < I915_NUM_RINGS; i++) 420 dev_priv->ring[i].default_context = ctx; 421 422 DRM_DEBUG_DRIVER("%s context support initialized\n", dev_priv->hw_context_size ? "HW" : "fake"); 423 return 0; 424} 425 426void i915_gem_context_fini(struct drm_device *dev) 427{ 428 struct drm_i915_private *dev_priv = dev->dev_private; 429 struct intel_context *dctx = dev_priv->ring[RCS].default_context; 430 int i; 431 432 if (dctx->obj) { 433 /* The only known way to stop the gpu from accessing the hw context is 434 * to reset it. Do this as the very last operation to avoid confusing 435 * other code, leading to spurious errors. */ 436 intel_gpu_reset(dev); 437 438 /* When default context is created and switched to, base object refcount 439 * will be 2 (+1 from object creation and +1 from do_switch()). 440 * i915_gem_context_fini() will be called after gpu_idle() has switched 441 * to default context. So we need to unreference the base object once 442 * to offset the do_switch part, so that i915_gem_context_unreference() 443 * can then free the base object correctly. */ 444 WARN_ON(!dev_priv->ring[RCS].last_context); 445 if (dev_priv->ring[RCS].last_context == dctx) { 446 /* Fake switch to NULL context */ 447 WARN_ON(dctx->obj->active); 448 i915_gem_object_ggtt_unpin(dctx->obj); 449 i915_gem_context_unreference(dctx); 450 dev_priv->ring[RCS].last_context = NULL; 451 } 452 453 i915_gem_object_ggtt_unpin(dctx->obj); 454 } 455 456 for (i = 0; i < I915_NUM_RINGS; i++) { 457 struct intel_engine_cs *ring = &dev_priv->ring[i]; 458 459 if (ring->last_context) 460 i915_gem_context_unreference(ring->last_context); 461 462 ring->default_context = NULL; 463 ring->last_context = NULL; 464 } 465 466 i915_gem_context_unreference(dctx); 467} 468 469int i915_gem_context_enable(struct drm_i915_private *dev_priv) 470{ 471 struct intel_engine_cs *ring; 472 int ret, i; 473 474 /* This is the only place the aliasing PPGTT gets enabled, which means 475 * it has to happen before we bail on reset */ 476 if (dev_priv->mm.aliasing_ppgtt) { 477 struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt; 478 ppgtt->enable(ppgtt); 479 } 480 481 /* FIXME: We should make this work, even in reset */ 482 if (i915_reset_in_progress(&dev_priv->gpu_error)) 483 return 0; 484 485 BUG_ON(!dev_priv->ring[RCS].default_context); 486 487 for_each_ring(ring, dev_priv, i) { 488 ret = i915_switch_context(ring, ring->default_context); 489 if (ret) 490 return ret; 491 } 492 493 return 0; 494} 495 496static int context_idr_cleanup(int id, void *p, void *data) 497{ 498 struct intel_context *ctx = p; 499 500 i915_gem_context_unreference(ctx); 501 return 0; 502} 503 504int i915_gem_context_open(struct drm_device *dev, struct drm_file *file) 505{ 506 struct drm_i915_file_private *file_priv = file->driver_priv; 507 struct intel_context *ctx; 508 509 idr_init(&file_priv->context_idr); 510 511 mutex_lock(&dev->struct_mutex); 512 ctx = i915_gem_create_context(dev, file_priv, USES_FULL_PPGTT(dev)); 513 mutex_unlock(&dev->struct_mutex); 514 515 if (IS_ERR(ctx)) { 516 idr_destroy(&file_priv->context_idr); 517 return PTR_ERR(ctx); 518 } 519 520 return 0; 521} 522 523void i915_gem_context_close(struct drm_device *dev, struct drm_file *file) 524{ 525 struct drm_i915_file_private *file_priv = file->driver_priv; 526 527 idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL); 528 idr_destroy(&file_priv->context_idr); 529} 530 531struct intel_context * 532i915_gem_context_get(struct drm_i915_file_private *file_priv, u32 id) 533{ 534 struct intel_context *ctx; 535 536 ctx = (struct intel_context *)idr_find(&file_priv->context_idr, id); 537 if (!ctx) 538 return ERR_PTR(-ENOENT); 539 540 return ctx; 541} 542 543static inline int 544mi_set_context(struct intel_engine_cs *ring, 545 struct intel_context *new_context, 546 u32 hw_flags) 547{ 548 int ret; 549 550 /* w/a: If Flush TLB Invalidation Mode is enabled, driver must do a TLB 551 * invalidation prior to MI_SET_CONTEXT. On GEN6 we don't set the value 552 * explicitly, so we rely on the value at ring init, stored in 553 * itlb_before_ctx_switch. 554 */ 555 if (IS_GEN6(ring->dev)) { 556 ret = ring->flush(ring, I915_GEM_GPU_DOMAINS, 0); 557 if (ret) 558 return ret; 559 } 560 561 ret = intel_ring_begin(ring, 6); 562 if (ret) 563 return ret; 564 565 /* WaProgramMiArbOnOffAroundMiSetContext:ivb,vlv,hsw,bdw,chv */ 566 if (INTEL_INFO(ring->dev)->gen >= 7) 567 intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_DISABLE); 568 else 569 intel_ring_emit(ring, MI_NOOP); 570 571 intel_ring_emit(ring, MI_NOOP); 572 intel_ring_emit(ring, MI_SET_CONTEXT); 573 intel_ring_emit(ring, i915_gem_obj_ggtt_offset(new_context->obj) | 574 MI_MM_SPACE_GTT | 575 MI_SAVE_EXT_STATE_EN | 576 MI_RESTORE_EXT_STATE_EN | 577 hw_flags); 578 /* 579 * w/a: MI_SET_CONTEXT must always be followed by MI_NOOP 580 * WaMiSetContext_Hang:snb,ivb,vlv 581 */ 582 intel_ring_emit(ring, MI_NOOP); 583 584 if (INTEL_INFO(ring->dev)->gen >= 7) 585 intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_ENABLE); 586 else 587 intel_ring_emit(ring, MI_NOOP); 588 589 intel_ring_advance(ring); 590 591 return ret; 592} 593 594static int do_switch(struct intel_engine_cs *ring, 595 struct intel_context *to) 596{ 597 struct drm_i915_private *dev_priv = ring->dev->dev_private; 598 struct intel_context *from = ring->last_context; 599 struct i915_hw_ppgtt *ppgtt = ctx_to_ppgtt(to); 600 u32 hw_flags = 0; 601 bool uninitialized = false; 602 int ret, i; 603 604 if (from != NULL && ring == &dev_priv->ring[RCS]) { 605 BUG_ON(from->obj == NULL); 606 BUG_ON(!i915_gem_obj_is_pinned(from->obj)); 607 } 608 609 if (from == to && from->last_ring == ring && !to->remap_slice) 610 return 0; 611 612 /* Trying to pin first makes error handling easier. */ 613 if (ring == &dev_priv->ring[RCS]) { 614 ret = i915_gem_obj_ggtt_pin(to->obj, 615 get_context_alignment(ring->dev), 0); 616 if (ret) 617 return ret; 618 } 619 620 /* 621 * Pin can switch back to the default context if we end up calling into 622 * evict_everything - as a last ditch gtt defrag effort that also 623 * switches to the default context. Hence we need to reload from here. 624 */ 625 from = ring->last_context; 626 627 if (USES_FULL_PPGTT(ring->dev)) { 628 ret = ppgtt->switch_mm(ppgtt, ring, false); 629 if (ret) 630 goto unpin_out; 631 } 632 633 if (ring != &dev_priv->ring[RCS]) { 634 if (from) 635 i915_gem_context_unreference(from); 636 goto done; 637 } 638 639 /* 640 * Clear this page out of any CPU caches for coherent swap-in/out. Note 641 * that thanks to write = false in this call and us not setting any gpu 642 * write domains when putting a context object onto the active list 643 * (when switching away from it), this won't block. 644 * 645 * XXX: We need a real interface to do this instead of trickery. 646 */ 647 ret = i915_gem_object_set_to_gtt_domain(to->obj, false); 648 if (ret) 649 goto unpin_out; 650 651 if (!to->obj->has_global_gtt_mapping) { 652 struct i915_vma *vma = i915_gem_obj_to_vma(to->obj, 653 &dev_priv->gtt.base); 654 vma->bind_vma(vma, to->obj->cache_level, GLOBAL_BIND); 655 } 656 657 if (!to->is_initialized || i915_gem_context_is_default(to)) 658 hw_flags |= MI_RESTORE_INHIBIT; 659 660 ret = mi_set_context(ring, to, hw_flags); 661 if (ret) 662 goto unpin_out; 663 664 for (i = 0; i < MAX_L3_SLICES; i++) { 665 if (!(to->remap_slice & (1<<i))) 666 continue; 667 668 ret = i915_gem_l3_remap(ring, i); 669 /* If it failed, try again next round */ 670 if (ret) 671 DRM_DEBUG_DRIVER("L3 remapping failed\n"); 672 else 673 to->remap_slice &= ~(1<<i); 674 } 675 676 /* The backing object for the context is done after switching to the 677 * *next* context. Therefore we cannot retire the previous context until 678 * the next context has already started running. In fact, the below code 679 * is a bit suboptimal because the retiring can occur simply after the 680 * MI_SET_CONTEXT instead of when the next seqno has completed. 681 */ 682 if (from != NULL) { 683 from->obj->base.read_domains = I915_GEM_DOMAIN_INSTRUCTION; 684 i915_vma_move_to_active(i915_gem_obj_to_ggtt(from->obj), ring); 685 /* As long as MI_SET_CONTEXT is serializing, ie. it flushes the 686 * whole damn pipeline, we don't need to explicitly mark the 687 * object dirty. The only exception is that the context must be 688 * correct in case the object gets swapped out. Ideally we'd be 689 * able to defer doing this until we know the object would be 690 * swapped, but there is no way to do that yet. 691 */ 692 from->obj->dirty = 1; 693 BUG_ON(from->obj->ring != ring); 694 695 /* obj is kept alive until the next request by its active ref */ 696 i915_gem_object_ggtt_unpin(from->obj); 697 i915_gem_context_unreference(from); 698 } 699 700 uninitialized = !to->is_initialized && from == NULL; 701 to->is_initialized = true; 702 703done: 704 i915_gem_context_reference(to); 705 ring->last_context = to; 706 to->last_ring = ring; 707 708 if (uninitialized) { 709 ret = i915_gem_render_state_init(ring); 710 if (ret) 711 DRM_ERROR("init render state: %d\n", ret); 712 } 713 714 return 0; 715 716unpin_out: 717 if (ring->id == RCS) 718 i915_gem_object_ggtt_unpin(to->obj); 719 return ret; 720} 721 722/** 723 * i915_switch_context() - perform a GPU context switch. 724 * @ring: ring for which we'll execute the context switch 725 * @to: the context to switch to 726 * 727 * The context life cycle is simple. The context refcount is incremented and 728 * decremented by 1 and create and destroy. If the context is in use by the GPU, 729 * it will have a refoucnt > 1. This allows us to destroy the context abstract 730 * object while letting the normal object tracking destroy the backing BO. 731 */ 732int i915_switch_context(struct intel_engine_cs *ring, 733 struct intel_context *to) 734{ 735 struct drm_i915_private *dev_priv = ring->dev->dev_private; 736 737 WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex)); 738 739 if (to->obj == NULL) { /* We have the fake context */ 740 if (to != ring->last_context) { 741 i915_gem_context_reference(to); 742 if (ring->last_context) 743 i915_gem_context_unreference(ring->last_context); 744 ring->last_context = to; 745 } 746 return 0; 747 } 748 749 return do_switch(ring, to); 750} 751 752static bool hw_context_enabled(struct drm_device *dev) 753{ 754 return to_i915(dev)->hw_context_size; 755} 756 757int i915_gem_context_create_ioctl(struct drm_device *dev, void *data, 758 struct drm_file *file) 759{ 760 struct drm_i915_gem_context_create *args = data; 761 struct drm_i915_file_private *file_priv = file->driver_priv; 762 struct intel_context *ctx; 763 int ret; 764 765 if (!hw_context_enabled(dev)) 766 return -ENODEV; 767 768 ret = i915_mutex_lock_interruptible(dev); 769 if (ret) 770 return ret; 771 772 ctx = i915_gem_create_context(dev, file_priv, USES_FULL_PPGTT(dev)); 773 mutex_unlock(&dev->struct_mutex); 774 if (IS_ERR(ctx)) 775 return PTR_ERR(ctx); 776 777 args->ctx_id = ctx->id; 778 DRM_DEBUG_DRIVER("HW context %d created\n", args->ctx_id); 779 780 return 0; 781} 782 783int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data, 784 struct drm_file *file) 785{ 786 struct drm_i915_gem_context_destroy *args = data; 787 struct drm_i915_file_private *file_priv = file->driver_priv; 788 struct intel_context *ctx; 789 int ret; 790 791 if (args->ctx_id == DEFAULT_CONTEXT_ID) 792 return -ENOENT; 793 794 ret = i915_mutex_lock_interruptible(dev); 795 if (ret) 796 return ret; 797 798 ctx = i915_gem_context_get(file_priv, args->ctx_id); 799 if (IS_ERR(ctx)) { 800 mutex_unlock(&dev->struct_mutex); 801 return PTR_ERR(ctx); 802 } 803 804 idr_remove(&ctx->file_priv->context_idr, ctx->id); 805 i915_gem_context_unreference(ctx); 806 mutex_unlock(&dev->struct_mutex); 807 808 DRM_DEBUG_DRIVER("HW context %d destroyed\n", args->ctx_id); 809 return 0; 810}