Lines Matching +full:p +full:- +full:tile
1 // SPDX-License-Identifier: MIT
9 #include <linux/fault-inject.h>
10 #include <linux/io-64-nonatomic-lo-hi.h>
41 * for resources that are accessible to privileged (i.e. kernel-mode) processes,
42 * and not tied to a specific user-level process. For example, the Graphics
43 * micro-Controller (GuC) and Display Engine (if present) utilize this Global
47 * address that can be accessed by HW. The GGTT is a flat, single-level table.
62 * GGTT. These simplifications might waste space in the GGTT (about 20-25 MBs
109 struct xe_tile *tile = ggtt->tile; in ggtt_update_access_counter() local
113 if (tile->primary_gt && XE_GT_WA(tile->primary_gt, 22019338487)) { in ggtt_update_access_counter()
114 affected_gt = tile->primary_gt; in ggtt_update_access_counter()
118 xe_tile_assert(tile, IS_DGFX(tile_to_xe(tile))); in ggtt_update_access_counter()
120 affected_gt = tile->media_gt; in ggtt_update_access_counter()
124 xe_tile_assert(tile, !IS_DGFX(tile_to_xe(tile))); in ggtt_update_access_counter()
132 lockdep_assert_held(&ggtt->lock); in ggtt_update_access_counter()
134 if ((++ggtt->access_count % max_gtt_writes) == 0) { in ggtt_update_access_counter()
135 xe_mmio_write32(&affected_gt->mmio, GMD_ID, 0x0); in ggtt_update_access_counter()
136 ggtt->access_count = 0; in ggtt_update_access_counter()
142 xe_tile_assert(ggtt->tile, !(addr & XE_PTE_MASK)); in xe_ggtt_set_pte()
143 xe_tile_assert(ggtt->tile, addr < ggtt->size); in xe_ggtt_set_pte()
145 writeq(pte, &ggtt->gsm[addr >> XE_PTE_SHIFT]); in xe_ggtt_set_pte()
156 xe_tile_assert(ggtt->tile, !(addr & XE_PTE_MASK)); in xe_ggtt_get_pte()
157 xe_tile_assert(ggtt->tile, addr < ggtt->size); in xe_ggtt_get_pte()
159 return readq(&ggtt->gsm[addr >> XE_PTE_SHIFT]); in xe_ggtt_get_pte()
164 u16 pat_index = tile_to_xe(ggtt->tile)->pat.idx[XE_CACHE_WB]; in xe_ggtt_clear()
165 u64 end = start + size - 1; in xe_ggtt_clear()
168 xe_tile_assert(ggtt->tile, start < end); in xe_ggtt_clear()
170 if (ggtt->scratch) in xe_ggtt_clear()
171 scratch_pte = xe_bo_addr(ggtt->scratch, 0, XE_PAGE_SIZE) | in xe_ggtt_clear()
172 ggtt->pt_ops->pte_encode_flags(ggtt->scratch, in xe_ggtt_clear()
178 ggtt->pt_ops->ggtt_set_pte(ggtt, start, scratch_pte); in xe_ggtt_clear()
189 might_lock(&ggtt->lock); in primelockdep()
194 * xe_ggtt_alloc - Allocate a GGTT for a given &xe_tile
195 * @tile: &xe_tile
197 * Allocates a &xe_ggtt for a given tile.
201 struct xe_ggtt *xe_ggtt_alloc(struct xe_tile *tile) in xe_ggtt_alloc() argument
203 struct xe_device *xe = tile_to_xe(tile); in xe_ggtt_alloc()
206 ggtt = drmm_kzalloc(&xe->drm, sizeof(*ggtt), GFP_KERNEL); in xe_ggtt_alloc()
210 if (drmm_mutex_init(&xe->drm, &ggtt->lock)) in xe_ggtt_alloc()
214 ggtt->tile = tile; in xe_ggtt_alloc()
223 destroy_workqueue(ggtt->wq); in ggtt_fini_early()
224 drm_mm_takedown(&ggtt->mm); in ggtt_fini_early()
231 ggtt->scratch = NULL; in ggtt_fini()
237 might_lock(&ggtt->lock); in xe_ggtt_might_lock()
261 drm_mm_init(&ggtt->mm, reserved, in __xe_ggtt_init_early()
262 ggtt->size - reserved); in __xe_ggtt_init_early()
267 ggtt->size = size; in xe_ggtt_init_kunit()
277 drain_workqueue(ggtt->wq); in dev_fini_ggtt()
281 * xe_ggtt_init_early - Early GGTT initialization
286 * initial clear done to it yet. That will happen in the regular, non-early
293 struct xe_device *xe = tile_to_xe(ggtt->tile); in xe_ggtt_init_early()
294 struct pci_dev *pdev = to_pci_dev(xe->drm.dev); in xe_ggtt_init_early()
304 xe_tile_err(ggtt->tile, "Hardware reported no preallocated GSM\n"); in xe_ggtt_init_early()
305 return -ENOMEM; in xe_ggtt_init_early()
308 ggtt->gsm = ggtt->tile->mmio.regs + SZ_8M; in xe_ggtt_init_early()
309 ggtt->size = (gsm_size / 8) * (u64) XE_PAGE_SIZE; in xe_ggtt_init_early()
311 if (IS_DGFX(xe) && xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K) in xe_ggtt_init_early()
312 ggtt->flags |= XE_GGTT_FLAGS_64K; in xe_ggtt_init_early()
314 if (ggtt->size > GUC_GGTT_TOP) in xe_ggtt_init_early()
315 ggtt->size = GUC_GGTT_TOP; in xe_ggtt_init_early()
318 ggtt->pt_ops = in xe_ggtt_init_early()
319 (ggtt->tile->media_gt && XE_GT_WA(ggtt->tile->media_gt, 22019338487)) || in xe_ggtt_init_early()
320 (ggtt->tile->primary_gt && XE_GT_WA(ggtt->tile->primary_gt, 22019338487)) ? in xe_ggtt_init_early()
323 ggtt->pt_ops = &xelp_pt_ops; in xe_ggtt_init_early()
325 ggtt->wq = alloc_workqueue("xe-ggtt-wq", 0, WQ_MEM_RECLAIM); in xe_ggtt_init_early()
326 if (!ggtt->wq) in xe_ggtt_init_early()
327 return -ENOMEM; in xe_ggtt_init_early()
331 err = drmm_add_action_or_reset(&xe->drm, ggtt_fini_early, ggtt); in xe_ggtt_init_early()
335 err = devm_add_action_or_reset(xe->drm.dev, dev_fini_ggtt, ggtt); in xe_ggtt_init_early()
340 err = xe_tile_sriov_vf_prepare_ggtt(ggtt->tile); in xe_ggtt_init_early()
357 mutex_lock(&ggtt->lock); in xe_ggtt_initial_clear()
358 drm_mm_for_each_hole(hole, &ggtt->mm, start, end) in xe_ggtt_initial_clear()
359 xe_ggtt_clear(ggtt, start, end - start); in xe_ggtt_initial_clear()
362 mutex_unlock(&ggtt->lock); in xe_ggtt_initial_clear()
367 struct xe_ggtt *ggtt = node->ggtt; in ggtt_node_remove()
368 struct xe_device *xe = tile_to_xe(ggtt->tile); in ggtt_node_remove()
372 bound = drm_dev_enter(&xe->drm, &idx); in ggtt_node_remove()
374 mutex_lock(&ggtt->lock); in ggtt_node_remove()
376 xe_ggtt_clear(ggtt, node->base.start, node->base.size); in ggtt_node_remove()
377 drm_mm_remove_node(&node->base); in ggtt_node_remove()
378 node->base.size = 0; in ggtt_node_remove()
379 mutex_unlock(&ggtt->lock); in ggtt_node_remove()
384 if (node->invalidate_on_remove) in ggtt_node_remove()
397 struct xe_device *xe = tile_to_xe(node->ggtt->tile); in ggtt_node_remove_work_func()
405 * xe_ggtt_node_remove - Remove a &xe_ggtt_node from the GGTT
414 if (!node || !node->ggtt) in xe_ggtt_node_remove()
417 ggtt = node->ggtt; in xe_ggtt_node_remove()
418 xe = tile_to_xe(ggtt->tile); in xe_ggtt_node_remove()
420 node->invalidate_on_remove = invalidate; in xe_ggtt_node_remove()
426 queue_work(ggtt->wq, &node->delayed_removal_work); in xe_ggtt_node_remove()
431 * xe_ggtt_init - Regular non-early GGTT initialization
438 struct xe_device *xe = tile_to_xe(ggtt->tile); in xe_ggtt_init()
448 if (ggtt->flags & XE_GGTT_FLAGS_64K) in xe_ggtt_init()
451 flags |= XE_BO_FLAG_VRAM_IF_DGFX(ggtt->tile); in xe_ggtt_init()
453 ggtt->scratch = xe_managed_bo_create_pin_map(xe, ggtt->tile, XE_PAGE_SIZE, flags); in xe_ggtt_init()
454 if (IS_ERR(ggtt->scratch)) { in xe_ggtt_init()
455 err = PTR_ERR(ggtt->scratch); in xe_ggtt_init()
459 xe_map_memset(xe, &ggtt->scratch->vmap, 0, 0, xe_bo_size(ggtt->scratch)); in xe_ggtt_init()
463 return devm_add_action_or_reset(xe->drm.dev, ggtt_fini, ggtt); in xe_ggtt_init()
465 ggtt->scratch = NULL; in xe_ggtt_init()
476 err = xe_tlb_inval_ggtt(>->tlb_inval); in ggtt_invalidate_gt_tlb()
482 struct xe_device *xe = tile_to_xe(ggtt->tile); in xe_ggtt_invalidate()
492 /* Each GT in a tile has its own TLB to cache GGTT lookups */ in xe_ggtt_invalidate()
493 ggtt_invalidate_gt_tlb(ggtt->tile->primary_gt); in xe_ggtt_invalidate()
494 ggtt_invalidate_gt_tlb(ggtt->tile->media_gt); in xe_ggtt_invalidate()
503 string_get_size(node->size, 1, STRING_UNITS_2, buf, sizeof(buf)); in xe_ggtt_dump_node()
504 xe_tile_dbg(ggtt->tile, "GGTT %#llx-%#llx (%s) %s\n", in xe_ggtt_dump_node()
505 node->start, node->start + node->size, buf, description); in xe_ggtt_dump_node()
510 * xe_ggtt_node_insert_balloon_locked - prevent allocation of specified GGTT addresses
515 * To be used in cases where ggtt->lock is already taken.
522 struct xe_ggtt *ggtt = node->ggtt; in xe_ggtt_node_insert_balloon_locked()
525 xe_tile_assert(ggtt->tile, start < end); in xe_ggtt_node_insert_balloon_locked()
526 xe_tile_assert(ggtt->tile, IS_ALIGNED(start, XE_PAGE_SIZE)); in xe_ggtt_node_insert_balloon_locked()
527 xe_tile_assert(ggtt->tile, IS_ALIGNED(end, XE_PAGE_SIZE)); in xe_ggtt_node_insert_balloon_locked()
528 xe_tile_assert(ggtt->tile, !drm_mm_node_allocated(&node->base)); in xe_ggtt_node_insert_balloon_locked()
529 lockdep_assert_held(&ggtt->lock); in xe_ggtt_node_insert_balloon_locked()
531 node->base.color = 0; in xe_ggtt_node_insert_balloon_locked()
532 node->base.start = start; in xe_ggtt_node_insert_balloon_locked()
533 node->base.size = end - start; in xe_ggtt_node_insert_balloon_locked()
535 err = drm_mm_reserve_node(&ggtt->mm, &node->base); in xe_ggtt_node_insert_balloon_locked()
537 if (xe_tile_WARN(ggtt->tile, err, "Failed to balloon GGTT %#llx-%#llx (%pe)\n", in xe_ggtt_node_insert_balloon_locked()
538 node->base.start, node->base.start + node->base.size, ERR_PTR(err))) in xe_ggtt_node_insert_balloon_locked()
541 xe_ggtt_dump_node(ggtt, &node->base, "balloon"); in xe_ggtt_node_insert_balloon_locked()
546 * xe_ggtt_node_remove_balloon_locked - release a reserved GGTT region
549 * To be used in cases where ggtt->lock is already taken.
557 lockdep_assert_held(&node->ggtt->lock); in xe_ggtt_node_remove_balloon_locked()
559 xe_ggtt_dump_node(node->ggtt, &node->base, "remove-balloon"); in xe_ggtt_node_remove_balloon_locked()
561 drm_mm_remove_node(&node->base); in xe_ggtt_node_remove_balloon_locked()
566 struct xe_tile *tile = ggtt->tile; in xe_ggtt_assert_fit() local
567 struct xe_device *xe = tile_to_xe(tile); in xe_ggtt_assert_fit()
570 xe_tile_assert(tile, start >= wopcm); in xe_ggtt_assert_fit()
571 xe_tile_assert(tile, start + size < ggtt->size - wopcm); in xe_ggtt_assert_fit()
575 * xe_ggtt_shift_nodes_locked - Shift GGTT nodes to adjust for a change in usable address range.
581 * When the GGTT VM is completely clear of any nodes, they are re-added with shifted offsets.
583 * The function has no ability of failing - because it shifts existing nodes, without
591 struct xe_tile *tile __maybe_unused = ggtt->tile; in xe_ggtt_shift_nodes_locked()
595 lockdep_assert_held(&ggtt->lock); in xe_ggtt_shift_nodes_locked()
598 drm_mm_for_each_node_safe(node, tmpn, &ggtt->mm) in xe_ggtt_shift_nodes_locked()
599 xe_ggtt_assert_fit(ggtt, node->start + shift, node->size); in xe_ggtt_shift_nodes_locked()
601 drm_mm_for_each_node_safe(node, tmpn, &ggtt->mm) { in xe_ggtt_shift_nodes_locked()
603 list_add(&node->node_list, &temp_list_head); in xe_ggtt_shift_nodes_locked()
607 list_del(&node->node_list); in xe_ggtt_shift_nodes_locked()
608 node->start += shift; in xe_ggtt_shift_nodes_locked()
609 drm_mm_reserve_node(&ggtt->mm, node); in xe_ggtt_shift_nodes_locked()
610 xe_tile_assert(tile, drm_mm_node_allocated(node)); in xe_ggtt_shift_nodes_locked()
615 * xe_ggtt_node_insert_locked - Locked version to insert a &xe_ggtt_node into the GGTT
622 * To be used in cases where ggtt->lock is already taken.
629 return drm_mm_insert_node_generic(&node->ggtt->mm, &node->base, size, align, 0, in xe_ggtt_node_insert_locked()
634 * xe_ggtt_node_insert - Insert a &xe_ggtt_node into the GGTT
647 if (!node || !node->ggtt) in xe_ggtt_node_insert()
648 return -ENOENT; in xe_ggtt_node_insert()
650 mutex_lock(&node->ggtt->lock); in xe_ggtt_node_insert()
653 mutex_unlock(&node->ggtt->lock); in xe_ggtt_node_insert()
659 * xe_ggtt_node_init - Initialize %xe_ggtt_node struct
676 return ERR_PTR(-ENOMEM); in xe_ggtt_node_init()
678 INIT_WORK(&node->delayed_removal_work, ggtt_node_remove_work_func); in xe_ggtt_node_init()
679 node->ggtt = ggtt; in xe_ggtt_node_init()
685 * xe_ggtt_node_fini - Forcebly finalize %xe_ggtt_node struct
698 * xe_ggtt_node_allocated - Check if node is allocated in GGTT
705 if (!node || !node->ggtt) in xe_ggtt_node_allocated()
708 return drm_mm_node_allocated(&node->base); in xe_ggtt_node_allocated()
712 * xe_ggtt_node_pt_size() - Get the size of page table entries needed to map a GGTT node.
722 return node->base.size / XE_PAGE_SIZE * sizeof(u64); in xe_ggtt_node_pt_size()
726 * xe_ggtt_map_bo - Map the BO into GGTT
742 start = node->base.start; in xe_ggtt_map_bo()
745 pte = ggtt->pt_ops->pte_encode_flags(bo, pat_index); in xe_ggtt_map_bo()
747 xe_assert(xe_bo_device(bo), bo->ttm.ttm); in xe_ggtt_map_bo()
751 ggtt->pt_ops->ggtt_set_pte(ggtt, end - cur.remaining, in xe_ggtt_map_bo()
755 pte |= vram_region_gpu_offset(bo->ttm.resource); in xe_ggtt_map_bo()
757 for (xe_res_first(bo->ttm.resource, 0, xe_bo_size(bo), &cur); in xe_ggtt_map_bo()
759 ggtt->pt_ops->ggtt_set_pte(ggtt, end - cur.remaining, in xe_ggtt_map_bo()
765 * xe_ggtt_map_bo_unlocked - Restore a mapping of a BO into GGTT
773 u16 cache_mode = bo->flags & XE_BO_FLAG_NEEDS_UC ? XE_CACHE_NONE : XE_CACHE_WB; in xe_ggtt_map_bo_unlocked()
774 u16 pat_index = tile_to_xe(ggtt->tile)->pat.idx[cache_mode]; in xe_ggtt_map_bo_unlocked()
776 mutex_lock(&ggtt->lock); in xe_ggtt_map_bo_unlocked()
777 xe_ggtt_map_bo(ggtt, bo->ggtt_node[ggtt->tile->id], bo, pat_index); in xe_ggtt_map_bo_unlocked()
778 mutex_unlock(&ggtt->lock); in xe_ggtt_map_bo_unlocked()
784 u64 alignment = bo->min_align > 0 ? bo->min_align : XE_PAGE_SIZE; in __xe_ggtt_insert_bo_at()
785 u8 tile_id = ggtt->tile->id; in __xe_ggtt_insert_bo_at()
788 if (xe_bo_is_vram(bo) && ggtt->flags & XE_GGTT_FLAGS_64K) in __xe_ggtt_insert_bo_at()
791 if (XE_WARN_ON(bo->ggtt_node[tile_id])) { in __xe_ggtt_insert_bo_at()
793 xe_tile_assert(ggtt->tile, bo->ggtt_node[tile_id]->base.size == xe_bo_size(bo)); in __xe_ggtt_insert_bo_at()
801 xe_pm_runtime_get_noresume(tile_to_xe(ggtt->tile)); in __xe_ggtt_insert_bo_at()
803 bo->ggtt_node[tile_id] = xe_ggtt_node_init(ggtt); in __xe_ggtt_insert_bo_at()
804 if (IS_ERR(bo->ggtt_node[tile_id])) { in __xe_ggtt_insert_bo_at()
805 err = PTR_ERR(bo->ggtt_node[tile_id]); in __xe_ggtt_insert_bo_at()
806 bo->ggtt_node[tile_id] = NULL; in __xe_ggtt_insert_bo_at()
810 mutex_lock(&ggtt->lock); in __xe_ggtt_insert_bo_at()
811 err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node[tile_id]->base, in __xe_ggtt_insert_bo_at()
814 xe_ggtt_node_fini(bo->ggtt_node[tile_id]); in __xe_ggtt_insert_bo_at()
815 bo->ggtt_node[tile_id] = NULL; in __xe_ggtt_insert_bo_at()
817 u16 cache_mode = bo->flags & XE_BO_FLAG_NEEDS_UC ? XE_CACHE_NONE : XE_CACHE_WB; in __xe_ggtt_insert_bo_at()
818 u16 pat_index = tile_to_xe(ggtt->tile)->pat.idx[cache_mode]; in __xe_ggtt_insert_bo_at()
820 xe_ggtt_map_bo(ggtt, bo->ggtt_node[tile_id], bo, pat_index); in __xe_ggtt_insert_bo_at()
822 mutex_unlock(&ggtt->lock); in __xe_ggtt_insert_bo_at()
824 if (!err && bo->flags & XE_BO_FLAG_GGTT_INVALIDATE) in __xe_ggtt_insert_bo_at()
828 xe_pm_runtime_put(tile_to_xe(ggtt->tile)); in __xe_ggtt_insert_bo_at()
834 * xe_ggtt_insert_bo_at - Insert BO at a specific GGTT space
850 * xe_ggtt_insert_bo - Insert BO into GGTT
864 * xe_ggtt_remove_bo - Remove a BO from the GGTT
870 u8 tile_id = ggtt->tile->id; in xe_ggtt_remove_bo()
872 if (XE_WARN_ON(!bo->ggtt_node[tile_id])) in xe_ggtt_remove_bo()
876 xe_tile_assert(ggtt->tile, bo->ggtt_node[tile_id]->base.size == xe_bo_size(bo)); in xe_ggtt_remove_bo()
878 xe_ggtt_node_remove(bo->ggtt_node[tile_id], in xe_ggtt_remove_bo()
879 bo->flags & XE_BO_FLAG_GGTT_INVALIDATE); in xe_ggtt_remove_bo()
883 * xe_ggtt_largest_hole - Largest GGTT hole
892 const struct drm_mm *mm = &ggtt->mm; in xe_ggtt_largest_hole()
894 u64 hole_min_start = xe_wopcm_size(tile_to_xe(ggtt->tile)); in xe_ggtt_largest_hole()
898 mutex_lock(&ggtt->lock); in xe_ggtt_largest_hole()
906 hole_size = hole_end - hole_start; in xe_ggtt_largest_hole()
908 *spare -= min3(*spare, hole_size, max_hole); in xe_ggtt_largest_hole()
912 mutex_unlock(&ggtt->lock); in xe_ggtt_largest_hole()
925 u64 start = node->start; in xe_ggtt_assign_locked()
926 u64 size = node->size; in xe_ggtt_assign_locked()
927 u64 end = start + size - 1; in xe_ggtt_assign_locked()
930 lockdep_assert_held(&ggtt->lock); in xe_ggtt_assign_locked()
936 ggtt->pt_ops->ggtt_set_pte(ggtt, start, pte); in xe_ggtt_assign_locked()
944 * xe_ggtt_assign - assign a GGTT region to the VF
954 mutex_lock(&node->ggtt->lock); in xe_ggtt_assign()
955 xe_ggtt_assign_locked(node->ggtt, &node->base, vfid); in xe_ggtt_assign()
956 mutex_unlock(&node->ggtt->lock); in xe_ggtt_assign()
960 * xe_ggtt_node_save() - Save a &xe_ggtt_node to a buffer.
976 return -ENOENT; in xe_ggtt_node_save()
978 guard(mutex)(&node->ggtt->lock); in xe_ggtt_node_save()
981 return -EINVAL; in xe_ggtt_node_save()
983 ggtt = node->ggtt; in xe_ggtt_node_save()
984 start = node->base.start; in xe_ggtt_node_save()
985 end = start + node->base.size - 1; in xe_ggtt_node_save()
988 pte = ggtt->pt_ops->ggtt_get_pte(ggtt, start); in xe_ggtt_node_save()
990 return -EPERM; in xe_ggtt_node_save()
1000 * xe_ggtt_node_load() - Load a &xe_ggtt_node from a buffer.
1016 return -ENOENT; in xe_ggtt_node_load()
1018 guard(mutex)(&node->ggtt->lock); in xe_ggtt_node_load()
1021 return -EINVAL; in xe_ggtt_node_load()
1023 ggtt = node->ggtt; in xe_ggtt_node_load()
1024 start = node->base.start; in xe_ggtt_node_load()
1025 end = start + node->base.size - 1; in xe_ggtt_node_load()
1029 ggtt->pt_ops->ggtt_set_pte(ggtt, start, vfid_pte); in xe_ggtt_node_load()
1040 * xe_ggtt_dump - Dump GGTT for debug
1042 * @p: the &drm_mm_printer helper handle to be used to dump the information
1046 int xe_ggtt_dump(struct xe_ggtt *ggtt, struct drm_printer *p) in xe_ggtt_dump() argument
1050 err = mutex_lock_interruptible(&ggtt->lock); in xe_ggtt_dump()
1054 drm_mm_print(&ggtt->mm, p); in xe_ggtt_dump()
1055 mutex_unlock(&ggtt->lock); in xe_ggtt_dump()
1060 * xe_ggtt_print_holes - Print holes
1063 * @p: the &drm_printer
1069 u64 xe_ggtt_print_holes(struct xe_ggtt *ggtt, u64 alignment, struct drm_printer *p) in xe_ggtt_print_holes() argument
1071 const struct drm_mm *mm = &ggtt->mm; in xe_ggtt_print_holes()
1073 u64 hole_min_start = xe_wopcm_size(tile_to_xe(ggtt->tile)); in xe_ggtt_print_holes()
1078 mutex_lock(&ggtt->lock); in xe_ggtt_print_holes()
1086 hole_size = hole_end - hole_start; in xe_ggtt_print_holes()
1090 drm_printf(p, "range:\t%#llx-%#llx\t(%s)\n", in xe_ggtt_print_holes()
1091 hole_start, hole_end - 1, buf); in xe_ggtt_print_holes()
1094 mutex_unlock(&ggtt->lock); in xe_ggtt_print_holes()
1100 * xe_ggtt_encode_pte_flags - Get PTE encoding flags for BO
1111 return ggtt->pt_ops->pte_encode_flags(bo, pat_index); in xe_ggtt_encode_pte_flags()
1115 * xe_ggtt_read_pte - Read a PTE from the GGTT
1123 return ioread64(ggtt->gsm + (offset / XE_PAGE_SIZE)); in xe_ggtt_read_pte()