Lines Matching refs:ggtt
50 static int ggtt_init_hw(struct i915_ggtt *ggtt) in ggtt_init_hw() argument
52 struct drm_i915_private *i915 = ggtt->vm.i915; in ggtt_init_hw()
54 i915_address_space_init(&ggtt->vm, VM_CLASS_GGTT); in ggtt_init_hw()
56 ggtt->vm.is_ggtt = true; in ggtt_init_hw()
59 ggtt->vm.has_read_only = IS_VALLEYVIEW(i915); in ggtt_init_hw()
62 ggtt->vm.mm.color_adjust = i915_ggtt_color_adjust; in ggtt_init_hw()
64 if (ggtt->mappable_end) { in ggtt_init_hw()
65 if (!io_mapping_init_wc(&ggtt->iomap, in ggtt_init_hw()
66 ggtt->gmadr.start, in ggtt_init_hw()
67 ggtt->mappable_end)) { in ggtt_init_hw()
68 ggtt->vm.cleanup(&ggtt->vm); in ggtt_init_hw()
72 ggtt->mtrr = arch_phys_wc_add(ggtt->gmadr.start, in ggtt_init_hw()
73 ggtt->mappable_end); in ggtt_init_hw()
76 intel_ggtt_init_fences(ggtt); in ggtt_init_hw()
95 ret = ggtt_init_hw(to_gt(i915)->ggtt); in i915_ggtt_init_hw()
172 void i915_ggtt_suspend(struct i915_ggtt *ggtt) in i915_ggtt_suspend() argument
176 i915_ggtt_suspend_vm(&ggtt->vm); in i915_ggtt_suspend()
177 ggtt->invalidate(ggtt); in i915_ggtt_suspend()
179 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) in i915_ggtt_suspend()
183 void gen6_ggtt_invalidate(struct i915_ggtt *ggtt) in gen6_ggtt_invalidate() argument
185 struct intel_uncore *uncore = ggtt->vm.gt->uncore; in gen6_ggtt_invalidate()
208 static void gen8_ggtt_invalidate(struct i915_ggtt *ggtt) in gen8_ggtt_invalidate() argument
210 struct intel_uncore *uncore = ggtt->vm.gt->uncore; in gen8_ggtt_invalidate()
218 if (needs_wc_ggtt_mapping(ggtt->vm.i915)) in gen8_ggtt_invalidate()
223 static void guc_ggtt_invalidate(struct i915_ggtt *ggtt) in guc_ggtt_invalidate() argument
225 struct drm_i915_private *i915 = ggtt->vm.i915; in guc_ggtt_invalidate()
227 gen8_ggtt_invalidate(ggtt); in guc_ggtt_invalidate()
232 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) in guc_ggtt_invalidate()
237 intel_uncore_write_fw(ggtt->vm.gt->uncore, in guc_ggtt_invalidate()
285 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_insert_page() local
287 (gen8_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE; in gen8_ggtt_insert_page()
289 gen8_set_pte(pte, ggtt->vm.pte_encode(addr, pat_index, flags)); in gen8_ggtt_insert_page()
291 ggtt->invalidate(ggtt); in gen8_ggtt_insert_page()
299 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_insert_entries() local
300 const gen8_pte_t pte_encode = ggtt->vm.pte_encode(0, pat_index, flags); in gen8_ggtt_insert_entries()
311 gte = (gen8_pte_t __iomem *)ggtt->gsm; in gen8_ggtt_insert_entries()
330 ggtt->invalidate(ggtt); in gen8_ggtt_insert_entries()
336 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_clear_range() local
341 (gen8_pte_t __iomem *)ggtt->gsm + first_entry; in gen8_ggtt_clear_range()
342 const int max_entries = ggtt_total_entries(ggtt) - first_entry; in gen8_ggtt_clear_range()
360 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_insert_page() local
362 (gen6_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE; in gen6_ggtt_insert_page()
366 ggtt->invalidate(ggtt); in gen6_ggtt_insert_page()
380 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_insert_entries() local
386 gte = (gen6_pte_t __iomem *)ggtt->gsm; in gen6_ggtt_insert_entries()
405 ggtt->invalidate(ggtt); in gen6_ggtt_insert_entries()
485 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_clear_range() local
489 (gen6_pte_t __iomem *)ggtt->gsm + first_entry; in gen6_ggtt_clear_range()
490 const int max_entries = ggtt_total_entries(ggtt) - first_entry; in gen6_ggtt_clear_range()
544 static int ggtt_reserve_guc_top(struct i915_ggtt *ggtt) in ggtt_reserve_guc_top() argument
549 if (!intel_uc_uses_guc(&ggtt->vm.gt->uc)) in ggtt_reserve_guc_top()
552 GEM_BUG_ON(ggtt->vm.total <= GUC_TOP_RESERVE_SIZE); in ggtt_reserve_guc_top()
553 offset = ggtt->vm.total - GUC_TOP_RESERVE_SIZE; in ggtt_reserve_guc_top()
555 ret = i915_gem_gtt_reserve(&ggtt->vm, NULL, &ggtt->uc_fw, in ggtt_reserve_guc_top()
559 drm_dbg(&ggtt->vm.i915->drm, in ggtt_reserve_guc_top()
565 static void ggtt_release_guc_top(struct i915_ggtt *ggtt) in ggtt_release_guc_top() argument
567 if (drm_mm_node_allocated(&ggtt->uc_fw)) in ggtt_release_guc_top()
568 drm_mm_remove_node(&ggtt->uc_fw); in ggtt_release_guc_top()
571 static void cleanup_init_ggtt(struct i915_ggtt *ggtt) in cleanup_init_ggtt() argument
573 ggtt_release_guc_top(ggtt); in cleanup_init_ggtt()
574 if (drm_mm_node_allocated(&ggtt->error_capture)) in cleanup_init_ggtt()
575 drm_mm_remove_node(&ggtt->error_capture); in cleanup_init_ggtt()
576 mutex_destroy(&ggtt->error_mutex); in cleanup_init_ggtt()
579 static int init_ggtt(struct i915_ggtt *ggtt) in init_ggtt() argument
601 ggtt->pin_bias = max_t(u32, I915_GTT_PAGE_SIZE, in init_ggtt()
602 intel_wopcm_guc_size(&ggtt->vm.gt->wopcm)); in init_ggtt()
604 ret = intel_vgt_balloon(ggtt); in init_ggtt()
608 mutex_init(&ggtt->error_mutex); in init_ggtt()
609 if (ggtt->mappable_end) { in init_ggtt()
632 ggtt->error_capture.size = 2 * I915_GTT_PAGE_SIZE; in init_ggtt()
633 ggtt->error_capture.color = I915_COLOR_UNEVICTABLE; in init_ggtt()
634 if (drm_mm_reserve_node(&ggtt->vm.mm, &ggtt->error_capture)) in init_ggtt()
635 drm_mm_insert_node_in_range(&ggtt->vm.mm, in init_ggtt()
636 &ggtt->error_capture, in init_ggtt()
637 ggtt->error_capture.size, 0, in init_ggtt()
638 ggtt->error_capture.color, in init_ggtt()
639 0, ggtt->mappable_end, in init_ggtt()
642 if (drm_mm_node_allocated(&ggtt->error_capture)) { in init_ggtt()
643 u64 start = ggtt->error_capture.start; in init_ggtt()
644 u64 size = ggtt->error_capture.size; in init_ggtt()
646 ggtt->vm.scratch_range(&ggtt->vm, start, size); in init_ggtt()
647 drm_dbg(&ggtt->vm.i915->drm, in init_ggtt()
657 ret = ggtt_reserve_guc_top(ggtt); in init_ggtt()
662 drm_mm_for_each_hole(entry, &ggtt->vm.mm, hole_start, hole_end) { in init_ggtt()
663 drm_dbg(&ggtt->vm.i915->drm, in init_ggtt()
666 ggtt->vm.clear_range(&ggtt->vm, hole_start, in init_ggtt()
671 ggtt->vm.clear_range(&ggtt->vm, ggtt->vm.total - PAGE_SIZE, PAGE_SIZE); in init_ggtt()
676 cleanup_init_ggtt(ggtt); in init_ggtt()
713 static int init_aliasing_ppgtt(struct i915_ggtt *ggtt) in init_aliasing_ppgtt() argument
719 ppgtt = i915_ppgtt_create(ggtt->vm.gt, 0); in init_aliasing_ppgtt()
723 if (GEM_WARN_ON(ppgtt->vm.total < ggtt->vm.total)) { in init_aliasing_ppgtt()
728 err = i915_vm_alloc_pt_stash(&ppgtt->vm, &stash, ggtt->vm.total); in init_aliasing_ppgtt()
744 ppgtt->vm.allocate_va_range(&ppgtt->vm, &stash, 0, ggtt->vm.total); in init_aliasing_ppgtt()
746 ggtt->alias = ppgtt; in init_aliasing_ppgtt()
747 ggtt->vm.bind_async_flags |= ppgtt->vm.bind_async_flags; in init_aliasing_ppgtt()
749 GEM_BUG_ON(ggtt->vm.vma_ops.bind_vma != intel_ggtt_bind_vma); in init_aliasing_ppgtt()
750 ggtt->vm.vma_ops.bind_vma = aliasing_gtt_bind_vma; in init_aliasing_ppgtt()
752 GEM_BUG_ON(ggtt->vm.vma_ops.unbind_vma != intel_ggtt_unbind_vma); in init_aliasing_ppgtt()
753 ggtt->vm.vma_ops.unbind_vma = aliasing_gtt_unbind_vma; in init_aliasing_ppgtt()
765 static void fini_aliasing_ppgtt(struct i915_ggtt *ggtt) in fini_aliasing_ppgtt() argument
769 ppgtt = fetch_and_zero(&ggtt->alias); in fini_aliasing_ppgtt()
775 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma; in fini_aliasing_ppgtt()
776 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma; in fini_aliasing_ppgtt()
783 ret = init_ggtt(to_gt(i915)->ggtt); in i915_init_ggtt()
788 ret = init_aliasing_ppgtt(to_gt(i915)->ggtt); in i915_init_ggtt()
790 cleanup_init_ggtt(to_gt(i915)->ggtt); in i915_init_ggtt()
796 static void ggtt_cleanup_hw(struct i915_ggtt *ggtt) in ggtt_cleanup_hw() argument
800 flush_workqueue(ggtt->vm.i915->wq); in ggtt_cleanup_hw()
801 i915_gem_drain_freed_objects(ggtt->vm.i915); in ggtt_cleanup_hw()
803 mutex_lock(&ggtt->vm.mutex); in ggtt_cleanup_hw()
805 ggtt->vm.skip_pte_rewrite = true; in ggtt_cleanup_hw()
807 list_for_each_entry_safe(vma, vn, &ggtt->vm.bound_list, vm_link) { in ggtt_cleanup_hw()
819 if (drm_mm_node_allocated(&ggtt->error_capture)) in ggtt_cleanup_hw()
820 drm_mm_remove_node(&ggtt->error_capture); in ggtt_cleanup_hw()
821 mutex_destroy(&ggtt->error_mutex); in ggtt_cleanup_hw()
823 ggtt_release_guc_top(ggtt); in ggtt_cleanup_hw()
824 intel_vgt_deballoon(ggtt); in ggtt_cleanup_hw()
826 ggtt->vm.cleanup(&ggtt->vm); in ggtt_cleanup_hw()
828 mutex_unlock(&ggtt->vm.mutex); in ggtt_cleanup_hw()
829 i915_address_space_fini(&ggtt->vm); in ggtt_cleanup_hw()
831 arch_phys_wc_del(ggtt->mtrr); in ggtt_cleanup_hw()
833 if (ggtt->iomap.size) in ggtt_cleanup_hw()
834 io_mapping_fini(&ggtt->iomap); in ggtt_cleanup_hw()
843 struct i915_ggtt *ggtt = to_gt(i915)->ggtt; in i915_ggtt_driver_release() local
845 fini_aliasing_ppgtt(ggtt); in i915_ggtt_driver_release()
847 intel_ggtt_fini_fences(ggtt); in i915_ggtt_driver_release()
848 ggtt_cleanup_hw(ggtt); in i915_ggtt_driver_release()
858 struct i915_ggtt *ggtt = to_gt(i915)->ggtt; in i915_ggtt_driver_late_release() local
860 GEM_WARN_ON(kref_read(&ggtt->vm.resv_ref) != 1); in i915_ggtt_driver_late_release()
861 dma_resv_fini(&ggtt->vm._resv); in i915_ggtt_driver_late_release()
913 static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size) in ggtt_probe_common() argument
915 struct drm_i915_private *i915 = ggtt->vm.i915; in ggtt_probe_common()
925 ggtt->gsm = ioremap_wc(phys_addr, size); in ggtt_probe_common()
927 ggtt->gsm = ioremap(phys_addr, size); in ggtt_probe_common()
929 if (!ggtt->gsm) { in ggtt_probe_common()
934 kref_init(&ggtt->vm.resv_ref); in ggtt_probe_common()
935 ret = setup_scratch_page(&ggtt->vm); in ggtt_probe_common()
939 iounmap(ggtt->gsm); in ggtt_probe_common()
944 if (i915_gem_object_is_lmem(ggtt->vm.scratch[0])) in ggtt_probe_common()
947 ggtt->vm.scratch[0]->encode = in ggtt_probe_common()
948 ggtt->vm.pte_encode(px_dma(ggtt->vm.scratch[0]), in ggtt_probe_common()
958 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_gmch_remove() local
960 iounmap(ggtt->gsm); in gen6_gmch_remove()
970 static int gen8_gmch_probe(struct i915_ggtt *ggtt) in gen8_gmch_probe() argument
972 struct drm_i915_private *i915 = ggtt->vm.i915; in gen8_gmch_probe()
981 ggtt->gmadr = pci_resource(pdev, GEN4_GMADR_BAR); in gen8_gmch_probe()
982 ggtt->mappable_end = resource_size(&ggtt->gmadr); in gen8_gmch_probe()
991 ggtt->vm.alloc_pt_dma = alloc_pt_dma; in gen8_gmch_probe()
992 ggtt->vm.alloc_scratch_dma = alloc_pt_dma; in gen8_gmch_probe()
993 ggtt->vm.lmem_pt_obj_flags = I915_BO_ALLOC_PM_EARLY; in gen8_gmch_probe()
995 ggtt->vm.total = (size / sizeof(gen8_pte_t)) * I915_GTT_PAGE_SIZE; in gen8_gmch_probe()
996 ggtt->vm.cleanup = gen6_gmch_remove; in gen8_gmch_probe()
997 ggtt->vm.insert_page = gen8_ggtt_insert_page; in gen8_gmch_probe()
998 ggtt->vm.clear_range = nop_clear_range; in gen8_gmch_probe()
999 ggtt->vm.scratch_range = gen8_ggtt_clear_range; in gen8_gmch_probe()
1001 ggtt->vm.insert_entries = gen8_ggtt_insert_entries; in gen8_gmch_probe()
1008 ggtt->vm.insert_entries = bxt_vtd_ggtt_insert_entries__BKL; in gen8_gmch_probe()
1009 ggtt->vm.insert_page = bxt_vtd_ggtt_insert_page__BKL; in gen8_gmch_probe()
1017 ggtt->vm.raw_insert_page = gen8_ggtt_insert_page; in gen8_gmch_probe()
1018 ggtt->vm.raw_insert_entries = gen8_ggtt_insert_entries; in gen8_gmch_probe()
1020 ggtt->vm.bind_async_flags = in gen8_gmch_probe()
1024 if (intel_uc_wants_guc(&ggtt->vm.gt->uc)) in gen8_gmch_probe()
1025 ggtt->invalidate = guc_ggtt_invalidate; in gen8_gmch_probe()
1027 ggtt->invalidate = gen8_ggtt_invalidate; in gen8_gmch_probe()
1029 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma; in gen8_gmch_probe()
1030 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma; in gen8_gmch_probe()
1033 ggtt->vm.pte_encode = mtl_ggtt_pte_encode; in gen8_gmch_probe()
1035 ggtt->vm.pte_encode = gen8_ggtt_pte_encode; in gen8_gmch_probe()
1037 return ggtt_probe_common(ggtt, size); in gen8_gmch_probe()
1136 static int gen6_gmch_probe(struct i915_ggtt *ggtt) in gen6_gmch_probe() argument
1138 struct drm_i915_private *i915 = ggtt->vm.i915; in gen6_gmch_probe()
1146 ggtt->gmadr = pci_resource(pdev, GEN4_GMADR_BAR); in gen6_gmch_probe()
1147 ggtt->mappable_end = resource_size(&ggtt->gmadr); in gen6_gmch_probe()
1153 if (ggtt->mappable_end < (64 << 20) || in gen6_gmch_probe()
1154 ggtt->mappable_end > (512 << 20)) { in gen6_gmch_probe()
1156 &ggtt->mappable_end); in gen6_gmch_probe()
1163 ggtt->vm.total = (size / sizeof(gen6_pte_t)) * I915_GTT_PAGE_SIZE; in gen6_gmch_probe()
1165 ggtt->vm.alloc_pt_dma = alloc_pt_dma; in gen6_gmch_probe()
1166 ggtt->vm.alloc_scratch_dma = alloc_pt_dma; in gen6_gmch_probe()
1168 ggtt->vm.clear_range = nop_clear_range; in gen6_gmch_probe()
1170 ggtt->vm.clear_range = gen6_ggtt_clear_range; in gen6_gmch_probe()
1171 ggtt->vm.scratch_range = gen6_ggtt_clear_range; in gen6_gmch_probe()
1172 ggtt->vm.insert_page = gen6_ggtt_insert_page; in gen6_gmch_probe()
1173 ggtt->vm.insert_entries = gen6_ggtt_insert_entries; in gen6_gmch_probe()
1174 ggtt->vm.cleanup = gen6_gmch_remove; in gen6_gmch_probe()
1176 ggtt->invalidate = gen6_ggtt_invalidate; in gen6_gmch_probe()
1179 ggtt->vm.pte_encode = iris_pte_encode; in gen6_gmch_probe()
1181 ggtt->vm.pte_encode = hsw_pte_encode; in gen6_gmch_probe()
1183 ggtt->vm.pte_encode = byt_pte_encode; in gen6_gmch_probe()
1185 ggtt->vm.pte_encode = ivb_pte_encode; in gen6_gmch_probe()
1187 ggtt->vm.pte_encode = snb_pte_encode; in gen6_gmch_probe()
1189 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma; in gen6_gmch_probe()
1190 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma; in gen6_gmch_probe()
1192 return ggtt_probe_common(ggtt, size); in gen6_gmch_probe()
1195 static int ggtt_probe_hw(struct i915_ggtt *ggtt, struct intel_gt *gt) in ggtt_probe_hw() argument
1200 ggtt->vm.gt = gt; in ggtt_probe_hw()
1201 ggtt->vm.i915 = i915; in ggtt_probe_hw()
1202 ggtt->vm.dma = i915->drm.dev; in ggtt_probe_hw()
1203 dma_resv_init(&ggtt->vm._resv); in ggtt_probe_hw()
1206 ret = gen8_gmch_probe(ggtt); in ggtt_probe_hw()
1208 ret = gen6_gmch_probe(ggtt); in ggtt_probe_hw()
1210 ret = intel_ggtt_gmch_probe(ggtt); in ggtt_probe_hw()
1213 dma_resv_fini(&ggtt->vm._resv); in ggtt_probe_hw()
1217 if ((ggtt->vm.total - 1) >> 32) { in ggtt_probe_hw()
1221 ggtt->vm.total >> 20); in ggtt_probe_hw()
1222 ggtt->vm.total = 1ULL << 32; in ggtt_probe_hw()
1223 ggtt->mappable_end = in ggtt_probe_hw()
1224 min_t(u64, ggtt->mappable_end, ggtt->vm.total); in ggtt_probe_hw()
1227 if (ggtt->mappable_end > ggtt->vm.total) { in ggtt_probe_hw()
1231 &ggtt->mappable_end, ggtt->vm.total); in ggtt_probe_hw()
1232 ggtt->mappable_end = ggtt->vm.total; in ggtt_probe_hw()
1236 drm_dbg(&i915->drm, "GGTT size = %lluM\n", ggtt->vm.total >> 20); in ggtt_probe_hw()
1238 (u64)ggtt->mappable_end >> 20); in ggtt_probe_hw()
1260 ret = ggtt_probe_hw(to_gt(i915)->ggtt, to_gt(i915)); in i915_ggtt_probe_hw()
1272 struct i915_ggtt *ggtt; in i915_ggtt_create() local
1274 ggtt = drmm_kzalloc(&i915->drm, sizeof(*ggtt), GFP_KERNEL); in i915_ggtt_create()
1275 if (!ggtt) in i915_ggtt_create()
1278 INIT_LIST_HEAD(&ggtt->gt_list); in i915_ggtt_create()
1280 return ggtt; in i915_ggtt_create()
1339 void i915_ggtt_resume(struct i915_ggtt *ggtt) in i915_ggtt_resume() argument
1344 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) in i915_ggtt_resume()
1347 flush = i915_ggtt_resume_vm(&ggtt->vm); in i915_ggtt_resume()
1349 if (drm_mm_node_allocated(&ggtt->error_capture)) in i915_ggtt_resume()
1350 ggtt->vm.scratch_range(&ggtt->vm, ggtt->error_capture.start, in i915_ggtt_resume()
1351 ggtt->error_capture.size); in i915_ggtt_resume()
1353 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) in i915_ggtt_resume()
1356 ggtt->invalidate(ggtt); in i915_ggtt_resume()
1361 intel_ggtt_restore_fences(ggtt); in i915_ggtt_resume()