drm/xe/migrate: Add kunit to test migration functionality for BMG
This part of kunit verifies that - main data is decompressed and ccs data is clear post bo eviction. - main data is raw copied and ccs data is clear post bo restore. v2: Added missing bo_put()/bo_unlock() (Matt Auld) Signed-off-by: Akshata Jahagirdar <akshata.jahagirdar@intel.com> Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> Signed-off-by: Matt Roper <matthew.d.roper@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/1d36d4377c566508e42b3fb80d3fe4a588fd00ca.1721250309.git.akshata.jahagirdar@intel.com
This commit is contained in:
committed by
Matt Roper
parent
523f191cc0
commit
8a92e2a67f
@@ -484,6 +484,94 @@ err_sync:
|
|||||||
return fence;
|
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 kunit *test)
|
||||||
|
{
|
||||||
|
struct dma_fence *fence;
|
||||||
|
u64 expected, retval;
|
||||||
|
long timeout;
|
||||||
|
long ret;
|
||||||
|
|
||||||
|
expected = 0xd0d0d0d0d0d0d0d0;
|
||||||
|
xe_map_memset(xe, &sys_bo->vmap, 0, 0xd0, sys_bo->size);
|
||||||
|
|
||||||
|
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, true);
|
||||||
|
if (ret) {
|
||||||
|
KUNIT_FAIL(test, "Failed to evict bo.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = xe_bo_vmap(vram_bo);
|
||||||
|
if (ret) {
|
||||||
|
KUNIT_FAIL(test, "Failed to vmap vram bo: %li\n", ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = xe_map_rd(xe, &vram_bo->vmap, 0, u64);
|
||||||
|
check(retval, expected, "Clear evicted vram data first value", test);
|
||||||
|
retval = xe_map_rd(xe, &vram_bo->vmap, vram_bo->size - 8, u64);
|
||||||
|
check(retval, expected, "Clear evicted vram data last value", test);
|
||||||
|
|
||||||
|
fence = blt_copy(tile, vram_bo, ccs_bo,
|
||||||
|
true, "Blit surf copy from vram to sysmem", test);
|
||||||
|
if (!sanity_fence_failed(xe, fence, "Clear ccs buffer data", test)) {
|
||||||
|
retval = xe_map_rd(xe, &ccs_bo->vmap, 0, u64);
|
||||||
|
check(retval, 0, "Clear ccs data first value", test);
|
||||||
|
|
||||||
|
retval = xe_map_rd(xe, &ccs_bo->vmap, ccs_bo->size - 8, u64);
|
||||||
|
check(retval, 0, "Clear ccs data last value", test);
|
||||||
|
}
|
||||||
|
dma_fence_put(fence);
|
||||||
|
|
||||||
|
kunit_info(test, "Restore vram buffer object\n");
|
||||||
|
ret = xe_bo_validate(vram_bo, NULL, false);
|
||||||
|
if (ret) {
|
||||||
|
KUNIT_FAIL(test, "Failed to validate vram bo for: %li\n", ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sync all migration blits */
|
||||||
|
timeout = dma_resv_wait_timeout(vram_bo->ttm.base.resv,
|
||||||
|
DMA_RESV_USAGE_KERNEL,
|
||||||
|
true,
|
||||||
|
5 * HZ);
|
||||||
|
if (timeout <= 0) {
|
||||||
|
KUNIT_FAIL(test, "Failed to sync bo eviction.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = xe_bo_vmap(vram_bo);
|
||||||
|
if (ret) {
|
||||||
|
KUNIT_FAIL(test, "Failed to vmap vram bo: %li\n", ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = xe_map_rd(xe, &vram_bo->vmap, 0, u64);
|
||||||
|
check(retval, expected, "Restored value must be equal to initial value", test);
|
||||||
|
retval = xe_map_rd(xe, &vram_bo->vmap, vram_bo->size - 8, u64);
|
||||||
|
check(retval, expected, "Restored value must be equal to initial value", test);
|
||||||
|
|
||||||
|
fence = blt_copy(tile, vram_bo, ccs_bo,
|
||||||
|
true, "Blit surf copy from vram to sysmem", test);
|
||||||
|
if (!sanity_fence_failed(xe, fence, "Clear ccs buffer data", test)) {
|
||||||
|
retval = xe_map_rd(xe, &ccs_bo->vmap, 0, u64);
|
||||||
|
check(retval, 0, "Clear ccs data first value", test);
|
||||||
|
retval = xe_map_rd(xe, &ccs_bo->vmap, ccs_bo->size - 8, u64);
|
||||||
|
check(retval, 0, "Clear ccs data last value", test);
|
||||||
|
}
|
||||||
|
dma_fence_put(fence);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_clear(struct xe_device *xe, struct xe_tile *tile,
|
static void test_clear(struct xe_device *xe, struct xe_tile *tile,
|
||||||
struct xe_bo *sys_bo, struct xe_bo *vram_bo, struct kunit *test)
|
struct xe_bo *sys_bo, struct xe_bo *vram_bo, struct kunit *test)
|
||||||
{
|
{
|
||||||
@@ -541,7 +629,7 @@ static void test_clear(struct xe_device *xe, struct xe_tile *tile,
|
|||||||
static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *tile,
|
static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *tile,
|
||||||
struct kunit *test)
|
struct kunit *test)
|
||||||
{
|
{
|
||||||
struct xe_bo *sys_bo, *vram_bo;
|
struct xe_bo *sys_bo, *vram_bo = NULL, *ccs_bo = NULL;
|
||||||
unsigned int bo_flags = XE_BO_FLAG_VRAM_IF_DGFX(tile);
|
unsigned int bo_flags = XE_BO_FLAG_VRAM_IF_DGFX(tile);
|
||||||
long ret;
|
long ret;
|
||||||
|
|
||||||
@@ -569,6 +657,29 @@ static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *til
|
|||||||
}
|
}
|
||||||
xe_bo_unlock(sys_bo);
|
xe_bo_unlock(sys_bo);
|
||||||
|
|
||||||
|
ccs_bo = xe_bo_create_user(xe, NULL, NULL, SZ_4M, DRM_XE_GEM_CPU_CACHING_WC,
|
||||||
|
ttm_bo_type_device, bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS);
|
||||||
|
|
||||||
|
if (IS_ERR(ccs_bo)) {
|
||||||
|
KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n",
|
||||||
|
PTR_ERR(ccs_bo));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xe_bo_lock(ccs_bo, false);
|
||||||
|
ret = xe_bo_validate(ccs_bo, NULL, false);
|
||||||
|
if (ret) {
|
||||||
|
KUNIT_FAIL(test, "Failed to validate system bo for: %li\n", ret);
|
||||||
|
goto free_ccsbo;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = xe_bo_vmap(ccs_bo);
|
||||||
|
if (ret) {
|
||||||
|
KUNIT_FAIL(test, "Failed to vmap system bo: %li\n", ret);
|
||||||
|
goto free_ccsbo;
|
||||||
|
}
|
||||||
|
xe_bo_unlock(ccs_bo);
|
||||||
|
|
||||||
vram_bo = xe_bo_create_user(xe, NULL, NULL, SZ_4M, DRM_XE_GEM_CPU_CACHING_WC,
|
vram_bo = xe_bo_create_user(xe, NULL, NULL, SZ_4M, DRM_XE_GEM_CPU_CACHING_WC,
|
||||||
ttm_bo_type_device, bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS);
|
ttm_bo_type_device, bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS);
|
||||||
if (IS_ERR(vram_bo)) {
|
if (IS_ERR(vram_bo)) {
|
||||||
@@ -591,17 +702,24 @@ static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *til
|
|||||||
}
|
}
|
||||||
|
|
||||||
test_clear(xe, tile, sys_bo, vram_bo, test);
|
test_clear(xe, tile, sys_bo, vram_bo, test);
|
||||||
|
test_migrate(xe, tile, sys_bo, vram_bo, ccs_bo, test);
|
||||||
xe_bo_unlock(vram_bo);
|
xe_bo_unlock(vram_bo);
|
||||||
|
|
||||||
xe_bo_lock(vram_bo, false);
|
xe_bo_lock(vram_bo, false);
|
||||||
xe_bo_vunmap(vram_bo);
|
xe_bo_vunmap(vram_bo);
|
||||||
xe_bo_unlock(vram_bo);
|
xe_bo_unlock(vram_bo);
|
||||||
|
|
||||||
|
xe_bo_lock(ccs_bo, false);
|
||||||
|
xe_bo_vunmap(ccs_bo);
|
||||||
|
xe_bo_unlock(ccs_bo);
|
||||||
|
|
||||||
xe_bo_lock(sys_bo, false);
|
xe_bo_lock(sys_bo, false);
|
||||||
xe_bo_vunmap(sys_bo);
|
xe_bo_vunmap(sys_bo);
|
||||||
xe_bo_unlock(sys_bo);
|
xe_bo_unlock(sys_bo);
|
||||||
free_vrambo:
|
free_vrambo:
|
||||||
xe_bo_put(vram_bo);
|
xe_bo_put(vram_bo);
|
||||||
|
free_ccsbo:
|
||||||
|
xe_bo_put(ccs_bo);
|
||||||
free_sysbo:
|
free_sysbo:
|
||||||
xe_bo_put(sys_bo);
|
xe_bo_put(sys_bo);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user