Commit dd886a63 authored by Matthew Brost's avatar Matthew Brost Committed by Lucas De Marchi
Browse files

drm/xe: Restore system memory GGTT mappings



GGTT mappings reside on the device and this state is lost during suspend
/ d3cold thus this state must be restored resume regardless if the BO is
in system memory or VRAM.

v2:
 - Unnecessary parentheses around bo->placements[0] (Checkpatch)

Signed-off-by: default avatarMatthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241031182257.2949579-1-matthew.brost@intel.com


(cherry picked from commit a19d1db9)
Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
parent ce0d6970
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -886,8 +886,8 @@ int xe_bo_evict_pinned(struct xe_bo *bo)
	if (WARN_ON(!xe_bo_is_pinned(bo)))
		return -EINVAL;

	if (WARN_ON(!xe_bo_is_vram(bo)))
		return -EINVAL;
	if (!xe_bo_is_vram(bo))
		return 0;

	ret = ttm_bo_mem_space(&bo->ttm, &placement, &new_mem, &ctx);
	if (ret)
@@ -937,6 +937,7 @@ int xe_bo_restore_pinned(struct xe_bo *bo)
		.interruptible = false,
	};
	struct ttm_resource *new_mem;
	struct ttm_place *place = &bo->placements[0];
	int ret;

	xe_bo_assert_held(bo);
@@ -950,6 +951,9 @@ int xe_bo_restore_pinned(struct xe_bo *bo)
	if (WARN_ON(xe_bo_is_vram(bo) || !bo->ttm.ttm))
		return -EINVAL;

	if (!mem_type_is_vram(place->mem_type))
		return 0;

	ret = ttm_bo_mem_space(&bo->ttm, &bo->placement, &new_mem, &ctx);
	if (ret)
		return ret;
@@ -1757,7 +1761,10 @@ int xe_bo_pin(struct xe_bo *bo)
			place->fpfn = (xe_bo_addr(bo, 0, PAGE_SIZE) -
				       vram_region_gpu_offset(bo->ttm.resource)) >> PAGE_SHIFT;
			place->lpfn = place->fpfn + (bo->size >> PAGE_SHIFT);
		}

		if (mem_type_is_vram(place->mem_type) ||
		    bo->flags & XE_BO_FLAG_GGTT) {
			spin_lock(&xe->pinned.lock);
			list_add_tail(&bo->pinned_link, &xe->pinned.kernel_bo_present);
			spin_unlock(&xe->pinned.lock);
@@ -1818,7 +1825,8 @@ void xe_bo_unpin(struct xe_bo *bo)
	    bo->flags & XE_BO_FLAG_INTERNAL_TEST)) {
		struct ttm_place *place = &(bo->placements[0]);

		if (mem_type_is_vram(place->mem_type)) {
		if (mem_type_is_vram(place->mem_type) ||
		    bo->flags & XE_BO_FLAG_GGTT) {
			spin_lock(&xe->pinned.lock);
			xe_assert(xe, !list_empty(&bo->pinned_link));
			list_del_init(&bo->pinned_link);
+0 −1
Original line number Diff line number Diff line
@@ -159,7 +159,6 @@ int xe_bo_restore_kernel(struct xe_device *xe)
		 * should setup the iosys map.
		 */
		xe_assert(xe, !iosys_map_is_null(&bo->vmap));
		xe_assert(xe, xe_bo_is_vram(bo));

		xe_bo_put(bo);