basic_tests.c revision f91b56dc8c604ec1c6f092d69550266d20dc9764
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; 16776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák amdgpu_bo_list_handle bo_list; 1683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 1693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 173646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 174646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 175646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 176646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_mc_address); 1773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 179646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 180646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 181646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_ce_handle, &ib_result_ce_cpu, 182646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_ce_mc_address); 1833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 18576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_get_bo_list(device_handle, ib_result_handle, 18676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_result_ce_handle, &bo_list); 18776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 18876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 1893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 1903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* IT_SET_CE_DE_COUNTERS */ 192646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_ce_cpu; 1933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[0] = 0xc0008900; 1943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[1] = 0; 1953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[2] = 0xc0008400; 1963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[3] = 1; 19776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info[0].ib_mc_address = ib_result_ce_mc_address; 1983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[0].size = 4; 199db126d1d8a764b9d3ad322779b13904867b14e5cJammy Zhou ib_info[0].flags = AMDGPU_IB_FLAG_CE; 2003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* IT_WAIT_ON_CE_COUNTER */ 202646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_cpu; 2033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[0] = 0xc0008600; 2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[1] = 0x00000001; 20576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info[1].ib_mc_address = ib_result_mc_address; 2063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[1].size = 2; 2073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ip_type = AMDGPU_HW_IP_GFX; 2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.number_of_ibs = 2; 2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ibs = ib_info; 21176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ibs_request.resources = bo_list; 2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2139c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_submit(context_handle, 0, 2143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &ibs_request, 1, &fence_status.fence); 2153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 2183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_GFX; 2193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 220f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou r = amdgpu_cs_query_fence_status(&fence_status, 221f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou AMDGPU_TIMEOUT_INFINITE, 222f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou 0, &expired); 2233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 225646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_handle); 2261041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 2271041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 228646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_ce_handle); 2291041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 2301041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 23176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_bo_list_destroy(bo_list); 23276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 23376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 2349c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 2353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 2373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 238ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_shared_ib(void) 239ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{ 240ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou amdgpu_context_handle context_handle; 241646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle; 242646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu; 243646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address; 244ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou struct amdgpu_cs_request ibs_request = {0}; 245ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou struct amdgpu_cs_ib_info ib_info[2]; 246ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou struct amdgpu_cs_query_fence fence_status = {0}; 247ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou uint32_t *ptr; 248ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou uint32_t expired; 24976af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák amdgpu_bo_list_handle bo_list; 250ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou int r; 251ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 252ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou r = amdgpu_cs_ctx_create(device_handle, &context_handle); 253ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 254ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 255646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 256646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 257646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 258646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_mc_address); 259ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 260ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 26176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 26276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák &bo_list); 26376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 26476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 265ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 266ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 267ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou /* IT_SET_CE_DE_COUNTERS */ 268646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_cpu; 269ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[0] = 0xc0008900; 270ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[1] = 0; 271ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[2] = 0xc0008400; 272ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[3] = 1; 27376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info[0].ib_mc_address = ib_result_mc_address; 274ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[0].size = 4; 275ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[0].flags = AMDGPU_IB_FLAG_CE; 276ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 277646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = (uint32_t *)ib_result_cpu + 4; 278ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[0] = 0xc0008600; 279ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ptr[1] = 0x00000001; 28076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info[1].ib_mc_address = ib_result_mc_address + 16; 281ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ib_info[1].size = 2; 282ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 283ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ibs_request.ip_type = AMDGPU_HW_IP_GFX; 284ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ibs_request.number_of_ibs = 2; 285ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou ibs_request.ibs = ib_info; 28676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ibs_request.resources = bo_list; 287ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 288ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou r = amdgpu_cs_submit(context_handle, 0, 289ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou &ibs_request, 1, &fence_status.fence); 290ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 291ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 292ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou fence_status.context = context_handle; 293ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou fence_status.ip_type = AMDGPU_HW_IP_GFX; 294ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 295f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou r = amdgpu_cs_query_fence_status(&fence_status, 296f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou AMDGPU_TIMEOUT_INFINITE, 297f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou 0, &expired); 298ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 299ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 300646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_handle); 3011041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 3021041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 30376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_bo_list_destroy(bo_list); 30476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 30576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 306ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou r = amdgpu_cs_ctx_free(context_handle); 307ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou CU_ASSERT_EQUAL(r, 0); 308ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou} 309ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 310ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx(void) 311ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{ 312ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou /* separate IB buffers for multi-IB submission */ 313ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou amdgpu_command_submission_gfx_separate_ibs(); 314ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou /* shared IB buffer for multi-IB submission */ 315ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou amdgpu_command_submission_gfx_shared_ib(); 316ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou} 317ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou 3183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void) 3193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 3203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 321646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle; 322646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu; 323646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address; 3243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request ibs_request; 3253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info ib_info; 3263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_query_fence fence_status; 3273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ptr; 3283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 3293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, r, instance; 33076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák amdgpu_bo_list_handle bo_list; 3313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (instance = 0; instance < 8; instance++) { 336646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 337646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 338646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 339646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_mc_address); 3403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 34276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 34376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák &bo_list); 34476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 34576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 346646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ptr = ib_result_cpu; 3473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (i = 0; i < 16; ++i) 3483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[i] = 0xffff1000; 3493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 35176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info.ib_mc_address = ib_result_mc_address; 3523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info.size = 16; 3533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 3553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE; 3563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ring = instance; 3573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.number_of_ibs = 1; 3583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ibs = &ib_info; 35976af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ibs_request.resources = bo_list; 3603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&fence_status, 0, sizeof(struct amdgpu_cs_query_fence)); 3629c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_submit(context_handle, 0, 3633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &ibs_request, 1, &fence_status.fence); 3643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 3673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_COMPUTE; 3683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ring = instance; 3693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 370f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou r = amdgpu_cs_query_fence_status(&fence_status, 371f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou AMDGPU_TIMEOUT_INFINITE, 372f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou 0, &expired); 3733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3741041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 37576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_bo_list_destroy(bo_list); 37676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák CU_ASSERT_EQUAL(r, 0); 37776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 378646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_handle); 3791041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 3803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 3813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3829c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 3833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 3853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/* 3873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * caller need create/release: 3883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * pm4_src, resources, ib_info, and ibs_request 3893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * submit command stream described in ibs_request and wait for this IB accomplished 3903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */ 3913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_sdma_test_exec_cs(amdgpu_context_handle context_handle, 3923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int instance, int pm4_dw, uint32_t *pm4_src, 3933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int res_cnt, amdgpu_bo_handle *resources, 3943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info, 3953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request) 3963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 39776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák int r; 3983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 3993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ring_ptr; 400646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák amdgpu_bo_handle ib_result_handle; 401646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák void *ib_result_cpu; 402646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák uint64_t ib_result_mc_address; 4033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_query_fence fence_status = {0}; 40476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1)); 4053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare CS */ 4073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4_src, NULL); 4083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 4093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 4103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 4113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_TRUE(pm4_dw <= 1024); 4123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate IB */ 414646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 415646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák AMDGPU_GEM_DOMAIN_GTT, 0, 416646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_handle, &ib_result_cpu, 417646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák &ib_result_mc_address); 4183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* copy PM4 packet to ring from caller */ 421646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák ring_ptr = ib_result_cpu; 4223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src)); 4233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 42476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák ib_info->ib_mc_address = ib_result_mc_address; 4253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info->size = pm4_dw; 4263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ip_type = AMDGPU_HW_IP_DMA; 4283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ring = instance; 4293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->number_of_ibs = 1; 4303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ibs = ib_info; 4313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 43276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák memcpy(all_res, resources, sizeof(resources[0]) * res_cnt); 43376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák all_res[res_cnt] = ib_result_handle; 43476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák 43576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák r = amdgpu_bo_list_create(device_handle, res_cnt+1, all_res, 4366dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König NULL, &ibs_request->resources); 4376dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König CU_ASSERT_EQUAL(r, 0); 4383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 4403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* submit CS */ 4429c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_submit(context_handle, 0, 4433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request, 1, &fence_status.fence); 4443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4466dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König r = amdgpu_bo_list_destroy(ibs_request->resources); 4476dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König CU_ASSERT_EQUAL(r, 0); 4486dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König 4493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_DMA; 4503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ring = ibs_request->ring; 4513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 4523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* wait for IB accomplished */ 454f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou r = amdgpu_cs_query_fence_status(&fence_status, 455f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou AMDGPU_TIMEOUT_INFINITE, 456f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou 0, &expired); 4573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(expired, true); 4591041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou 460646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák r = amdgpu_bo_free(ib_result_handle); 4611041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou CU_ASSERT_EQUAL(r, 0); 4623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 4633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_write_linear(void) 4653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 4663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 128; 4673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 4683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 4693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 4703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 4713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 4723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 4733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 4743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 4753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile uint32_t *bo_cpu; 4763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop; 477a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 4783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 4803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 4813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 4833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 4843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 4863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 4873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 4893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 4923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(1, sizeof(amdgpu_bo_handle)); 4933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 4943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop = 0; 496a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop < 2) { 4973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo for sDMA use */ 4983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 4993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length * sizeof(uint32_t), 5003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, AMDGPU_GEM_DOMAIN_GTT, 5013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop], &bo_mc); 5023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0); 5043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo_cpu, NULL); 5053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo */ 5073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t)); 5083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo; 5113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA write-linear */ 5133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 5143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 5153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 5163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 5173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 5183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 5193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(j++ < sdma_write_length) 5203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 5213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 5233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 5243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, resources, 5253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 5263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 5283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 5293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < sdma_write_length) { 5303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 5313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo); 5333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop++; 5343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 5363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 5373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 5383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 5393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 5403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 5429c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 5433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 5443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 5453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_const_fill(void) 5473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 5483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 1024 * 1024; 5493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 5503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 5513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 5523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 5533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 5543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 5553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 5563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 5573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile uint32_t *bo_cpu; 5583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop; 559a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 5603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 5623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 5633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 5653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 5663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 5683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 5693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 5713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 5723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 5743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(1, sizeof(amdgpu_bo_handle)); 5753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 5763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop = 0; 578a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop < 2) { 5793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo for sDMA use */ 5803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 5813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length, 4096, 5823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 5833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop], &bo_mc); 5843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0); 5863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo_cpu, NULL); 5873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo */ 5893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo_cpu, 0, sdma_write_length); 5903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo; 5923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA const fill */ 5943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 5953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0, 5963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_CONSTANT_FILL_EXTRA_SIZE(2)); 5973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 5983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 5993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 6003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 6013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 6033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 6043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, resources, 6053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 6063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 6083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 6093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < (sdma_write_length / 4)) { 6103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 6113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 6123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo); 6133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop++; 6143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 6153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 6163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 6173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 6183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 6193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 6203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 6229c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 6233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 6253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_copy_linear(void) 6273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 6283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 1024; 6293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 6303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 6313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo1, bo2; 6323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 6333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 6343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 6353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 6363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo1_mc, bo2_mc; 6373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile unsigned char *bo1_cpu, *bo2_cpu; 6383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop1, loop2; 639a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 6403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 6423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 6433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 6453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 6463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 6483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 6493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 6513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 6543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(2, sizeof(amdgpu_bo_handle)); 6553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 6563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop1 = loop2 = 0; 6583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* run 9 circle to test all mapping combination */ 659a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop1 < 2) { 660a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou while(loop2 < 2) { 6613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo1for sDMA use */ 6623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo1 = gpu_mem_alloc(device_handle, 6633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length, 4096, 6643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 6653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop1], &bo1_mc); 6663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo1, (void **)&bo1_cpu), 0); 6683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo1_cpu, NULL); 6693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* set bo1 */ 6713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo1_cpu, 0xaa, sdma_write_length); 6723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo2 for sDMA use */ 6743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo2 = gpu_mem_alloc(device_handle, 6753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length, 4096, 6763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 6773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop2], &bo2_mc); 6783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo2, (void **)&bo2_cpu), 0); 6803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo2_cpu, NULL); 6813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo2 */ 6833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo2_cpu, 0, sdma_write_length); 6843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo1; 6863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[1] = bo2; 6873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA copy linear */ 6893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 6903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0); 6913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 6923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0; 6933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo1_mc; 6943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 6953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo2_mc; 6963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 6973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 7003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 7013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2, resources, 7023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 7033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 7053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 7063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < sdma_write_length) { 7073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa); 7083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 7093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo1); 7103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo2); 7113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop2++; 7123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 7133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop1++; 7143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 7153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 7163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 7173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 7183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 7193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 7203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 7229c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 7233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 7253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void) 7273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 7283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_write_linear(); 7293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_const_fill(); 7303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_copy_linear(); 7313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 7323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void) 7343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 7353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, r, j; 7363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4 = NULL; 7373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 7383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher void *ptr = NULL; 7393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int pm4_dw = 256; 7403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int sdma_write_length = 4; 7413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle handle; 7423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 7433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 7443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 7453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_bo_alloc_result res; 7463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&res, 0, sizeof(res)); 7483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 7503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 7513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 7533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 7543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 7563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 7573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 7593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE); 7623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ptr, NULL); 7633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(ptr, 0, BUFFER_SIZE); 7643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_create_bo_from_user_mem(device_handle, 7663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr, BUFFER_SIZE, &res); 7673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo_mc = res.virtual_mc_base_address; 7693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher handle = res.buf_handle; 7703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher j = i = 0; 7723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 7733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 7743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 7753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 7763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 7773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while (j++ < sdma_write_length) 7793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 7803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 7823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 7833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, &handle, 7843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 7853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 7863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while (i < sdma_write_length) { 7873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf); 7883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 7893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 7903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 7913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 7923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_bo_free(res.buf_handle); 7933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ptr); 7953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 7969c2afffedb773da27fd7506b31fc2164f329d3a8Christian König r = amdgpu_cs_ctx_free(context_handle); 7973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 7983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 799