Lines Matching refs:vm
57 struct drm_i915_private *i915 = ggtt->vm.i915; in ggtt_init_hw()
59 i915_address_space_init(&ggtt->vm, VM_CLASS_GGTT); in ggtt_init_hw()
61 ggtt->vm.is_ggtt = true; in ggtt_init_hw()
64 ggtt->vm.has_read_only = IS_VALLEYVIEW(i915); in ggtt_init_hw()
67 ggtt->vm.mm.color_adjust = i915_ggtt_color_adjust; in ggtt_init_hw()
73 ggtt->vm.cleanup(&ggtt->vm); in ggtt_init_hw()
115 void i915_ggtt_suspend_vm(struct i915_address_space *vm, bool evict_all) in i915_ggtt_suspend_vm() argument
120 drm_WARN_ON(&vm->i915->drm, !vm->is_ggtt && !vm->is_dpt); in i915_ggtt_suspend_vm()
123 i915_gem_drain_freed_objects(vm->i915); in i915_ggtt_suspend_vm()
125 mutex_lock(&vm->mutex); in i915_ggtt_suspend_vm()
131 save_skip_rewrite = vm->skip_pte_rewrite; in i915_ggtt_suspend_vm()
132 vm->skip_pte_rewrite = true; in i915_ggtt_suspend_vm()
134 list_for_each_entry_safe(vma, vn, &vm->bound_list, vm_link) { in i915_ggtt_suspend_vm()
150 mutex_unlock(&vm->mutex); in i915_ggtt_suspend_vm()
157 vm->skip_pte_rewrite = save_skip_rewrite; in i915_ggtt_suspend_vm()
171 vm->clear_range(vm, 0, vm->total); in i915_ggtt_suspend_vm()
173 vm->skip_pte_rewrite = save_skip_rewrite; in i915_ggtt_suspend_vm()
175 mutex_unlock(&vm->mutex); in i915_ggtt_suspend_vm()
177 drm_WARN_ON(&vm->i915->drm, evict_all && !list_empty(&vm->bound_list)); in i915_ggtt_suspend_vm()
184 i915_ggtt_suspend_vm(&ggtt->vm, false); in i915_ggtt_suspend()
193 struct intel_uncore *uncore = ggtt->vm.gt->uncore; in gen6_ggtt_invalidate()
218 struct intel_uncore *uncore = ggtt->vm.gt->uncore; in gen8_ggtt_invalidate()
226 if (needs_wc_ggtt_mapping(ggtt->vm.i915)) in gen8_ggtt_invalidate()
242 struct drm_i915_private *i915 = ggtt->vm.i915; in guc_ggtt_invalidate()
302 struct intel_gt *gt = ggtt->vm.gt; in should_update_ggtt_with_bind()
310 struct intel_gt *gt = ggtt->vm.gt; in gen8_ggtt_bind_get_ce()
344 struct intel_gt *gt = ggtt->vm.gt; in gen8_ggtt_bind_ptes()
345 const gen8_pte_t scratch_pte = ggtt->vm.scratch[0]->encode; in gen8_ggtt_bind_ptes()
451 static void gen8_ggtt_insert_page(struct i915_address_space *vm, in gen8_ggtt_insert_page() argument
457 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_insert_page()
461 gen8_set_pte(pte, ggtt->vm.pte_encode(addr, pat_index, flags)); in gen8_ggtt_insert_page()
466 static dma_addr_t gen8_ggtt_read_entry(struct i915_address_space *vm, in gen8_ggtt_read_entry() argument
469 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_read_entry()
473 return ggtt->vm.pte_decode(gen8_get_pte(pte), is_present, is_local); in gen8_ggtt_read_entry()
476 static void gen8_ggtt_insert_page_bind(struct i915_address_space *vm, in gen8_ggtt_insert_page_bind() argument
480 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_insert_page_bind()
483 pte = ggtt->vm.pte_encode(addr, pat_index, flags); in gen8_ggtt_insert_page_bind()
484 if (should_update_ggtt_with_bind(i915_vm_to_ggtt(vm)) && in gen8_ggtt_insert_page_bind()
488 gen8_ggtt_insert_page(vm, addr, offset, pat_index, flags); in gen8_ggtt_insert_page_bind()
491 static void gen8_ggtt_insert_entries(struct i915_address_space *vm, in gen8_ggtt_insert_entries() argument
496 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_insert_entries()
497 const gen8_pte_t pte_encode = ggtt->vm.pte_encode(0, pat_index, flags); in gen8_ggtt_insert_entries()
512 gen8_set_pte(gte++, vm->scratch[0]->encode); in gen8_ggtt_insert_entries()
521 gen8_set_pte(gte++, vm->scratch[0]->encode); in gen8_ggtt_insert_entries()
530 static bool __gen8_ggtt_insert_entries_bind(struct i915_address_space *vm, in __gen8_ggtt_insert_entries_bind() argument
534 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in __gen8_ggtt_insert_entries_bind()
535 gen8_pte_t scratch_pte = vm->scratch[0]->encode; in __gen8_ggtt_insert_entries_bind()
539 pte_encode = ggtt->vm.pte_encode(0, pat_index, flags); in __gen8_ggtt_insert_entries_bind()
561 static void gen8_ggtt_insert_entries_bind(struct i915_address_space *vm, in gen8_ggtt_insert_entries_bind() argument
565 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_insert_entries_bind()
567 if (should_update_ggtt_with_bind(i915_vm_to_ggtt(vm)) && in gen8_ggtt_insert_entries_bind()
568 __gen8_ggtt_insert_entries_bind(vm, vma_res, pat_index, flags)) in gen8_ggtt_insert_entries_bind()
571 gen8_ggtt_insert_entries(vm, vma_res, pat_index, flags); in gen8_ggtt_insert_entries_bind()
574 static void gen8_ggtt_clear_range(struct i915_address_space *vm, in gen8_ggtt_clear_range() argument
577 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_clear_range()
580 const gen8_pte_t scratch_pte = vm->scratch[0]->encode; in gen8_ggtt_clear_range()
595 static void gen8_ggtt_scratch_range_bind(struct i915_address_space *vm, in gen8_ggtt_scratch_range_bind() argument
598 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_scratch_range_bind()
601 const gen8_pte_t scratch_pte = vm->scratch[0]->encode; in gen8_ggtt_scratch_range_bind()
613 gen8_ggtt_clear_range(vm, start, length); in gen8_ggtt_scratch_range_bind()
616 static void gen6_ggtt_insert_page(struct i915_address_space *vm, in gen6_ggtt_insert_page() argument
622 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_insert_page()
626 iowrite32(vm->pte_encode(addr, pat_index, flags), pte); in gen6_ggtt_insert_page()
631 static dma_addr_t gen6_ggtt_read_entry(struct i915_address_space *vm, in gen6_ggtt_read_entry() argument
635 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_read_entry()
639 return vm->pte_decode(ioread32(pte), is_present, is_local); in gen6_ggtt_read_entry()
648 static void gen6_ggtt_insert_entries(struct i915_address_space *vm, in gen6_ggtt_insert_entries() argument
653 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_insert_entries()
664 iowrite32(vm->scratch[0]->encode, gte++); in gen6_ggtt_insert_entries()
667 iowrite32(vm->pte_encode(addr, pat_index, flags), gte++); in gen6_ggtt_insert_entries()
672 iowrite32(vm->scratch[0]->encode, gte++); in gen6_ggtt_insert_entries()
681 static void nop_clear_range(struct i915_address_space *vm, in nop_clear_range() argument
686 static void bxt_vtd_ggtt_wa(struct i915_address_space *vm) in bxt_vtd_ggtt_wa() argument
695 intel_uncore_posting_read_fw(vm->gt->uncore, GFX_FLSH_CNTL_GEN6); in bxt_vtd_ggtt_wa()
699 struct i915_address_space *vm; member
709 gen8_ggtt_insert_page(arg->vm, arg->addr, arg->offset, in bxt_vtd_ggtt_insert_page__cb()
711 bxt_vtd_ggtt_wa(arg->vm); in bxt_vtd_ggtt_insert_page__cb()
716 static void bxt_vtd_ggtt_insert_page__BKL(struct i915_address_space *vm, in bxt_vtd_ggtt_insert_page__BKL() argument
722 struct insert_page arg = { vm, addr, offset, pat_index }; in bxt_vtd_ggtt_insert_page__BKL()
728 struct i915_address_space *vm; member
738 gen8_ggtt_insert_entries(arg->vm, arg->vma_res, in bxt_vtd_ggtt_insert_entries__cb()
740 bxt_vtd_ggtt_wa(arg->vm); in bxt_vtd_ggtt_insert_entries__cb()
745 static void bxt_vtd_ggtt_insert_entries__BKL(struct i915_address_space *vm, in bxt_vtd_ggtt_insert_entries__BKL() argument
750 struct insert_entries arg = { vm, vma_res, pat_index, flags }; in bxt_vtd_ggtt_insert_entries__BKL()
755 static void gen6_ggtt_clear_range(struct i915_address_space *vm, in gen6_ggtt_clear_range() argument
758 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_clear_range()
771 scratch_pte = vm->scratch[0]->encode; in gen6_ggtt_clear_range()
776 void intel_ggtt_bind_vma(struct i915_address_space *vm, in intel_ggtt_bind_vma() argument
796 vm->insert_entries(vm, vma_res, pat_index, pte_flags); in intel_ggtt_bind_vma()
800 void intel_ggtt_unbind_vma(struct i915_address_space *vm, in intel_ggtt_unbind_vma() argument
803 vm->clear_range(vm, vma_res->start, vma_res->vma_size); in intel_ggtt_unbind_vma()
806 dma_addr_t intel_ggtt_read_entry(struct i915_address_space *vm, in intel_ggtt_read_entry() argument
809 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in intel_ggtt_read_entry()
811 return ggtt->vm.read_entry(vm, offset, is_present, is_local); in intel_ggtt_read_entry()
830 if (!intel_uc_uses_guc(&ggtt->vm.gt->uc)) in ggtt_reserve_guc_top()
833 GEM_BUG_ON(ggtt->vm.total <= GUC_TOP_RESERVE_SIZE); in ggtt_reserve_guc_top()
834 offset = ggtt->vm.total - GUC_TOP_RESERVE_SIZE; in ggtt_reserve_guc_top()
836 ret = i915_gem_gtt_reserve(&ggtt->vm, NULL, &ggtt->uc_fw, in ggtt_reserve_guc_top()
840 drm_dbg(&ggtt->vm.i915->drm, in ggtt_reserve_guc_top()
883 intel_wopcm_guc_size(&ggtt->vm.gt->wopcm)); in init_ggtt()
915 if (drm_mm_reserve_node(&ggtt->vm.mm, &ggtt->error_capture)) in init_ggtt()
916 drm_mm_insert_node_in_range(&ggtt->vm.mm, in init_ggtt()
927 ggtt->vm.scratch_range(&ggtt->vm, start, size); in init_ggtt()
928 drm_dbg(&ggtt->vm.i915->drm, in init_ggtt()
943 drm_mm_for_each_hole(entry, &ggtt->vm.mm, hole_start, hole_end) { in init_ggtt()
944 drm_dbg(&ggtt->vm.i915->drm, in init_ggtt()
947 ggtt->vm.clear_range(&ggtt->vm, hole_start, in init_ggtt()
952 ggtt->vm.clear_range(&ggtt->vm, ggtt->vm.total - PAGE_SIZE, PAGE_SIZE); in init_ggtt()
961 static void aliasing_gtt_bind_vma(struct i915_address_space *vm, in aliasing_gtt_bind_vma() argument
975 ppgtt_bind_vma(&i915_vm_to_ggtt(vm)->alias->vm, in aliasing_gtt_bind_vma()
979 vm->insert_entries(vm, vma_res, pat_index, pte_flags); in aliasing_gtt_bind_vma()
984 static void aliasing_gtt_unbind_vma(struct i915_address_space *vm, in aliasing_gtt_unbind_vma() argument
988 vm->clear_range(vm, vma_res->start, vma_res->vma_size); in aliasing_gtt_unbind_vma()
991 ppgtt_unbind_vma(&i915_vm_to_ggtt(vm)->alias->vm, vma_res); in aliasing_gtt_unbind_vma()
1000 ppgtt = i915_ppgtt_create(ggtt->vm.gt, 0); in init_aliasing_ppgtt()
1004 if (GEM_WARN_ON(ppgtt->vm.total < ggtt->vm.total)) { in init_aliasing_ppgtt()
1009 err = i915_vm_alloc_pt_stash(&ppgtt->vm, &stash, ggtt->vm.total); in init_aliasing_ppgtt()
1013 i915_gem_object_lock(ppgtt->vm.scratch[0], NULL); in init_aliasing_ppgtt()
1014 err = i915_vm_map_pt_stash(&ppgtt->vm, &stash); in init_aliasing_ppgtt()
1015 i915_gem_object_unlock(ppgtt->vm.scratch[0]); in init_aliasing_ppgtt()
1025 ppgtt->vm.allocate_va_range(&ppgtt->vm, &stash, 0, ggtt->vm.total); in init_aliasing_ppgtt()
1028 ggtt->vm.bind_async_flags |= ppgtt->vm.bind_async_flags; in init_aliasing_ppgtt()
1030 GEM_BUG_ON(ggtt->vm.vma_ops.bind_vma != intel_ggtt_bind_vma); in init_aliasing_ppgtt()
1031 ggtt->vm.vma_ops.bind_vma = aliasing_gtt_bind_vma; in init_aliasing_ppgtt()
1033 GEM_BUG_ON(ggtt->vm.vma_ops.unbind_vma != intel_ggtt_unbind_vma); in init_aliasing_ppgtt()
1034 ggtt->vm.vma_ops.unbind_vma = aliasing_gtt_unbind_vma; in init_aliasing_ppgtt()
1036 i915_vm_free_pt_stash(&ppgtt->vm, &stash); in init_aliasing_ppgtt()
1040 i915_vm_free_pt_stash(&ppgtt->vm, &stash); in init_aliasing_ppgtt()
1042 i915_vm_put(&ppgtt->vm); in init_aliasing_ppgtt()
1054 i915_vm_put(&ppgtt->vm); in fini_aliasing_ppgtt()
1056 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma; in fini_aliasing_ppgtt()
1057 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma; in fini_aliasing_ppgtt()
1081 flush_workqueue(ggtt->vm.i915->wq); in ggtt_cleanup_hw()
1082 i915_gem_drain_freed_objects(ggtt->vm.i915); in ggtt_cleanup_hw()
1084 mutex_lock(&ggtt->vm.mutex); in ggtt_cleanup_hw()
1086 ggtt->vm.skip_pte_rewrite = true; in ggtt_cleanup_hw()
1088 list_for_each_entry_safe(vma, vn, &ggtt->vm.bound_list, vm_link) { in ggtt_cleanup_hw()
1107 ggtt->vm.cleanup(&ggtt->vm); in ggtt_cleanup_hw()
1109 mutex_unlock(&ggtt->vm.mutex); in ggtt_cleanup_hw()
1110 i915_address_space_fini(&ggtt->vm); in ggtt_cleanup_hw()
1141 GEM_WARN_ON(kref_read(&ggtt->vm.resv_ref) != 1); in i915_ggtt_driver_late_release()
1142 dma_resv_fini(&ggtt->vm._resv); in i915_ggtt_driver_late_release()
1196 struct drm_i915_private *i915 = ggtt->vm.i915; in ggtt_probe_common()
1197 struct intel_uncore *uncore = ggtt->vm.gt->uncore; in ggtt_probe_common()
1222 kref_init(&ggtt->vm.resv_ref); in ggtt_probe_common()
1223 ret = setup_scratch_page(&ggtt->vm); in ggtt_probe_common()
1232 if (i915_gem_object_is_lmem(ggtt->vm.scratch[0])) in ggtt_probe_common()
1235 ggtt->vm.scratch[0]->encode = in ggtt_probe_common()
1236 ggtt->vm.pte_encode(px_dma(ggtt->vm.scratch[0]), in ggtt_probe_common()
1244 static void gen6_gmch_remove(struct i915_address_space *vm) in gen6_gmch_remove() argument
1246 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_gmch_remove()
1249 free_scratch(vm); in gen6_gmch_remove()
1260 struct drm_i915_private *i915 = ggtt->vm.i915; in gen8_gmch_probe()
1279 ggtt->vm.alloc_pt_dma = alloc_pt_dma; in gen8_gmch_probe()
1280 ggtt->vm.alloc_scratch_dma = alloc_pt_dma; in gen8_gmch_probe()
1281 ggtt->vm.lmem_pt_obj_flags = I915_BO_ALLOC_PM_EARLY; in gen8_gmch_probe()
1283 ggtt->vm.total = (size / sizeof(gen8_pte_t)) * I915_GTT_PAGE_SIZE; in gen8_gmch_probe()
1284 ggtt->vm.cleanup = gen6_gmch_remove; in gen8_gmch_probe()
1285 ggtt->vm.insert_page = gen8_ggtt_insert_page; in gen8_gmch_probe()
1286 ggtt->vm.clear_range = nop_clear_range; in gen8_gmch_probe()
1287 ggtt->vm.scratch_range = gen8_ggtt_clear_range; in gen8_gmch_probe()
1289 ggtt->vm.insert_entries = gen8_ggtt_insert_entries; in gen8_gmch_probe()
1290 ggtt->vm.read_entry = gen8_ggtt_read_entry; in gen8_gmch_probe()
1297 ggtt->vm.insert_entries = bxt_vtd_ggtt_insert_entries__BKL; in gen8_gmch_probe()
1298 ggtt->vm.insert_page = bxt_vtd_ggtt_insert_page__BKL; in gen8_gmch_probe()
1306 ggtt->vm.raw_insert_page = gen8_ggtt_insert_page; in gen8_gmch_probe()
1307 ggtt->vm.raw_insert_entries = gen8_ggtt_insert_entries; in gen8_gmch_probe()
1309 ggtt->vm.bind_async_flags = in gen8_gmch_probe()
1314 ggtt->vm.scratch_range = gen8_ggtt_scratch_range_bind; in gen8_gmch_probe()
1315 ggtt->vm.insert_page = gen8_ggtt_insert_page_bind; in gen8_gmch_probe()
1316 ggtt->vm.insert_entries = gen8_ggtt_insert_entries_bind; in gen8_gmch_probe()
1321 ggtt->vm.raw_insert_page = gen8_ggtt_insert_page; in gen8_gmch_probe()
1324 if (intel_uc_wants_guc_submission(&ggtt->vm.gt->uc)) in gen8_gmch_probe()
1329 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma; in gen8_gmch_probe()
1330 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma; in gen8_gmch_probe()
1333 ggtt->vm.pte_encode = mtl_ggtt_pte_encode; in gen8_gmch_probe()
1335 ggtt->vm.pte_encode = gen8_ggtt_pte_encode; in gen8_gmch_probe()
1337 ggtt->vm.pte_decode = gen8_ggtt_pte_decode; in gen8_gmch_probe()
1448 struct drm_i915_private *i915 = ggtt->vm.i915; in gen6_gmch_probe()
1473 ggtt->vm.total = (size / sizeof(gen6_pte_t)) * I915_GTT_PAGE_SIZE; in gen6_gmch_probe()
1475 ggtt->vm.alloc_pt_dma = alloc_pt_dma; in gen6_gmch_probe()
1476 ggtt->vm.alloc_scratch_dma = alloc_pt_dma; in gen6_gmch_probe()
1478 ggtt->vm.clear_range = nop_clear_range; in gen6_gmch_probe()
1480 ggtt->vm.clear_range = gen6_ggtt_clear_range; in gen6_gmch_probe()
1481 ggtt->vm.scratch_range = gen6_ggtt_clear_range; in gen6_gmch_probe()
1482 ggtt->vm.insert_page = gen6_ggtt_insert_page; in gen6_gmch_probe()
1483 ggtt->vm.insert_entries = gen6_ggtt_insert_entries; in gen6_gmch_probe()
1484 ggtt->vm.read_entry = gen6_ggtt_read_entry; in gen6_gmch_probe()
1485 ggtt->vm.cleanup = gen6_gmch_remove; in gen6_gmch_probe()
1490 ggtt->vm.pte_encode = iris_pte_encode; in gen6_gmch_probe()
1492 ggtt->vm.pte_encode = hsw_pte_encode; in gen6_gmch_probe()
1494 ggtt->vm.pte_encode = byt_pte_encode; in gen6_gmch_probe()
1496 ggtt->vm.pte_encode = ivb_pte_encode; in gen6_gmch_probe()
1498 ggtt->vm.pte_encode = snb_pte_encode; in gen6_gmch_probe()
1500 ggtt->vm.pte_decode = gen6_pte_decode; in gen6_gmch_probe()
1502 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma; in gen6_gmch_probe()
1503 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma; in gen6_gmch_probe()
1513 ggtt->vm.gt = gt; in ggtt_probe_hw()
1514 ggtt->vm.i915 = i915; in ggtt_probe_hw()
1515 ggtt->vm.dma = i915->drm.dev; in ggtt_probe_hw()
1516 dma_resv_init(&ggtt->vm._resv); in ggtt_probe_hw()
1526 dma_resv_fini(&ggtt->vm._resv); in ggtt_probe_hw()
1530 if ((ggtt->vm.total - 1) >> 32) { in ggtt_probe_hw()
1534 ggtt->vm.total >> 20); in ggtt_probe_hw()
1535 ggtt->vm.total = 1ULL << 32; in ggtt_probe_hw()
1537 min_t(u64, ggtt->mappable_end, ggtt->vm.total); in ggtt_probe_hw()
1540 if (ggtt->mappable_end > ggtt->vm.total) { in ggtt_probe_hw()
1544 &ggtt->mappable_end, ggtt->vm.total); in ggtt_probe_hw()
1545 ggtt->mappable_end = ggtt->vm.total; in ggtt_probe_hw()
1549 drm_dbg(&i915->drm, "GGTT size = %lluM\n", ggtt->vm.total >> 20); in ggtt_probe_hw()
1615 bool i915_ggtt_resume_vm(struct i915_address_space *vm, bool all_evicted) in i915_ggtt_resume_vm() argument
1620 drm_WARN_ON(&vm->i915->drm, !vm->is_ggtt && !vm->is_dpt); in i915_ggtt_resume_vm()
1623 drm_WARN_ON(&vm->i915->drm, !list_empty(&vm->bound_list)); in i915_ggtt_resume_vm()
1628 vm->clear_range(vm, 0, vm->total); in i915_ggtt_resume_vm()
1631 list_for_each_entry(vma, &vm->bound_list, vm_link) { in i915_ggtt_resume_vm()
1643 vma->ops->bind_vma(vm, NULL, vma->resource, in i915_ggtt_resume_vm()
1645 i915_gem_get_pat_index(vm->i915, in i915_ggtt_resume_vm()
1666 flush = i915_ggtt_resume_vm(&ggtt->vm, false); in i915_ggtt_resume()
1669 ggtt->vm.scratch_range(&ggtt->vm, ggtt->error_capture.start, in i915_ggtt_resume()