Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

authored by

Akshata Jahagirdar and committed by
Matt Roper
8a92e2a6 523f191c

+119 -1
+119 -1
drivers/gpu/drm/xe/tests/xe_migrate.c
··· 484 484 return fence; 485 485 } 486 486 487 + static void test_migrate(struct xe_device *xe, struct xe_tile *tile, 488 + struct xe_bo *sys_bo, struct xe_bo *vram_bo, struct xe_bo *ccs_bo, 489 + struct kunit *test) 490 + { 491 + struct dma_fence *fence; 492 + u64 expected, retval; 493 + long timeout; 494 + long ret; 495 + 496 + expected = 0xd0d0d0d0d0d0d0d0; 497 + xe_map_memset(xe, &sys_bo->vmap, 0, 0xd0, sys_bo->size); 498 + 499 + fence = blt_copy(tile, sys_bo, vram_bo, false, "Blit copy from sysmem to vram", test); 500 + if (!sanity_fence_failed(xe, fence, "Blit copy from sysmem to vram", test)) { 501 + retval = xe_map_rd(xe, &vram_bo->vmap, 0, u64); 502 + if (retval == expected) 503 + KUNIT_FAIL(test, "Sanity check failed: VRAM must have compressed value\n"); 504 + } 505 + dma_fence_put(fence); 506 + 507 + kunit_info(test, "Evict vram buffer object\n"); 508 + ret = xe_bo_evict(vram_bo, true); 509 + if (ret) { 510 + KUNIT_FAIL(test, "Failed to evict bo.\n"); 511 + return; 512 + } 513 + 514 + ret = xe_bo_vmap(vram_bo); 515 + if (ret) { 516 + KUNIT_FAIL(test, "Failed to vmap vram bo: %li\n", ret); 517 + return; 518 + } 519 + 520 + retval = xe_map_rd(xe, &vram_bo->vmap, 0, u64); 521 + check(retval, expected, "Clear evicted vram data first value", test); 522 + retval = xe_map_rd(xe, &vram_bo->vmap, vram_bo->size - 8, u64); 523 + check(retval, expected, "Clear evicted vram data last value", test); 524 + 525 + fence = blt_copy(tile, vram_bo, ccs_bo, 526 + true, "Blit surf copy from vram to sysmem", test); 527 + if (!sanity_fence_failed(xe, fence, "Clear ccs buffer data", test)) { 528 + retval = xe_map_rd(xe, &ccs_bo->vmap, 0, u64); 529 + check(retval, 0, "Clear ccs data first value", test); 530 + 531 + retval = xe_map_rd(xe, &ccs_bo->vmap, ccs_bo->size - 8, u64); 532 + check(retval, 0, "Clear ccs data last value", test); 533 + } 534 + dma_fence_put(fence); 535 + 536 + kunit_info(test, "Restore vram buffer object\n"); 537 + ret = xe_bo_validate(vram_bo, NULL, false); 538 + if (ret) { 539 + KUNIT_FAIL(test, "Failed to validate vram bo for: %li\n", ret); 540 + return; 541 + } 542 + 543 + /* Sync all migration blits */ 544 + timeout = dma_resv_wait_timeout(vram_bo->ttm.base.resv, 545 + DMA_RESV_USAGE_KERNEL, 546 + true, 547 + 5 * HZ); 548 + if (timeout <= 0) { 549 + KUNIT_FAIL(test, "Failed to sync bo eviction.\n"); 550 + return; 551 + } 552 + 553 + ret = xe_bo_vmap(vram_bo); 554 + if (ret) { 555 + KUNIT_FAIL(test, "Failed to vmap vram bo: %li\n", ret); 556 + return; 557 + } 558 + 559 + retval = xe_map_rd(xe, &vram_bo->vmap, 0, u64); 560 + check(retval, expected, "Restored value must be equal to initial value", test); 561 + retval = xe_map_rd(xe, &vram_bo->vmap, vram_bo->size - 8, u64); 562 + check(retval, expected, "Restored value must be equal to initial value", test); 563 + 564 + fence = blt_copy(tile, vram_bo, ccs_bo, 565 + true, "Blit surf copy from vram to sysmem", test); 566 + if (!sanity_fence_failed(xe, fence, "Clear ccs buffer data", test)) { 567 + retval = xe_map_rd(xe, &ccs_bo->vmap, 0, u64); 568 + check(retval, 0, "Clear ccs data first value", test); 569 + retval = xe_map_rd(xe, &ccs_bo->vmap, ccs_bo->size - 8, u64); 570 + check(retval, 0, "Clear ccs data last value", test); 571 + } 572 + dma_fence_put(fence); 573 + } 574 + 487 575 static void test_clear(struct xe_device *xe, struct xe_tile *tile, 488 576 struct xe_bo *sys_bo, struct xe_bo *vram_bo, struct kunit *test) 489 577 { ··· 629 541 static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *tile, 630 542 struct kunit *test) 631 543 { 632 - struct xe_bo *sys_bo, *vram_bo; 544 + struct xe_bo *sys_bo, *vram_bo = NULL, *ccs_bo = NULL; 633 545 unsigned int bo_flags = XE_BO_FLAG_VRAM_IF_DGFX(tile); 634 546 long ret; 635 547 ··· 657 569 } 658 570 xe_bo_unlock(sys_bo); 659 571 572 + ccs_bo = xe_bo_create_user(xe, NULL, NULL, SZ_4M, DRM_XE_GEM_CPU_CACHING_WC, 573 + ttm_bo_type_device, bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS); 574 + 575 + if (IS_ERR(ccs_bo)) { 576 + KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", 577 + PTR_ERR(ccs_bo)); 578 + return; 579 + } 580 + 581 + xe_bo_lock(ccs_bo, false); 582 + ret = xe_bo_validate(ccs_bo, NULL, false); 583 + if (ret) { 584 + KUNIT_FAIL(test, "Failed to validate system bo for: %li\n", ret); 585 + goto free_ccsbo; 586 + } 587 + 588 + ret = xe_bo_vmap(ccs_bo); 589 + if (ret) { 590 + KUNIT_FAIL(test, "Failed to vmap system bo: %li\n", ret); 591 + goto free_ccsbo; 592 + } 593 + xe_bo_unlock(ccs_bo); 594 + 660 595 vram_bo = xe_bo_create_user(xe, NULL, NULL, SZ_4M, DRM_XE_GEM_CPU_CACHING_WC, 661 596 ttm_bo_type_device, bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS); 662 597 if (IS_ERR(vram_bo)) { ··· 702 591 } 703 592 704 593 test_clear(xe, tile, sys_bo, vram_bo, test); 594 + test_migrate(xe, tile, sys_bo, vram_bo, ccs_bo, test); 705 595 xe_bo_unlock(vram_bo); 706 596 707 597 xe_bo_lock(vram_bo, false); 708 598 xe_bo_vunmap(vram_bo); 709 599 xe_bo_unlock(vram_bo); 710 600 601 + xe_bo_lock(ccs_bo, false); 602 + xe_bo_vunmap(ccs_bo); 603 + xe_bo_unlock(ccs_bo); 604 + 711 605 xe_bo_lock(sys_bo, false); 712 606 xe_bo_vunmap(sys_bo); 713 607 xe_bo_unlock(sys_bo); 714 608 free_vrambo: 715 609 xe_bo_put(vram_bo); 610 + free_ccsbo: 611 + xe_bo_put(ccs_bo); 716 612 free_sysbo: 717 613 xe_bo_put(sys_bo); 718 614 }