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()
193 static void gen8_ggtt_invalidate(struct i915_ggtt *ggtt) in gen8_ggtt_invalidate() argument
195 struct intel_uncore *uncore = ggtt->vm.gt->uncore; in gen8_ggtt_invalidate()
204 static void guc_ggtt_invalidate(struct i915_ggtt *ggtt) in guc_ggtt_invalidate() argument
206 struct drm_i915_private *i915 = ggtt->vm.i915; in guc_ggtt_invalidate()
208 gen8_ggtt_invalidate(ggtt); in guc_ggtt_invalidate()
213 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) in guc_ggtt_invalidate()
218 intel_uncore_write_fw(ggtt->vm.gt->uncore, in guc_ggtt_invalidate()
246 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_insert_page() local
248 (gen8_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE; in gen8_ggtt_insert_page()
252 ggtt->invalidate(ggtt); in gen8_ggtt_insert_page()
261 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen8_ggtt_insert_entries() local
272 gte = (gen8_pte_t __iomem *)ggtt->gsm; in gen8_ggtt_insert_entries()
291 ggtt->invalidate(ggtt); in gen8_ggtt_insert_entries()
300 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_insert_page() local
302 (gen6_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE; in gen6_ggtt_insert_page()
306 ggtt->invalidate(ggtt); in gen6_ggtt_insert_page()
320 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_insert_entries() local
326 gte = (gen6_pte_t __iomem *)ggtt->gsm; in gen6_ggtt_insert_entries()
345 ggtt->invalidate(ggtt); in gen6_ggtt_insert_entries()
423 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_ggtt_clear_range() local
427 (gen6_pte_t __iomem *)ggtt->gsm + first_entry; in gen6_ggtt_clear_range()
428 const int max_entries = ggtt_total_entries(ggtt) - first_entry; in gen6_ggtt_clear_range()
471 static int ggtt_reserve_guc_top(struct i915_ggtt *ggtt) in ggtt_reserve_guc_top() argument
476 if (!intel_uc_uses_guc(&ggtt->vm.gt->uc)) in ggtt_reserve_guc_top()
479 GEM_BUG_ON(ggtt->vm.total <= GUC_GGTT_TOP); in ggtt_reserve_guc_top()
480 size = ggtt->vm.total - GUC_GGTT_TOP; in ggtt_reserve_guc_top()
482 ret = i915_gem_gtt_reserve(&ggtt->vm, NULL, &ggtt->uc_fw, size, in ggtt_reserve_guc_top()
486 drm_dbg(&ggtt->vm.i915->drm, in ggtt_reserve_guc_top()
492 static void ggtt_release_guc_top(struct i915_ggtt *ggtt) in ggtt_release_guc_top() argument
494 if (drm_mm_node_allocated(&ggtt->uc_fw)) in ggtt_release_guc_top()
495 drm_mm_remove_node(&ggtt->uc_fw); in ggtt_release_guc_top()
498 static void cleanup_init_ggtt(struct i915_ggtt *ggtt) in cleanup_init_ggtt() argument
500 ggtt_release_guc_top(ggtt); in cleanup_init_ggtt()
501 if (drm_mm_node_allocated(&ggtt->error_capture)) in cleanup_init_ggtt()
502 drm_mm_remove_node(&ggtt->error_capture); in cleanup_init_ggtt()
503 mutex_destroy(&ggtt->error_mutex); in cleanup_init_ggtt()
506 static int init_ggtt(struct i915_ggtt *ggtt) in init_ggtt() argument
528 ggtt->pin_bias = max_t(u32, I915_GTT_PAGE_SIZE, in init_ggtt()
529 intel_wopcm_guc_size(&ggtt->vm.gt->wopcm)); in init_ggtt()
531 ret = intel_vgt_balloon(ggtt); in init_ggtt()
535 mutex_init(&ggtt->error_mutex); in init_ggtt()
536 if (ggtt->mappable_end) { in init_ggtt()
555 ggtt->error_capture.size = I915_GTT_PAGE_SIZE; in init_ggtt()
556 ggtt->error_capture.color = I915_COLOR_UNEVICTABLE; in init_ggtt()
557 if (drm_mm_reserve_node(&ggtt->vm.mm, &ggtt->error_capture)) in init_ggtt()
558 drm_mm_insert_node_in_range(&ggtt->vm.mm, in init_ggtt()
559 &ggtt->error_capture, in init_ggtt()
560 ggtt->error_capture.size, 0, in init_ggtt()
561 ggtt->error_capture.color, in init_ggtt()
562 0, ggtt->mappable_end, in init_ggtt()
565 if (drm_mm_node_allocated(&ggtt->error_capture)) in init_ggtt()
566 drm_dbg(&ggtt->vm.i915->drm, in init_ggtt()
568 ggtt->error_capture.start, in init_ggtt()
569 ggtt->error_capture.start + ggtt->error_capture.size); in init_ggtt()
576 ret = ggtt_reserve_guc_top(ggtt); in init_ggtt()
581 drm_mm_for_each_hole(entry, &ggtt->vm.mm, hole_start, hole_end) { in init_ggtt()
582 drm_dbg(&ggtt->vm.i915->drm, in init_ggtt()
585 ggtt->vm.clear_range(&ggtt->vm, hole_start, in init_ggtt()
590 ggtt->vm.clear_range(&ggtt->vm, ggtt->vm.total - PAGE_SIZE, PAGE_SIZE); in init_ggtt()
595 cleanup_init_ggtt(ggtt); in init_ggtt()
632 static int init_aliasing_ppgtt(struct i915_ggtt *ggtt) in init_aliasing_ppgtt() argument
638 ppgtt = i915_ppgtt_create(ggtt->vm.gt, 0); in init_aliasing_ppgtt()
642 if (GEM_WARN_ON(ppgtt->vm.total < ggtt->vm.total)) { in init_aliasing_ppgtt()
647 err = i915_vm_alloc_pt_stash(&ppgtt->vm, &stash, ggtt->vm.total); in init_aliasing_ppgtt()
663 ppgtt->vm.allocate_va_range(&ppgtt->vm, &stash, 0, ggtt->vm.total); in init_aliasing_ppgtt()
665 ggtt->alias = ppgtt; in init_aliasing_ppgtt()
666 ggtt->vm.bind_async_flags |= ppgtt->vm.bind_async_flags; in init_aliasing_ppgtt()
668 GEM_BUG_ON(ggtt->vm.vma_ops.bind_vma != intel_ggtt_bind_vma); in init_aliasing_ppgtt()
669 ggtt->vm.vma_ops.bind_vma = aliasing_gtt_bind_vma; in init_aliasing_ppgtt()
671 GEM_BUG_ON(ggtt->vm.vma_ops.unbind_vma != intel_ggtt_unbind_vma); in init_aliasing_ppgtt()
672 ggtt->vm.vma_ops.unbind_vma = aliasing_gtt_unbind_vma; in init_aliasing_ppgtt()
684 static void fini_aliasing_ppgtt(struct i915_ggtt *ggtt) in fini_aliasing_ppgtt() argument
688 ppgtt = fetch_and_zero(&ggtt->alias); in fini_aliasing_ppgtt()
694 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma; in fini_aliasing_ppgtt()
695 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma; in fini_aliasing_ppgtt()
702 ret = init_ggtt(to_gt(i915)->ggtt); in i915_init_ggtt()
707 ret = init_aliasing_ppgtt(to_gt(i915)->ggtt); in i915_init_ggtt()
709 cleanup_init_ggtt(to_gt(i915)->ggtt); in i915_init_ggtt()
715 static void ggtt_cleanup_hw(struct i915_ggtt *ggtt) in ggtt_cleanup_hw() argument
719 flush_workqueue(ggtt->vm.i915->wq); in ggtt_cleanup_hw()
720 i915_gem_drain_freed_objects(ggtt->vm.i915); in ggtt_cleanup_hw()
722 mutex_lock(&ggtt->vm.mutex); in ggtt_cleanup_hw()
724 ggtt->vm.skip_pte_rewrite = true; in ggtt_cleanup_hw()
726 list_for_each_entry_safe(vma, vn, &ggtt->vm.bound_list, vm_link) { in ggtt_cleanup_hw()
738 if (drm_mm_node_allocated(&ggtt->error_capture)) in ggtt_cleanup_hw()
739 drm_mm_remove_node(&ggtt->error_capture); in ggtt_cleanup_hw()
740 mutex_destroy(&ggtt->error_mutex); in ggtt_cleanup_hw()
742 ggtt_release_guc_top(ggtt); in ggtt_cleanup_hw()
743 intel_vgt_deballoon(ggtt); in ggtt_cleanup_hw()
745 ggtt->vm.cleanup(&ggtt->vm); in ggtt_cleanup_hw()
747 mutex_unlock(&ggtt->vm.mutex); in ggtt_cleanup_hw()
748 i915_address_space_fini(&ggtt->vm); in ggtt_cleanup_hw()
750 arch_phys_wc_del(ggtt->mtrr); in ggtt_cleanup_hw()
752 if (ggtt->iomap.size) in ggtt_cleanup_hw()
753 io_mapping_fini(&ggtt->iomap); in ggtt_cleanup_hw()
762 struct i915_ggtt *ggtt = to_gt(i915)->ggtt; in i915_ggtt_driver_release() local
764 fini_aliasing_ppgtt(ggtt); in i915_ggtt_driver_release()
766 intel_ggtt_fini_fences(ggtt); in i915_ggtt_driver_release()
767 ggtt_cleanup_hw(ggtt); in i915_ggtt_driver_release()
777 struct i915_ggtt *ggtt = to_gt(i915)->ggtt; in i915_ggtt_driver_late_release() local
779 GEM_WARN_ON(kref_read(&ggtt->vm.resv_ref) != 1); in i915_ggtt_driver_late_release()
780 dma_resv_fini(&ggtt->vm._resv); in i915_ggtt_driver_late_release()
832 static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size) in ggtt_probe_common() argument
834 struct drm_i915_private *i915 = ggtt->vm.i915; in ggtt_probe_common()
851 ggtt->gsm = ioremap(phys_addr, size); in ggtt_probe_common()
853 ggtt->gsm = ioremap_wc(phys_addr, size); in ggtt_probe_common()
854 if (!ggtt->gsm) { in ggtt_probe_common()
859 kref_init(&ggtt->vm.resv_ref); in ggtt_probe_common()
860 ret = setup_scratch_page(&ggtt->vm); in ggtt_probe_common()
864 iounmap(ggtt->gsm); in ggtt_probe_common()
869 if (i915_gem_object_is_lmem(ggtt->vm.scratch[0])) in ggtt_probe_common()
872 ggtt->vm.scratch[0]->encode = in ggtt_probe_common()
873 ggtt->vm.pte_encode(px_dma(ggtt->vm.scratch[0]), in ggtt_probe_common()
881 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); in gen6_gmch_remove() local
883 iounmap(ggtt->gsm); in gen6_gmch_remove()
893 static int gen8_gmch_probe(struct i915_ggtt *ggtt) in gen8_gmch_probe() argument
895 struct drm_i915_private *i915 = ggtt->vm.i915; in gen8_gmch_probe()
904 ggtt->gmadr = pci_resource(pdev, GEN4_GMADR_BAR); in gen8_gmch_probe()
905 ggtt->mappable_end = resource_size(&ggtt->gmadr); in gen8_gmch_probe()
914 ggtt->vm.alloc_pt_dma = alloc_pt_dma; in gen8_gmch_probe()
915 ggtt->vm.alloc_scratch_dma = alloc_pt_dma; in gen8_gmch_probe()
916 ggtt->vm.lmem_pt_obj_flags = I915_BO_ALLOC_PM_EARLY; in gen8_gmch_probe()
918 ggtt->vm.total = (size / sizeof(gen8_pte_t)) * I915_GTT_PAGE_SIZE; in gen8_gmch_probe()
919 ggtt->vm.cleanup = gen6_gmch_remove; in gen8_gmch_probe()
920 ggtt->vm.insert_page = gen8_ggtt_insert_page; in gen8_gmch_probe()
921 ggtt->vm.clear_range = nop_clear_range; in gen8_gmch_probe()
923 ggtt->vm.insert_entries = gen8_ggtt_insert_entries; in gen8_gmch_probe()
930 ggtt->vm.insert_entries = bxt_vtd_ggtt_insert_entries__BKL; in gen8_gmch_probe()
931 ggtt->vm.insert_page = bxt_vtd_ggtt_insert_page__BKL; in gen8_gmch_probe()
939 ggtt->vm.raw_insert_page = gen8_ggtt_insert_page; in gen8_gmch_probe()
940 ggtt->vm.raw_insert_entries = gen8_ggtt_insert_entries; in gen8_gmch_probe()
942 ggtt->vm.bind_async_flags = in gen8_gmch_probe()
946 if (intel_uc_wants_guc(&ggtt->vm.gt->uc)) in gen8_gmch_probe()
947 ggtt->invalidate = guc_ggtt_invalidate; in gen8_gmch_probe()
949 ggtt->invalidate = gen8_ggtt_invalidate; in gen8_gmch_probe()
951 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma; in gen8_gmch_probe()
952 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma; in gen8_gmch_probe()
954 ggtt->vm.pte_encode = gen8_ggtt_pte_encode; in gen8_gmch_probe()
956 return ggtt_probe_common(ggtt, size); in gen8_gmch_probe()
1050 static int gen6_gmch_probe(struct i915_ggtt *ggtt) in gen6_gmch_probe() argument
1052 struct drm_i915_private *i915 = ggtt->vm.i915; in gen6_gmch_probe()
1060 ggtt->gmadr = pci_resource(pdev, GEN4_GMADR_BAR); in gen6_gmch_probe()
1061 ggtt->mappable_end = resource_size(&ggtt->gmadr); in gen6_gmch_probe()
1067 if (ggtt->mappable_end < (64 << 20) || in gen6_gmch_probe()
1068 ggtt->mappable_end > (512 << 20)) { in gen6_gmch_probe()
1070 &ggtt->mappable_end); in gen6_gmch_probe()
1077 ggtt->vm.total = (size / sizeof(gen6_pte_t)) * I915_GTT_PAGE_SIZE; in gen6_gmch_probe()
1079 ggtt->vm.alloc_pt_dma = alloc_pt_dma; in gen6_gmch_probe()
1080 ggtt->vm.alloc_scratch_dma = alloc_pt_dma; in gen6_gmch_probe()
1082 ggtt->vm.clear_range = nop_clear_range; in gen6_gmch_probe()
1084 ggtt->vm.clear_range = gen6_ggtt_clear_range; in gen6_gmch_probe()
1085 ggtt->vm.insert_page = gen6_ggtt_insert_page; in gen6_gmch_probe()
1086 ggtt->vm.insert_entries = gen6_ggtt_insert_entries; in gen6_gmch_probe()
1087 ggtt->vm.cleanup = gen6_gmch_remove; in gen6_gmch_probe()
1089 ggtt->invalidate = gen6_ggtt_invalidate; in gen6_gmch_probe()
1092 ggtt->vm.pte_encode = iris_pte_encode; in gen6_gmch_probe()
1094 ggtt->vm.pte_encode = hsw_pte_encode; in gen6_gmch_probe()
1096 ggtt->vm.pte_encode = byt_pte_encode; in gen6_gmch_probe()
1098 ggtt->vm.pte_encode = ivb_pte_encode; in gen6_gmch_probe()
1100 ggtt->vm.pte_encode = snb_pte_encode; in gen6_gmch_probe()
1102 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma; in gen6_gmch_probe()
1103 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma; in gen6_gmch_probe()
1105 return ggtt_probe_common(ggtt, size); in gen6_gmch_probe()
1108 static int ggtt_probe_hw(struct i915_ggtt *ggtt, struct intel_gt *gt) in ggtt_probe_hw() argument
1113 ggtt->vm.gt = gt; in ggtt_probe_hw()
1114 ggtt->vm.i915 = i915; in ggtt_probe_hw()
1115 ggtt->vm.dma = i915->drm.dev; in ggtt_probe_hw()
1116 dma_resv_init(&ggtt->vm._resv); in ggtt_probe_hw()
1119 ret = gen8_gmch_probe(ggtt); in ggtt_probe_hw()
1121 ret = gen6_gmch_probe(ggtt); in ggtt_probe_hw()
1123 ret = intel_ggtt_gmch_probe(ggtt); in ggtt_probe_hw()
1126 dma_resv_fini(&ggtt->vm._resv); in ggtt_probe_hw()
1130 if ((ggtt->vm.total - 1) >> 32) { in ggtt_probe_hw()
1134 ggtt->vm.total >> 20); in ggtt_probe_hw()
1135 ggtt->vm.total = 1ULL << 32; in ggtt_probe_hw()
1136 ggtt->mappable_end = in ggtt_probe_hw()
1137 min_t(u64, ggtt->mappable_end, ggtt->vm.total); in ggtt_probe_hw()
1140 if (ggtt->mappable_end > ggtt->vm.total) { in ggtt_probe_hw()
1144 &ggtt->mappable_end, ggtt->vm.total); in ggtt_probe_hw()
1145 ggtt->mappable_end = ggtt->vm.total; in ggtt_probe_hw()
1149 drm_dbg(&i915->drm, "GGTT size = %lluM\n", ggtt->vm.total >> 20); in ggtt_probe_hw()
1151 (u64)ggtt->mappable_end >> 20); in ggtt_probe_hw()
1173 ret = ggtt_probe_hw(to_gt(i915)->ggtt, to_gt(i915)); in i915_ggtt_probe_hw()
1185 struct i915_ggtt *ggtt; in i915_ggtt_create() local
1187 ggtt = drmm_kzalloc(&i915->drm, sizeof(*ggtt), GFP_KERNEL); in i915_ggtt_create()
1188 if (!ggtt) in i915_ggtt_create()
1191 INIT_LIST_HEAD(&ggtt->gt_list); in i915_ggtt_create()
1193 return ggtt; in i915_ggtt_create()
1250 void i915_ggtt_resume(struct i915_ggtt *ggtt) in i915_ggtt_resume() argument
1255 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) in i915_ggtt_resume()
1258 flush = i915_ggtt_resume_vm(&ggtt->vm); in i915_ggtt_resume()
1260 ggtt->invalidate(ggtt); in i915_ggtt_resume()
1265 intel_ggtt_restore_fences(ggtt); in i915_ggtt_resume()