drivers/gpu/drm/xe/tests/xe_migrate.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/xe/tests/xe_migrate.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/xe/tests/xe_migrate.c
Extension
.c
Size
22951 bytes
Lines
787
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (IS_ERR(bb)) {
			err = PTR_ERR(bb);
			goto err_sync;
		}

		if (src_is_vram)
			xe_res_next(&src_it, src_L0);
		else
			emit_pte(m, bb, src_L0_pt, src_is_vram, false,
				 &src_it, src_L0, src);

		if (dst_is_vram)
			xe_res_next(&dst_it, src_L0);
		else
			emit_pte(m, bb, dst_L0_pt, dst_is_vram, false,
				 &dst_it, src_L0, dst);

		bb->cs[bb->len++] = MI_BATCH_BUFFER_END;
		update_idx = bb->len;
		if (!copy_only_ccs)
			emit_copy(gt, bb, src_L0_ofs, dst_L0_ofs, src_L0, XE_PAGE_SIZE);

		if (copy_only_ccs)
			flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs,
							  src_is_vram, dst_L0_ofs,
							  dst_is_vram, src_L0, dst_L0_ofs,
							  copy_only_ccs);

		job = xe_bb_create_migration_job(m->q, bb,
						 xe_migrate_batch_base(m, xe->info.has_usm),
						 update_idx);
		if (IS_ERR(job)) {
			err = PTR_ERR(job);
			goto err;
		}

		xe_sched_job_add_migrate_flush(job, flush_flags);

		mutex_lock(&m->job_mutex);
		xe_sched_job_arm(job);
		dma_fence_put(fence);
		fence = dma_fence_get(&job->drm.s_fence->finished);
		xe_sched_job_push(job);

		dma_fence_put(m->fence);
		m->fence = dma_fence_get(fence);

		mutex_unlock(&m->job_mutex);

		xe_bb_free(bb, fence);
		size -= src_L0;
		continue;

err:
		xe_bb_free(bb, NULL);

err_sync:
		if (fence) {
			dma_fence_wait(fence, false);
			dma_fence_put(fence);
		}
		return ERR_PTR(err);
	}

	return fence;
}

static void test_migrate(struct xe_device *xe, struct xe_tile *tile,
			 struct xe_bo *sys_bo, struct xe_bo *vram_bo, struct xe_bo *ccs_bo,
			 struct drm_exec *exec, struct kunit *test)
{
	struct dma_fence *fence;
	u64 expected, retval;
	long timeout;
	long ret;

	expected = 0xd0d0d0d0d0d0d0d0;
	xe_map_memset(xe, &sys_bo->vmap, 0, 0xd0, xe_bo_size(sys_bo));

	fence = blt_copy(tile, sys_bo, vram_bo, false, "Blit copy from sysmem to vram", test);
	if (!sanity_fence_failed(xe, fence, "Blit copy from sysmem to vram", test)) {
		retval = xe_map_rd(xe, &vram_bo->vmap, 0, u64);
		if (retval == expected)
			KUNIT_FAIL(test, "Sanity check failed: VRAM must have compressed value\n");
	}
	dma_fence_put(fence);

	kunit_info(test, "Evict vram buffer object\n");
	ret = xe_bo_evict(vram_bo, exec);
	if (ret) {

Annotation

Implementation Notes