basic_tests.c revision 646f5411cf36413c903eb6db48b5e7febd893ec5
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*/ 233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdio.h> 243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdlib.h> 253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <unistd.h> 263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "CUnit/Basic.h" 283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_test.h" 303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_drm.h" 313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic amdgpu_device_handle device_handle; 333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic uint32_t major_version; 343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic uint32_t minor_version; 353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void); 373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void); 383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_gfx(void); 393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void); 403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void); 413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void); 423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex DeucherCU_TestInfo basic_tests[] = { 443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Query Info Test", amdgpu_query_info_test }, 453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Memory alloc Test", amdgpu_memory_alloc }, 463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Userptr Test", amdgpu_userptr_test }, 473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Command submission Test (GFX)", amdgpu_command_submission_gfx }, 483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Command submission Test (Compute)", amdgpu_command_submission_compute }, 493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher { "Command submission Test (SDMA)", amdgpu_command_submission_sdma }, 503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_TEST_INFO_NULL, 513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}; 523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define BUFFER_SIZE (8 * 1024) 533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_offset 0 543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_mask 0x000000FF 553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_shift 0 563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift) 573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_CONSTANT_FILL 11 583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher# define SDMA_CONSTANT_FILL_EXTRA_SIZE(x) ((x) << 14) 593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* 0 = byte fill 603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 2 = DW fill 613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */ 623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PACKET(op, sub_op, e) ((((e) & 0xFFFF) << 16) | \ 633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher (((sub_op) & 0xFF) << 8) | \ 643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher (((op) & 0xFF) << 0)) 653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_WRITE 2 663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher# define SDMA_WRITE_SUB_OPCODE_LINEAR 0 673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher# define SDMA_WRTIE_SUB_OPCODE_TILED 1 683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_COPY 1 703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher# define SDMA_COPY_SUB_OPCODE_LINEAR 0 713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_init(void) 733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_device_initialize(drm_amdgpu[0], &major_version, 773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &minor_version, &device_handle); 783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (r == 0) 803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CUE_SUCCESS; 813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher else 823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CUE_SINIT_FAILED; 833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_clean(void) 863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r = amdgpu_device_deinitialize(device_handle); 883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (r == 0) 903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CUE_SUCCESS; 913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher else 923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CUE_SCLEAN_FAILED; 933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void) 963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_gpu_info gpu_info = {0}; 983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t version, feature; 993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 1003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_query_gpu_info(device_handle, &gpu_info); 1023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0, 1053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 0, &version, &feature); 1063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 1083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void) 1103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 1113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 1123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 1133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 1143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Test visible VRAM */ 1163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 1173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, 4096, 1183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_VRAM, 1193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 1203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &bo_mc); 1213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_bo_free(bo); 1233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Test invisible VRAM */ 1263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 1273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, 4096, 1283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_VRAM, 1293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 1303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &bo_mc); 1313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_bo_free(bo); 1333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Test GART Cacheable */ 1363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 1373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, 4096, 1383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 1393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 0, 1403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &bo_mc); 1413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_bo_free(bo); 1433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Test GART USWC */ 1463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 1473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, 4096, 1483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 149a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou AMDGPU_GEM_CREATE_CPU_GTT_USWC, 1503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &bo_mc); 1513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_bo_free(bo); 1533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 1553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 156ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_separate_ibs(void) 1573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 1583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 159646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle, ib_result_ce_handle; 160646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu, *ib_result_ce_cpu; 161646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address, ib_result_ce_mc_address; 1623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request ibs_request = {0}; 1633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info ib_info[2]; 1643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_query_fence fence_status = {0}; 1653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ptr; 1663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 1673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 1683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 172646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 173646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 174646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 175646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_mc_address); 1763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 178646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 179646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 180646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_ce_handle, &ib_result_ce_cpu, 181646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_ce_mc_address); 1823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 1853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* IT_SET_CE_DE_COUNTERS */ 187646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_ce_cpu; 1883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[0] = 0xc0008900; 1893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[1] = 0; 1903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[2] = 0xc0008400; 1913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[3] = 1; 192646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ib_info[0].bo_handle = ib_result_ce_handle; 1933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[0].size = 4; 194db126d1d8a764b9d3ad322779b13904867b14e5cJammy Zhou ib_info[0].flags = AMDGPU_IB_FLAG_CE; 1953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* IT_WAIT_ON_CE_COUNTER */ 197646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_cpu; 1983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[0] = 0xc0008600; 1993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[1] = 0x00000001; 200646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ib_info[1].bo_handle = ib_result_handle; 2013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[1].size = 2; 2023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ip_type = AMDGPU_HW_IP_GFX; 2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.number_of_ibs = 2; 2053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ibs = ib_info; 2063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2079c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_submit(context_handle, 0, 2083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &ibs_request, 1, &fence_status.fence); 2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE; 2133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_GFX; 2143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2159c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_query_fence_status(&fence_status, &expired); 2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 218646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_handle); 2191041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 2201041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 221646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_ce_handle); 2221041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 2231041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 2249c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 2253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 2273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 228ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_shared_ib(void) 229ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{ 230ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou amdgpu_context_handle context_handle; 231646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle; 232646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu; 233646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address; 234ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou struct amdgpu_cs_request ibs_request = {0}; 235ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou struct amdgpu_cs_ib_info ib_info[2]; 236ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou struct amdgpu_cs_query_fence fence_status = {0}; 237ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou uint32_t *ptr; 238ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou uint32_t expired; 239ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou int r; 240ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 241ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou r = amdgpu_cs_ctx_create(device_handle, &context_handle); 242ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 243ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 244646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 245646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 246646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 247646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_mc_address); 248ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 249ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 250ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 251ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 252ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou /* IT_SET_CE_DE_COUNTERS */ 253646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_cpu; 254ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[0] = 0xc0008900; 255ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[1] = 0; 256ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[2] = 0xc0008400; 257ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[3] = 1; 258646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ib_info[0].bo_handle = ib_result_handle; 259ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[0].size = 4; 260ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[0].flags = AMDGPU_IB_FLAG_CE; 261ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 262646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = (uint32_t *)ib_result_cpu + 4; 263ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[0] = 0xc0008600; 264ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[1] = 0x00000001; 265646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ib_info[1].bo_handle = ib_result_handle; 266ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[1].size = 2; 267ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[1].offset_dw = 4; 268ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 269ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ibs_request.ip_type = AMDGPU_HW_IP_GFX; 270ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ibs_request.number_of_ibs = 2; 271ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ibs_request.ibs = ib_info; 272ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 273ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou r = amdgpu_cs_submit(context_handle, 0, 274ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou &ibs_request, 1, &fence_status.fence); 275ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 276ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 277ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou fence_status.context = context_handle; 278ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE; 279ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou fence_status.ip_type = AMDGPU_HW_IP_GFX; 280ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 281ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou r = amdgpu_cs_query_fence_status(&fence_status, &expired); 282ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 283ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 284646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_handle); 2851041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 2861041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 287ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou r = amdgpu_cs_ctx_free(context_handle); 288ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 289ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou} 290ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 291ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx(void) 292ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{ 293ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou /* separate IB buffers for multi-IB submission */ 294ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou amdgpu_command_submission_gfx_separate_ibs(); 295ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou /* shared IB buffer for multi-IB submission */ 296ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou amdgpu_command_submission_gfx_shared_ib(); 297ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou} 298ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 2993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void) 3003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 3013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 302646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle; 303646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu; 304646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address; 3053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request ibs_request; 3063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info ib_info; 3073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_query_fence fence_status; 3083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ptr; 3093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 3103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, r, instance; 3113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (instance = 0; instance < 8; instance++) { 316646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 317646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 318646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 319646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_mc_address); 3203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 322646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_cpu; 3233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (i = 0; i < 16; ++i) 3243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[i] = 0xffff1000; 3253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 327646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ib_info.bo_handle = ib_result_handle; 3283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info.size = 16; 3293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 3313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE; 3323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ring = instance; 3333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.number_of_ibs = 1; 3343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ibs = &ib_info; 3353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&fence_status, 0, sizeof(struct amdgpu_cs_query_fence)); 3379c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_submit(context_handle, 0, 3383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &ibs_request, 1, &fence_status.fence); 3393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 3423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE; 3433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_COMPUTE; 3443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ring = instance; 3453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3469c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_query_fence_status(&fence_status, &expired); 3473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3481041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 349646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_handle); 3501041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 3513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 3523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3539c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 3543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 3563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/* 3583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * caller need create/release: 3593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * pm4_src, resources, ib_info, and ibs_request 3603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * submit command stream described in ibs_request and wait for this IB accomplished 3613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */ 3623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_sdma_test_exec_cs(amdgpu_context_handle context_handle, 3633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int instance, int pm4_dw, uint32_t *pm4_src, 3643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int res_cnt, amdgpu_bo_handle *resources, 3653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info, 3663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request) 3673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 3683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r, i, j; 3693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 3703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ring_ptr; 371646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle; 372646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu; 373646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address; 3743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_query_fence fence_status = {0}; 3753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare CS */ 3773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4_src, NULL); 3783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 3793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 3803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 3813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_TRUE(pm4_dw <= 1024); 3823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate IB */ 384646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 385646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 386646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 387646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_mc_address); 3883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* copy PM4 packet to ring from caller */ 391646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ring_ptr = ib_result_cpu; 3923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src)); 3933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 394646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ib_info->bo_handle = ib_result_handle; 3953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info->size = pm4_dw; 3963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ip_type = AMDGPU_HW_IP_DMA; 3983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ring = instance; 3993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->number_of_ibs = 1; 4003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ibs = ib_info; 4013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4026dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König r = amdgpu_bo_list_create(device_handle, res_cnt, resources, 4036dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König NULL, &ibs_request->resources); 4046dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König CU_ASSERT_EQUAL(r, 0); 4053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 4073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* submit CS */ 4099c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_submit(context_handle, 0, 4103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request, 1, &fence_status.fence); 4113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4136dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König r = amdgpu_bo_list_destroy(ibs_request->resources); 4146dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König CU_ASSERT_EQUAL(r, 0); 4156dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König 4163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_DMA; 4173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ring = ibs_request->ring; 4183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 4193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE; 4203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* wait for IB accomplished */ 4229c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_query_fence_status(&fence_status, &expired); 4233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(expired, true); 4251041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 426646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_handle); 4271041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 4283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 4293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_write_linear(void) 4313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 4323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 128; 4333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 4343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 4353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 4363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 4373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 4383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 4393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 4403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 4413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile uint32_t *bo_cpu; 4423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop; 443a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 4443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 4463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 4473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 4493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 4503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 4523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 4533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 4553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 4583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(1, sizeof(amdgpu_bo_handle)); 4593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 4603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop = 0; 462a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop < 2) { 4633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo for sDMA use */ 4643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 4653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length * sizeof(uint32_t), 4663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, AMDGPU_GEM_DOMAIN_GTT, 4673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop], &bo_mc); 4683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0); 4703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo_cpu, NULL); 4713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo */ 4733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t)); 4743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo; 4773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA write-linear */ 4793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 4803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 4813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 4823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 4833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 4843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 4853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(j++ < sdma_write_length) 4863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 4873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 4893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 4903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, resources, 4913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 4923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 4943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 4953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < sdma_write_length) { 4963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 4973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 4983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo); 4993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop++; 5003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 5023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 5033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 5043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 5053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 5063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 5089c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 5093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 5103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 5113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_const_fill(void) 5133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 5143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 1024 * 1024; 5153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 5163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 5173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 5183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 5193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 5203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 5213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 5223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 5233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile uint32_t *bo_cpu; 5243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop; 525a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 5263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 5283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 5293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 5313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 5323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 5343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 5353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 5373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 5383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 5403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(1, sizeof(amdgpu_bo_handle)); 5413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 5423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop = 0; 544a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop < 2) { 5453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo for sDMA use */ 5463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 5473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length, 4096, 5483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 5493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop], &bo_mc); 5503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0); 5523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo_cpu, NULL); 5533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo */ 5553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo_cpu, 0, sdma_write_length); 5563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo; 5583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA const fill */ 5603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 5613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0, 5623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_CONSTANT_FILL_EXTRA_SIZE(2)); 5633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 5643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 5653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 5663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 5673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 5693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 5703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, resources, 5713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 5723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 5743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 5753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < (sdma_write_length / 4)) { 5763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 5773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo); 5793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop++; 5803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 5823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 5833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 5843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 5853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 5863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 5889c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 5893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 5903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 5913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_copy_linear(void) 5933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 5943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 1024; 5953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 5963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 5973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo1, bo2; 5983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 5993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 6003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 6013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 6023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo1_mc, bo2_mc; 6033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile unsigned char *bo1_cpu, *bo2_cpu; 6043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop1, loop2; 605a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 6063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 6083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 6093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 6113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 6123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 6143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 6153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 6173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 6203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(2, sizeof(amdgpu_bo_handle)); 6213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 6223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop1 = loop2 = 0; 6243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* run 9 circle to test all mapping combination */ 625a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop1 < 2) { 626a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop2 < 2) { 6273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo1for sDMA use */ 6283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo1 = gpu_mem_alloc(device_handle, 6293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length, 4096, 6303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 6313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop1], &bo1_mc); 6323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo1, (void **)&bo1_cpu), 0); 6343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo1_cpu, NULL); 6353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* set bo1 */ 6373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo1_cpu, 0xaa, sdma_write_length); 6383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo2 for sDMA use */ 6403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo2 = gpu_mem_alloc(device_handle, 6413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length, 4096, 6423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 6433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop2], &bo2_mc); 6443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo2, (void **)&bo2_cpu), 0); 6463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo2_cpu, NULL); 6473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo2 */ 6493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo2_cpu, 0, sdma_write_length); 6503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo1; 6523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[1] = bo2; 6533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA copy linear */ 6553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 6563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0); 6573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 6583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0; 6593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo1_mc; 6603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 6613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo2_mc; 6623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 6633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 6663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 6673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2, resources, 6683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 6693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 6713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 6723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < sdma_write_length) { 6733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa); 6743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 6753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo1); 6763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo2); 6773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop2++; 6783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 6793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop1++; 6803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 6813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 6823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 6833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 6843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 6853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 6863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 6889c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 6893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 6913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void) 6933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 6943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_write_linear(); 6953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_const_fill(); 6963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_copy_linear(); 6973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 6983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void) 7003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 7013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, r, j; 7023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4 = NULL; 7033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 7043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher void *ptr = NULL; 7053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int pm4_dw = 256; 7063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int sdma_write_length = 4; 7073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle handle; 7083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 7093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 7103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 7113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_bo_alloc_result res; 7123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&res, 0, sizeof(res)); 7143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 7163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 7173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 7193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 7203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 7223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 7233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 7253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE); 7283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ptr, NULL); 7293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(ptr, 0, BUFFER_SIZE); 7303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_create_bo_from_user_mem(device_handle, 7323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr, BUFFER_SIZE, &res); 7333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo_mc = res.virtual_mc_base_address; 7353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher handle = res.buf_handle; 7363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher j = i = 0; 7383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 7393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 7403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 7413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 7423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 7433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while (j++ < sdma_write_length) 7453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 7463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 7483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 7493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, &handle, 7503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 7513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 7523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while (i < sdma_write_length) { 7533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf); 7543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 7553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 7563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 7573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 7583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_bo_free(res.buf_handle); 7593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ptr); 7613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7629c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 7633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 765