13c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/* 23c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Copyright 2014 Advanced Micro Devices, Inc. 33c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 43c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Permission is hereby granted, free of charge, to any person obtaining a 53c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * copy of this software and associated documentation files (the "Software"), 63c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * to deal in the Software without restriction, including without limitation 73c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * the rights to use, copy, modify, merge, publish, distribute, sublicense, 83c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * and/or sell copies of the Software, and to permit persons to whom the 93c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Software is furnished to do so, subject to the following conditions: 103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * The above copyright notice and this permission notice shall be included in 123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * all copies or substantial portions of the Software. 133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * OTHER DEALINGS IN THE SOFTWARE. 213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher*/ 2325784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer 2425784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer#ifdef HAVE_CONFIG_H 2525784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer#include "config.h" 2625784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer#endif 2725784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer 283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdio.h> 293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdlib.h> 303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <unistd.h> 3194ecdcb8b11dd3eb6b047ad72030d775014aadeeAlan Coopersmith#ifdef HAVE_ALLOCA_H 3294ecdcb8b11dd3eb6b047ad72030d775014aadeeAlan Coopersmith# include <alloca.h> 3394ecdcb8b11dd3eb6b047ad72030d775014aadeeAlan Coopersmith#endif 343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "CUnit/Basic.h" 363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_test.h" 383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_drm.h" 393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic amdgpu_device_handle device_handle; 413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic uint32_t major_version; 423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic uint32_t minor_version; 433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void); 453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void); 463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_gfx(void); 473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void); 483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void); 493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void); 503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex DeucherCU_TestInfo basic_tests[] = { 523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Query Info Test", amdgpu_query_info_test }, 533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Memory alloc Test", amdgpu_memory_alloc }, 543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Userptr Test", amdgpu_userptr_test }, 553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Command submission Test (GFX)", amdgpu_command_submission_gfx }, 563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Command submission Test (Compute)", amdgpu_command_submission_compute }, 573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Command submission Test (SDMA)", amdgpu_command_submission_sdma }, 583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_TEST_INFO_NULL, 593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}; 603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define BUFFER_SIZE (8 * 1024) 613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_offset 0 623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_mask 0x000000FF 633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_shift 0 643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift) 653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_CONSTANT_FILL 11 663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher# define SDMA_CONSTANT_FILL_EXTRA_SIZE(x) ((x) << 14) 673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* 0 = byte fill 683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 2 = DW fill 693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */ 703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PACKET(op, sub_op, e) ((((e) & 0xFFFF) << 16) | \ 713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher (((sub_op) & 0xFF) << 8) | \ 723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher (((op) & 0xFF) << 0)) 733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_WRITE 2 743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher# define SDMA_WRITE_SUB_OPCODE_LINEAR 0 753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher# define SDMA_WRTIE_SUB_OPCODE_TILED 1 763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_COPY 1 783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher# define SDMA_COPY_SUB_OPCODE_LINEAR 0 793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_init(void) 813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_device_initialize(drm_amdgpu[0], &major_version, 853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &minor_version, &device_handle); 863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (r == 0) 883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CUE_SUCCESS; 893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher else 903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CUE_SINIT_FAILED; 913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_clean(void) 943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r = amdgpu_device_deinitialize(device_handle); 963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (r == 0) 983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CUE_SUCCESS; 993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher else 1003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CUE_SCLEAN_FAILED; 1013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 1023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void) 1043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 1053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_gpu_info gpu_info = {0}; 1063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t version, feature; 1073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 1083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_query_gpu_info(device_handle, &gpu_info); 1103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0, 1133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 0, &version, &feature); 1143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 1163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void) 1183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 1193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 1208aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_va_handle va_handle; 1213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 1223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 1233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Test visible VRAM */ 1253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 1263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, 4096, 1273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_VRAM, 1283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 1298aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &bo_mc, &va_handle); 1303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1318aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 1323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Test invisible VRAM */ 1353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 1363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, 4096, 1373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_VRAM, 1383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 1398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &bo_mc, &va_handle); 1403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1418aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 1423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Test GART Cacheable */ 1453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 1463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, 4096, 1473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 1488aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou 0, &bo_mc, &va_handle); 1493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1508aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 1513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Test GART USWC */ 1543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 1553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, 4096, 1563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 157a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou AMDGPU_GEM_CREATE_CPU_GTT_USWC, 1588aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &bo_mc, &va_handle); 1593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1608aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 1613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 1633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 164ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_separate_ibs(void) 1653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 1663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 167646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle, ib_result_ce_handle; 168646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu, *ib_result_ce_cpu; 169646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address, ib_result_ce_mc_address; 1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request ibs_request = {0}; 1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info ib_info[2]; 1725463d2e83a450a0428f6c46561c5e2a54a229589Christian König struct amdgpu_cs_fence fence_status = {0}; 1733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ptr; 1743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 17576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák amdgpu_bo_list_handle bo_list; 1768aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_va_handle va_handle, va_handle_ce; 1773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 1783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 1803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 182646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 183646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 184646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 1858aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &ib_result_mc_address, &va_handle); 1863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 188646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 189646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 190646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_ce_handle, &ib_result_ce_cpu, 1918aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &ib_result_ce_mc_address, &va_handle_ce); 1923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 19476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_get_bo_list(device_handle, ib_result_handle, 19576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_result_ce_handle, &bo_list); 19676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 19776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 1983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 1993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* IT_SET_CE_DE_COUNTERS */ 201646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_ce_cpu; 2023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[0] = 0xc0008900; 2033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[1] = 0; 2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[2] = 0xc0008400; 2053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[3] = 1; 20676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info[0].ib_mc_address = ib_result_ce_mc_address; 2073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[0].size = 4; 208db126d1d8a764b9d3ad322779b13904867b14e5cJammy Zhou ib_info[0].flags = AMDGPU_IB_FLAG_CE; 2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* IT_WAIT_ON_CE_COUNTER */ 211646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_cpu; 2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[0] = 0xc0008600; 2133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[1] = 0x00000001; 21476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info[1].ib_mc_address = ib_result_mc_address; 2153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[1].size = 2; 2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ip_type = AMDGPU_HW_IP_GFX; 2183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.number_of_ibs = 2; 2193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ibs = ib_info; 22076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ibs_request.resources = bo_list; 221926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang ibs_request.fence_info.handle = NULL; 222926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang 223926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 2243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 2283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_GFX; 229926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang fence_status.fence = ibs_request.seq_no; 2303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 231f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou r = amdgpu_cs_query_fence_status(&fence_status, 232f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou AMDGPU_TIMEOUT_INFINITE, 233f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou 0, &expired); 2343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2368aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 2378aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou ib_result_mc_address, 4096); 2381041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 2391041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 2408aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce, 2418aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou ib_result_ce_mc_address, 4096); 2421041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 2431041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 24476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_bo_list_destroy(bo_list); 24576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 24676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 2479c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 2483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 249926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang 2503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 2513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 252ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_shared_ib(void) 253ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{ 254ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou amdgpu_context_handle context_handle; 255646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle; 256646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu; 257646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address; 258ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou struct amdgpu_cs_request ibs_request = {0}; 259ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou struct amdgpu_cs_ib_info ib_info[2]; 2605463d2e83a450a0428f6c46561c5e2a54a229589Christian König struct amdgpu_cs_fence fence_status = {0}; 261ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou uint32_t *ptr; 262ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou uint32_t expired; 26376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák amdgpu_bo_list_handle bo_list; 2648aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_va_handle va_handle; 265ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou int r; 266ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 267ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou r = amdgpu_cs_ctx_create(device_handle, &context_handle); 268ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 269ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 270646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 271646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 272646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 2738aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &ib_result_mc_address, &va_handle); 274ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 275ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 27676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 27776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák &bo_list); 27876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 27976af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 280ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 281ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 282ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou /* IT_SET_CE_DE_COUNTERS */ 283646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_cpu; 284ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[0] = 0xc0008900; 285ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[1] = 0; 286ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[2] = 0xc0008400; 287ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[3] = 1; 28876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info[0].ib_mc_address = ib_result_mc_address; 289ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[0].size = 4; 290ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[0].flags = AMDGPU_IB_FLAG_CE; 291ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 292646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = (uint32_t *)ib_result_cpu + 4; 293ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[0] = 0xc0008600; 294ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[1] = 0x00000001; 29576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info[1].ib_mc_address = ib_result_mc_address + 16; 296ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[1].size = 2; 297ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 298ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ibs_request.ip_type = AMDGPU_HW_IP_GFX; 299ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ibs_request.number_of_ibs = 2; 300ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ibs_request.ibs = ib_info; 30176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ibs_request.resources = bo_list; 302926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang ibs_request.fence_info.handle = NULL; 303926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang 304926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang r = amdgpu_cs_submit(context_handle, 0, &ibs_request, 1); 305ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 306ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 307ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 308ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou fence_status.context = context_handle; 309ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou fence_status.ip_type = AMDGPU_HW_IP_GFX; 310926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang fence_status.fence = ibs_request.seq_no; 311ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 312f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou r = amdgpu_cs_query_fence_status(&fence_status, 313f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou AMDGPU_TIMEOUT_INFINITE, 314f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou 0, &expired); 315ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 316ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 3178aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 3188aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou ib_result_mc_address, 4096); 3191041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 3201041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 32176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_bo_list_destroy(bo_list); 32276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 32376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 324ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou r = amdgpu_cs_ctx_free(context_handle); 325ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 326ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou} 327ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 328ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx(void) 329ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{ 330ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou /* separate IB buffers for multi-IB submission */ 331ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou amdgpu_command_submission_gfx_separate_ibs(); 332ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou /* shared IB buffer for multi-IB submission */ 333ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou amdgpu_command_submission_gfx_shared_ib(); 334ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou} 335ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 3363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void) 3373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 3383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 339646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle; 340646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu; 341646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address; 3423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request ibs_request; 3433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info ib_info; 3445463d2e83a450a0428f6c46561c5e2a54a229589Christian König struct amdgpu_cs_fence fence_status; 3453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ptr; 3463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 3473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, r, instance; 34876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák amdgpu_bo_list_handle bo_list; 3498aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_va_handle va_handle; 3503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (instance = 0; instance < 8; instance++) { 355646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 356646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 357646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 3588aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &ib_result_mc_address, &va_handle); 3593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 36176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 36276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák &bo_list); 36376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 36476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 365646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_cpu; 3663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (i = 0; i < 16; ++i) 3673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[i] = 0xffff1000; 3683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 37076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info.ib_mc_address = ib_result_mc_address; 3713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info.size = 16; 3723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 3743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE; 3753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ring = instance; 3763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.number_of_ibs = 1; 3773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ibs = &ib_info; 37876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ibs_request.resources = bo_list; 379926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang ibs_request.fence_info.handle = NULL; 3803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3815463d2e83a450a0428f6c46561c5e2a54a229589Christian König memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 382926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 3833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 3863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_COMPUTE; 3873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ring = instance; 388926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang fence_status.fence = ibs_request.seq_no; 3893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 390f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou r = amdgpu_cs_query_fence_status(&fence_status, 391f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou AMDGPU_TIMEOUT_INFINITE, 392f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou 0, &expired); 3933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3941041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 39576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_bo_list_destroy(bo_list); 39676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 39776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 3988aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 3998aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou ib_result_mc_address, 4096); 4001041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 4013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 4023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4039c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 4043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 4063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/* 4083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * caller need create/release: 4093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * pm4_src, resources, ib_info, and ibs_request 4103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * submit command stream described in ibs_request and wait for this IB accomplished 4113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */ 4123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_sdma_test_exec_cs(amdgpu_context_handle context_handle, 4133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int instance, int pm4_dw, uint32_t *pm4_src, 4143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int res_cnt, amdgpu_bo_handle *resources, 4153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info, 4163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request) 4173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 41876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák int r; 4193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 4203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ring_ptr; 421646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle; 422646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu; 423646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address; 4245463d2e83a450a0428f6c46561c5e2a54a229589Christian König struct amdgpu_cs_fence fence_status = {0}; 42576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1)); 4268aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_va_handle va_handle; 4273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare CS */ 4293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4_src, NULL); 4303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 4313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 4323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 4333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_TRUE(pm4_dw <= 1024); 4343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate IB */ 436646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 437646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 438646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 4398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &ib_result_mc_address, &va_handle); 4403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* copy PM4 packet to ring from caller */ 443646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ring_ptr = ib_result_cpu; 4443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src)); 4453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 44676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info->ib_mc_address = ib_result_mc_address; 4473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info->size = pm4_dw; 4483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ip_type = AMDGPU_HW_IP_DMA; 4503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ring = instance; 4513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->number_of_ibs = 1; 4523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ibs = ib_info; 453926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang ibs_request->fence_info.handle = NULL; 4543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 45576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák memcpy(all_res, resources, sizeof(resources[0]) * res_cnt); 45676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák all_res[res_cnt] = ib_result_handle; 45776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 45876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_bo_list_create(device_handle, res_cnt+1, all_res, 4596dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König NULL, &ibs_request->resources); 4606dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König CU_ASSERT_EQUAL(r, 0); 4613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 4633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* submit CS */ 465926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang r = amdgpu_cs_submit(context_handle, 0, ibs_request, 1); 4663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4686dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König r = amdgpu_bo_list_destroy(ibs_request->resources); 4696dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König CU_ASSERT_EQUAL(r, 0); 4706dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König 4713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_DMA; 4723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ring = ibs_request->ring; 4733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 474926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang fence_status.fence = ibs_request->seq_no; 4753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* wait for IB accomplished */ 477f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou r = amdgpu_cs_query_fence_status(&fence_status, 478f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou AMDGPU_TIMEOUT_INFINITE, 479f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou 0, &expired); 4803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(expired, true); 4821041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 4838aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4848aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou ib_result_mc_address, 4096); 4851041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 4863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 4873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_write_linear(void) 4893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 4903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 128; 4913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 4923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 4933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 4943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 4953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 4963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 4973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 4983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 4993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile uint32_t *bo_cpu; 5003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop; 501a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 5028aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_va_handle va_handle; 5033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 5053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 5063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 5083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 5093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 5113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 5123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 5143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 5153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 5173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(1, sizeof(amdgpu_bo_handle)); 5183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 5193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop = 0; 521a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop < 2) { 5223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo for sDMA use */ 5238aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_alloc_and_map(device_handle, 5248aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou sdma_write_length * sizeof(uint32_t), 5258aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou 4096, AMDGPU_GEM_DOMAIN_GTT, 526d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer gtt_flags[loop], &bo, (void**)&bo_cpu, 5278aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &bo_mc, &va_handle); 5288aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 5293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo */ 5313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t)); 5323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo; 5353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA write-linear */ 5373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 5383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 5393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 5403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 5413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 5423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 5433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(j++ < sdma_write_length) 5443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 5453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 5473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 5483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, resources, 5493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 5503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 5523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 5533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < sdma_write_length) { 5543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 5553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5568aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou 5578aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc, 5588aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou sdma_write_length * sizeof(uint32_t)); 5598aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 5603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop++; 5613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 5633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 5643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 5653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 5663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 5673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 5699c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 5703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 5713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 5723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_const_fill(void) 5743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 5753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 1024 * 1024; 5763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 5773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 5783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 5793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 5803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 5813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 5823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 5833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 5843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile uint32_t *bo_cpu; 5853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop; 586a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 5878aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_va_handle va_handle; 5883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 5903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 5913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 5933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 5943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 5963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 5973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 5993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 6023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(1, sizeof(amdgpu_bo_handle)); 6033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 6043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop = 0; 606a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop < 2) { 6073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo for sDMA use */ 6088aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_alloc_and_map(device_handle, 6098aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou sdma_write_length, 4096, 6108aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou AMDGPU_GEM_DOMAIN_GTT, 611d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer gtt_flags[loop], &bo, (void**)&bo_cpu, 6128aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &bo_mc, &va_handle); 6138aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 6143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo */ 6163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo_cpu, 0, sdma_write_length); 6173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo; 6193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA const fill */ 6213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 6223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0, 6233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_CONSTANT_FILL_EXTRA_SIZE(2)); 6243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 6253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 6263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 6273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 6283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 6303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 6313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, resources, 6323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 6333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 6353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 6363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < (sdma_write_length / 4)) { 6373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 6383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 6398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou 6408aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc, 6418aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou sdma_write_length); 6428aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 6433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop++; 6443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 6453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 6463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 6473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 6483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 6493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 6503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 6529c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 6533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 6553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_copy_linear(void) 6573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 6583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 1024; 6593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 6603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 6613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo1, bo2; 6623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 6633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 6643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 6653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 6663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo1_mc, bo2_mc; 6673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile unsigned char *bo1_cpu, *bo2_cpu; 6683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop1, loop2; 669a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 6708aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_va_handle bo1_va_handle, bo2_va_handle; 6713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 6733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 6743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 6763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 6773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 6793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 6803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 6823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 6853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(2, sizeof(amdgpu_bo_handle)); 6863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 6873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop1 = loop2 = 0; 6893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* run 9 circle to test all mapping combination */ 690a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop1 < 2) { 691a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop2 < 2) { 6923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo1for sDMA use */ 6938aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_alloc_and_map(device_handle, 6948aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou sdma_write_length, 4096, 6958aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou AMDGPU_GEM_DOMAIN_GTT, 696d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer gtt_flags[loop1], &bo1, 697d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer (void**)&bo1_cpu, &bo1_mc, 698d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer &bo1_va_handle); 6998aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 7003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* set bo1 */ 7023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo1_cpu, 0xaa, sdma_write_length); 7033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo2 for sDMA use */ 7058aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_alloc_and_map(device_handle, 7068aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou sdma_write_length, 4096, 7078aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou AMDGPU_GEM_DOMAIN_GTT, 708d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer gtt_flags[loop2], &bo2, 709d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer (void**)&bo2_cpu, &bo2_mc, 710d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer &bo2_va_handle); 7118aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 7123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo2 */ 7143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo2_cpu, 0, sdma_write_length); 7153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo1; 7173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[1] = bo2; 7183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA copy linear */ 7203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 7213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0); 7223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 7233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0; 7243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo1_mc; 7253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 7263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo2_mc; 7273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 7283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 7313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 7323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2, resources, 7333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 7343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 7363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 7373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < sdma_write_length) { 7383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa); 7393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 7408aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc, 7418aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou sdma_write_length); 7428aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 7438aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc, 7448aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou sdma_write_length); 7458aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 7463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop2++; 7473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 7483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop1++; 7493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 7503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 7513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 7523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 7533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 7543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 7553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 7579c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 7583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 7603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void) 7623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 7633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_write_linear(); 7643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_const_fill(); 7653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_copy_linear(); 7663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 7673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void) 7693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 7703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, r, j; 7713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4 = NULL; 7723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 7733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher void *ptr = NULL; 7743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int pm4_dw = 256; 7753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int sdma_write_length = 4; 7763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle handle; 7773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 7783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 7793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 7808aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_bo_handle buf_handle; 7818aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_va_handle va_handle; 7823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 7843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 7853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 7873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 7883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 7903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 7913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 7933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE); 7963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ptr, NULL); 7973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(ptr, 0, BUFFER_SIZE); 7983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_create_bo_from_user_mem(device_handle, 8008aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou ptr, BUFFER_SIZE, &buf_handle); 8018aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 8028aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou 8038aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_va_range_alloc(device_handle, 8048aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou amdgpu_gpu_va_range_general, 8058aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou BUFFER_SIZE, 1, 0, &bo_mc, 8068aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou &va_handle, 0); 8078aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 8088aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou 8098aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_MAP); 8103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 8118aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou 8128aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou handle = buf_handle; 8133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 8143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher j = i = 0; 8153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 8163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 8173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 8183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 8193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 8203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 8213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while (j++ < sdma_write_length) 8223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 8233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 8243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 8253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 8263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, &handle, 8273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 8283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 8293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while (i < sdma_write_length) { 8303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf); 8313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 8323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 8333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 8343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 8358aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou 8368aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_UNMAP); 8378aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 8388aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_va_range_free(va_handle); 8398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou CU_ASSERT_EQUAL(r, 0); 8408aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou r = amdgpu_bo_free(buf_handle); 8413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 8423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ptr); 8433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 8449c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 8453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 8463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 847