xref: /linux/drivers/gpu/drm/xe/xe_bo.c (revision 965c995c9a4b395471ff48790a0155ee986ca405)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2021 Intel Corporation
4  */
5 
6 #include "xe_bo.h"
7 
8 #include <linux/dma-buf.h>
9 #include <linux/nospec.h>
10 
11 #include <drm/drm_drv.h>
12 #include <drm/drm_gem_ttm_helper.h>
13 #include <drm/drm_managed.h>
14 #include <drm/ttm/ttm_backup.h>
15 #include <drm/ttm/ttm_device.h>
16 #include <drm/ttm/ttm_placement.h>
17 #include <drm/ttm/ttm_tt.h>
18 #include <uapi/drm/xe_drm.h>
19 
20 #include <kunit/static_stub.h>
21 
22 #include <trace/events/gpu_mem.h>
23 
24 #include "xe_device.h"
25 #include "xe_dma_buf.h"
26 #include "xe_drm_client.h"
27 #include "xe_ggtt.h"
28 #include "xe_gt.h"
29 #include "xe_map.h"
30 #include "xe_migrate.h"
31 #include "xe_pm.h"
32 #include "xe_preempt_fence.h"
33 #include "xe_pxp.h"
34 #include "xe_res_cursor.h"
35 #include "xe_shrinker.h"
36 #include "xe_trace_bo.h"
37 #include "xe_ttm_stolen_mgr.h"
38 #include "xe_vm.h"
39 
40 const char *const xe_mem_type_to_name[TTM_NUM_MEM_TYPES]  = {
41 	[XE_PL_SYSTEM] = "system",
42 	[XE_PL_TT] = "gtt",
43 	[XE_PL_VRAM0] = "vram0",
44 	[XE_PL_VRAM1] = "vram1",
45 	[XE_PL_STOLEN] = "stolen"
46 };
47 
48 static const struct ttm_place sys_placement_flags = {
49 	.fpfn = 0,
50 	.lpfn = 0,
51 	.mem_type = XE_PL_SYSTEM,
52 	.flags = 0,
53 };
54 
55 static struct ttm_placement sys_placement = {
56 	.num_placement = 1,
57 	.placement = &sys_placement_flags,
58 };
59 
60 static struct ttm_placement purge_placement;
61 
62 static const struct ttm_place tt_placement_flags[] = {
63 	{
64 		.fpfn = 0,
65 		.lpfn = 0,
66 		.mem_type = XE_PL_TT,
67 		.flags = TTM_PL_FLAG_DESIRED,
68 	},
69 	{
70 		.fpfn = 0,
71 		.lpfn = 0,
72 		.mem_type = XE_PL_SYSTEM,
73 		.flags = TTM_PL_FLAG_FALLBACK,
74 	}
75 };
76 
77 static struct ttm_placement tt_placement = {
78 	.num_placement = 2,
79 	.placement = tt_placement_flags,
80 };
81 
mem_type_is_vram(u32 mem_type)82 bool mem_type_is_vram(u32 mem_type)
83 {
84 	return mem_type >= XE_PL_VRAM0 && mem_type != XE_PL_STOLEN;
85 }
86 
resource_is_stolen_vram(struct xe_device * xe,struct ttm_resource * res)87 static bool resource_is_stolen_vram(struct xe_device *xe, struct ttm_resource *res)
88 {
89 	return res->mem_type == XE_PL_STOLEN && IS_DGFX(xe);
90 }
91 
resource_is_vram(struct ttm_resource * res)92 static bool resource_is_vram(struct ttm_resource *res)
93 {
94 	return mem_type_is_vram(res->mem_type);
95 }
96 
xe_bo_is_vram(struct xe_bo * bo)97 bool xe_bo_is_vram(struct xe_bo *bo)
98 {
99 	return resource_is_vram(bo->ttm.resource) ||
100 		resource_is_stolen_vram(xe_bo_device(bo), bo->ttm.resource);
101 }
102 
xe_bo_is_stolen(struct xe_bo * bo)103 bool xe_bo_is_stolen(struct xe_bo *bo)
104 {
105 	return bo->ttm.resource->mem_type == XE_PL_STOLEN;
106 }
107 
108 /**
109  * xe_bo_has_single_placement - check if BO is placed only in one memory location
110  * @bo: The BO
111  *
112  * This function checks whether a given BO is placed in only one memory location.
113  *
114  * Returns: true if the BO is placed in a single memory location, false otherwise.
115  *
116  */
xe_bo_has_single_placement(struct xe_bo * bo)117 bool xe_bo_has_single_placement(struct xe_bo *bo)
118 {
119 	return bo->placement.num_placement == 1;
120 }
121 
122 /**
123  * xe_bo_is_stolen_devmem - check if BO is of stolen type accessed via PCI BAR
124  * @bo: The BO
125  *
126  * The stolen memory is accessed through the PCI BAR for both DGFX and some
127  * integrated platforms that have a dedicated bit in the PTE for devmem (DM).
128  *
129  * Returns: true if it's stolen memory accessed via PCI BAR, false otherwise.
130  */
xe_bo_is_stolen_devmem(struct xe_bo * bo)131 bool xe_bo_is_stolen_devmem(struct xe_bo *bo)
132 {
133 	return xe_bo_is_stolen(bo) &&
134 		GRAPHICS_VERx100(xe_bo_device(bo)) >= 1270;
135 }
136 
137 /**
138  * xe_bo_is_vm_bound - check if BO has any mappings through VM_BIND
139  * @bo: The BO
140  *
141  * Check if a given bo is bound through VM_BIND. This requires the
142  * reservation lock for the BO to be held.
143  *
144  * Returns: boolean
145  */
xe_bo_is_vm_bound(struct xe_bo * bo)146 bool xe_bo_is_vm_bound(struct xe_bo *bo)
147 {
148 	xe_bo_assert_held(bo);
149 
150 	return !list_empty(&bo->ttm.base.gpuva.list);
151 }
152 
xe_bo_is_user(struct xe_bo * bo)153 static bool xe_bo_is_user(struct xe_bo *bo)
154 {
155 	return bo->flags & XE_BO_FLAG_USER;
156 }
157 
158 static struct xe_migrate *
mem_type_to_migrate(struct xe_device * xe,u32 mem_type)159 mem_type_to_migrate(struct xe_device *xe, u32 mem_type)
160 {
161 	struct xe_tile *tile;
162 
163 	xe_assert(xe, mem_type == XE_PL_STOLEN || mem_type_is_vram(mem_type));
164 	tile = &xe->tiles[mem_type == XE_PL_STOLEN ? 0 : (mem_type - XE_PL_VRAM0)];
165 	return tile->migrate;
166 }
167 
res_to_mem_region(struct ttm_resource * res)168 static struct xe_vram_region *res_to_mem_region(struct ttm_resource *res)
169 {
170 	struct xe_device *xe = ttm_to_xe_device(res->bo->bdev);
171 	struct ttm_resource_manager *mgr;
172 	struct xe_ttm_vram_mgr *vram_mgr;
173 
174 	xe_assert(xe, resource_is_vram(res));
175 	mgr = ttm_manager_type(&xe->ttm, res->mem_type);
176 	vram_mgr = to_xe_ttm_vram_mgr(mgr);
177 
178 	return container_of(vram_mgr, struct xe_vram_region, ttm);
179 }
180 
try_add_system(struct xe_device * xe,struct xe_bo * bo,u32 bo_flags,u32 * c)181 static void try_add_system(struct xe_device *xe, struct xe_bo *bo,
182 			   u32 bo_flags, u32 *c)
183 {
184 	if (bo_flags & XE_BO_FLAG_SYSTEM) {
185 		xe_assert(xe, *c < ARRAY_SIZE(bo->placements));
186 
187 		bo->placements[*c] = (struct ttm_place) {
188 			.mem_type = XE_PL_TT,
189 			.flags = (bo_flags & XE_BO_FLAG_VRAM_MASK) ?
190 			TTM_PL_FLAG_FALLBACK : 0,
191 		};
192 		*c += 1;
193 	}
194 }
195 
force_contiguous(u32 bo_flags)196 static bool force_contiguous(u32 bo_flags)
197 {
198 	if (bo_flags & XE_BO_FLAG_STOLEN)
199 		return true; /* users expect this */
200 	else if (bo_flags & XE_BO_FLAG_PINNED &&
201 		 !(bo_flags & XE_BO_FLAG_PINNED_LATE_RESTORE))
202 		return true; /* needs vmap */
203 
204 	/*
205 	 * For eviction / restore on suspend / resume objects pinned in VRAM
206 	 * must be contiguous, also only contiguous BOs support xe_bo_vmap.
207 	 */
208 	return bo_flags & XE_BO_FLAG_NEEDS_CPU_ACCESS &&
209 	       bo_flags & XE_BO_FLAG_PINNED;
210 }
211 
add_vram(struct xe_device * xe,struct xe_bo * bo,struct ttm_place * places,u32 bo_flags,u32 mem_type,u32 * c)212 static void add_vram(struct xe_device *xe, struct xe_bo *bo,
213 		     struct ttm_place *places, u32 bo_flags, u32 mem_type, u32 *c)
214 {
215 	struct ttm_place place = { .mem_type = mem_type };
216 	struct ttm_resource_manager *mgr = ttm_manager_type(&xe->ttm, mem_type);
217 	struct xe_ttm_vram_mgr *vram_mgr = to_xe_ttm_vram_mgr(mgr);
218 
219 	struct xe_vram_region *vram;
220 	u64 io_size;
221 
222 	xe_assert(xe, *c < ARRAY_SIZE(bo->placements));
223 
224 	vram = container_of(vram_mgr, struct xe_vram_region, ttm);
225 	xe_assert(xe, vram && vram->usable_size);
226 	io_size = vram->io_size;
227 
228 	if (force_contiguous(bo_flags))
229 		place.flags |= TTM_PL_FLAG_CONTIGUOUS;
230 
231 	if (io_size < vram->usable_size) {
232 		if (bo_flags & XE_BO_FLAG_NEEDS_CPU_ACCESS) {
233 			place.fpfn = 0;
234 			place.lpfn = io_size >> PAGE_SHIFT;
235 		} else {
236 			place.flags |= TTM_PL_FLAG_TOPDOWN;
237 		}
238 	}
239 	places[*c] = place;
240 	*c += 1;
241 }
242 
try_add_vram(struct xe_device * xe,struct xe_bo * bo,u32 bo_flags,u32 * c)243 static void try_add_vram(struct xe_device *xe, struct xe_bo *bo,
244 			 u32 bo_flags, u32 *c)
245 {
246 	if (bo_flags & XE_BO_FLAG_VRAM0)
247 		add_vram(xe, bo, bo->placements, bo_flags, XE_PL_VRAM0, c);
248 	if (bo_flags & XE_BO_FLAG_VRAM1)
249 		add_vram(xe, bo, bo->placements, bo_flags, XE_PL_VRAM1, c);
250 }
251 
try_add_stolen(struct xe_device * xe,struct xe_bo * bo,u32 bo_flags,u32 * c)252 static void try_add_stolen(struct xe_device *xe, struct xe_bo *bo,
253 			   u32 bo_flags, u32 *c)
254 {
255 	if (bo_flags & XE_BO_FLAG_STOLEN) {
256 		xe_assert(xe, *c < ARRAY_SIZE(bo->placements));
257 
258 		bo->placements[*c] = (struct ttm_place) {
259 			.mem_type = XE_PL_STOLEN,
260 			.flags = force_contiguous(bo_flags) ?
261 				TTM_PL_FLAG_CONTIGUOUS : 0,
262 		};
263 		*c += 1;
264 	}
265 }
266 
__xe_bo_placement_for_flags(struct xe_device * xe,struct xe_bo * bo,u32 bo_flags)267 static int __xe_bo_placement_for_flags(struct xe_device *xe, struct xe_bo *bo,
268 				       u32 bo_flags)
269 {
270 	u32 c = 0;
271 
272 	try_add_vram(xe, bo, bo_flags, &c);
273 	try_add_system(xe, bo, bo_flags, &c);
274 	try_add_stolen(xe, bo, bo_flags, &c);
275 
276 	if (!c)
277 		return -EINVAL;
278 
279 	bo->placement = (struct ttm_placement) {
280 		.num_placement = c,
281 		.placement = bo->placements,
282 	};
283 
284 	return 0;
285 }
286 
xe_bo_placement_for_flags(struct xe_device * xe,struct xe_bo * bo,u32 bo_flags)287 int xe_bo_placement_for_flags(struct xe_device *xe, struct xe_bo *bo,
288 			      u32 bo_flags)
289 {
290 	xe_bo_assert_held(bo);
291 	return __xe_bo_placement_for_flags(xe, bo, bo_flags);
292 }
293 
xe_evict_flags(struct ttm_buffer_object * tbo,struct ttm_placement * placement)294 static void xe_evict_flags(struct ttm_buffer_object *tbo,
295 			   struct ttm_placement *placement)
296 {
297 	struct xe_device *xe = container_of(tbo->bdev, typeof(*xe), ttm);
298 	bool device_unplugged = drm_dev_is_unplugged(&xe->drm);
299 	struct xe_bo *bo;
300 
301 	if (!xe_bo_is_xe_bo(tbo)) {
302 		/* Don't handle scatter gather BOs */
303 		if (tbo->type == ttm_bo_type_sg) {
304 			placement->num_placement = 0;
305 			return;
306 		}
307 
308 		*placement = device_unplugged ? purge_placement : sys_placement;
309 		return;
310 	}
311 
312 	bo = ttm_to_xe_bo(tbo);
313 	if (bo->flags & XE_BO_FLAG_CPU_ADDR_MIRROR) {
314 		*placement = sys_placement;
315 		return;
316 	}
317 
318 	if (device_unplugged && !tbo->base.dma_buf) {
319 		*placement = purge_placement;
320 		return;
321 	}
322 
323 	/*
324 	 * For xe, sg bos that are evicted to system just triggers a
325 	 * rebind of the sg list upon subsequent validation to XE_PL_TT.
326 	 */
327 	switch (tbo->resource->mem_type) {
328 	case XE_PL_VRAM0:
329 	case XE_PL_VRAM1:
330 	case XE_PL_STOLEN:
331 		*placement = tt_placement;
332 		break;
333 	case XE_PL_TT:
334 	default:
335 		*placement = sys_placement;
336 		break;
337 	}
338 }
339 
340 /* struct xe_ttm_tt - Subclassed ttm_tt for xe */
341 struct xe_ttm_tt {
342 	struct ttm_tt ttm;
343 	struct sg_table sgt;
344 	struct sg_table *sg;
345 	/** @purgeable: Whether the content of the pages of @ttm is purgeable. */
346 	bool purgeable;
347 };
348 
xe_tt_map_sg(struct xe_device * xe,struct ttm_tt * tt)349 static int xe_tt_map_sg(struct xe_device *xe, struct ttm_tt *tt)
350 {
351 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
352 	unsigned long num_pages = tt->num_pages;
353 	int ret;
354 
355 	XE_WARN_ON((tt->page_flags & TTM_TT_FLAG_EXTERNAL) &&
356 		   !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE));
357 
358 	if (xe_tt->sg)
359 		return 0;
360 
361 	ret = sg_alloc_table_from_pages_segment(&xe_tt->sgt, tt->pages,
362 						num_pages, 0,
363 						(u64)num_pages << PAGE_SHIFT,
364 						xe_sg_segment_size(xe->drm.dev),
365 						GFP_KERNEL);
366 	if (ret)
367 		return ret;
368 
369 	xe_tt->sg = &xe_tt->sgt;
370 	ret = dma_map_sgtable(xe->drm.dev, xe_tt->sg, DMA_BIDIRECTIONAL,
371 			      DMA_ATTR_SKIP_CPU_SYNC);
372 	if (ret) {
373 		sg_free_table(xe_tt->sg);
374 		xe_tt->sg = NULL;
375 		return ret;
376 	}
377 
378 	return 0;
379 }
380 
xe_tt_unmap_sg(struct xe_device * xe,struct ttm_tt * tt)381 static void xe_tt_unmap_sg(struct xe_device *xe, struct ttm_tt *tt)
382 {
383 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
384 
385 	if (xe_tt->sg) {
386 		dma_unmap_sgtable(xe->drm.dev, xe_tt->sg,
387 				  DMA_BIDIRECTIONAL, 0);
388 		sg_free_table(xe_tt->sg);
389 		xe_tt->sg = NULL;
390 	}
391 }
392 
xe_bo_sg(struct xe_bo * bo)393 struct sg_table *xe_bo_sg(struct xe_bo *bo)
394 {
395 	struct ttm_tt *tt = bo->ttm.ttm;
396 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
397 
398 	return xe_tt->sg;
399 }
400 
401 /*
402  * Account ttm pages against the device shrinker's shrinkable and
403  * purgeable counts.
404  */
xe_ttm_tt_account_add(struct xe_device * xe,struct ttm_tt * tt)405 static void xe_ttm_tt_account_add(struct xe_device *xe, struct ttm_tt *tt)
406 {
407 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
408 
409 	if (xe_tt->purgeable)
410 		xe_shrinker_mod_pages(xe->mem.shrinker, 0, tt->num_pages);
411 	else
412 		xe_shrinker_mod_pages(xe->mem.shrinker, tt->num_pages, 0);
413 }
414 
xe_ttm_tt_account_subtract(struct xe_device * xe,struct ttm_tt * tt)415 static void xe_ttm_tt_account_subtract(struct xe_device *xe, struct ttm_tt *tt)
416 {
417 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
418 
419 	if (xe_tt->purgeable)
420 		xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt->num_pages);
421 	else
422 		xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt->num_pages, 0);
423 }
424 
update_global_total_pages(struct ttm_device * ttm_dev,long num_pages)425 static void update_global_total_pages(struct ttm_device *ttm_dev,
426 				      long num_pages)
427 {
428 #if IS_ENABLED(CONFIG_TRACE_GPU_MEM)
429 	struct xe_device *xe = ttm_to_xe_device(ttm_dev);
430 	u64 global_total_pages =
431 		atomic64_add_return(num_pages, &xe->global_total_pages);
432 
433 	trace_gpu_mem_total(xe->drm.primary->index, 0,
434 			    global_total_pages << PAGE_SHIFT);
435 #endif
436 }
437 
xe_ttm_tt_create(struct ttm_buffer_object * ttm_bo,u32 page_flags)438 static struct ttm_tt *xe_ttm_tt_create(struct ttm_buffer_object *ttm_bo,
439 				       u32 page_flags)
440 {
441 	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
442 	struct xe_device *xe = xe_bo_device(bo);
443 	struct xe_ttm_tt *xe_tt;
444 	struct ttm_tt *tt;
445 	unsigned long extra_pages;
446 	enum ttm_caching caching = ttm_cached;
447 	int err;
448 
449 	xe_tt = kzalloc(sizeof(*xe_tt), GFP_KERNEL);
450 	if (!xe_tt)
451 		return NULL;
452 
453 	tt = &xe_tt->ttm;
454 
455 	extra_pages = 0;
456 	if (xe_bo_needs_ccs_pages(bo))
457 		extra_pages = DIV_ROUND_UP(xe_device_ccs_bytes(xe, xe_bo_size(bo)),
458 					   PAGE_SIZE);
459 
460 	/*
461 	 * DGFX system memory is always WB / ttm_cached, since
462 	 * other caching modes are only supported on x86. DGFX
463 	 * GPU system memory accesses are always coherent with the
464 	 * CPU.
465 	 */
466 	if (!IS_DGFX(xe)) {
467 		switch (bo->cpu_caching) {
468 		case DRM_XE_GEM_CPU_CACHING_WC:
469 			caching = ttm_write_combined;
470 			break;
471 		default:
472 			caching = ttm_cached;
473 			break;
474 		}
475 
476 		WARN_ON((bo->flags & XE_BO_FLAG_USER) && !bo->cpu_caching);
477 
478 		/*
479 		 * Display scanout is always non-coherent with the CPU cache.
480 		 *
481 		 * For Xe_LPG and beyond, PPGTT PTE lookups are also
482 		 * non-coherent and require a CPU:WC mapping.
483 		 */
484 		if ((!bo->cpu_caching && bo->flags & XE_BO_FLAG_SCANOUT) ||
485 		    (xe->info.graphics_verx100 >= 1270 &&
486 		     bo->flags & XE_BO_FLAG_PAGETABLE))
487 			caching = ttm_write_combined;
488 	}
489 
490 	if (bo->flags & XE_BO_FLAG_NEEDS_UC) {
491 		/*
492 		 * Valid only for internally-created buffers only, for
493 		 * which cpu_caching is never initialized.
494 		 */
495 		xe_assert(xe, bo->cpu_caching == 0);
496 		caching = ttm_uncached;
497 	}
498 
499 	if (ttm_bo->type != ttm_bo_type_sg)
500 		page_flags |= TTM_TT_FLAG_EXTERNAL | TTM_TT_FLAG_EXTERNAL_MAPPABLE;
501 
502 	err = ttm_tt_init(tt, &bo->ttm, page_flags, caching, extra_pages);
503 	if (err) {
504 		kfree(xe_tt);
505 		return NULL;
506 	}
507 
508 	if (ttm_bo->type != ttm_bo_type_sg) {
509 		err = ttm_tt_setup_backup(tt);
510 		if (err) {
511 			ttm_tt_fini(tt);
512 			kfree(xe_tt);
513 			return NULL;
514 		}
515 	}
516 
517 	return tt;
518 }
519 
xe_ttm_tt_populate(struct ttm_device * ttm_dev,struct ttm_tt * tt,struct ttm_operation_ctx * ctx)520 static int xe_ttm_tt_populate(struct ttm_device *ttm_dev, struct ttm_tt *tt,
521 			      struct ttm_operation_ctx *ctx)
522 {
523 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
524 	int err;
525 
526 	/*
527 	 * dma-bufs are not populated with pages, and the dma-
528 	 * addresses are set up when moved to XE_PL_TT.
529 	 */
530 	if ((tt->page_flags & TTM_TT_FLAG_EXTERNAL) &&
531 	    !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE))
532 		return 0;
533 
534 	if (ttm_tt_is_backed_up(tt) && !xe_tt->purgeable) {
535 		err = ttm_tt_restore(ttm_dev, tt, ctx);
536 	} else {
537 		ttm_tt_clear_backed_up(tt);
538 		err = ttm_pool_alloc(&ttm_dev->pool, tt, ctx);
539 	}
540 	if (err)
541 		return err;
542 
543 	xe_tt->purgeable = false;
544 	xe_ttm_tt_account_add(ttm_to_xe_device(ttm_dev), tt);
545 	update_global_total_pages(ttm_dev, tt->num_pages);
546 
547 	return 0;
548 }
549 
xe_ttm_tt_unpopulate(struct ttm_device * ttm_dev,struct ttm_tt * tt)550 static void xe_ttm_tt_unpopulate(struct ttm_device *ttm_dev, struct ttm_tt *tt)
551 {
552 	struct xe_device *xe = ttm_to_xe_device(ttm_dev);
553 
554 	if ((tt->page_flags & TTM_TT_FLAG_EXTERNAL) &&
555 	    !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE))
556 		return;
557 
558 	xe_tt_unmap_sg(xe, tt);
559 
560 	ttm_pool_free(&ttm_dev->pool, tt);
561 	xe_ttm_tt_account_subtract(xe, tt);
562 	update_global_total_pages(ttm_dev, -(long)tt->num_pages);
563 }
564 
xe_ttm_tt_destroy(struct ttm_device * ttm_dev,struct ttm_tt * tt)565 static void xe_ttm_tt_destroy(struct ttm_device *ttm_dev, struct ttm_tt *tt)
566 {
567 	ttm_tt_fini(tt);
568 	kfree(tt);
569 }
570 
xe_ttm_resource_visible(struct ttm_resource * mem)571 static bool xe_ttm_resource_visible(struct ttm_resource *mem)
572 {
573 	struct xe_ttm_vram_mgr_resource *vres =
574 		to_xe_ttm_vram_mgr_resource(mem);
575 
576 	return vres->used_visible_size == mem->size;
577 }
578 
xe_ttm_io_mem_reserve(struct ttm_device * bdev,struct ttm_resource * mem)579 static int xe_ttm_io_mem_reserve(struct ttm_device *bdev,
580 				 struct ttm_resource *mem)
581 {
582 	struct xe_device *xe = ttm_to_xe_device(bdev);
583 
584 	switch (mem->mem_type) {
585 	case XE_PL_SYSTEM:
586 	case XE_PL_TT:
587 		return 0;
588 	case XE_PL_VRAM0:
589 	case XE_PL_VRAM1: {
590 		struct xe_vram_region *vram = res_to_mem_region(mem);
591 
592 		if (!xe_ttm_resource_visible(mem))
593 			return -EINVAL;
594 
595 		mem->bus.offset = mem->start << PAGE_SHIFT;
596 
597 		if (vram->mapping &&
598 		    mem->placement & TTM_PL_FLAG_CONTIGUOUS)
599 			mem->bus.addr = (u8 __force *)vram->mapping +
600 				mem->bus.offset;
601 
602 		mem->bus.offset += vram->io_start;
603 		mem->bus.is_iomem = true;
604 
605 #if  !IS_ENABLED(CONFIG_X86)
606 		mem->bus.caching = ttm_write_combined;
607 #endif
608 		return 0;
609 	} case XE_PL_STOLEN:
610 		return xe_ttm_stolen_io_mem_reserve(xe, mem);
611 	default:
612 		return -EINVAL;
613 	}
614 }
615 
xe_bo_trigger_rebind(struct xe_device * xe,struct xe_bo * bo,const struct ttm_operation_ctx * ctx)616 static int xe_bo_trigger_rebind(struct xe_device *xe, struct xe_bo *bo,
617 				const struct ttm_operation_ctx *ctx)
618 {
619 	struct dma_resv_iter cursor;
620 	struct dma_fence *fence;
621 	struct drm_gem_object *obj = &bo->ttm.base;
622 	struct drm_gpuvm_bo *vm_bo;
623 	bool idle = false;
624 	int ret = 0;
625 
626 	dma_resv_assert_held(bo->ttm.base.resv);
627 
628 	if (!list_empty(&bo->ttm.base.gpuva.list)) {
629 		dma_resv_iter_begin(&cursor, bo->ttm.base.resv,
630 				    DMA_RESV_USAGE_BOOKKEEP);
631 		dma_resv_for_each_fence_unlocked(&cursor, fence)
632 			dma_fence_enable_sw_signaling(fence);
633 		dma_resv_iter_end(&cursor);
634 	}
635 
636 	drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
637 		struct xe_vm *vm = gpuvm_to_vm(vm_bo->vm);
638 		struct drm_gpuva *gpuva;
639 
640 		if (!xe_vm_in_fault_mode(vm)) {
641 			drm_gpuvm_bo_evict(vm_bo, true);
642 			continue;
643 		}
644 
645 		if (!idle) {
646 			long timeout;
647 
648 			if (ctx->no_wait_gpu &&
649 			    !dma_resv_test_signaled(bo->ttm.base.resv,
650 						    DMA_RESV_USAGE_BOOKKEEP))
651 				return -EBUSY;
652 
653 			timeout = dma_resv_wait_timeout(bo->ttm.base.resv,
654 							DMA_RESV_USAGE_BOOKKEEP,
655 							ctx->interruptible,
656 							MAX_SCHEDULE_TIMEOUT);
657 			if (!timeout)
658 				return -ETIME;
659 			if (timeout < 0)
660 				return timeout;
661 
662 			idle = true;
663 		}
664 
665 		drm_gpuvm_bo_for_each_va(gpuva, vm_bo) {
666 			struct xe_vma *vma = gpuva_to_vma(gpuva);
667 
668 			trace_xe_vma_evict(vma);
669 			ret = xe_vm_invalidate_vma(vma);
670 			if (XE_WARN_ON(ret))
671 				return ret;
672 		}
673 	}
674 
675 	return ret;
676 }
677 
678 /*
679  * The dma-buf map_attachment() / unmap_attachment() is hooked up here.
680  * Note that unmapping the attachment is deferred to the next
681  * map_attachment time, or to bo destroy (after idling) whichever comes first.
682  * This is to avoid syncing before unmap_attachment(), assuming that the
683  * caller relies on idling the reservation object before moving the
684  * backing store out. Should that assumption not hold, then we will be able
685  * to unconditionally call unmap_attachment() when moving out to system.
686  */
xe_bo_move_dmabuf(struct ttm_buffer_object * ttm_bo,struct ttm_resource * new_res)687 static int xe_bo_move_dmabuf(struct ttm_buffer_object *ttm_bo,
688 			     struct ttm_resource *new_res)
689 {
690 	struct dma_buf_attachment *attach = ttm_bo->base.import_attach;
691 	struct xe_ttm_tt *xe_tt = container_of(ttm_bo->ttm, struct xe_ttm_tt,
692 					       ttm);
693 	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
694 	bool device_unplugged = drm_dev_is_unplugged(&xe->drm);
695 	struct sg_table *sg;
696 
697 	xe_assert(xe, attach);
698 	xe_assert(xe, ttm_bo->ttm);
699 
700 	if (device_unplugged && new_res->mem_type == XE_PL_SYSTEM &&
701 	    ttm_bo->sg) {
702 		dma_resv_wait_timeout(ttm_bo->base.resv, DMA_RESV_USAGE_BOOKKEEP,
703 				      false, MAX_SCHEDULE_TIMEOUT);
704 		dma_buf_unmap_attachment(attach, ttm_bo->sg, DMA_BIDIRECTIONAL);
705 		ttm_bo->sg = NULL;
706 	}
707 
708 	if (new_res->mem_type == XE_PL_SYSTEM)
709 		goto out;
710 
711 	if (ttm_bo->sg) {
712 		dma_buf_unmap_attachment(attach, ttm_bo->sg, DMA_BIDIRECTIONAL);
713 		ttm_bo->sg = NULL;
714 	}
715 
716 	sg = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
717 	if (IS_ERR(sg))
718 		return PTR_ERR(sg);
719 
720 	ttm_bo->sg = sg;
721 	xe_tt->sg = sg;
722 
723 out:
724 	ttm_bo_move_null(ttm_bo, new_res);
725 
726 	return 0;
727 }
728 
729 /**
730  * xe_bo_move_notify - Notify subsystems of a pending move
731  * @bo: The buffer object
732  * @ctx: The struct ttm_operation_ctx controlling locking and waits.
733  *
734  * This function notifies subsystems of an upcoming buffer move.
735  * Upon receiving such a notification, subsystems should schedule
736  * halting access to the underlying pages and optionally add a fence
737  * to the buffer object's dma_resv object, that signals when access is
738  * stopped. The caller will wait on all dma_resv fences before
739  * starting the move.
740  *
741  * A subsystem may commence access to the object after obtaining
742  * bindings to the new backing memory under the object lock.
743  *
744  * Return: 0 on success, -EINTR or -ERESTARTSYS if interrupted in fault mode,
745  * negative error code on error.
746  */
xe_bo_move_notify(struct xe_bo * bo,const struct ttm_operation_ctx * ctx)747 static int xe_bo_move_notify(struct xe_bo *bo,
748 			     const struct ttm_operation_ctx *ctx)
749 {
750 	struct ttm_buffer_object *ttm_bo = &bo->ttm;
751 	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
752 	struct ttm_resource *old_mem = ttm_bo->resource;
753 	u32 old_mem_type = old_mem ? old_mem->mem_type : XE_PL_SYSTEM;
754 	int ret;
755 
756 	/*
757 	 * If this starts to call into many components, consider
758 	 * using a notification chain here.
759 	 */
760 
761 	if (xe_bo_is_pinned(bo))
762 		return -EINVAL;
763 
764 	xe_bo_vunmap(bo);
765 	ret = xe_bo_trigger_rebind(xe, bo, ctx);
766 	if (ret)
767 		return ret;
768 
769 	/* Don't call move_notify() for imported dma-bufs. */
770 	if (ttm_bo->base.dma_buf && !ttm_bo->base.import_attach)
771 		dma_buf_move_notify(ttm_bo->base.dma_buf);
772 
773 	/*
774 	 * TTM has already nuked the mmap for us (see ttm_bo_unmap_virtual),
775 	 * so if we moved from VRAM make sure to unlink this from the userfault
776 	 * tracking.
777 	 */
778 	if (mem_type_is_vram(old_mem_type)) {
779 		mutex_lock(&xe->mem_access.vram_userfault.lock);
780 		if (!list_empty(&bo->vram_userfault_link))
781 			list_del_init(&bo->vram_userfault_link);
782 		mutex_unlock(&xe->mem_access.vram_userfault.lock);
783 	}
784 
785 	return 0;
786 }
787 
xe_bo_move(struct ttm_buffer_object * ttm_bo,bool evict,struct ttm_operation_ctx * ctx,struct ttm_resource * new_mem,struct ttm_place * hop)788 static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
789 		      struct ttm_operation_ctx *ctx,
790 		      struct ttm_resource *new_mem,
791 		      struct ttm_place *hop)
792 {
793 	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
794 	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
795 	struct ttm_resource *old_mem = ttm_bo->resource;
796 	u32 old_mem_type = old_mem ? old_mem->mem_type : XE_PL_SYSTEM;
797 	struct ttm_tt *ttm = ttm_bo->ttm;
798 	struct xe_migrate *migrate = NULL;
799 	struct dma_fence *fence;
800 	bool move_lacks_source;
801 	bool tt_has_data;
802 	bool needs_clear;
803 	bool handle_system_ccs = (!IS_DGFX(xe) && xe_bo_needs_ccs_pages(bo) &&
804 				  ttm && ttm_tt_is_populated(ttm)) ? true : false;
805 	int ret = 0;
806 
807 	/* Bo creation path, moving to system or TT. */
808 	if ((!old_mem && ttm) && !handle_system_ccs) {
809 		if (new_mem->mem_type == XE_PL_TT)
810 			ret = xe_tt_map_sg(xe, ttm);
811 		if (!ret)
812 			ttm_bo_move_null(ttm_bo, new_mem);
813 		goto out;
814 	}
815 
816 	if (ttm_bo->type == ttm_bo_type_sg) {
817 		if (new_mem->mem_type == XE_PL_SYSTEM)
818 			ret = xe_bo_move_notify(bo, ctx);
819 		if (!ret)
820 			ret = xe_bo_move_dmabuf(ttm_bo, new_mem);
821 		return ret;
822 	}
823 
824 	tt_has_data = ttm && (ttm_tt_is_populated(ttm) || ttm_tt_is_swapped(ttm));
825 
826 	move_lacks_source = !old_mem || (handle_system_ccs ? (!bo->ccs_cleared) :
827 					 (!mem_type_is_vram(old_mem_type) && !tt_has_data));
828 
829 	needs_clear = (ttm && ttm->page_flags & TTM_TT_FLAG_ZERO_ALLOC) ||
830 		(!ttm && ttm_bo->type == ttm_bo_type_device);
831 
832 	if (new_mem->mem_type == XE_PL_TT) {
833 		ret = xe_tt_map_sg(xe, ttm);
834 		if (ret)
835 			goto out;
836 	}
837 
838 	if ((move_lacks_source && !needs_clear)) {
839 		ttm_bo_move_null(ttm_bo, new_mem);
840 		goto out;
841 	}
842 
843 	if (!move_lacks_source && (bo->flags & XE_BO_FLAG_CPU_ADDR_MIRROR) &&
844 	    new_mem->mem_type == XE_PL_SYSTEM) {
845 		ret = xe_svm_bo_evict(bo);
846 		if (!ret) {
847 			drm_dbg(&xe->drm, "Evict system allocator BO success\n");
848 			ttm_bo_move_null(ttm_bo, new_mem);
849 		} else {
850 			drm_dbg(&xe->drm, "Evict system allocator BO failed=%pe\n",
851 				ERR_PTR(ret));
852 		}
853 
854 		goto out;
855 	}
856 
857 	if (old_mem_type == XE_PL_SYSTEM && new_mem->mem_type == XE_PL_TT && !handle_system_ccs) {
858 		ttm_bo_move_null(ttm_bo, new_mem);
859 		goto out;
860 	}
861 
862 	/*
863 	 * Failed multi-hop where the old_mem is still marked as
864 	 * TTM_PL_FLAG_TEMPORARY, should just be a dummy move.
865 	 */
866 	if (old_mem_type == XE_PL_TT &&
867 	    new_mem->mem_type == XE_PL_TT) {
868 		ttm_bo_move_null(ttm_bo, new_mem);
869 		goto out;
870 	}
871 
872 	if (!move_lacks_source && !xe_bo_is_pinned(bo)) {
873 		ret = xe_bo_move_notify(bo, ctx);
874 		if (ret)
875 			goto out;
876 	}
877 
878 	if (old_mem_type == XE_PL_TT &&
879 	    new_mem->mem_type == XE_PL_SYSTEM) {
880 		long timeout = dma_resv_wait_timeout(ttm_bo->base.resv,
881 						     DMA_RESV_USAGE_BOOKKEEP,
882 						     false,
883 						     MAX_SCHEDULE_TIMEOUT);
884 		if (timeout < 0) {
885 			ret = timeout;
886 			goto out;
887 		}
888 
889 		if (!handle_system_ccs) {
890 			ttm_bo_move_null(ttm_bo, new_mem);
891 			goto out;
892 		}
893 	}
894 
895 	if (!move_lacks_source &&
896 	    ((old_mem_type == XE_PL_SYSTEM && resource_is_vram(new_mem)) ||
897 	     (mem_type_is_vram(old_mem_type) &&
898 	      new_mem->mem_type == XE_PL_SYSTEM))) {
899 		hop->fpfn = 0;
900 		hop->lpfn = 0;
901 		hop->mem_type = XE_PL_TT;
902 		hop->flags = TTM_PL_FLAG_TEMPORARY;
903 		ret = -EMULTIHOP;
904 		goto out;
905 	}
906 
907 	if (bo->tile)
908 		migrate = bo->tile->migrate;
909 	else if (resource_is_vram(new_mem))
910 		migrate = mem_type_to_migrate(xe, new_mem->mem_type);
911 	else if (mem_type_is_vram(old_mem_type))
912 		migrate = mem_type_to_migrate(xe, old_mem_type);
913 	else
914 		migrate = xe->tiles[0].migrate;
915 
916 	xe_assert(xe, migrate);
917 	trace_xe_bo_move(bo, new_mem->mem_type, old_mem_type, move_lacks_source);
918 	if (xe_rpm_reclaim_safe(xe)) {
919 		/*
920 		 * We might be called through swapout in the validation path of
921 		 * another TTM device, so acquire rpm here.
922 		 */
923 		xe_pm_runtime_get(xe);
924 	} else {
925 		drm_WARN_ON(&xe->drm, handle_system_ccs);
926 		xe_pm_runtime_get_noresume(xe);
927 	}
928 
929 	if (move_lacks_source) {
930 		u32 flags = 0;
931 
932 		if (mem_type_is_vram(new_mem->mem_type))
933 			flags |= XE_MIGRATE_CLEAR_FLAG_FULL;
934 		else if (handle_system_ccs)
935 			flags |= XE_MIGRATE_CLEAR_FLAG_CCS_DATA;
936 
937 		fence = xe_migrate_clear(migrate, bo, new_mem, flags);
938 	} else {
939 		fence = xe_migrate_copy(migrate, bo, bo, old_mem, new_mem,
940 					handle_system_ccs);
941 	}
942 	if (IS_ERR(fence)) {
943 		ret = PTR_ERR(fence);
944 		xe_pm_runtime_put(xe);
945 		goto out;
946 	}
947 	if (!move_lacks_source) {
948 		ret = ttm_bo_move_accel_cleanup(ttm_bo, fence, evict, true,
949 						new_mem);
950 		if (ret) {
951 			dma_fence_wait(fence, false);
952 			ttm_bo_move_null(ttm_bo, new_mem);
953 			ret = 0;
954 		}
955 	} else {
956 		/*
957 		 * ttm_bo_move_accel_cleanup() may blow up if
958 		 * bo->resource == NULL, so just attach the
959 		 * fence and set the new resource.
960 		 */
961 		dma_resv_add_fence(ttm_bo->base.resv, fence,
962 				   DMA_RESV_USAGE_KERNEL);
963 		ttm_bo_move_null(ttm_bo, new_mem);
964 	}
965 
966 	dma_fence_put(fence);
967 	xe_pm_runtime_put(xe);
968 
969 out:
970 	if ((!ttm_bo->resource || ttm_bo->resource->mem_type == XE_PL_SYSTEM) &&
971 	    ttm_bo->ttm) {
972 		long timeout = dma_resv_wait_timeout(ttm_bo->base.resv,
973 						     DMA_RESV_USAGE_KERNEL,
974 						     false,
975 						     MAX_SCHEDULE_TIMEOUT);
976 		if (timeout < 0)
977 			ret = timeout;
978 
979 		xe_tt_unmap_sg(xe, ttm_bo->ttm);
980 	}
981 
982 	return ret;
983 }
984 
xe_bo_shrink_purge(struct ttm_operation_ctx * ctx,struct ttm_buffer_object * bo,unsigned long * scanned)985 static long xe_bo_shrink_purge(struct ttm_operation_ctx *ctx,
986 			       struct ttm_buffer_object *bo,
987 			       unsigned long *scanned)
988 {
989 	struct xe_device *xe = ttm_to_xe_device(bo->bdev);
990 	long lret;
991 
992 	/* Fake move to system, without copying data. */
993 	if (bo->resource->mem_type != XE_PL_SYSTEM) {
994 		struct ttm_resource *new_resource;
995 
996 		lret = ttm_bo_wait_ctx(bo, ctx);
997 		if (lret)
998 			return lret;
999 
1000 		lret = ttm_bo_mem_space(bo, &sys_placement, &new_resource, ctx);
1001 		if (lret)
1002 			return lret;
1003 
1004 		xe_tt_unmap_sg(xe, bo->ttm);
1005 		ttm_bo_move_null(bo, new_resource);
1006 	}
1007 
1008 	*scanned += bo->ttm->num_pages;
1009 	lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
1010 			     {.purge = true,
1011 			      .writeback = false,
1012 			      .allow_move = false});
1013 
1014 	if (lret > 0)
1015 		xe_ttm_tt_account_subtract(xe, bo->ttm);
1016 
1017 	return lret;
1018 }
1019 
1020 static bool
xe_bo_eviction_valuable(struct ttm_buffer_object * bo,const struct ttm_place * place)1021 xe_bo_eviction_valuable(struct ttm_buffer_object *bo, const struct ttm_place *place)
1022 {
1023 	struct drm_gpuvm_bo *vm_bo;
1024 
1025 	if (!ttm_bo_eviction_valuable(bo, place))
1026 		return false;
1027 
1028 	if (!xe_bo_is_xe_bo(bo))
1029 		return true;
1030 
1031 	drm_gem_for_each_gpuvm_bo(vm_bo, &bo->base) {
1032 		if (xe_vm_is_validating(gpuvm_to_vm(vm_bo->vm)))
1033 			return false;
1034 	}
1035 
1036 	return true;
1037 }
1038 
1039 /**
1040  * xe_bo_shrink() - Try to shrink an xe bo.
1041  * @ctx: The struct ttm_operation_ctx used for shrinking.
1042  * @bo: The TTM buffer object whose pages to shrink.
1043  * @flags: Flags governing the shrink behaviour.
1044  * @scanned: Pointer to a counter of the number of pages
1045  * attempted to shrink.
1046  *
1047  * Try to shrink- or purge a bo, and if it succeeds, unmap dma.
1048  * Note that we need to be able to handle also non xe bos
1049  * (ghost bos), but only if the struct ttm_tt is embedded in
1050  * a struct xe_ttm_tt. When the function attempts to shrink
1051  * the pages of a buffer object, The value pointed to by @scanned
1052  * is updated.
1053  *
1054  * Return: The number of pages shrunken or purged, or negative error
1055  * code on failure.
1056  */
xe_bo_shrink(struct ttm_operation_ctx * ctx,struct ttm_buffer_object * bo,const struct xe_bo_shrink_flags flags,unsigned long * scanned)1057 long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
1058 		  const struct xe_bo_shrink_flags flags,
1059 		  unsigned long *scanned)
1060 {
1061 	struct ttm_tt *tt = bo->ttm;
1062 	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
1063 	struct ttm_place place = {.mem_type = bo->resource->mem_type};
1064 	struct xe_bo *xe_bo = ttm_to_xe_bo(bo);
1065 	struct xe_device *xe = ttm_to_xe_device(bo->bdev);
1066 	bool needs_rpm;
1067 	long lret = 0L;
1068 
1069 	if (!(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE) ||
1070 	    (flags.purge && !xe_tt->purgeable))
1071 		return -EBUSY;
1072 
1073 	if (!xe_bo_eviction_valuable(bo, &place))
1074 		return -EBUSY;
1075 
1076 	if (!xe_bo_is_xe_bo(bo) || !xe_bo_get_unless_zero(xe_bo))
1077 		return xe_bo_shrink_purge(ctx, bo, scanned);
1078 
1079 	if (xe_tt->purgeable) {
1080 		if (bo->resource->mem_type != XE_PL_SYSTEM)
1081 			lret = xe_bo_move_notify(xe_bo, ctx);
1082 		if (!lret)
1083 			lret = xe_bo_shrink_purge(ctx, bo, scanned);
1084 		goto out_unref;
1085 	}
1086 
1087 	/* System CCS needs gpu copy when moving PL_TT -> PL_SYSTEM */
1088 	needs_rpm = (!IS_DGFX(xe) && bo->resource->mem_type != XE_PL_SYSTEM &&
1089 		     xe_bo_needs_ccs_pages(xe_bo));
1090 	if (needs_rpm && !xe_pm_runtime_get_if_active(xe))
1091 		goto out_unref;
1092 
1093 	*scanned += tt->num_pages;
1094 	lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
1095 			     {.purge = false,
1096 			      .writeback = flags.writeback,
1097 			      .allow_move = true});
1098 	if (needs_rpm)
1099 		xe_pm_runtime_put(xe);
1100 
1101 	if (lret > 0)
1102 		xe_ttm_tt_account_subtract(xe, tt);
1103 
1104 out_unref:
1105 	xe_bo_put(xe_bo);
1106 
1107 	return lret;
1108 }
1109 
1110 /**
1111  * xe_bo_notifier_prepare_pinned() - Prepare a pinned VRAM object to be backed
1112  * up in system memory.
1113  * @bo: The buffer object to prepare.
1114  *
1115  * On successful completion, the object backup pages are allocated. Expectation
1116  * is that this is called from the PM notifier, prior to suspend/hibernation.
1117  *
1118  * Return: 0 on success. Negative error code on failure.
1119  */
xe_bo_notifier_prepare_pinned(struct xe_bo * bo)1120 int xe_bo_notifier_prepare_pinned(struct xe_bo *bo)
1121 {
1122 	struct xe_device *xe = ttm_to_xe_device(bo->ttm.bdev);
1123 	struct xe_bo *backup;
1124 	int ret = 0;
1125 
1126 	xe_bo_lock(bo, false);
1127 
1128 	xe_assert(xe, !bo->backup_obj);
1129 
1130 	/*
1131 	 * Since this is called from the PM notifier we might have raced with
1132 	 * someone unpinning this after we dropped the pinned list lock and
1133 	 * grabbing the above bo lock.
1134 	 */
1135 	if (!xe_bo_is_pinned(bo))
1136 		goto out_unlock_bo;
1137 
1138 	if (!xe_bo_is_vram(bo))
1139 		goto out_unlock_bo;
1140 
1141 	if (bo->flags & XE_BO_FLAG_PINNED_NORESTORE)
1142 		goto out_unlock_bo;
1143 
1144 	backup = ___xe_bo_create_locked(xe, NULL, NULL, bo->ttm.base.resv, NULL, xe_bo_size(bo),
1145 					DRM_XE_GEM_CPU_CACHING_WB, ttm_bo_type_kernel,
1146 					XE_BO_FLAG_SYSTEM | XE_BO_FLAG_NEEDS_CPU_ACCESS |
1147 					XE_BO_FLAG_PINNED);
1148 	if (IS_ERR(backup)) {
1149 		ret = PTR_ERR(backup);
1150 		goto out_unlock_bo;
1151 	}
1152 
1153 	backup->parent_obj = xe_bo_get(bo); /* Released by bo_destroy */
1154 	ttm_bo_pin(&backup->ttm);
1155 	bo->backup_obj = backup;
1156 
1157 out_unlock_bo:
1158 	xe_bo_unlock(bo);
1159 	return ret;
1160 }
1161 
1162 /**
1163  * xe_bo_notifier_unprepare_pinned() - Undo the previous prepare operation.
1164  * @bo: The buffer object to undo the prepare for.
1165  *
1166  * Always returns 0. The backup object is removed, if still present. Expectation
1167  * it that this called from the PM notifier when undoing the prepare step.
1168  *
1169  * Return: Always returns 0.
1170  */
xe_bo_notifier_unprepare_pinned(struct xe_bo * bo)1171 int xe_bo_notifier_unprepare_pinned(struct xe_bo *bo)
1172 {
1173 	xe_bo_lock(bo, false);
1174 	if (bo->backup_obj) {
1175 		ttm_bo_unpin(&bo->backup_obj->ttm);
1176 		xe_bo_put(bo->backup_obj);
1177 		bo->backup_obj = NULL;
1178 	}
1179 	xe_bo_unlock(bo);
1180 
1181 	return 0;
1182 }
1183 
1184 /**
1185  * xe_bo_evict_pinned() - Evict a pinned VRAM object to system memory
1186  * @bo: The buffer object to move.
1187  *
1188  * On successful completion, the object memory will be moved to system memory.
1189  *
1190  * This is needed to for special handling of pinned VRAM object during
1191  * suspend-resume.
1192  *
1193  * Return: 0 on success. Negative error code on failure.
1194  */
xe_bo_evict_pinned(struct xe_bo * bo)1195 int xe_bo_evict_pinned(struct xe_bo *bo)
1196 {
1197 	struct xe_device *xe = ttm_to_xe_device(bo->ttm.bdev);
1198 	struct xe_bo *backup = bo->backup_obj;
1199 	bool backup_created = false;
1200 	bool unmap = false;
1201 	int ret = 0;
1202 
1203 	xe_bo_lock(bo, false);
1204 
1205 	if (WARN_ON(!bo->ttm.resource)) {
1206 		ret = -EINVAL;
1207 		goto out_unlock_bo;
1208 	}
1209 
1210 	if (WARN_ON(!xe_bo_is_pinned(bo))) {
1211 		ret = -EINVAL;
1212 		goto out_unlock_bo;
1213 	}
1214 
1215 	if (!xe_bo_is_vram(bo))
1216 		goto out_unlock_bo;
1217 
1218 	if (bo->flags & XE_BO_FLAG_PINNED_NORESTORE)
1219 		goto out_unlock_bo;
1220 
1221 	if (!backup) {
1222 		backup = ___xe_bo_create_locked(xe, NULL, NULL, bo->ttm.base.resv,
1223 						NULL, xe_bo_size(bo),
1224 						DRM_XE_GEM_CPU_CACHING_WB, ttm_bo_type_kernel,
1225 						XE_BO_FLAG_SYSTEM | XE_BO_FLAG_NEEDS_CPU_ACCESS |
1226 						XE_BO_FLAG_PINNED);
1227 		if (IS_ERR(backup)) {
1228 			ret = PTR_ERR(backup);
1229 			goto out_unlock_bo;
1230 		}
1231 		backup->parent_obj = xe_bo_get(bo); /* Released by bo_destroy */
1232 		backup_created = true;
1233 	}
1234 
1235 	if (xe_bo_is_user(bo) || (bo->flags & XE_BO_FLAG_PINNED_LATE_RESTORE)) {
1236 		struct xe_migrate *migrate;
1237 		struct dma_fence *fence;
1238 
1239 		if (bo->tile)
1240 			migrate = bo->tile->migrate;
1241 		else
1242 			migrate = mem_type_to_migrate(xe, bo->ttm.resource->mem_type);
1243 
1244 		ret = dma_resv_reserve_fences(bo->ttm.base.resv, 1);
1245 		if (ret)
1246 			goto out_backup;
1247 
1248 		ret = dma_resv_reserve_fences(backup->ttm.base.resv, 1);
1249 		if (ret)
1250 			goto out_backup;
1251 
1252 		fence = xe_migrate_copy(migrate, bo, backup, bo->ttm.resource,
1253 					backup->ttm.resource, false);
1254 		if (IS_ERR(fence)) {
1255 			ret = PTR_ERR(fence);
1256 			goto out_backup;
1257 		}
1258 
1259 		dma_resv_add_fence(bo->ttm.base.resv, fence,
1260 				   DMA_RESV_USAGE_KERNEL);
1261 		dma_resv_add_fence(backup->ttm.base.resv, fence,
1262 				   DMA_RESV_USAGE_KERNEL);
1263 		dma_fence_put(fence);
1264 	} else {
1265 		ret = xe_bo_vmap(backup);
1266 		if (ret)
1267 			goto out_backup;
1268 
1269 		if (iosys_map_is_null(&bo->vmap)) {
1270 			ret = xe_bo_vmap(bo);
1271 			if (ret)
1272 				goto out_backup;
1273 			unmap = true;
1274 		}
1275 
1276 		xe_map_memcpy_from(xe, backup->vmap.vaddr, &bo->vmap, 0,
1277 				   xe_bo_size(bo));
1278 	}
1279 
1280 	if (!bo->backup_obj)
1281 		bo->backup_obj = backup;
1282 
1283 out_backup:
1284 	xe_bo_vunmap(backup);
1285 	if (ret && backup_created)
1286 		xe_bo_put(backup);
1287 out_unlock_bo:
1288 	if (unmap)
1289 		xe_bo_vunmap(bo);
1290 	xe_bo_unlock(bo);
1291 	return ret;
1292 }
1293 
1294 /**
1295  * xe_bo_restore_pinned() - Restore a pinned VRAM object
1296  * @bo: The buffer object to move.
1297  *
1298  * On successful completion, the object memory will be moved back to VRAM.
1299  *
1300  * This is needed to for special handling of pinned VRAM object during
1301  * suspend-resume.
1302  *
1303  * Return: 0 on success. Negative error code on failure.
1304  */
xe_bo_restore_pinned(struct xe_bo * bo)1305 int xe_bo_restore_pinned(struct xe_bo *bo)
1306 {
1307 	struct ttm_operation_ctx ctx = {
1308 		.interruptible = false,
1309 		.gfp_retry_mayfail = false,
1310 	};
1311 	struct xe_device *xe = ttm_to_xe_device(bo->ttm.bdev);
1312 	struct xe_bo *backup = bo->backup_obj;
1313 	bool unmap = false;
1314 	int ret;
1315 
1316 	if (!backup)
1317 		return 0;
1318 
1319 	xe_bo_lock(bo, false);
1320 
1321 	if (!xe_bo_is_pinned(backup)) {
1322 		ret = ttm_bo_validate(&backup->ttm, &backup->placement, &ctx);
1323 		if (ret)
1324 			goto out_unlock_bo;
1325 	}
1326 
1327 	if (xe_bo_is_user(bo) || (bo->flags & XE_BO_FLAG_PINNED_LATE_RESTORE)) {
1328 		struct xe_migrate *migrate;
1329 		struct dma_fence *fence;
1330 
1331 		if (bo->tile)
1332 			migrate = bo->tile->migrate;
1333 		else
1334 			migrate = mem_type_to_migrate(xe, bo->ttm.resource->mem_type);
1335 
1336 		ret = dma_resv_reserve_fences(bo->ttm.base.resv, 1);
1337 		if (ret)
1338 			goto out_unlock_bo;
1339 
1340 		ret = dma_resv_reserve_fences(backup->ttm.base.resv, 1);
1341 		if (ret)
1342 			goto out_unlock_bo;
1343 
1344 		fence = xe_migrate_copy(migrate, backup, bo,
1345 					backup->ttm.resource, bo->ttm.resource,
1346 					false);
1347 		if (IS_ERR(fence)) {
1348 			ret = PTR_ERR(fence);
1349 			goto out_unlock_bo;
1350 		}
1351 
1352 		dma_resv_add_fence(bo->ttm.base.resv, fence,
1353 				   DMA_RESV_USAGE_KERNEL);
1354 		dma_resv_add_fence(backup->ttm.base.resv, fence,
1355 				   DMA_RESV_USAGE_KERNEL);
1356 		dma_fence_put(fence);
1357 	} else {
1358 		ret = xe_bo_vmap(backup);
1359 		if (ret)
1360 			goto out_unlock_bo;
1361 
1362 		if (iosys_map_is_null(&bo->vmap)) {
1363 			ret = xe_bo_vmap(bo);
1364 			if (ret)
1365 				goto out_backup;
1366 			unmap = true;
1367 		}
1368 
1369 		xe_map_memcpy_to(xe, &bo->vmap, 0, backup->vmap.vaddr,
1370 				 xe_bo_size(bo));
1371 	}
1372 
1373 	bo->backup_obj = NULL;
1374 
1375 out_backup:
1376 	xe_bo_vunmap(backup);
1377 	if (!bo->backup_obj) {
1378 		if (xe_bo_is_pinned(backup))
1379 			ttm_bo_unpin(&backup->ttm);
1380 		xe_bo_put(backup);
1381 	}
1382 out_unlock_bo:
1383 	if (unmap)
1384 		xe_bo_vunmap(bo);
1385 	xe_bo_unlock(bo);
1386 	return ret;
1387 }
1388 
xe_bo_dma_unmap_pinned(struct xe_bo * bo)1389 int xe_bo_dma_unmap_pinned(struct xe_bo *bo)
1390 {
1391 	struct ttm_buffer_object *ttm_bo = &bo->ttm;
1392 	struct ttm_tt *tt = ttm_bo->ttm;
1393 
1394 	if (tt) {
1395 		struct xe_ttm_tt *xe_tt = container_of(tt, typeof(*xe_tt), ttm);
1396 
1397 		if (ttm_bo->type == ttm_bo_type_sg && ttm_bo->sg) {
1398 			dma_buf_unmap_attachment(ttm_bo->base.import_attach,
1399 						 ttm_bo->sg,
1400 						 DMA_BIDIRECTIONAL);
1401 			ttm_bo->sg = NULL;
1402 			xe_tt->sg = NULL;
1403 		} else if (xe_tt->sg) {
1404 			dma_unmap_sgtable(ttm_to_xe_device(ttm_bo->bdev)->drm.dev,
1405 					  xe_tt->sg,
1406 					  DMA_BIDIRECTIONAL, 0);
1407 			sg_free_table(xe_tt->sg);
1408 			xe_tt->sg = NULL;
1409 		}
1410 	}
1411 
1412 	return 0;
1413 }
1414 
xe_ttm_io_mem_pfn(struct ttm_buffer_object * ttm_bo,unsigned long page_offset)1415 static unsigned long xe_ttm_io_mem_pfn(struct ttm_buffer_object *ttm_bo,
1416 				       unsigned long page_offset)
1417 {
1418 	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
1419 	struct xe_res_cursor cursor;
1420 	struct xe_vram_region *vram;
1421 
1422 	if (ttm_bo->resource->mem_type == XE_PL_STOLEN)
1423 		return xe_ttm_stolen_io_offset(bo, page_offset << PAGE_SHIFT) >> PAGE_SHIFT;
1424 
1425 	vram = res_to_mem_region(ttm_bo->resource);
1426 	xe_res_first(ttm_bo->resource, (u64)page_offset << PAGE_SHIFT, 0, &cursor);
1427 	return (vram->io_start + cursor.start) >> PAGE_SHIFT;
1428 }
1429 
1430 static void __xe_bo_vunmap(struct xe_bo *bo);
1431 
1432 /*
1433  * TODO: Move this function to TTM so we don't rely on how TTM does its
1434  * locking, thereby abusing TTM internals.
1435  */
xe_ttm_bo_lock_in_destructor(struct ttm_buffer_object * ttm_bo)1436 static bool xe_ttm_bo_lock_in_destructor(struct ttm_buffer_object *ttm_bo)
1437 {
1438 	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
1439 	bool locked;
1440 
1441 	xe_assert(xe, !kref_read(&ttm_bo->kref));
1442 
1443 	/*
1444 	 * We can typically only race with TTM trylocking under the
1445 	 * lru_lock, which will immediately be unlocked again since
1446 	 * the ttm_bo refcount is zero at this point. So trylocking *should*
1447 	 * always succeed here, as long as we hold the lru lock.
1448 	 */
1449 	spin_lock(&ttm_bo->bdev->lru_lock);
1450 	locked = dma_resv_trylock(ttm_bo->base.resv);
1451 	spin_unlock(&ttm_bo->bdev->lru_lock);
1452 	xe_assert(xe, locked);
1453 
1454 	return locked;
1455 }
1456 
xe_ttm_bo_release_notify(struct ttm_buffer_object * ttm_bo)1457 static void xe_ttm_bo_release_notify(struct ttm_buffer_object *ttm_bo)
1458 {
1459 	struct dma_resv_iter cursor;
1460 	struct dma_fence *fence;
1461 	struct dma_fence *replacement = NULL;
1462 	struct xe_bo *bo;
1463 
1464 	if (!xe_bo_is_xe_bo(ttm_bo))
1465 		return;
1466 
1467 	bo = ttm_to_xe_bo(ttm_bo);
1468 	xe_assert(xe_bo_device(bo), !(bo->created && kref_read(&ttm_bo->base.refcount)));
1469 
1470 	/*
1471 	 * Corner case where TTM fails to allocate memory and this BOs resv
1472 	 * still points the VMs resv
1473 	 */
1474 	if (ttm_bo->base.resv != &ttm_bo->base._resv)
1475 		return;
1476 
1477 	if (!xe_ttm_bo_lock_in_destructor(ttm_bo))
1478 		return;
1479 
1480 	/*
1481 	 * Scrub the preempt fences if any. The unbind fence is already
1482 	 * attached to the resv.
1483 	 * TODO: Don't do this for external bos once we scrub them after
1484 	 * unbind.
1485 	 */
1486 	dma_resv_for_each_fence(&cursor, ttm_bo->base.resv,
1487 				DMA_RESV_USAGE_BOOKKEEP, fence) {
1488 		if (xe_fence_is_xe_preempt(fence) &&
1489 		    !dma_fence_is_signaled(fence)) {
1490 			if (!replacement)
1491 				replacement = dma_fence_get_stub();
1492 
1493 			dma_resv_replace_fences(ttm_bo->base.resv,
1494 						fence->context,
1495 						replacement,
1496 						DMA_RESV_USAGE_BOOKKEEP);
1497 		}
1498 	}
1499 	dma_fence_put(replacement);
1500 
1501 	dma_resv_unlock(ttm_bo->base.resv);
1502 }
1503 
xe_ttm_bo_delete_mem_notify(struct ttm_buffer_object * ttm_bo)1504 static void xe_ttm_bo_delete_mem_notify(struct ttm_buffer_object *ttm_bo)
1505 {
1506 	if (!xe_bo_is_xe_bo(ttm_bo))
1507 		return;
1508 
1509 	/*
1510 	 * Object is idle and about to be destroyed. Release the
1511 	 * dma-buf attachment.
1512 	 */
1513 	if (ttm_bo->type == ttm_bo_type_sg && ttm_bo->sg) {
1514 		struct xe_ttm_tt *xe_tt = container_of(ttm_bo->ttm,
1515 						       struct xe_ttm_tt, ttm);
1516 
1517 		dma_buf_unmap_attachment(ttm_bo->base.import_attach, ttm_bo->sg,
1518 					 DMA_BIDIRECTIONAL);
1519 		ttm_bo->sg = NULL;
1520 		xe_tt->sg = NULL;
1521 	}
1522 }
1523 
xe_ttm_bo_purge(struct ttm_buffer_object * ttm_bo,struct ttm_operation_ctx * ctx)1524 static void xe_ttm_bo_purge(struct ttm_buffer_object *ttm_bo, struct ttm_operation_ctx *ctx)
1525 {
1526 	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
1527 
1528 	if (ttm_bo->ttm) {
1529 		struct ttm_placement place = {};
1530 		int ret = ttm_bo_validate(ttm_bo, &place, ctx);
1531 
1532 		drm_WARN_ON(&xe->drm, ret);
1533 	}
1534 }
1535 
xe_ttm_bo_swap_notify(struct ttm_buffer_object * ttm_bo)1536 static void xe_ttm_bo_swap_notify(struct ttm_buffer_object *ttm_bo)
1537 {
1538 	struct ttm_operation_ctx ctx = {
1539 		.interruptible = false,
1540 		.gfp_retry_mayfail = false,
1541 	};
1542 
1543 	if (ttm_bo->ttm) {
1544 		struct xe_ttm_tt *xe_tt =
1545 			container_of(ttm_bo->ttm, struct xe_ttm_tt, ttm);
1546 
1547 		if (xe_tt->purgeable)
1548 			xe_ttm_bo_purge(ttm_bo, &ctx);
1549 	}
1550 }
1551 
xe_ttm_access_memory(struct ttm_buffer_object * ttm_bo,unsigned long offset,void * buf,int len,int write)1552 static int xe_ttm_access_memory(struct ttm_buffer_object *ttm_bo,
1553 				unsigned long offset, void *buf, int len,
1554 				int write)
1555 {
1556 	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
1557 	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
1558 	struct iosys_map vmap;
1559 	struct xe_res_cursor cursor;
1560 	struct xe_vram_region *vram;
1561 	int bytes_left = len;
1562 	int err = 0;
1563 
1564 	xe_bo_assert_held(bo);
1565 	xe_device_assert_mem_access(xe);
1566 
1567 	if (!mem_type_is_vram(ttm_bo->resource->mem_type))
1568 		return -EIO;
1569 
1570 	if (!xe_ttm_resource_visible(ttm_bo->resource) || len >= SZ_16K) {
1571 		struct xe_migrate *migrate =
1572 			mem_type_to_migrate(xe, ttm_bo->resource->mem_type);
1573 
1574 		err = xe_migrate_access_memory(migrate, bo, offset, buf, len,
1575 					       write);
1576 		goto out;
1577 	}
1578 
1579 	vram = res_to_mem_region(ttm_bo->resource);
1580 	xe_res_first(ttm_bo->resource, offset & PAGE_MASK,
1581 		     xe_bo_size(bo) - (offset & PAGE_MASK), &cursor);
1582 
1583 	do {
1584 		unsigned long page_offset = (offset & ~PAGE_MASK);
1585 		int byte_count = min((int)(PAGE_SIZE - page_offset), bytes_left);
1586 
1587 		iosys_map_set_vaddr_iomem(&vmap, (u8 __iomem *)vram->mapping +
1588 					  cursor.start);
1589 		if (write)
1590 			xe_map_memcpy_to(xe, &vmap, page_offset, buf, byte_count);
1591 		else
1592 			xe_map_memcpy_from(xe, buf, &vmap, page_offset, byte_count);
1593 
1594 		buf += byte_count;
1595 		offset += byte_count;
1596 		bytes_left -= byte_count;
1597 		if (bytes_left)
1598 			xe_res_next(&cursor, PAGE_SIZE);
1599 	} while (bytes_left);
1600 
1601 out:
1602 	return err ?: len;
1603 }
1604 
1605 const struct ttm_device_funcs xe_ttm_funcs = {
1606 	.ttm_tt_create = xe_ttm_tt_create,
1607 	.ttm_tt_populate = xe_ttm_tt_populate,
1608 	.ttm_tt_unpopulate = xe_ttm_tt_unpopulate,
1609 	.ttm_tt_destroy = xe_ttm_tt_destroy,
1610 	.evict_flags = xe_evict_flags,
1611 	.move = xe_bo_move,
1612 	.io_mem_reserve = xe_ttm_io_mem_reserve,
1613 	.io_mem_pfn = xe_ttm_io_mem_pfn,
1614 	.access_memory = xe_ttm_access_memory,
1615 	.release_notify = xe_ttm_bo_release_notify,
1616 	.eviction_valuable = xe_bo_eviction_valuable,
1617 	.delete_mem_notify = xe_ttm_bo_delete_mem_notify,
1618 	.swap_notify = xe_ttm_bo_swap_notify,
1619 };
1620 
xe_ttm_bo_destroy(struct ttm_buffer_object * ttm_bo)1621 static void xe_ttm_bo_destroy(struct ttm_buffer_object *ttm_bo)
1622 {
1623 	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
1624 	struct xe_device *xe = ttm_to_xe_device(ttm_bo->bdev);
1625 	struct xe_tile *tile;
1626 	u8 id;
1627 
1628 	if (bo->ttm.base.import_attach)
1629 		drm_prime_gem_destroy(&bo->ttm.base, NULL);
1630 	drm_gem_object_release(&bo->ttm.base);
1631 
1632 	xe_assert(xe, list_empty(&ttm_bo->base.gpuva.list));
1633 
1634 	for_each_tile(tile, xe, id)
1635 		if (bo->ggtt_node[id] && bo->ggtt_node[id]->base.size)
1636 			xe_ggtt_remove_bo(tile->mem.ggtt, bo);
1637 
1638 #ifdef CONFIG_PROC_FS
1639 	if (bo->client)
1640 		xe_drm_client_remove_bo(bo);
1641 #endif
1642 
1643 	if (bo->vm && xe_bo_is_user(bo))
1644 		xe_vm_put(bo->vm);
1645 
1646 	if (bo->parent_obj)
1647 		xe_bo_put(bo->parent_obj);
1648 
1649 	mutex_lock(&xe->mem_access.vram_userfault.lock);
1650 	if (!list_empty(&bo->vram_userfault_link))
1651 		list_del(&bo->vram_userfault_link);
1652 	mutex_unlock(&xe->mem_access.vram_userfault.lock);
1653 
1654 	kfree(bo);
1655 }
1656 
xe_gem_object_free(struct drm_gem_object * obj)1657 static void xe_gem_object_free(struct drm_gem_object *obj)
1658 {
1659 	/* Our BO reference counting scheme works as follows:
1660 	 *
1661 	 * The gem object kref is typically used throughout the driver,
1662 	 * and the gem object holds a ttm_buffer_object refcount, so
1663 	 * that when the last gem object reference is put, which is when
1664 	 * we end up in this function, we put also that ttm_buffer_object
1665 	 * refcount. Anything using gem interfaces is then no longer
1666 	 * allowed to access the object in a way that requires a gem
1667 	 * refcount, including locking the object.
1668 	 *
1669 	 * driver ttm callbacks is allowed to use the ttm_buffer_object
1670 	 * refcount directly if needed.
1671 	 */
1672 	__xe_bo_vunmap(gem_to_xe_bo(obj));
1673 	ttm_bo_put(container_of(obj, struct ttm_buffer_object, base));
1674 }
1675 
xe_gem_object_close(struct drm_gem_object * obj,struct drm_file * file_priv)1676 static void xe_gem_object_close(struct drm_gem_object *obj,
1677 				struct drm_file *file_priv)
1678 {
1679 	struct xe_bo *bo = gem_to_xe_bo(obj);
1680 
1681 	if (bo->vm && !xe_vm_in_fault_mode(bo->vm)) {
1682 		xe_assert(xe_bo_device(bo), xe_bo_is_user(bo));
1683 
1684 		xe_bo_lock(bo, false);
1685 		ttm_bo_set_bulk_move(&bo->ttm, NULL);
1686 		xe_bo_unlock(bo);
1687 	}
1688 }
1689 
xe_gem_fault(struct vm_fault * vmf)1690 static vm_fault_t xe_gem_fault(struct vm_fault *vmf)
1691 {
1692 	struct ttm_buffer_object *tbo = vmf->vma->vm_private_data;
1693 	struct drm_device *ddev = tbo->base.dev;
1694 	struct xe_device *xe = to_xe_device(ddev);
1695 	struct xe_bo *bo = ttm_to_xe_bo(tbo);
1696 	bool needs_rpm = bo->flags & XE_BO_FLAG_VRAM_MASK;
1697 	vm_fault_t ret;
1698 	int idx;
1699 
1700 	if (needs_rpm)
1701 		xe_pm_runtime_get(xe);
1702 
1703 	ret = ttm_bo_vm_reserve(tbo, vmf);
1704 	if (ret)
1705 		goto out;
1706 
1707 	if (drm_dev_enter(ddev, &idx)) {
1708 		trace_xe_bo_cpu_fault(bo);
1709 
1710 		ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot,
1711 					       TTM_BO_VM_NUM_PREFAULT);
1712 		drm_dev_exit(idx);
1713 	} else {
1714 		ret = ttm_bo_vm_dummy_page(vmf, vmf->vma->vm_page_prot);
1715 	}
1716 
1717 	if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
1718 		goto out;
1719 	/*
1720 	 * ttm_bo_vm_reserve() already has dma_resv_lock.
1721 	 */
1722 	if (ret == VM_FAULT_NOPAGE && mem_type_is_vram(tbo->resource->mem_type)) {
1723 		mutex_lock(&xe->mem_access.vram_userfault.lock);
1724 		if (list_empty(&bo->vram_userfault_link))
1725 			list_add(&bo->vram_userfault_link, &xe->mem_access.vram_userfault.list);
1726 		mutex_unlock(&xe->mem_access.vram_userfault.lock);
1727 	}
1728 
1729 	dma_resv_unlock(tbo->base.resv);
1730 out:
1731 	if (needs_rpm)
1732 		xe_pm_runtime_put(xe);
1733 
1734 	return ret;
1735 }
1736 
xe_bo_vm_access(struct vm_area_struct * vma,unsigned long addr,void * buf,int len,int write)1737 static int xe_bo_vm_access(struct vm_area_struct *vma, unsigned long addr,
1738 			   void *buf, int len, int write)
1739 {
1740 	struct ttm_buffer_object *ttm_bo = vma->vm_private_data;
1741 	struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
1742 	struct xe_device *xe = xe_bo_device(bo);
1743 	int ret;
1744 
1745 	xe_pm_runtime_get(xe);
1746 	ret = ttm_bo_vm_access(vma, addr, buf, len, write);
1747 	xe_pm_runtime_put(xe);
1748 
1749 	return ret;
1750 }
1751 
1752 /**
1753  * xe_bo_read() - Read from an xe_bo
1754  * @bo: The buffer object to read from.
1755  * @offset: The byte offset to start reading from.
1756  * @dst: Location to store the read.
1757  * @size: Size in bytes for the read.
1758  *
1759  * Read @size bytes from the @bo, starting from @offset, storing into @dst.
1760  *
1761  * Return: Zero on success, or negative error.
1762  */
xe_bo_read(struct xe_bo * bo,u64 offset,void * dst,int size)1763 int xe_bo_read(struct xe_bo *bo, u64 offset, void *dst, int size)
1764 {
1765 	int ret;
1766 
1767 	ret = ttm_bo_access(&bo->ttm, offset, dst, size, 0);
1768 	if (ret >= 0 && ret != size)
1769 		ret = -EIO;
1770 	else if (ret == size)
1771 		ret = 0;
1772 
1773 	return ret;
1774 }
1775 
1776 static const struct vm_operations_struct xe_gem_vm_ops = {
1777 	.fault = xe_gem_fault,
1778 	.open = ttm_bo_vm_open,
1779 	.close = ttm_bo_vm_close,
1780 	.access = xe_bo_vm_access,
1781 };
1782 
1783 static const struct drm_gem_object_funcs xe_gem_object_funcs = {
1784 	.free = xe_gem_object_free,
1785 	.close = xe_gem_object_close,
1786 	.mmap = drm_gem_ttm_mmap,
1787 	.export = xe_gem_prime_export,
1788 	.vm_ops = &xe_gem_vm_ops,
1789 };
1790 
1791 /**
1792  * xe_bo_alloc - Allocate storage for a struct xe_bo
1793  *
1794  * This function is intended to allocate storage to be used for input
1795  * to __xe_bo_create_locked(), in the case a pointer to the bo to be
1796  * created is needed before the call to __xe_bo_create_locked().
1797  * If __xe_bo_create_locked ends up never to be called, then the
1798  * storage allocated with this function needs to be freed using
1799  * xe_bo_free().
1800  *
1801  * Return: A pointer to an uninitialized struct xe_bo on success,
1802  * ERR_PTR(-ENOMEM) on error.
1803  */
xe_bo_alloc(void)1804 struct xe_bo *xe_bo_alloc(void)
1805 {
1806 	struct xe_bo *bo = kzalloc(sizeof(*bo), GFP_KERNEL);
1807 
1808 	if (!bo)
1809 		return ERR_PTR(-ENOMEM);
1810 
1811 	return bo;
1812 }
1813 
1814 /**
1815  * xe_bo_free - Free storage allocated using xe_bo_alloc()
1816  * @bo: The buffer object storage.
1817  *
1818  * Refer to xe_bo_alloc() documentation for valid use-cases.
1819  */
xe_bo_free(struct xe_bo * bo)1820 void xe_bo_free(struct xe_bo *bo)
1821 {
1822 	kfree(bo);
1823 }
1824 
___xe_bo_create_locked(struct xe_device * xe,struct xe_bo * bo,struct xe_tile * tile,struct dma_resv * resv,struct ttm_lru_bulk_move * bulk,size_t size,u16 cpu_caching,enum ttm_bo_type type,u32 flags)1825 struct xe_bo *___xe_bo_create_locked(struct xe_device *xe, struct xe_bo *bo,
1826 				     struct xe_tile *tile, struct dma_resv *resv,
1827 				     struct ttm_lru_bulk_move *bulk, size_t size,
1828 				     u16 cpu_caching, enum ttm_bo_type type,
1829 				     u32 flags)
1830 {
1831 	struct ttm_operation_ctx ctx = {
1832 		.interruptible = true,
1833 		.no_wait_gpu = false,
1834 		.gfp_retry_mayfail = true,
1835 	};
1836 	struct ttm_placement *placement;
1837 	uint32_t alignment;
1838 	size_t aligned_size;
1839 	int err;
1840 
1841 	/* Only kernel objects should set GT */
1842 	xe_assert(xe, !tile || type == ttm_bo_type_kernel);
1843 
1844 	if (XE_WARN_ON(!size)) {
1845 		xe_bo_free(bo);
1846 		return ERR_PTR(-EINVAL);
1847 	}
1848 
1849 	/* XE_BO_FLAG_GGTTx requires XE_BO_FLAG_GGTT also be set */
1850 	if ((flags & XE_BO_FLAG_GGTT_ALL) && !(flags & XE_BO_FLAG_GGTT))
1851 		return ERR_PTR(-EINVAL);
1852 
1853 	if (flags & (XE_BO_FLAG_VRAM_MASK | XE_BO_FLAG_STOLEN) &&
1854 	    !(flags & XE_BO_FLAG_IGNORE_MIN_PAGE_SIZE) &&
1855 	    ((xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K) ||
1856 	     (flags & (XE_BO_FLAG_NEEDS_64K | XE_BO_FLAG_NEEDS_2M)))) {
1857 		size_t align = flags & XE_BO_FLAG_NEEDS_2M ? SZ_2M : SZ_64K;
1858 
1859 		aligned_size = ALIGN(size, align);
1860 		if (type != ttm_bo_type_device)
1861 			size = ALIGN(size, align);
1862 		flags |= XE_BO_FLAG_INTERNAL_64K;
1863 		alignment = align >> PAGE_SHIFT;
1864 	} else {
1865 		aligned_size = ALIGN(size, SZ_4K);
1866 		flags &= ~XE_BO_FLAG_INTERNAL_64K;
1867 		alignment = SZ_4K >> PAGE_SHIFT;
1868 	}
1869 
1870 	if (type == ttm_bo_type_device && aligned_size != size)
1871 		return ERR_PTR(-EINVAL);
1872 
1873 	if (!bo) {
1874 		bo = xe_bo_alloc();
1875 		if (IS_ERR(bo))
1876 			return bo;
1877 	}
1878 
1879 	bo->ccs_cleared = false;
1880 	bo->tile = tile;
1881 	bo->flags = flags;
1882 	bo->cpu_caching = cpu_caching;
1883 	bo->ttm.base.funcs = &xe_gem_object_funcs;
1884 	bo->ttm.priority = XE_BO_PRIORITY_NORMAL;
1885 	INIT_LIST_HEAD(&bo->pinned_link);
1886 #ifdef CONFIG_PROC_FS
1887 	INIT_LIST_HEAD(&bo->client_link);
1888 #endif
1889 	INIT_LIST_HEAD(&bo->vram_userfault_link);
1890 
1891 	drm_gem_private_object_init(&xe->drm, &bo->ttm.base, size);
1892 
1893 	if (resv) {
1894 		ctx.allow_res_evict = !(flags & XE_BO_FLAG_NO_RESV_EVICT);
1895 		ctx.resv = resv;
1896 	}
1897 
1898 	if (!(flags & XE_BO_FLAG_FIXED_PLACEMENT)) {
1899 		err = __xe_bo_placement_for_flags(xe, bo, bo->flags);
1900 		if (WARN_ON(err)) {
1901 			xe_ttm_bo_destroy(&bo->ttm);
1902 			return ERR_PTR(err);
1903 		}
1904 	}
1905 
1906 	/* Defer populating type_sg bos */
1907 	placement = (type == ttm_bo_type_sg ||
1908 		     bo->flags & XE_BO_FLAG_DEFER_BACKING) ? &sys_placement :
1909 		&bo->placement;
1910 	err = ttm_bo_init_reserved(&xe->ttm, &bo->ttm, type,
1911 				   placement, alignment,
1912 				   &ctx, NULL, resv, xe_ttm_bo_destroy);
1913 	if (err)
1914 		return ERR_PTR(err);
1915 
1916 	/*
1917 	 * The VRAM pages underneath are potentially still being accessed by the
1918 	 * GPU, as per async GPU clearing and async evictions. However TTM makes
1919 	 * sure to add any corresponding move/clear fences into the objects
1920 	 * dma-resv using the DMA_RESV_USAGE_KERNEL slot.
1921 	 *
1922 	 * For KMD internal buffers we don't care about GPU clearing, however we
1923 	 * still need to handle async evictions, where the VRAM is still being
1924 	 * accessed by the GPU. Most internal callers are not expecting this,
1925 	 * since they are missing the required synchronisation before accessing
1926 	 * the memory. To keep things simple just sync wait any kernel fences
1927 	 * here, if the buffer is designated KMD internal.
1928 	 *
1929 	 * For normal userspace objects we should already have the required
1930 	 * pipelining or sync waiting elsewhere, since we already have to deal
1931 	 * with things like async GPU clearing.
1932 	 */
1933 	if (type == ttm_bo_type_kernel) {
1934 		long timeout = dma_resv_wait_timeout(bo->ttm.base.resv,
1935 						     DMA_RESV_USAGE_KERNEL,
1936 						     ctx.interruptible,
1937 						     MAX_SCHEDULE_TIMEOUT);
1938 
1939 		if (timeout < 0) {
1940 			if (!resv)
1941 				dma_resv_unlock(bo->ttm.base.resv);
1942 			xe_bo_put(bo);
1943 			return ERR_PTR(timeout);
1944 		}
1945 	}
1946 
1947 	bo->created = true;
1948 	if (bulk)
1949 		ttm_bo_set_bulk_move(&bo->ttm, bulk);
1950 	else
1951 		ttm_bo_move_to_lru_tail_unlocked(&bo->ttm);
1952 
1953 	return bo;
1954 }
1955 
__xe_bo_fixed_placement(struct xe_device * xe,struct xe_bo * bo,u32 flags,u64 start,u64 end,u64 size)1956 static int __xe_bo_fixed_placement(struct xe_device *xe,
1957 				   struct xe_bo *bo,
1958 				   u32 flags,
1959 				   u64 start, u64 end, u64 size)
1960 {
1961 	struct ttm_place *place = bo->placements;
1962 
1963 	if (flags & (XE_BO_FLAG_USER | XE_BO_FLAG_SYSTEM))
1964 		return -EINVAL;
1965 
1966 	place->flags = TTM_PL_FLAG_CONTIGUOUS;
1967 	place->fpfn = start >> PAGE_SHIFT;
1968 	place->lpfn = end >> PAGE_SHIFT;
1969 
1970 	switch (flags & (XE_BO_FLAG_STOLEN | XE_BO_FLAG_VRAM_MASK)) {
1971 	case XE_BO_FLAG_VRAM0:
1972 		place->mem_type = XE_PL_VRAM0;
1973 		break;
1974 	case XE_BO_FLAG_VRAM1:
1975 		place->mem_type = XE_PL_VRAM1;
1976 		break;
1977 	case XE_BO_FLAG_STOLEN:
1978 		place->mem_type = XE_PL_STOLEN;
1979 		break;
1980 
1981 	default:
1982 		/* 0 or multiple of the above set */
1983 		return -EINVAL;
1984 	}
1985 
1986 	bo->placement = (struct ttm_placement) {
1987 		.num_placement = 1,
1988 		.placement = place,
1989 	};
1990 
1991 	return 0;
1992 }
1993 
1994 static struct xe_bo *
__xe_bo_create_locked(struct xe_device * xe,struct xe_tile * tile,struct xe_vm * vm,size_t size,u64 start,u64 end,u16 cpu_caching,enum ttm_bo_type type,u32 flags,u64 alignment)1995 __xe_bo_create_locked(struct xe_device *xe,
1996 		      struct xe_tile *tile, struct xe_vm *vm,
1997 		      size_t size, u64 start, u64 end,
1998 		      u16 cpu_caching, enum ttm_bo_type type, u32 flags,
1999 		      u64 alignment)
2000 {
2001 	struct xe_bo *bo = NULL;
2002 	int err;
2003 
2004 	if (vm)
2005 		xe_vm_assert_held(vm);
2006 
2007 	if (start || end != ~0ULL) {
2008 		bo = xe_bo_alloc();
2009 		if (IS_ERR(bo))
2010 			return bo;
2011 
2012 		flags |= XE_BO_FLAG_FIXED_PLACEMENT;
2013 		err = __xe_bo_fixed_placement(xe, bo, flags, start, end, size);
2014 		if (err) {
2015 			xe_bo_free(bo);
2016 			return ERR_PTR(err);
2017 		}
2018 	}
2019 
2020 	bo = ___xe_bo_create_locked(xe, bo, tile, vm ? xe_vm_resv(vm) : NULL,
2021 				    vm && !xe_vm_in_fault_mode(vm) &&
2022 				    flags & XE_BO_FLAG_USER ?
2023 				    &vm->lru_bulk_move : NULL, size,
2024 				    cpu_caching, type, flags);
2025 	if (IS_ERR(bo))
2026 		return bo;
2027 
2028 	bo->min_align = alignment;
2029 
2030 	/*
2031 	 * Note that instead of taking a reference no the drm_gpuvm_resv_bo(),
2032 	 * to ensure the shared resv doesn't disappear under the bo, the bo
2033 	 * will keep a reference to the vm, and avoid circular references
2034 	 * by having all the vm's bo refereferences released at vm close
2035 	 * time.
2036 	 */
2037 	if (vm && xe_bo_is_user(bo))
2038 		xe_vm_get(vm);
2039 	bo->vm = vm;
2040 
2041 	if (bo->flags & XE_BO_FLAG_GGTT) {
2042 		struct xe_tile *t;
2043 		u8 id;
2044 
2045 		if (!(bo->flags & XE_BO_FLAG_GGTT_ALL)) {
2046 			if (!tile && flags & XE_BO_FLAG_STOLEN)
2047 				tile = xe_device_get_root_tile(xe);
2048 
2049 			xe_assert(xe, tile);
2050 		}
2051 
2052 		for_each_tile(t, xe, id) {
2053 			if (t != tile && !(bo->flags & XE_BO_FLAG_GGTTx(t)))
2054 				continue;
2055 
2056 			if (flags & XE_BO_FLAG_FIXED_PLACEMENT) {
2057 				err = xe_ggtt_insert_bo_at(t->mem.ggtt, bo,
2058 							   start + xe_bo_size(bo), U64_MAX);
2059 			} else {
2060 				err = xe_ggtt_insert_bo(t->mem.ggtt, bo);
2061 			}
2062 			if (err)
2063 				goto err_unlock_put_bo;
2064 		}
2065 	}
2066 
2067 	trace_xe_bo_create(bo);
2068 	return bo;
2069 
2070 err_unlock_put_bo:
2071 	__xe_bo_unset_bulk_move(bo);
2072 	xe_bo_unlock_vm_held(bo);
2073 	xe_bo_put(bo);
2074 	return ERR_PTR(err);
2075 }
2076 
2077 struct xe_bo *
xe_bo_create_locked_range(struct xe_device * xe,struct xe_tile * tile,struct xe_vm * vm,size_t size,u64 start,u64 end,enum ttm_bo_type type,u32 flags,u64 alignment)2078 xe_bo_create_locked_range(struct xe_device *xe,
2079 			  struct xe_tile *tile, struct xe_vm *vm,
2080 			  size_t size, u64 start, u64 end,
2081 			  enum ttm_bo_type type, u32 flags, u64 alignment)
2082 {
2083 	return __xe_bo_create_locked(xe, tile, vm, size, start, end, 0, type,
2084 				     flags, alignment);
2085 }
2086 
xe_bo_create_locked(struct xe_device * xe,struct xe_tile * tile,struct xe_vm * vm,size_t size,enum ttm_bo_type type,u32 flags)2087 struct xe_bo *xe_bo_create_locked(struct xe_device *xe, struct xe_tile *tile,
2088 				  struct xe_vm *vm, size_t size,
2089 				  enum ttm_bo_type type, u32 flags)
2090 {
2091 	return __xe_bo_create_locked(xe, tile, vm, size, 0, ~0ULL, 0, type,
2092 				     flags, 0);
2093 }
2094 
xe_bo_create_user(struct xe_device * xe,struct xe_tile * tile,struct xe_vm * vm,size_t size,u16 cpu_caching,u32 flags)2095 struct xe_bo *xe_bo_create_user(struct xe_device *xe, struct xe_tile *tile,
2096 				struct xe_vm *vm, size_t size,
2097 				u16 cpu_caching,
2098 				u32 flags)
2099 {
2100 	struct xe_bo *bo = __xe_bo_create_locked(xe, tile, vm, size, 0, ~0ULL,
2101 						 cpu_caching, ttm_bo_type_device,
2102 						 flags | XE_BO_FLAG_USER, 0);
2103 	if (!IS_ERR(bo))
2104 		xe_bo_unlock_vm_held(bo);
2105 
2106 	return bo;
2107 }
2108 
xe_bo_create(struct xe_device * xe,struct xe_tile * tile,struct xe_vm * vm,size_t size,enum ttm_bo_type type,u32 flags)2109 struct xe_bo *xe_bo_create(struct xe_device *xe, struct xe_tile *tile,
2110 			   struct xe_vm *vm, size_t size,
2111 			   enum ttm_bo_type type, u32 flags)
2112 {
2113 	struct xe_bo *bo = xe_bo_create_locked(xe, tile, vm, size, type, flags);
2114 
2115 	if (!IS_ERR(bo))
2116 		xe_bo_unlock_vm_held(bo);
2117 
2118 	return bo;
2119 }
2120 
xe_bo_create_pin_map_at(struct xe_device * xe,struct xe_tile * tile,struct xe_vm * vm,size_t size,u64 offset,enum ttm_bo_type type,u32 flags)2121 struct xe_bo *xe_bo_create_pin_map_at(struct xe_device *xe, struct xe_tile *tile,
2122 				      struct xe_vm *vm,
2123 				      size_t size, u64 offset,
2124 				      enum ttm_bo_type type, u32 flags)
2125 {
2126 	return xe_bo_create_pin_map_at_aligned(xe, tile, vm, size, offset,
2127 					       type, flags, 0);
2128 }
2129 
xe_bo_create_pin_map_at_aligned(struct xe_device * xe,struct xe_tile * tile,struct xe_vm * vm,size_t size,u64 offset,enum ttm_bo_type type,u32 flags,u64 alignment)2130 struct xe_bo *xe_bo_create_pin_map_at_aligned(struct xe_device *xe,
2131 					      struct xe_tile *tile,
2132 					      struct xe_vm *vm,
2133 					      size_t size, u64 offset,
2134 					      enum ttm_bo_type type, u32 flags,
2135 					      u64 alignment)
2136 {
2137 	struct xe_bo *bo;
2138 	int err;
2139 	u64 start = offset == ~0ull ? 0 : offset;
2140 	u64 end = offset == ~0ull ? offset : start + size;
2141 
2142 	if (flags & XE_BO_FLAG_STOLEN &&
2143 	    xe_ttm_stolen_cpu_access_needs_ggtt(xe))
2144 		flags |= XE_BO_FLAG_GGTT;
2145 
2146 	bo = xe_bo_create_locked_range(xe, tile, vm, size, start, end, type,
2147 				       flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | XE_BO_FLAG_PINNED,
2148 				       alignment);
2149 	if (IS_ERR(bo))
2150 		return bo;
2151 
2152 	err = xe_bo_pin(bo);
2153 	if (err)
2154 		goto err_put;
2155 
2156 	err = xe_bo_vmap(bo);
2157 	if (err)
2158 		goto err_unpin;
2159 
2160 	xe_bo_unlock_vm_held(bo);
2161 
2162 	return bo;
2163 
2164 err_unpin:
2165 	xe_bo_unpin(bo);
2166 err_put:
2167 	xe_bo_unlock_vm_held(bo);
2168 	xe_bo_put(bo);
2169 	return ERR_PTR(err);
2170 }
2171 
xe_bo_create_pin_map(struct xe_device * xe,struct xe_tile * tile,struct xe_vm * vm,size_t size,enum ttm_bo_type type,u32 flags)2172 struct xe_bo *xe_bo_create_pin_map(struct xe_device *xe, struct xe_tile *tile,
2173 				   struct xe_vm *vm, size_t size,
2174 				   enum ttm_bo_type type, u32 flags)
2175 {
2176 	return xe_bo_create_pin_map_at(xe, tile, vm, size, ~0ull, type, flags);
2177 }
2178 
__xe_bo_unpin_map_no_vm(void * arg)2179 static void __xe_bo_unpin_map_no_vm(void *arg)
2180 {
2181 	xe_bo_unpin_map_no_vm(arg);
2182 }
2183 
xe_managed_bo_create_pin_map(struct xe_device * xe,struct xe_tile * tile,size_t size,u32 flags)2184 struct xe_bo *xe_managed_bo_create_pin_map(struct xe_device *xe, struct xe_tile *tile,
2185 					   size_t size, u32 flags)
2186 {
2187 	struct xe_bo *bo;
2188 	int ret;
2189 
2190 	KUNIT_STATIC_STUB_REDIRECT(xe_managed_bo_create_pin_map, xe, tile, size, flags);
2191 
2192 	bo = xe_bo_create_pin_map(xe, tile, NULL, size, ttm_bo_type_kernel, flags);
2193 	if (IS_ERR(bo))
2194 		return bo;
2195 
2196 	ret = devm_add_action_or_reset(xe->drm.dev, __xe_bo_unpin_map_no_vm, bo);
2197 	if (ret)
2198 		return ERR_PTR(ret);
2199 
2200 	return bo;
2201 }
2202 
xe_managed_bo_create_from_data(struct xe_device * xe,struct xe_tile * tile,const void * data,size_t size,u32 flags)2203 struct xe_bo *xe_managed_bo_create_from_data(struct xe_device *xe, struct xe_tile *tile,
2204 					     const void *data, size_t size, u32 flags)
2205 {
2206 	struct xe_bo *bo = xe_managed_bo_create_pin_map(xe, tile, ALIGN(size, PAGE_SIZE), flags);
2207 
2208 	if (IS_ERR(bo))
2209 		return bo;
2210 
2211 	xe_map_memcpy_to(xe, &bo->vmap, 0, data, size);
2212 
2213 	return bo;
2214 }
2215 
2216 /**
2217  * xe_managed_bo_reinit_in_vram
2218  * @xe: xe device
2219  * @tile: Tile where the new buffer will be created
2220  * @src: Managed buffer object allocated in system memory
2221  *
2222  * Replace a managed src buffer object allocated in system memory with a new
2223  * one allocated in vram, copying the data between them.
2224  * Buffer object in VRAM is not going to have the same GGTT address, the caller
2225  * is responsible for making sure that any old references to it are updated.
2226  *
2227  * Returns 0 for success, negative error code otherwise.
2228  */
xe_managed_bo_reinit_in_vram(struct xe_device * xe,struct xe_tile * tile,struct xe_bo ** src)2229 int xe_managed_bo_reinit_in_vram(struct xe_device *xe, struct xe_tile *tile, struct xe_bo **src)
2230 {
2231 	struct xe_bo *bo;
2232 	u32 dst_flags = XE_BO_FLAG_VRAM_IF_DGFX(tile) | XE_BO_FLAG_GGTT;
2233 
2234 	dst_flags |= (*src)->flags & (XE_BO_FLAG_GGTT_INVALIDATE |
2235 				      XE_BO_FLAG_PINNED_NORESTORE);
2236 
2237 	xe_assert(xe, IS_DGFX(xe));
2238 	xe_assert(xe, !(*src)->vmap.is_iomem);
2239 
2240 	bo = xe_managed_bo_create_from_data(xe, tile, (*src)->vmap.vaddr,
2241 					    xe_bo_size(*src), dst_flags);
2242 	if (IS_ERR(bo))
2243 		return PTR_ERR(bo);
2244 
2245 	devm_release_action(xe->drm.dev, __xe_bo_unpin_map_no_vm, *src);
2246 	*src = bo;
2247 
2248 	return 0;
2249 }
2250 
2251 /*
2252  * XXX: This is in the VM bind data path, likely should calculate this once and
2253  * store, with a recalculation if the BO is moved.
2254  */
vram_region_gpu_offset(struct ttm_resource * res)2255 uint64_t vram_region_gpu_offset(struct ttm_resource *res)
2256 {
2257 	struct xe_device *xe = ttm_to_xe_device(res->bo->bdev);
2258 
2259 	switch (res->mem_type) {
2260 	case XE_PL_STOLEN:
2261 		return xe_ttm_stolen_gpu_offset(xe);
2262 	case XE_PL_TT:
2263 	case XE_PL_SYSTEM:
2264 		return 0;
2265 	default:
2266 		return res_to_mem_region(res)->dpa_base;
2267 	}
2268 	return 0;
2269 }
2270 
2271 /**
2272  * xe_bo_pin_external - pin an external BO
2273  * @bo: buffer object to be pinned
2274  * @in_place: Pin in current placement, don't attempt to migrate.
2275  *
2276  * Pin an external (not tied to a VM, can be exported via dma-buf / prime FD)
2277  * BO. Unique call compared to xe_bo_pin as this function has it own set of
2278  * asserts and code to ensure evict / restore on suspend / resume.
2279  *
2280  * Returns 0 for success, negative error code otherwise.
2281  */
xe_bo_pin_external(struct xe_bo * bo,bool in_place)2282 int xe_bo_pin_external(struct xe_bo *bo, bool in_place)
2283 {
2284 	struct xe_device *xe = xe_bo_device(bo);
2285 	int err;
2286 
2287 	xe_assert(xe, !bo->vm);
2288 	xe_assert(xe, xe_bo_is_user(bo));
2289 
2290 	if (!xe_bo_is_pinned(bo)) {
2291 		if (!in_place) {
2292 			err = xe_bo_validate(bo, NULL, false);
2293 			if (err)
2294 				return err;
2295 		}
2296 
2297 		spin_lock(&xe->pinned.lock);
2298 		list_add_tail(&bo->pinned_link, &xe->pinned.late.external);
2299 		spin_unlock(&xe->pinned.lock);
2300 	}
2301 
2302 	ttm_bo_pin(&bo->ttm);
2303 	if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
2304 		xe_ttm_tt_account_subtract(xe, bo->ttm.ttm);
2305 
2306 	/*
2307 	 * FIXME: If we always use the reserve / unreserve functions for locking
2308 	 * we do not need this.
2309 	 */
2310 	ttm_bo_move_to_lru_tail_unlocked(&bo->ttm);
2311 
2312 	return 0;
2313 }
2314 
xe_bo_pin(struct xe_bo * bo)2315 int xe_bo_pin(struct xe_bo *bo)
2316 {
2317 	struct ttm_place *place = &bo->placements[0];
2318 	struct xe_device *xe = xe_bo_device(bo);
2319 	int err;
2320 
2321 	/* We currently don't expect user BO to be pinned */
2322 	xe_assert(xe, !xe_bo_is_user(bo));
2323 
2324 	/* Pinned object must be in GGTT or have pinned flag */
2325 	xe_assert(xe, bo->flags & (XE_BO_FLAG_PINNED |
2326 				   XE_BO_FLAG_GGTT));
2327 
2328 	/*
2329 	 * No reason we can't support pinning imported dma-bufs we just don't
2330 	 * expect to pin an imported dma-buf.
2331 	 */
2332 	xe_assert(xe, !bo->ttm.base.import_attach);
2333 
2334 	/* We only expect at most 1 pin */
2335 	xe_assert(xe, !xe_bo_is_pinned(bo));
2336 
2337 	err = xe_bo_validate(bo, NULL, false);
2338 	if (err)
2339 		return err;
2340 
2341 	if (mem_type_is_vram(place->mem_type) || bo->flags & XE_BO_FLAG_GGTT) {
2342 		spin_lock(&xe->pinned.lock);
2343 		if (bo->flags & XE_BO_FLAG_PINNED_LATE_RESTORE)
2344 			list_add_tail(&bo->pinned_link, &xe->pinned.late.kernel_bo_present);
2345 		else
2346 			list_add_tail(&bo->pinned_link, &xe->pinned.early.kernel_bo_present);
2347 		spin_unlock(&xe->pinned.lock);
2348 	}
2349 
2350 	ttm_bo_pin(&bo->ttm);
2351 	if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
2352 		xe_ttm_tt_account_subtract(xe, bo->ttm.ttm);
2353 
2354 	/*
2355 	 * FIXME: If we always use the reserve / unreserve functions for locking
2356 	 * we do not need this.
2357 	 */
2358 	ttm_bo_move_to_lru_tail_unlocked(&bo->ttm);
2359 
2360 	return 0;
2361 }
2362 
2363 /**
2364  * xe_bo_unpin_external - unpin an external BO
2365  * @bo: buffer object to be unpinned
2366  *
2367  * Unpin an external (not tied to a VM, can be exported via dma-buf / prime FD)
2368  * BO. Unique call compared to xe_bo_unpin as this function has it own set of
2369  * asserts and code to ensure evict / restore on suspend / resume.
2370  *
2371  * Returns 0 for success, negative error code otherwise.
2372  */
xe_bo_unpin_external(struct xe_bo * bo)2373 void xe_bo_unpin_external(struct xe_bo *bo)
2374 {
2375 	struct xe_device *xe = xe_bo_device(bo);
2376 
2377 	xe_assert(xe, !bo->vm);
2378 	xe_assert(xe, xe_bo_is_pinned(bo));
2379 	xe_assert(xe, xe_bo_is_user(bo));
2380 
2381 	spin_lock(&xe->pinned.lock);
2382 	if (bo->ttm.pin_count == 1 && !list_empty(&bo->pinned_link))
2383 		list_del_init(&bo->pinned_link);
2384 	spin_unlock(&xe->pinned.lock);
2385 
2386 	ttm_bo_unpin(&bo->ttm);
2387 	if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
2388 		xe_ttm_tt_account_add(xe, bo->ttm.ttm);
2389 
2390 	/*
2391 	 * FIXME: If we always use the reserve / unreserve functions for locking
2392 	 * we do not need this.
2393 	 */
2394 	ttm_bo_move_to_lru_tail_unlocked(&bo->ttm);
2395 }
2396 
xe_bo_unpin(struct xe_bo * bo)2397 void xe_bo_unpin(struct xe_bo *bo)
2398 {
2399 	struct ttm_place *place = &bo->placements[0];
2400 	struct xe_device *xe = xe_bo_device(bo);
2401 
2402 	xe_assert(xe, !bo->ttm.base.import_attach);
2403 	xe_assert(xe, xe_bo_is_pinned(bo));
2404 
2405 	if (mem_type_is_vram(place->mem_type) || bo->flags & XE_BO_FLAG_GGTT) {
2406 		spin_lock(&xe->pinned.lock);
2407 		xe_assert(xe, !list_empty(&bo->pinned_link));
2408 		list_del_init(&bo->pinned_link);
2409 		spin_unlock(&xe->pinned.lock);
2410 
2411 		if (bo->backup_obj) {
2412 			if (xe_bo_is_pinned(bo->backup_obj))
2413 				ttm_bo_unpin(&bo->backup_obj->ttm);
2414 			xe_bo_put(bo->backup_obj);
2415 			bo->backup_obj = NULL;
2416 		}
2417 	}
2418 	ttm_bo_unpin(&bo->ttm);
2419 	if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
2420 		xe_ttm_tt_account_add(xe, bo->ttm.ttm);
2421 }
2422 
2423 /**
2424  * xe_bo_validate() - Make sure the bo is in an allowed placement
2425  * @bo: The bo,
2426  * @vm: Pointer to a the vm the bo shares a locked dma_resv object with, or
2427  *      NULL. Used together with @allow_res_evict.
2428  * @allow_res_evict: Whether it's allowed to evict bos sharing @vm's
2429  *                   reservation object.
2430  *
2431  * Make sure the bo is in allowed placement, migrating it if necessary. If
2432  * needed, other bos will be evicted. If bos selected for eviction shares
2433  * the @vm's reservation object, they can be evicted iff @allow_res_evict is
2434  * set to true, otherwise they will be bypassed.
2435  *
2436  * Return: 0 on success, negative error code on failure. May return
2437  * -EINTR or -ERESTARTSYS if internal waits are interrupted by a signal.
2438  */
xe_bo_validate(struct xe_bo * bo,struct xe_vm * vm,bool allow_res_evict)2439 int xe_bo_validate(struct xe_bo *bo, struct xe_vm *vm, bool allow_res_evict)
2440 {
2441 	struct ttm_operation_ctx ctx = {
2442 		.interruptible = true,
2443 		.no_wait_gpu = false,
2444 		.gfp_retry_mayfail = true,
2445 	};
2446 	int ret;
2447 
2448 	if (xe_bo_is_pinned(bo))
2449 		return 0;
2450 
2451 	if (vm) {
2452 		lockdep_assert_held(&vm->lock);
2453 		xe_vm_assert_held(vm);
2454 
2455 		ctx.allow_res_evict = allow_res_evict;
2456 		ctx.resv = xe_vm_resv(vm);
2457 	}
2458 
2459 	xe_vm_set_validating(vm, allow_res_evict);
2460 	trace_xe_bo_validate(bo);
2461 	ret = ttm_bo_validate(&bo->ttm, &bo->placement, &ctx);
2462 	xe_vm_clear_validating(vm, allow_res_evict);
2463 
2464 	return ret;
2465 }
2466 
xe_bo_is_xe_bo(struct ttm_buffer_object * bo)2467 bool xe_bo_is_xe_bo(struct ttm_buffer_object *bo)
2468 {
2469 	if (bo->destroy == &xe_ttm_bo_destroy)
2470 		return true;
2471 
2472 	return false;
2473 }
2474 
2475 /*
2476  * Resolve a BO address. There is no assert to check if the proper lock is held
2477  * so it should only be used in cases where it is not fatal to get the wrong
2478  * address, such as printing debug information, but not in cases where memory is
2479  * written based on this result.
2480  */
__xe_bo_addr(struct xe_bo * bo,u64 offset,size_t page_size)2481 dma_addr_t __xe_bo_addr(struct xe_bo *bo, u64 offset, size_t page_size)
2482 {
2483 	struct xe_device *xe = xe_bo_device(bo);
2484 	struct xe_res_cursor cur;
2485 	u64 page;
2486 
2487 	xe_assert(xe, page_size <= PAGE_SIZE);
2488 	page = offset >> PAGE_SHIFT;
2489 	offset &= (PAGE_SIZE - 1);
2490 
2491 	if (!xe_bo_is_vram(bo) && !xe_bo_is_stolen(bo)) {
2492 		xe_assert(xe, bo->ttm.ttm);
2493 
2494 		xe_res_first_sg(xe_bo_sg(bo), page << PAGE_SHIFT,
2495 				page_size, &cur);
2496 		return xe_res_dma(&cur) + offset;
2497 	} else {
2498 		struct xe_res_cursor cur;
2499 
2500 		xe_res_first(bo->ttm.resource, page << PAGE_SHIFT,
2501 			     page_size, &cur);
2502 		return cur.start + offset + vram_region_gpu_offset(bo->ttm.resource);
2503 	}
2504 }
2505 
xe_bo_addr(struct xe_bo * bo,u64 offset,size_t page_size)2506 dma_addr_t xe_bo_addr(struct xe_bo *bo, u64 offset, size_t page_size)
2507 {
2508 	if (!READ_ONCE(bo->ttm.pin_count))
2509 		xe_bo_assert_held(bo);
2510 	return __xe_bo_addr(bo, offset, page_size);
2511 }
2512 
xe_bo_vmap(struct xe_bo * bo)2513 int xe_bo_vmap(struct xe_bo *bo)
2514 {
2515 	struct xe_device *xe = ttm_to_xe_device(bo->ttm.bdev);
2516 	void *virtual;
2517 	bool is_iomem;
2518 	int ret;
2519 
2520 	xe_bo_assert_held(bo);
2521 
2522 	if (drm_WARN_ON(&xe->drm, !(bo->flags & XE_BO_FLAG_NEEDS_CPU_ACCESS) ||
2523 			!force_contiguous(bo->flags)))
2524 		return -EINVAL;
2525 
2526 	if (!iosys_map_is_null(&bo->vmap))
2527 		return 0;
2528 
2529 	/*
2530 	 * We use this more or less deprecated interface for now since
2531 	 * ttm_bo_vmap() doesn't offer the optimization of kmapping
2532 	 * single page bos, which is done here.
2533 	 * TODO: Fix up ttm_bo_vmap to do that, or fix up ttm_bo_kmap
2534 	 * to use struct iosys_map.
2535 	 */
2536 	ret = ttm_bo_kmap(&bo->ttm, 0, xe_bo_size(bo) >> PAGE_SHIFT, &bo->kmap);
2537 	if (ret)
2538 		return ret;
2539 
2540 	virtual = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem);
2541 	if (is_iomem)
2542 		iosys_map_set_vaddr_iomem(&bo->vmap, (void __iomem *)virtual);
2543 	else
2544 		iosys_map_set_vaddr(&bo->vmap, virtual);
2545 
2546 	return 0;
2547 }
2548 
__xe_bo_vunmap(struct xe_bo * bo)2549 static void __xe_bo_vunmap(struct xe_bo *bo)
2550 {
2551 	if (!iosys_map_is_null(&bo->vmap)) {
2552 		iosys_map_clear(&bo->vmap);
2553 		ttm_bo_kunmap(&bo->kmap);
2554 	}
2555 }
2556 
xe_bo_vunmap(struct xe_bo * bo)2557 void xe_bo_vunmap(struct xe_bo *bo)
2558 {
2559 	xe_bo_assert_held(bo);
2560 	__xe_bo_vunmap(bo);
2561 }
2562 
gem_create_set_pxp_type(struct xe_device * xe,struct xe_bo * bo,u64 value)2563 static int gem_create_set_pxp_type(struct xe_device *xe, struct xe_bo *bo, u64 value)
2564 {
2565 	if (value == DRM_XE_PXP_TYPE_NONE)
2566 		return 0;
2567 
2568 	/* we only support DRM_XE_PXP_TYPE_HWDRM for now */
2569 	if (XE_IOCTL_DBG(xe, value != DRM_XE_PXP_TYPE_HWDRM))
2570 		return -EINVAL;
2571 
2572 	return xe_pxp_key_assign(xe->pxp, bo);
2573 }
2574 
2575 typedef int (*xe_gem_create_set_property_fn)(struct xe_device *xe,
2576 					     struct xe_bo *bo,
2577 					     u64 value);
2578 
2579 static const xe_gem_create_set_property_fn gem_create_set_property_funcs[] = {
2580 	[DRM_XE_GEM_CREATE_SET_PROPERTY_PXP_TYPE] = gem_create_set_pxp_type,
2581 };
2582 
gem_create_user_ext_set_property(struct xe_device * xe,struct xe_bo * bo,u64 extension)2583 static int gem_create_user_ext_set_property(struct xe_device *xe,
2584 					    struct xe_bo *bo,
2585 					    u64 extension)
2586 {
2587 	u64 __user *address = u64_to_user_ptr(extension);
2588 	struct drm_xe_ext_set_property ext;
2589 	int err;
2590 	u32 idx;
2591 
2592 	err = copy_from_user(&ext, address, sizeof(ext));
2593 	if (XE_IOCTL_DBG(xe, err))
2594 		return -EFAULT;
2595 
2596 	if (XE_IOCTL_DBG(xe, ext.property >=
2597 			 ARRAY_SIZE(gem_create_set_property_funcs)) ||
2598 	    XE_IOCTL_DBG(xe, ext.pad) ||
2599 	    XE_IOCTL_DBG(xe, ext.property != DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY))
2600 		return -EINVAL;
2601 
2602 	idx = array_index_nospec(ext.property, ARRAY_SIZE(gem_create_set_property_funcs));
2603 	if (!gem_create_set_property_funcs[idx])
2604 		return -EINVAL;
2605 
2606 	return gem_create_set_property_funcs[idx](xe, bo, ext.value);
2607 }
2608 
2609 typedef int (*xe_gem_create_user_extension_fn)(struct xe_device *xe,
2610 					       struct xe_bo *bo,
2611 					       u64 extension);
2612 
2613 static const xe_gem_create_user_extension_fn gem_create_user_extension_funcs[] = {
2614 	[DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY] = gem_create_user_ext_set_property,
2615 };
2616 
2617 #define MAX_USER_EXTENSIONS	16
gem_create_user_extensions(struct xe_device * xe,struct xe_bo * bo,u64 extensions,int ext_number)2618 static int gem_create_user_extensions(struct xe_device *xe, struct xe_bo *bo,
2619 				      u64 extensions, int ext_number)
2620 {
2621 	u64 __user *address = u64_to_user_ptr(extensions);
2622 	struct drm_xe_user_extension ext;
2623 	int err;
2624 	u32 idx;
2625 
2626 	if (XE_IOCTL_DBG(xe, ext_number >= MAX_USER_EXTENSIONS))
2627 		return -E2BIG;
2628 
2629 	err = copy_from_user(&ext, address, sizeof(ext));
2630 	if (XE_IOCTL_DBG(xe, err))
2631 		return -EFAULT;
2632 
2633 	if (XE_IOCTL_DBG(xe, ext.pad) ||
2634 	    XE_IOCTL_DBG(xe, ext.name >= ARRAY_SIZE(gem_create_user_extension_funcs)))
2635 		return -EINVAL;
2636 
2637 	idx = array_index_nospec(ext.name,
2638 				 ARRAY_SIZE(gem_create_user_extension_funcs));
2639 	err = gem_create_user_extension_funcs[idx](xe, bo, extensions);
2640 	if (XE_IOCTL_DBG(xe, err))
2641 		return err;
2642 
2643 	if (ext.next_extension)
2644 		return gem_create_user_extensions(xe, bo, ext.next_extension,
2645 						  ++ext_number);
2646 
2647 	return 0;
2648 }
2649 
xe_gem_create_ioctl(struct drm_device * dev,void * data,struct drm_file * file)2650 int xe_gem_create_ioctl(struct drm_device *dev, void *data,
2651 			struct drm_file *file)
2652 {
2653 	struct xe_device *xe = to_xe_device(dev);
2654 	struct xe_file *xef = to_xe_file(file);
2655 	struct drm_xe_gem_create *args = data;
2656 	struct xe_vm *vm = NULL;
2657 	ktime_t end = 0;
2658 	struct xe_bo *bo;
2659 	unsigned int bo_flags;
2660 	u32 handle;
2661 	int err;
2662 
2663 	if (XE_IOCTL_DBG(xe, args->pad[0] || args->pad[1] || args->pad[2]) ||
2664 	    XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
2665 		return -EINVAL;
2666 
2667 	/* at least one valid memory placement must be specified */
2668 	if (XE_IOCTL_DBG(xe, (args->placement & ~xe->info.mem_region_mask) ||
2669 			 !args->placement))
2670 		return -EINVAL;
2671 
2672 	if (XE_IOCTL_DBG(xe, args->flags &
2673 			 ~(DRM_XE_GEM_CREATE_FLAG_DEFER_BACKING |
2674 			   DRM_XE_GEM_CREATE_FLAG_SCANOUT |
2675 			   DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM)))
2676 		return -EINVAL;
2677 
2678 	if (XE_IOCTL_DBG(xe, args->handle))
2679 		return -EINVAL;
2680 
2681 	if (XE_IOCTL_DBG(xe, !args->size))
2682 		return -EINVAL;
2683 
2684 	if (XE_IOCTL_DBG(xe, args->size > SIZE_MAX))
2685 		return -EINVAL;
2686 
2687 	if (XE_IOCTL_DBG(xe, args->size & ~PAGE_MASK))
2688 		return -EINVAL;
2689 
2690 	bo_flags = 0;
2691 	if (args->flags & DRM_XE_GEM_CREATE_FLAG_DEFER_BACKING)
2692 		bo_flags |= XE_BO_FLAG_DEFER_BACKING;
2693 
2694 	if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
2695 		bo_flags |= XE_BO_FLAG_SCANOUT;
2696 
2697 	bo_flags |= args->placement << (ffs(XE_BO_FLAG_SYSTEM) - 1);
2698 
2699 	/* CCS formats need physical placement at a 64K alignment in VRAM. */
2700 	if ((bo_flags & XE_BO_FLAG_VRAM_MASK) &&
2701 	    (bo_flags & XE_BO_FLAG_SCANOUT) &&
2702 	    !(xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K) &&
2703 	    IS_ALIGNED(args->size, SZ_64K))
2704 		bo_flags |= XE_BO_FLAG_NEEDS_64K;
2705 
2706 	if (args->flags & DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM) {
2707 		if (XE_IOCTL_DBG(xe, !(bo_flags & XE_BO_FLAG_VRAM_MASK)))
2708 			return -EINVAL;
2709 
2710 		bo_flags |= XE_BO_FLAG_NEEDS_CPU_ACCESS;
2711 	}
2712 
2713 	if (XE_IOCTL_DBG(xe, !args->cpu_caching ||
2714 			 args->cpu_caching > DRM_XE_GEM_CPU_CACHING_WC))
2715 		return -EINVAL;
2716 
2717 	if (XE_IOCTL_DBG(xe, bo_flags & XE_BO_FLAG_VRAM_MASK &&
2718 			 args->cpu_caching != DRM_XE_GEM_CPU_CACHING_WC))
2719 		return -EINVAL;
2720 
2721 	if (XE_IOCTL_DBG(xe, bo_flags & XE_BO_FLAG_SCANOUT &&
2722 			 args->cpu_caching == DRM_XE_GEM_CPU_CACHING_WB))
2723 		return -EINVAL;
2724 
2725 	if (args->vm_id) {
2726 		vm = xe_vm_lookup(xef, args->vm_id);
2727 		if (XE_IOCTL_DBG(xe, !vm))
2728 			return -ENOENT;
2729 	}
2730 
2731 retry:
2732 	if (vm) {
2733 		err = xe_vm_lock(vm, true);
2734 		if (err)
2735 			goto out_vm;
2736 	}
2737 
2738 	bo = xe_bo_create_user(xe, NULL, vm, args->size, args->cpu_caching,
2739 			       bo_flags);
2740 
2741 	if (vm)
2742 		xe_vm_unlock(vm);
2743 
2744 	if (IS_ERR(bo)) {
2745 		err = PTR_ERR(bo);
2746 		if (xe_vm_validate_should_retry(NULL, err, &end))
2747 			goto retry;
2748 		goto out_vm;
2749 	}
2750 
2751 	if (args->extensions) {
2752 		err = gem_create_user_extensions(xe, bo, args->extensions, 0);
2753 		if (err)
2754 			goto out_bulk;
2755 	}
2756 
2757 	err = drm_gem_handle_create(file, &bo->ttm.base, &handle);
2758 	if (err)
2759 		goto out_bulk;
2760 
2761 	args->handle = handle;
2762 	goto out_put;
2763 
2764 out_bulk:
2765 	if (vm && !xe_vm_in_fault_mode(vm)) {
2766 		xe_vm_lock(vm, false);
2767 		__xe_bo_unset_bulk_move(bo);
2768 		xe_vm_unlock(vm);
2769 	}
2770 out_put:
2771 	xe_bo_put(bo);
2772 out_vm:
2773 	if (vm)
2774 		xe_vm_put(vm);
2775 
2776 	return err;
2777 }
2778 
xe_gem_mmap_offset_ioctl(struct drm_device * dev,void * data,struct drm_file * file)2779 int xe_gem_mmap_offset_ioctl(struct drm_device *dev, void *data,
2780 			     struct drm_file *file)
2781 {
2782 	struct xe_device *xe = to_xe_device(dev);
2783 	struct drm_xe_gem_mmap_offset *args = data;
2784 	struct drm_gem_object *gem_obj;
2785 
2786 	if (XE_IOCTL_DBG(xe, args->extensions) ||
2787 	    XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
2788 		return -EINVAL;
2789 
2790 	if (XE_IOCTL_DBG(xe, args->flags &
2791 			 ~DRM_XE_MMAP_OFFSET_FLAG_PCI_BARRIER))
2792 		return -EINVAL;
2793 
2794 	if (args->flags & DRM_XE_MMAP_OFFSET_FLAG_PCI_BARRIER) {
2795 		if (XE_IOCTL_DBG(xe, !IS_DGFX(xe)))
2796 			return -EINVAL;
2797 
2798 		if (XE_IOCTL_DBG(xe, args->handle))
2799 			return -EINVAL;
2800 
2801 		if (XE_IOCTL_DBG(xe, PAGE_SIZE > SZ_4K))
2802 			return -EINVAL;
2803 
2804 		BUILD_BUG_ON(((XE_PCI_BARRIER_MMAP_OFFSET >> XE_PTE_SHIFT) +
2805 			      SZ_4K) >= DRM_FILE_PAGE_OFFSET_START);
2806 		args->offset = XE_PCI_BARRIER_MMAP_OFFSET;
2807 		return 0;
2808 	}
2809 
2810 	gem_obj = drm_gem_object_lookup(file, args->handle);
2811 	if (XE_IOCTL_DBG(xe, !gem_obj))
2812 		return -ENOENT;
2813 
2814 	/* The mmap offset was set up at BO allocation time. */
2815 	args->offset = drm_vma_node_offset_addr(&gem_obj->vma_node);
2816 
2817 	xe_bo_put(gem_to_xe_bo(gem_obj));
2818 	return 0;
2819 }
2820 
2821 /**
2822  * xe_bo_lock() - Lock the buffer object's dma_resv object
2823  * @bo: The struct xe_bo whose lock is to be taken
2824  * @intr: Whether to perform any wait interruptible
2825  *
2826  * Locks the buffer object's dma_resv object. If the buffer object is
2827  * pointing to a shared dma_resv object, that shared lock is locked.
2828  *
2829  * Return: 0 on success, -EINTR if @intr is true and the wait for a
2830  * contended lock was interrupted. If @intr is set to false, the
2831  * function always returns 0.
2832  */
xe_bo_lock(struct xe_bo * bo,bool intr)2833 int xe_bo_lock(struct xe_bo *bo, bool intr)
2834 {
2835 	if (intr)
2836 		return dma_resv_lock_interruptible(bo->ttm.base.resv, NULL);
2837 
2838 	dma_resv_lock(bo->ttm.base.resv, NULL);
2839 
2840 	return 0;
2841 }
2842 
2843 /**
2844  * xe_bo_unlock() - Unlock the buffer object's dma_resv object
2845  * @bo: The struct xe_bo whose lock is to be released.
2846  *
2847  * Unlock a buffer object lock that was locked by xe_bo_lock().
2848  */
xe_bo_unlock(struct xe_bo * bo)2849 void xe_bo_unlock(struct xe_bo *bo)
2850 {
2851 	dma_resv_unlock(bo->ttm.base.resv);
2852 }
2853 
2854 /**
2855  * xe_bo_can_migrate - Whether a buffer object likely can be migrated
2856  * @bo: The buffer object to migrate
2857  * @mem_type: The TTM memory type intended to migrate to
2858  *
2859  * Check whether the buffer object supports migration to the
2860  * given memory type. Note that pinning may affect the ability to migrate as
2861  * returned by this function.
2862  *
2863  * This function is primarily intended as a helper for checking the
2864  * possibility to migrate buffer objects and can be called without
2865  * the object lock held.
2866  *
2867  * Return: true if migration is possible, false otherwise.
2868  */
xe_bo_can_migrate(struct xe_bo * bo,u32 mem_type)2869 bool xe_bo_can_migrate(struct xe_bo *bo, u32 mem_type)
2870 {
2871 	unsigned int cur_place;
2872 
2873 	if (bo->ttm.type == ttm_bo_type_kernel)
2874 		return true;
2875 
2876 	if (bo->ttm.type == ttm_bo_type_sg)
2877 		return false;
2878 
2879 	for (cur_place = 0; cur_place < bo->placement.num_placement;
2880 	     cur_place++) {
2881 		if (bo->placements[cur_place].mem_type == mem_type)
2882 			return true;
2883 	}
2884 
2885 	return false;
2886 }
2887 
xe_place_from_ttm_type(u32 mem_type,struct ttm_place * place)2888 static void xe_place_from_ttm_type(u32 mem_type, struct ttm_place *place)
2889 {
2890 	memset(place, 0, sizeof(*place));
2891 	place->mem_type = mem_type;
2892 }
2893 
2894 /**
2895  * xe_bo_migrate - Migrate an object to the desired region id
2896  * @bo: The buffer object to migrate.
2897  * @mem_type: The TTM region type to migrate to.
2898  *
2899  * Attempt to migrate the buffer object to the desired memory region. The
2900  * buffer object may not be pinned, and must be locked.
2901  * On successful completion, the object memory type will be updated,
2902  * but an async migration task may not have completed yet, and to
2903  * accomplish that, the object's kernel fences must be signaled with
2904  * the object lock held.
2905  *
2906  * Return: 0 on success. Negative error code on failure. In particular may
2907  * return -EINTR or -ERESTARTSYS if signal pending.
2908  */
xe_bo_migrate(struct xe_bo * bo,u32 mem_type)2909 int xe_bo_migrate(struct xe_bo *bo, u32 mem_type)
2910 {
2911 	struct xe_device *xe = ttm_to_xe_device(bo->ttm.bdev);
2912 	struct ttm_operation_ctx ctx = {
2913 		.interruptible = true,
2914 		.no_wait_gpu = false,
2915 		.gfp_retry_mayfail = true,
2916 	};
2917 	struct ttm_placement placement;
2918 	struct ttm_place requested;
2919 
2920 	xe_bo_assert_held(bo);
2921 
2922 	if (bo->ttm.resource->mem_type == mem_type)
2923 		return 0;
2924 
2925 	if (xe_bo_is_pinned(bo))
2926 		return -EBUSY;
2927 
2928 	if (!xe_bo_can_migrate(bo, mem_type))
2929 		return -EINVAL;
2930 
2931 	xe_place_from_ttm_type(mem_type, &requested);
2932 	placement.num_placement = 1;
2933 	placement.placement = &requested;
2934 
2935 	/*
2936 	 * Stolen needs to be handled like below VRAM handling if we ever need
2937 	 * to support it.
2938 	 */
2939 	drm_WARN_ON(&xe->drm, mem_type == XE_PL_STOLEN);
2940 
2941 	if (mem_type_is_vram(mem_type)) {
2942 		u32 c = 0;
2943 
2944 		add_vram(xe, bo, &requested, bo->flags, mem_type, &c);
2945 	}
2946 
2947 	return ttm_bo_validate(&bo->ttm, &placement, &ctx);
2948 }
2949 
2950 /**
2951  * xe_bo_evict - Evict an object to evict placement
2952  * @bo: The buffer object to migrate.
2953  *
2954  * On successful completion, the object memory will be moved to evict
2955  * placement. This function blocks until the object has been fully moved.
2956  *
2957  * Return: 0 on success. Negative error code on failure.
2958  */
xe_bo_evict(struct xe_bo * bo)2959 int xe_bo_evict(struct xe_bo *bo)
2960 {
2961 	struct ttm_operation_ctx ctx = {
2962 		.interruptible = false,
2963 		.no_wait_gpu = false,
2964 		.gfp_retry_mayfail = true,
2965 	};
2966 	struct ttm_placement placement;
2967 	int ret;
2968 
2969 	xe_evict_flags(&bo->ttm, &placement);
2970 	ret = ttm_bo_validate(&bo->ttm, &placement, &ctx);
2971 	if (ret)
2972 		return ret;
2973 
2974 	dma_resv_wait_timeout(bo->ttm.base.resv, DMA_RESV_USAGE_KERNEL,
2975 			      false, MAX_SCHEDULE_TIMEOUT);
2976 
2977 	return 0;
2978 }
2979 
2980 /**
2981  * xe_bo_needs_ccs_pages - Whether a bo needs to back up CCS pages when
2982  * placed in system memory.
2983  * @bo: The xe_bo
2984  *
2985  * Return: true if extra pages need to be allocated, false otherwise.
2986  */
xe_bo_needs_ccs_pages(struct xe_bo * bo)2987 bool xe_bo_needs_ccs_pages(struct xe_bo *bo)
2988 {
2989 	struct xe_device *xe = xe_bo_device(bo);
2990 
2991 	if (GRAPHICS_VER(xe) >= 20 && IS_DGFX(xe))
2992 		return false;
2993 
2994 	if (!xe_device_has_flat_ccs(xe) || bo->ttm.type != ttm_bo_type_device)
2995 		return false;
2996 
2997 	/* On discrete GPUs, if the GPU can access this buffer from
2998 	 * system memory (i.e., it allows XE_PL_TT placement), FlatCCS
2999 	 * can't be used since there's no CCS storage associated with
3000 	 * non-VRAM addresses.
3001 	 */
3002 	if (IS_DGFX(xe) && (bo->flags & XE_BO_FLAG_SYSTEM))
3003 		return false;
3004 
3005 	/*
3006 	 * Compression implies coh_none, therefore we know for sure that WB
3007 	 * memory can't currently use compression, which is likely one of the
3008 	 * common cases.
3009 	 */
3010 	if (bo->cpu_caching == DRM_XE_GEM_CPU_CACHING_WB)
3011 		return false;
3012 
3013 	return true;
3014 }
3015 
3016 /**
3017  * __xe_bo_release_dummy() - Dummy kref release function
3018  * @kref: The embedded struct kref.
3019  *
3020  * Dummy release function for xe_bo_put_deferred(). Keep off.
3021  */
__xe_bo_release_dummy(struct kref * kref)3022 void __xe_bo_release_dummy(struct kref *kref)
3023 {
3024 }
3025 
3026 /**
3027  * xe_bo_put_commit() - Put bos whose put was deferred by xe_bo_put_deferred().
3028  * @deferred: The lockless list used for the call to xe_bo_put_deferred().
3029  *
3030  * Puts all bos whose put was deferred by xe_bo_put_deferred().
3031  * The @deferred list can be either an onstack local list or a global
3032  * shared list used by a workqueue.
3033  */
xe_bo_put_commit(struct llist_head * deferred)3034 void xe_bo_put_commit(struct llist_head *deferred)
3035 {
3036 	struct llist_node *freed;
3037 	struct xe_bo *bo, *next;
3038 
3039 	if (!deferred)
3040 		return;
3041 
3042 	freed = llist_del_all(deferred);
3043 	if (!freed)
3044 		return;
3045 
3046 	llist_for_each_entry_safe(bo, next, freed, freed)
3047 		drm_gem_object_free(&bo->ttm.base.refcount);
3048 }
3049 
xe_bo_dev_work_func(struct work_struct * work)3050 static void xe_bo_dev_work_func(struct work_struct *work)
3051 {
3052 	struct xe_bo_dev *bo_dev = container_of(work, typeof(*bo_dev), async_free);
3053 
3054 	xe_bo_put_commit(&bo_dev->async_list);
3055 }
3056 
3057 /**
3058  * xe_bo_dev_init() - Initialize BO dev to manage async BO freeing
3059  * @bo_dev: The BO dev structure
3060  */
xe_bo_dev_init(struct xe_bo_dev * bo_dev)3061 void xe_bo_dev_init(struct xe_bo_dev *bo_dev)
3062 {
3063 	INIT_WORK(&bo_dev->async_free, xe_bo_dev_work_func);
3064 }
3065 
3066 /**
3067  * xe_bo_dev_fini() - Finalize BO dev managing async BO freeing
3068  * @bo_dev: The BO dev structure
3069  */
xe_bo_dev_fini(struct xe_bo_dev * bo_dev)3070 void xe_bo_dev_fini(struct xe_bo_dev *bo_dev)
3071 {
3072 	flush_work(&bo_dev->async_free);
3073 }
3074 
xe_bo_put(struct xe_bo * bo)3075 void xe_bo_put(struct xe_bo *bo)
3076 {
3077 	struct xe_tile *tile;
3078 	u8 id;
3079 
3080 	might_sleep();
3081 	if (bo) {
3082 #ifdef CONFIG_PROC_FS
3083 		if (bo->client)
3084 			might_lock(&bo->client->bos_lock);
3085 #endif
3086 		for_each_tile(tile, xe_bo_device(bo), id)
3087 			if (bo->ggtt_node[id] && bo->ggtt_node[id]->ggtt)
3088 				xe_ggtt_might_lock(bo->ggtt_node[id]->ggtt);
3089 		drm_gem_object_put(&bo->ttm.base);
3090 	}
3091 }
3092 
3093 /**
3094  * xe_bo_dumb_create - Create a dumb bo as backing for a fb
3095  * @file_priv: ...
3096  * @dev: ...
3097  * @args: ...
3098  *
3099  * See dumb_create() hook in include/drm/drm_drv.h
3100  *
3101  * Return: ...
3102  */
xe_bo_dumb_create(struct drm_file * file_priv,struct drm_device * dev,struct drm_mode_create_dumb * args)3103 int xe_bo_dumb_create(struct drm_file *file_priv,
3104 		      struct drm_device *dev,
3105 		      struct drm_mode_create_dumb *args)
3106 {
3107 	struct xe_device *xe = to_xe_device(dev);
3108 	struct xe_bo *bo;
3109 	uint32_t handle;
3110 	int cpp = DIV_ROUND_UP(args->bpp, 8);
3111 	int err;
3112 	u32 page_size = max_t(u32, PAGE_SIZE,
3113 		xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K ? SZ_64K : SZ_4K);
3114 
3115 	args->pitch = ALIGN(args->width * cpp, 64);
3116 	args->size = ALIGN(mul_u32_u32(args->pitch, args->height),
3117 			   page_size);
3118 
3119 	bo = xe_bo_create_user(xe, NULL, NULL, args->size,
3120 			       DRM_XE_GEM_CPU_CACHING_WC,
3121 			       XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
3122 			       XE_BO_FLAG_SCANOUT |
3123 			       XE_BO_FLAG_NEEDS_CPU_ACCESS);
3124 	if (IS_ERR(bo))
3125 		return PTR_ERR(bo);
3126 
3127 	err = drm_gem_handle_create(file_priv, &bo->ttm.base, &handle);
3128 	/* drop reference from allocate - handle holds it now */
3129 	drm_gem_object_put(&bo->ttm.base);
3130 	if (!err)
3131 		args->handle = handle;
3132 	return err;
3133 }
3134 
xe_bo_runtime_pm_release_mmap_offset(struct xe_bo * bo)3135 void xe_bo_runtime_pm_release_mmap_offset(struct xe_bo *bo)
3136 {
3137 	struct ttm_buffer_object *tbo = &bo->ttm;
3138 	struct ttm_device *bdev = tbo->bdev;
3139 
3140 	drm_vma_node_unmap(&tbo->base.vma_node, bdev->dev_mapping);
3141 
3142 	list_del_init(&bo->vram_userfault_link);
3143 }
3144 
3145 #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
3146 #include "tests/xe_bo.c"
3147 #endif
3148