Lines Matching defs:ggtt

55 static int ggtt_init_hw(struct i915_ggtt *ggtt)
57 struct drm_i915_private *i915 = ggtt->vm.i915;
59 i915_address_space_init(&ggtt->vm, VM_CLASS_GGTT);
61 ggtt->vm.is_ggtt = true;
64 ggtt->vm.has_read_only = IS_VALLEYVIEW(i915);
67 ggtt->vm.mm.color_adjust = i915_ggtt_color_adjust;
69 if (ggtt->mappable_end) {
70 if (!io_mapping_init_wc(&ggtt->iomap,
71 ggtt->gmadr.start,
72 ggtt->mappable_end)) {
73 ggtt->vm.cleanup(&ggtt->vm);
77 ggtt->mtrr = arch_phys_wc_add(ggtt->gmadr.start,
78 ggtt->mappable_end);
81 intel_ggtt_init_fences(ggtt);
100 ret = ggtt_init_hw(to_gt(i915)->ggtt);
180 void i915_ggtt_suspend(struct i915_ggtt *ggtt)
184 i915_ggtt_suspend_vm(&ggtt->vm, false);
185 ggtt->invalidate(ggtt);
187 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link)
191 void gen6_ggtt_invalidate(struct i915_ggtt *ggtt)
193 struct intel_uncore *uncore = ggtt->vm.gt->uncore;
216 static void gen8_ggtt_invalidate(struct i915_ggtt *ggtt)
218 struct intel_uncore *uncore = ggtt->vm.gt->uncore;
226 if (needs_wc_ggtt_mapping(ggtt->vm.i915))
240 static void guc_ggtt_invalidate(struct i915_ggtt *ggtt)
242 struct drm_i915_private *i915 = ggtt->vm.i915;
245 gen8_ggtt_invalidate(ggtt);
247 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link) {
300 static bool should_update_ggtt_with_bind(struct i915_ggtt *ggtt)
302 struct intel_gt *gt = ggtt->vm.gt;
307 static struct intel_context *gen8_ggtt_bind_get_ce(struct i915_ggtt *ggtt, intel_wakeref_t *wakeref)
310 struct intel_gt *gt = ggtt->vm.gt;
339 static bool gen8_ggtt_bind_ptes(struct i915_ggtt *ggtt, u32 offset,
344 struct intel_gt *gt = ggtt->vm.gt;
345 const gen8_pte_t scratch_pte = ggtt->vm.scratch[0]->encode;
355 ce = gen8_ggtt_bind_get_ce(ggtt, &wakeref);
457 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
459 (gen8_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE;
461 gen8_set_pte(pte, ggtt->vm.pte_encode(addr, pat_index, flags));
463 ggtt->invalidate(ggtt);
469 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
471 (gen8_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE;
473 return ggtt->vm.pte_decode(gen8_get_pte(pte), is_present, is_local);
480 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
483 pte = ggtt->vm.pte_encode(addr, pat_index, flags);
485 gen8_ggtt_bind_ptes(ggtt, offset, NULL, 1, pte))
486 return ggtt->invalidate(ggtt);
496 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
497 const gen8_pte_t pte_encode = ggtt->vm.pte_encode(0, pat_index, flags);
508 gte = (gen8_pte_t __iomem *)ggtt->gsm;
527 ggtt->invalidate(ggtt);
534 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
539 pte_encode = ggtt->vm.pte_encode(0, pat_index, flags);
542 if (!gen8_ggtt_bind_ptes(ggtt, start, NULL, end - start, scratch_pte))
547 if (!gen8_ggtt_bind_ptes(ggtt, start, vma_res->bi.pages,
552 if (!gen8_ggtt_bind_ptes(ggtt, start, NULL, end - start, scratch_pte))
565 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
569 return ggtt->invalidate(ggtt);
577 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
582 (gen8_pte_t __iomem *)ggtt->gsm + first_entry;
583 const int max_entries = ggtt_total_entries(ggtt) - first_entry;
598 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
602 const int max_entries = ggtt_total_entries(ggtt) - first_entry;
609 if (should_update_ggtt_with_bind(ggtt) && gen8_ggtt_bind_ptes(ggtt, first_entry,
611 return ggtt->invalidate(ggtt);
622 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
624 (gen6_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE;
628 ggtt->invalidate(ggtt);
635 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
637 (gen6_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE;
653 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
659 gte = (gen6_pte_t __iomem *)ggtt->gsm;
678 ggtt->invalidate(ggtt);
758 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
762 (gen6_pte_t __iomem *)ggtt->gsm + first_entry;
763 const int max_entries = ggtt_total_entries(ggtt) - first_entry;
809 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
811 return ggtt->vm.read_entry(vm, offset, is_present, is_local);
825 static int ggtt_reserve_guc_top(struct i915_ggtt *ggtt)
830 if (!intel_uc_uses_guc(&ggtt->vm.gt->uc))
833 GEM_BUG_ON(ggtt->vm.total <= GUC_TOP_RESERVE_SIZE);
834 offset = ggtt->vm.total - GUC_TOP_RESERVE_SIZE;
836 ret = i915_gem_gtt_reserve(&ggtt->vm, NULL, &ggtt->uc_fw,
840 drm_dbg(&ggtt->vm.i915->drm,
846 static void ggtt_release_guc_top(struct i915_ggtt *ggtt)
848 if (drm_mm_node_allocated(&ggtt->uc_fw))
849 drm_mm_remove_node(&ggtt->uc_fw);
852 static void cleanup_init_ggtt(struct i915_ggtt *ggtt)
854 ggtt_release_guc_top(ggtt);
855 if (drm_mm_node_allocated(&ggtt->error_capture))
856 drm_mm_remove_node(&ggtt->error_capture);
857 mutex_destroy(&ggtt->error_mutex);
860 static int init_ggtt(struct i915_ggtt *ggtt)
882 ggtt->pin_bias = max_t(u32, I915_GTT_PAGE_SIZE,
883 intel_wopcm_guc_size(&ggtt->vm.gt->wopcm));
885 ret = intel_vgt_balloon(ggtt);
889 mutex_init(&ggtt->error_mutex);
890 if (ggtt->mappable_end) {
913 ggtt->error_capture.size = 2 * I915_GTT_PAGE_SIZE;
914 ggtt->error_capture.color = I915_COLOR_UNEVICTABLE;
915 if (drm_mm_reserve_node(&ggtt->vm.mm, &ggtt->error_capture))
916 drm_mm_insert_node_in_range(&ggtt->vm.mm,
917 &ggtt->error_capture,
918 ggtt->error_capture.size, 0,
919 ggtt->error_capture.color,
920 0, ggtt->mappable_end,
923 if (drm_mm_node_allocated(&ggtt->error_capture)) {
924 u64 start = ggtt->error_capture.start;
925 u64 size = ggtt->error_capture.size;
927 ggtt->vm.scratch_range(&ggtt->vm, start, size);
928 drm_dbg(&ggtt->vm.i915->drm,
938 ret = ggtt_reserve_guc_top(ggtt);
943 drm_mm_for_each_hole(entry, &ggtt->vm.mm, hole_start, hole_end) {
944 drm_dbg(&ggtt->vm.i915->drm,
947 ggtt->vm.clear_range(&ggtt->vm, hole_start,
952 ggtt->vm.clear_range(&ggtt->vm, ggtt->vm.total - PAGE_SIZE, PAGE_SIZE);
957 cleanup_init_ggtt(ggtt);
994 static int init_aliasing_ppgtt(struct i915_ggtt *ggtt)
1000 ppgtt = i915_ppgtt_create(ggtt->vm.gt, 0);
1004 if (GEM_WARN_ON(ppgtt->vm.total < ggtt->vm.total)) {
1009 err = i915_vm_alloc_pt_stash(&ppgtt->vm, &stash, ggtt->vm.total);
1025 ppgtt->vm.allocate_va_range(&ppgtt->vm, &stash, 0, ggtt->vm.total);
1027 ggtt->alias = ppgtt;
1028 ggtt->vm.bind_async_flags |= ppgtt->vm.bind_async_flags;
1030 GEM_BUG_ON(ggtt->vm.vma_ops.bind_vma != intel_ggtt_bind_vma);
1031 ggtt->vm.vma_ops.bind_vma = aliasing_gtt_bind_vma;
1033 GEM_BUG_ON(ggtt->vm.vma_ops.unbind_vma != intel_ggtt_unbind_vma);
1034 ggtt->vm.vma_ops.unbind_vma = aliasing_gtt_unbind_vma;
1046 static void fini_aliasing_ppgtt(struct i915_ggtt *ggtt)
1050 ppgtt = fetch_and_zero(&ggtt->alias);
1056 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma;
1057 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma;
1064 ret = init_ggtt(to_gt(i915)->ggtt);
1069 ret = init_aliasing_ppgtt(to_gt(i915)->ggtt);
1071 cleanup_init_ggtt(to_gt(i915)->ggtt);
1077 static void ggtt_cleanup_hw(struct i915_ggtt *ggtt)
1081 flush_workqueue(ggtt->vm.i915->wq);
1082 i915_gem_drain_freed_objects(ggtt->vm.i915);
1084 mutex_lock(&ggtt->vm.mutex);
1086 ggtt->vm.skip_pte_rewrite = true;
1088 list_for_each_entry_safe(vma, vn, &ggtt->vm.bound_list, vm_link) {
1100 if (drm_mm_node_allocated(&ggtt->error_capture))
1101 drm_mm_remove_node(&ggtt->error_capture);
1102 mutex_destroy(&ggtt->error_mutex);
1104 ggtt_release_guc_top(ggtt);
1105 intel_vgt_deballoon(ggtt);
1107 ggtt->vm.cleanup(&ggtt->vm);
1109 mutex_unlock(&ggtt->vm.mutex);
1110 i915_address_space_fini(&ggtt->vm);
1112 arch_phys_wc_del(ggtt->mtrr);
1114 if (ggtt->iomap.size)
1115 io_mapping_fini(&ggtt->iomap);
1124 struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
1126 fini_aliasing_ppgtt(ggtt);
1128 intel_ggtt_fini_fences(ggtt);
1129 ggtt_cleanup_hw(ggtt);
1139 struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
1141 GEM_WARN_ON(kref_read(&ggtt->vm.resv_ref) != 1);
1142 dma_resv_fini(&ggtt->vm._resv);
1194 static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
1196 struct drm_i915_private *i915 = ggtt->vm.i915;
1197 struct intel_uncore *uncore = ggtt->vm.gt->uncore;
1213 ggtt->gsm = ioremap_wc(phys_addr, size);
1215 ggtt->gsm = ioremap(phys_addr, size);
1217 if (!ggtt->gsm) {
1218 drm_err(&i915->drm, "Failed to map the ggtt page table\n");
1222 kref_init(&ggtt->vm.resv_ref);
1223 ret = setup_scratch_page(&ggtt->vm);
1227 iounmap(ggtt->gsm);
1232 if (i915_gem_object_is_lmem(ggtt->vm.scratch[0]))
1235 ggtt->vm.scratch[0]->encode =
1236 ggtt->vm.pte_encode(px_dma(ggtt->vm.scratch[0]),
1246 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
1248 iounmap(ggtt->gsm);
1258 static int gen8_gmch_probe(struct i915_ggtt *ggtt)
1260 struct drm_i915_private *i915 = ggtt->vm.i915;
1269 ggtt->gmadr = pci_resource(pdev, GEN4_GMADR_BAR);
1270 ggtt->mappable_end = resource_size(&ggtt->gmadr);
1279 ggtt->vm.alloc_pt_dma = alloc_pt_dma;
1280 ggtt->vm.alloc_scratch_dma = alloc_pt_dma;
1281 ggtt->vm.lmem_pt_obj_flags = I915_BO_ALLOC_PM_EARLY;
1283 ggtt->vm.total = (size / sizeof(gen8_pte_t)) * I915_GTT_PAGE_SIZE;
1284 ggtt->vm.cleanup = gen6_gmch_remove;
1285 ggtt->vm.insert_page = gen8_ggtt_insert_page;
1286 ggtt->vm.clear_range = nop_clear_range;
1287 ggtt->vm.scratch_range = gen8_ggtt_clear_range;
1289 ggtt->vm.insert_entries = gen8_ggtt_insert_entries;
1290 ggtt->vm.read_entry = gen8_ggtt_read_entry;
1297 ggtt->vm.insert_entries = bxt_vtd_ggtt_insert_entries__BKL;
1298 ggtt->vm.insert_page = bxt_vtd_ggtt_insert_page__BKL;
1306 ggtt->vm.raw_insert_page = gen8_ggtt_insert_page;
1307 ggtt->vm.raw_insert_entries = gen8_ggtt_insert_entries;
1309 ggtt->vm.bind_async_flags =
1314 ggtt->vm.scratch_range = gen8_ggtt_scratch_range_bind;
1315 ggtt->vm.insert_page = gen8_ggtt_insert_page_bind;
1316 ggtt->vm.insert_entries = gen8_ggtt_insert_entries_bind;
1321 ggtt->vm.raw_insert_page = gen8_ggtt_insert_page;
1324 if (intel_uc_wants_guc_submission(&ggtt->vm.gt->uc))
1325 ggtt->invalidate = guc_ggtt_invalidate;
1327 ggtt->invalidate = gen8_ggtt_invalidate;
1329 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma;
1330 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma;
1333 ggtt->vm.pte_encode = mtl_ggtt_pte_encode;
1335 ggtt->vm.pte_encode = gen8_ggtt_pte_encode;
1337 ggtt->vm.pte_decode = gen8_ggtt_pte_decode;
1339 return ggtt_probe_common(ggtt, size);
1446 static int gen6_gmch_probe(struct i915_ggtt *ggtt)
1448 struct drm_i915_private *i915 = ggtt->vm.i915;
1456 ggtt->gmadr = pci_resource(pdev, GEN4_GMADR_BAR);
1457 ggtt->mappable_end = resource_size(&ggtt->gmadr);
1463 if (ggtt->mappable_end < (64 << 20) ||
1464 ggtt->mappable_end > (512 << 20)) {
1466 &ggtt->mappable_end);
1473 ggtt->vm.total = (size / sizeof(gen6_pte_t)) * I915_GTT_PAGE_SIZE;
1475 ggtt->vm.alloc_pt_dma = alloc_pt_dma;
1476 ggtt->vm.alloc_scratch_dma = alloc_pt_dma;
1478 ggtt->vm.clear_range = nop_clear_range;
1480 ggtt->vm.clear_range = gen6_ggtt_clear_range;
1481 ggtt->vm.scratch_range = gen6_ggtt_clear_range;
1482 ggtt->vm.insert_page = gen6_ggtt_insert_page;
1483 ggtt->vm.insert_entries = gen6_ggtt_insert_entries;
1484 ggtt->vm.read_entry = gen6_ggtt_read_entry;
1485 ggtt->vm.cleanup = gen6_gmch_remove;
1487 ggtt->invalidate = gen6_ggtt_invalidate;
1490 ggtt->vm.pte_encode = iris_pte_encode;
1492 ggtt->vm.pte_encode = hsw_pte_encode;
1494 ggtt->vm.pte_encode = byt_pte_encode;
1496 ggtt->vm.pte_encode = ivb_pte_encode;
1498 ggtt->vm.pte_encode = snb_pte_encode;
1500 ggtt->vm.pte_decode = gen6_pte_decode;
1502 ggtt->vm.vma_ops.bind_vma = intel_ggtt_bind_vma;
1503 ggtt->vm.vma_ops.unbind_vma = intel_ggtt_unbind_vma;
1505 return ggtt_probe_common(ggtt, size);
1508 static int ggtt_probe_hw(struct i915_ggtt *ggtt, struct intel_gt *gt)
1513 ggtt->vm.gt = gt;
1514 ggtt->vm.i915 = i915;
1515 ggtt->vm.dma = i915->drm.dev;
1516 dma_resv_init(&ggtt->vm._resv);
1519 ret = gen8_gmch_probe(ggtt);
1521 ret = gen6_gmch_probe(ggtt);
1523 ret = intel_ggtt_gmch_probe(ggtt);
1526 dma_resv_fini(&ggtt->vm._resv);
1530 if ((ggtt->vm.total - 1) >> 32) {
1534 ggtt->vm.total >> 20);
1535 ggtt->vm.total = 1ULL << 32;
1536 ggtt->mappable_end =
1537 min_t(u64, ggtt->mappable_end, ggtt->vm.total);
1540 if (ggtt->mappable_end > ggtt->vm.total) {
1544 &ggtt->mappable_end, ggtt->vm.total);
1545 ggtt->mappable_end = ggtt->vm.total;
1549 drm_dbg(&i915->drm, "GGTT size = %lluM\n", ggtt->vm.total >> 20);
1551 (u64)ggtt->mappable_end >> 20);
1573 ret = ggtt_probe_hw(to_gt(i915)->ggtt, to_gt(i915));
1585 struct i915_ggtt *ggtt;
1587 ggtt = drmm_kzalloc(&i915->drm, sizeof(*ggtt), GFP_KERNEL);
1588 if (!ggtt)
1591 INIT_LIST_HEAD(&ggtt->gt_list);
1593 return ggtt;
1658 void i915_ggtt_resume(struct i915_ggtt *ggtt)
1663 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link)
1666 flush = i915_ggtt_resume_vm(&ggtt->vm, false);
1668 if (drm_mm_node_allocated(&ggtt->error_capture))
1669 ggtt->vm.scratch_range(&ggtt->vm, ggtt->error_capture.start,
1670 ggtt->error_capture.size);
1672 list_for_each_entry(gt, &ggtt->gt_list, ggtt_link)
1675 ggtt->invalidate(ggtt);
1680 intel_ggtt_restore_fences(ggtt);