basic_tests.c revision 3c5fe78801dbadc82cc25f4a63a983fea15d938b
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, 1493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_CREATE_CPU_GTT_WC, 1503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &bo_mc); 1513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_bo_free(bo); 1533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 1553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_gfx(void) 1573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 1583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 1593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_alloc_result ib_result = {0}; 1603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_alloc_result ib_result_ce = {0}; 1613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request ibs_request = {0}; 1623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info ib_info[2]; 1633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_query_fence fence_status = {0}; 1643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ptr; 1653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 1663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r; 1673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 1693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_alloc_ib(device_handle, context_handle, 1723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_cs_ib_size_4K, &ib_result); 1733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_alloc_ib(device_handle, context_handle, 1763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_cs_ib_size_4K, &ib_result_ce); 1773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 1783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 1803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* IT_SET_CE_DE_COUNTERS */ 1823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr = ib_result_ce.cpu; 1833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[0] = 0xc0008900; 1843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[1] = 0; 1853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[2] = 0xc0008400; 1863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[3] = 1; 1873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[0].ib_handle = ib_result_ce.handle; 1883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[0].size = 4; 1893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[0].flags = AMDGPU_CS_GFX_IB_CE; 1903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* IT_WAIT_ON_CE_COUNTER */ 1923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr = ib_result.cpu; 1933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[0] = 0xc0008600; 1943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[1] = 0x00000001; 1953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[1].ib_handle = ib_result.handle; 1963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info[1].size = 2; 1973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ip_type = AMDGPU_HW_IP_GFX; 1993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.number_of_ibs = 2; 2003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ibs = ib_info; 2013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_submit(device_handle, context_handle, 0, 2033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &ibs_request, 1, &fence_status.fence); 2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 2073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE; 2083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_GFX; 2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_query_fence_status(device_handle, &fence_status, &expired); 2113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_free(device_handle, context_handle); 2143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void) 2183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 2193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 2203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_alloc_result ib_result; 2213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request ibs_request; 2223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info ib_info; 2233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_query_fence fence_status; 2243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ptr; 2253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 2263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, r, instance; 2273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 2293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (instance = 0; instance < 8; instance++) { 2323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&ib_result, 0, sizeof(struct amdgpu_cs_ib_alloc_result)); 2333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_alloc_ib(device_handle, context_handle, 2343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_cs_ib_size_4K, &ib_result); 2353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr = ib_result.cpu; 2383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (i = 0; i < 16; ++i) 2393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr[i] = 0xffff1000; 2403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 2423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info.ib_handle = ib_result.handle; 2433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info.size = 16; 2443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 2463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE; 2473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ring = instance; 2483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.number_of_ibs = 1; 2493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request.ibs = &ib_info; 2503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&fence_status, 0, sizeof(struct amdgpu_cs_query_fence)); 2523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_submit(device_handle, context_handle, 0, 2533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &ibs_request, 1, &fence_status.fence); 2543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 2573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE; 2583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_COMPUTE; 2593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ring = instance; 2603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_query_fence_status(device_handle, &fence_status, &expired); 2623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 2643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_free(device_handle, context_handle); 2663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 2683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/* 2703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * caller need create/release: 2713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * pm4_src, resources, ib_info, and ibs_request 2723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * submit command stream described in ibs_request and wait for this IB accomplished 2733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */ 2743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_sdma_test_exec_cs(amdgpu_context_handle context_handle, 2753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int instance, int pm4_dw, uint32_t *pm4_src, 2763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int res_cnt, amdgpu_bo_handle *resources, 2773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info, 2783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request) 2793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 2803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int r, i, j; 2813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t expired; 2823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *ring_ptr; 2833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_alloc_result ib_result = {0}; 2843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_query_fence fence_status = {0}; 2853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare CS */ 2873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4_src, NULL); 2883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 2893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 2903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 2913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_TRUE(pm4_dw <= 1024); 2923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate IB */ 2943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_alloc_ib(device_handle, context_handle, 2953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_cs_ib_size_4K, &ib_result); 2963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 2973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* copy PM4 packet to ring from caller */ 2993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ring_ptr = ib_result.cpu; 3003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src)); 3013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info->ib_handle = ib_result.handle; 3033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info->size = pm4_dw; 3043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ip_type = AMDGPU_HW_IP_DMA; 3063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ring = instance; 3073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->number_of_ibs = 1; 3083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->ibs = ib_info; 3093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->number_of_resources = res_cnt; 3103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request->resources = resources; 3113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 3143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* submit CS */ 3163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_submit(device_handle, context_handle, 0, 3173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request, 1, &fence_status.fence); 3183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ip_type = AMDGPU_HW_IP_DMA; 3213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.ring = ibs_request->ring; 3223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.context = context_handle; 3233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE; 3243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* wait for IB accomplished */ 3263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_query_fence_status(device_handle, &fence_status, 3273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher &expired); 3283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(expired, true); 3303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 3313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_write_linear(void) 3333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 3343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 128; 3353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 3363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 3373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 3383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 3393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 3403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 3413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 3423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 3433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile uint32_t *bo_cpu; 3443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop; 3453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t gtt_flags[3] = {0, AMDGPU_GEM_CREATE_CPU_GTT_UC, 3463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_CREATE_CPU_GTT_WC}; 3473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 3493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 3503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 3523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 3533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 3553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 3563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 3593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 3613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(1, sizeof(amdgpu_bo_handle)); 3623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 3633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop = 0; 3653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(loop < 3) { 3663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo for sDMA use */ 3673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 3683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length * sizeof(uint32_t), 3693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4096, AMDGPU_GEM_DOMAIN_GTT, 3703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop], &bo_mc); 3713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0); 3733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo_cpu, NULL); 3743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo */ 3763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t)); 3773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo; 3803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA write-linear */ 3823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 3833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 3843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 3853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 3863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 3873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 3883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(j++ < sdma_write_length) 3893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 3903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 3923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 3933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, resources, 3943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 3953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 3963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 3973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 3983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < sdma_write_length) { 3993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 4003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 4013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo); 4023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop++; 4033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 4043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 4053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 4063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 4073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 4083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 4093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 4113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_free(device_handle, context_handle); 4123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 4143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_const_fill(void) 4163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 4173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 1024 * 1024; 4183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 4193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 4203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo; 4213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 4223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 4233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 4243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 4253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 4263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile uint32_t *bo_cpu; 4273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop; 4283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t gtt_flags[3] = {0, AMDGPU_GEM_CREATE_CPU_GTT_UC, 4293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_CREATE_CPU_GTT_WC}; 4303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 4323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 4333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 4353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 4363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 4383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 4393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 4413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 4443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(1, sizeof(amdgpu_bo_handle)); 4453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 4463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop = 0; 4483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(loop < 3) { 4493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo for sDMA use */ 4503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo = gpu_mem_alloc(device_handle, 4513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length, 4096, 4523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 4533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop], &bo_mc); 4543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0); 4563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo_cpu, NULL); 4573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo */ 4593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo_cpu, 0, sdma_write_length); 4603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo; 4623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA const fill */ 4643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 4653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0, 4663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_CONSTANT_FILL_EXTRA_SIZE(2)); 4673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 4683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 4693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 4703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 4713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 4733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 4743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, resources, 4753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 4763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 4783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 4793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < (sdma_write_length / 4)) { 4803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 4813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 4823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo); 4833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop++; 4843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 4853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 4863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 4873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 4883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 4893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 4903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 4923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_free(device_handle, context_handle); 4933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 4943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 4953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 4963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_copy_linear(void) 4973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 4983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int sdma_write_length = 1024; 4993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher const int pm4_dw = 256; 5003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 5013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle bo1, bo2; 5023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle *resources; 5033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4; 5043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 5053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 5063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo1_mc, bo2_mc; 5073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher volatile unsigned char *bo1_cpu, *bo2_cpu; 5083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, j, r, loop1, loop2; 5093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t gtt_flags[3] = {0, AMDGPU_GEM_CREATE_CPU_GTT_UC, 5103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_CREATE_CPU_GTT_WC}; 5113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 5133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 5143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 5163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 5173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 5193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 5203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 5223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 5233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* prepare resource */ 5253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources = calloc(2, sizeof(amdgpu_bo_handle)); 5263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(resources, NULL); 5273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop1 = loop2 = 0; 5293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* run 9 circle to test all mapping combination */ 5303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(loop1 < 3) { 5313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(loop2 < 3) { 5323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo1for sDMA use */ 5333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo1 = gpu_mem_alloc(device_handle, 5343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length, 4096, 5353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 5363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop1], &bo1_mc); 5373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo1, (void **)&bo1_cpu), 0); 5393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo1_cpu, NULL); 5403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* set bo1 */ 5423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo1_cpu, 0xaa, sdma_write_length); 5433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* allocate UC bo2 for sDMA use */ 5453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo2 = gpu_mem_alloc(device_handle, 5463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher sdma_write_length, 4096, 5473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher AMDGPU_GEM_DOMAIN_GTT, 5483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher gtt_flags[loop2], &bo2_mc); 5493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo2, (void **)&bo2_cpu), 0); 5513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(bo2_cpu, NULL); 5523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clear bo2 */ 5543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset((void*)bo2_cpu, 0, sdma_write_length); 5553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[0] = bo1; 5573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher resources[1] = bo2; 5583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* fullfill PM4: test DMA copy linear */ 5603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = j = 0; 5613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0); 5623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 5633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0; 5643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo1_mc; 5653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 5663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo2_mc; 5673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 5683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 5713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 5723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2, resources, 5733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 5743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* verify if SDMA test result meets with expected */ 5763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 5773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while(i < sdma_write_length) { 5783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa); 5793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo1); 5813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_free(bo2); 5823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop2++; 5833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher loop1++; 5853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 5863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* clean resources */ 5873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(resources); 5883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 5893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 5903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 5913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* end of test */ 5933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_free(device_handle, context_handle); 5943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 5953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 5963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 5973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void) 5983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 5993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_write_linear(); 6003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_const_fill(); 6013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_command_submission_sdma_copy_linear(); 6023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 6033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void) 6053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 6063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i, r, j; 6073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint32_t *pm4 = NULL; 6083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher uint64_t bo_mc; 6093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher void *ptr = NULL; 6103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int pm4_dw = 256; 6113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int sdma_write_length = 4; 6123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_bo_handle handle; 6133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_context_handle context_handle; 6143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_ib_info *ib_info; 6153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_cs_request *ibs_request; 6163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher struct amdgpu_bo_alloc_result res; 6173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(&res, 0, sizeof(res)); 6193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4 = calloc(pm4_dw, sizeof(*pm4)); 6213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(pm4, NULL); 6223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info = calloc(1, sizeof(*ib_info)); 6243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ib_info, NULL); 6253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ibs_request = calloc(1, sizeof(*ibs_request)); 6273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 6283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_create(device_handle, &context_handle); 6303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE); 6333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_NOT_EQUAL(ptr, NULL); 6343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher memset(ptr, 0, BUFFER_SIZE); 6353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_create_bo_from_user_mem(device_handle, 6373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ptr, BUFFER_SIZE, &res); 6383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher bo_mc = res.virtual_mc_base_address; 6403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher handle = res.buf_handle; 6413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher j = i = 0; 6433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 6443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 6453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xffffffff & bo_mc; 6463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 6473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = sdma_write_length; 6483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while (j++ < sdma_write_length) 6503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pm4[i++] = 0xdeadbeaf; 6513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher amdgpu_sdma_test_exec_cs(context_handle, 0, 6533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i, pm4, 6543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1, &handle, 6553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher ib_info, ibs_request); 6563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher i = 0; 6573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while (i < sdma_write_length) { 6583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf); 6593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 6603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ibs_request); 6613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ib_info); 6623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(pm4); 6633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_bo_free(res.buf_handle); 6643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher free(ptr); 6663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 6673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher r = amdgpu_cs_ctx_free(device_handle, context_handle); 6683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_ASSERT_EQUAL(r, 0); 6693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 670