basic_tests.c revision 037b3c26
13f012e29Smrg/* 23f012e29Smrg * Copyright 2014 Advanced Micro Devices, Inc. 33f012e29Smrg * 43f012e29Smrg * Permission is hereby granted, free of charge, to any person obtaining a 53f012e29Smrg * copy of this software and associated documentation files (the "Software"), 63f012e29Smrg * to deal in the Software without restriction, including without limitation 73f012e29Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 83f012e29Smrg * and/or sell copies of the Software, and to permit persons to whom the 93f012e29Smrg * Software is furnished to do so, subject to the following conditions: 103f012e29Smrg * 113f012e29Smrg * The above copyright notice and this permission notice shall be included in 123f012e29Smrg * all copies or substantial portions of the Software. 133f012e29Smrg * 143f012e29Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 153f012e29Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 163f012e29Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 173f012e29Smrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 183f012e29Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 193f012e29Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 203f012e29Smrg * OTHER DEALINGS IN THE SOFTWARE. 213f012e29Smrg * 223f012e29Smrg*/ 233f012e29Smrg 243f012e29Smrg#ifdef HAVE_CONFIG_H 253f012e29Smrg#include "config.h" 263f012e29Smrg#endif 273f012e29Smrg 283f012e29Smrg#include <stdio.h> 293f012e29Smrg#include <stdlib.h> 303f012e29Smrg#include <unistd.h> 313f012e29Smrg#ifdef HAVE_ALLOCA_H 323f012e29Smrg# include <alloca.h> 333f012e29Smrg#endif 343f012e29Smrg 353f012e29Smrg#include "CUnit/Basic.h" 363f012e29Smrg 373f012e29Smrg#include "amdgpu_test.h" 383f012e29Smrg#include "amdgpu_drm.h" 393f012e29Smrg 403f012e29Smrgstatic amdgpu_device_handle device_handle; 413f012e29Smrgstatic uint32_t major_version; 423f012e29Smrgstatic uint32_t minor_version; 433f012e29Smrg 443f012e29Smrgstatic void amdgpu_query_info_test(void); 453f012e29Smrgstatic void amdgpu_memory_alloc(void); 463f012e29Smrgstatic void amdgpu_command_submission_gfx(void); 473f012e29Smrgstatic void amdgpu_command_submission_compute(void); 483f012e29Smrgstatic void amdgpu_command_submission_sdma(void); 493f012e29Smrgstatic void amdgpu_userptr_test(void); 503f012e29Smrgstatic void amdgpu_semaphore_test(void); 513f012e29Smrg 523f012e29Smrgstatic void amdgpu_command_submission_write_linear_helper(unsigned ip_type); 533f012e29Smrgstatic void amdgpu_command_submission_const_fill_helper(unsigned ip_type); 543f012e29Smrgstatic void amdgpu_command_submission_copy_linear_helper(unsigned ip_type); 553f012e29Smrg 563f012e29SmrgCU_TestInfo basic_tests[] = { 573f012e29Smrg { "Query Info Test", amdgpu_query_info_test }, 583f012e29Smrg { "Memory alloc Test", amdgpu_memory_alloc }, 593f012e29Smrg { "Userptr Test", amdgpu_userptr_test }, 603f012e29Smrg { "Command submission Test (GFX)", amdgpu_command_submission_gfx }, 613f012e29Smrg { "Command submission Test (Compute)", amdgpu_command_submission_compute }, 623f012e29Smrg { "Command submission Test (SDMA)", amdgpu_command_submission_sdma }, 633f012e29Smrg { "SW semaphore Test", amdgpu_semaphore_test }, 643f012e29Smrg CU_TEST_INFO_NULL, 653f012e29Smrg}; 663f012e29Smrg#define BUFFER_SIZE (8 * 1024) 673f012e29Smrg#define SDMA_PKT_HEADER_op_offset 0 683f012e29Smrg#define SDMA_PKT_HEADER_op_mask 0x000000FF 693f012e29Smrg#define SDMA_PKT_HEADER_op_shift 0 703f012e29Smrg#define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift) 713f012e29Smrg#define SDMA_OPCODE_CONSTANT_FILL 11 723f012e29Smrg# define SDMA_CONSTANT_FILL_EXTRA_SIZE(x) ((x) << 14) 733f012e29Smrg /* 0 = byte fill 743f012e29Smrg * 2 = DW fill 753f012e29Smrg */ 763f012e29Smrg#define SDMA_PACKET(op, sub_op, e) ((((e) & 0xFFFF) << 16) | \ 773f012e29Smrg (((sub_op) & 0xFF) << 8) | \ 783f012e29Smrg (((op) & 0xFF) << 0)) 793f012e29Smrg#define SDMA_OPCODE_WRITE 2 803f012e29Smrg# define SDMA_WRITE_SUB_OPCODE_LINEAR 0 813f012e29Smrg# define SDMA_WRTIE_SUB_OPCODE_TILED 1 823f012e29Smrg 833f012e29Smrg#define SDMA_OPCODE_COPY 1 843f012e29Smrg# define SDMA_COPY_SUB_OPCODE_LINEAR 0 853f012e29Smrg 863f012e29Smrg#define GFX_COMPUTE_NOP 0xffff1000 873f012e29Smrg#define SDMA_NOP 0x0 883f012e29Smrg 893f012e29Smrg/* PM4 */ 903f012e29Smrg#define PACKET_TYPE0 0 913f012e29Smrg#define PACKET_TYPE1 1 923f012e29Smrg#define PACKET_TYPE2 2 933f012e29Smrg#define PACKET_TYPE3 3 943f012e29Smrg 953f012e29Smrg#define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 963f012e29Smrg#define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 973f012e29Smrg#define CP_PACKET0_GET_REG(h) ((h) & 0xFFFF) 983f012e29Smrg#define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 993f012e29Smrg#define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \ 1003f012e29Smrg ((reg) & 0xFFFF) | \ 1013f012e29Smrg ((n) & 0x3FFF) << 16) 1023f012e29Smrg#define CP_PACKET2 0x80000000 1033f012e29Smrg#define PACKET2_PAD_SHIFT 0 1043f012e29Smrg#define PACKET2_PAD_MASK (0x3fffffff << 0) 1053f012e29Smrg 1063f012e29Smrg#define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v))) 1073f012e29Smrg 1083f012e29Smrg#define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \ 1093f012e29Smrg (((op) & 0xFF) << 8) | \ 1103f012e29Smrg ((n) & 0x3FFF) << 16) 1113f012e29Smrg 1123f012e29Smrg/* Packet 3 types */ 1133f012e29Smrg#define PACKET3_NOP 0x10 1143f012e29Smrg 1153f012e29Smrg#define PACKET3_WRITE_DATA 0x37 1163f012e29Smrg#define WRITE_DATA_DST_SEL(x) ((x) << 8) 1173f012e29Smrg /* 0 - register 1183f012e29Smrg * 1 - memory (sync - via GRBM) 1193f012e29Smrg * 2 - gl2 1203f012e29Smrg * 3 - gds 1213f012e29Smrg * 4 - reserved 1223f012e29Smrg * 5 - memory (async - direct) 1233f012e29Smrg */ 1243f012e29Smrg#define WR_ONE_ADDR (1 << 16) 1253f012e29Smrg#define WR_CONFIRM (1 << 20) 1263f012e29Smrg#define WRITE_DATA_CACHE_POLICY(x) ((x) << 25) 1273f012e29Smrg /* 0 - LRU 1283f012e29Smrg * 1 - Stream 1293f012e29Smrg */ 1303f012e29Smrg#define WRITE_DATA_ENGINE_SEL(x) ((x) << 30) 1313f012e29Smrg /* 0 - me 1323f012e29Smrg * 1 - pfp 1333f012e29Smrg * 2 - ce 1343f012e29Smrg */ 1353f012e29Smrg 1363f012e29Smrg#define PACKET3_DMA_DATA 0x50 1373f012e29Smrg/* 1. header 1383f012e29Smrg * 2. CONTROL 1393f012e29Smrg * 3. SRC_ADDR_LO or DATA [31:0] 1403f012e29Smrg * 4. SRC_ADDR_HI [31:0] 1413f012e29Smrg * 5. DST_ADDR_LO [31:0] 1423f012e29Smrg * 6. DST_ADDR_HI [7:0] 1433f012e29Smrg * 7. COMMAND [30:21] | BYTE_COUNT [20:0] 1443f012e29Smrg */ 1453f012e29Smrg/* CONTROL */ 1463f012e29Smrg# define PACKET3_DMA_DATA_ENGINE(x) ((x) << 0) 1473f012e29Smrg /* 0 - ME 1483f012e29Smrg * 1 - PFP 1493f012e29Smrg */ 1503f012e29Smrg# define PACKET3_DMA_DATA_SRC_CACHE_POLICY(x) ((x) << 13) 1513f012e29Smrg /* 0 - LRU 1523f012e29Smrg * 1 - Stream 1533f012e29Smrg * 2 - Bypass 1543f012e29Smrg */ 1553f012e29Smrg# define PACKET3_DMA_DATA_SRC_VOLATILE (1 << 15) 1563f012e29Smrg# define PACKET3_DMA_DATA_DST_SEL(x) ((x) << 20) 1573f012e29Smrg /* 0 - DST_ADDR using DAS 1583f012e29Smrg * 1 - GDS 1593f012e29Smrg * 3 - DST_ADDR using L2 1603f012e29Smrg */ 1613f012e29Smrg# define PACKET3_DMA_DATA_DST_CACHE_POLICY(x) ((x) << 25) 1623f012e29Smrg /* 0 - LRU 1633f012e29Smrg * 1 - Stream 1643f012e29Smrg * 2 - Bypass 1653f012e29Smrg */ 1663f012e29Smrg# define PACKET3_DMA_DATA_DST_VOLATILE (1 << 27) 1673f012e29Smrg# define PACKET3_DMA_DATA_SRC_SEL(x) ((x) << 29) 1683f012e29Smrg /* 0 - SRC_ADDR using SAS 1693f012e29Smrg * 1 - GDS 1703f012e29Smrg * 2 - DATA 1713f012e29Smrg * 3 - SRC_ADDR using L2 1723f012e29Smrg */ 1733f012e29Smrg# define PACKET3_DMA_DATA_CP_SYNC (1 << 31) 1743f012e29Smrg/* COMMAND */ 1753f012e29Smrg# define PACKET3_DMA_DATA_DIS_WC (1 << 21) 1763f012e29Smrg# define PACKET3_DMA_DATA_CMD_SRC_SWAP(x) ((x) << 22) 1773f012e29Smrg /* 0 - none 1783f012e29Smrg * 1 - 8 in 16 1793f012e29Smrg * 2 - 8 in 32 1803f012e29Smrg * 3 - 8 in 64 1813f012e29Smrg */ 1823f012e29Smrg# define PACKET3_DMA_DATA_CMD_DST_SWAP(x) ((x) << 24) 1833f012e29Smrg /* 0 - none 1843f012e29Smrg * 1 - 8 in 16 1853f012e29Smrg * 2 - 8 in 32 1863f012e29Smrg * 3 - 8 in 64 1873f012e29Smrg */ 1883f012e29Smrg# define PACKET3_DMA_DATA_CMD_SAS (1 << 26) 1893f012e29Smrg /* 0 - memory 1903f012e29Smrg * 1 - register 1913f012e29Smrg */ 1923f012e29Smrg# define PACKET3_DMA_DATA_CMD_DAS (1 << 27) 1933f012e29Smrg /* 0 - memory 1943f012e29Smrg * 1 - register 1953f012e29Smrg */ 1963f012e29Smrg# define PACKET3_DMA_DATA_CMD_SAIC (1 << 28) 1973f012e29Smrg# define PACKET3_DMA_DATA_CMD_DAIC (1 << 29) 1983f012e29Smrg# define PACKET3_DMA_DATA_CMD_RAW_WAIT (1 << 30) 1993f012e29Smrg 2003f012e29Smrgint suite_basic_tests_init(void) 2013f012e29Smrg{ 2023f012e29Smrg int r; 2033f012e29Smrg 2043f012e29Smrg r = amdgpu_device_initialize(drm_amdgpu[0], &major_version, 2053f012e29Smrg &minor_version, &device_handle); 2063f012e29Smrg 2073f012e29Smrg if (r == 0) 2083f012e29Smrg return CUE_SUCCESS; 209037b3c26Smrg else { 210037b3c26Smrg if ((r == -EACCES) && (errno == EACCES)) 211037b3c26Smrg printf("\n\nError:%s. " 212037b3c26Smrg "Hint:Try to run this test program as root.", 213037b3c26Smrg strerror(errno)); 2143f012e29Smrg return CUE_SINIT_FAILED; 215037b3c26Smrg } 2163f012e29Smrg} 2173f012e29Smrg 2183f012e29Smrgint suite_basic_tests_clean(void) 2193f012e29Smrg{ 2203f012e29Smrg int r = amdgpu_device_deinitialize(device_handle); 2213f012e29Smrg 2223f012e29Smrg if (r == 0) 2233f012e29Smrg return CUE_SUCCESS; 2243f012e29Smrg else 2253f012e29Smrg return CUE_SCLEAN_FAILED; 2263f012e29Smrg} 2273f012e29Smrg 2283f012e29Smrgstatic void amdgpu_query_info_test(void) 2293f012e29Smrg{ 2303f012e29Smrg struct amdgpu_gpu_info gpu_info = {0}; 2313f012e29Smrg uint32_t version, feature; 2323f012e29Smrg int r; 2333f012e29Smrg 2343f012e29Smrg r = amdgpu_query_gpu_info(device_handle, &gpu_info); 2353f012e29Smrg CU_ASSERT_EQUAL(r, 0); 2363f012e29Smrg 2373f012e29Smrg r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0, 2383f012e29Smrg 0, &version, &feature); 2393f012e29Smrg CU_ASSERT_EQUAL(r, 0); 2403f012e29Smrg} 2413f012e29Smrg 2423f012e29Smrgstatic void amdgpu_memory_alloc(void) 2433f012e29Smrg{ 2443f012e29Smrg amdgpu_bo_handle bo; 2453f012e29Smrg amdgpu_va_handle va_handle; 2463f012e29Smrg uint64_t bo_mc; 2473f012e29Smrg int r; 2483f012e29Smrg 2493f012e29Smrg /* Test visible VRAM */ 2503f012e29Smrg bo = gpu_mem_alloc(device_handle, 2513f012e29Smrg 4096, 4096, 2523f012e29Smrg AMDGPU_GEM_DOMAIN_VRAM, 2533f012e29Smrg AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 2543f012e29Smrg &bo_mc, &va_handle); 2553f012e29Smrg 2563f012e29Smrg r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 2573f012e29Smrg CU_ASSERT_EQUAL(r, 0); 2583f012e29Smrg 2593f012e29Smrg /* Test invisible VRAM */ 2603f012e29Smrg bo = gpu_mem_alloc(device_handle, 2613f012e29Smrg 4096, 4096, 2623f012e29Smrg AMDGPU_GEM_DOMAIN_VRAM, 2633f012e29Smrg AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 2643f012e29Smrg &bo_mc, &va_handle); 2653f012e29Smrg 2663f012e29Smrg r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 2673f012e29Smrg CU_ASSERT_EQUAL(r, 0); 2683f012e29Smrg 2693f012e29Smrg /* Test GART Cacheable */ 2703f012e29Smrg bo = gpu_mem_alloc(device_handle, 2713f012e29Smrg 4096, 4096, 2723f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 2733f012e29Smrg 0, &bo_mc, &va_handle); 2743f012e29Smrg 2753f012e29Smrg r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 2763f012e29Smrg CU_ASSERT_EQUAL(r, 0); 2773f012e29Smrg 2783f012e29Smrg /* Test GART USWC */ 2793f012e29Smrg bo = gpu_mem_alloc(device_handle, 2803f012e29Smrg 4096, 4096, 2813f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 2823f012e29Smrg AMDGPU_GEM_CREATE_CPU_GTT_USWC, 2833f012e29Smrg &bo_mc, &va_handle); 2843f012e29Smrg 2853f012e29Smrg r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 2863f012e29Smrg CU_ASSERT_EQUAL(r, 0); 2873f012e29Smrg} 2883f012e29Smrg 2893f012e29Smrgstatic void amdgpu_command_submission_gfx_separate_ibs(void) 2903f012e29Smrg{ 2913f012e29Smrg amdgpu_context_handle context_handle; 2923f012e29Smrg amdgpu_bo_handle ib_result_handle, ib_result_ce_handle; 2933f012e29Smrg void *ib_result_cpu, *ib_result_ce_cpu; 2943f012e29Smrg uint64_t ib_result_mc_address, ib_result_ce_mc_address; 2953f012e29Smrg struct amdgpu_cs_request ibs_request = {0}; 2963f012e29Smrg struct amdgpu_cs_ib_info ib_info[2]; 2973f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 2983f012e29Smrg uint32_t *ptr; 2993f012e29Smrg uint32_t expired; 3003f012e29Smrg amdgpu_bo_list_handle bo_list; 3013f012e29Smrg amdgpu_va_handle va_handle, va_handle_ce; 3023f012e29Smrg int r; 3033f012e29Smrg 3043f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3053f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3063f012e29Smrg 3073f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 3083f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 3093f012e29Smrg &ib_result_handle, &ib_result_cpu, 3103f012e29Smrg &ib_result_mc_address, &va_handle); 3113f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3123f012e29Smrg 3133f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 3143f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 3153f012e29Smrg &ib_result_ce_handle, &ib_result_ce_cpu, 3163f012e29Smrg &ib_result_ce_mc_address, &va_handle_ce); 3173f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3183f012e29Smrg 3193f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, 3203f012e29Smrg ib_result_ce_handle, &bo_list); 3213f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3223f012e29Smrg 3233f012e29Smrg memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 3243f012e29Smrg 3253f012e29Smrg /* IT_SET_CE_DE_COUNTERS */ 3263f012e29Smrg ptr = ib_result_ce_cpu; 3273f012e29Smrg ptr[0] = 0xc0008900; 3283f012e29Smrg ptr[1] = 0; 3293f012e29Smrg ptr[2] = 0xc0008400; 3303f012e29Smrg ptr[3] = 1; 3313f012e29Smrg ib_info[0].ib_mc_address = ib_result_ce_mc_address; 3323f012e29Smrg ib_info[0].size = 4; 3333f012e29Smrg ib_info[0].flags = AMDGPU_IB_FLAG_CE; 3343f012e29Smrg 3353f012e29Smrg /* IT_WAIT_ON_CE_COUNTER */ 3363f012e29Smrg ptr = ib_result_cpu; 3373f012e29Smrg ptr[0] = 0xc0008600; 3383f012e29Smrg ptr[1] = 0x00000001; 3393f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address; 3403f012e29Smrg ib_info[1].size = 2; 3413f012e29Smrg 3423f012e29Smrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 3433f012e29Smrg ibs_request.number_of_ibs = 2; 3443f012e29Smrg ibs_request.ibs = ib_info; 3453f012e29Smrg ibs_request.resources = bo_list; 3463f012e29Smrg ibs_request.fence_info.handle = NULL; 3473f012e29Smrg 3483f012e29Smrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 3493f012e29Smrg 3503f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3513f012e29Smrg 3523f012e29Smrg fence_status.context = context_handle; 3533f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 3543f012e29Smrg fence_status.ip_instance = 0; 3553f012e29Smrg fence_status.fence = ibs_request.seq_no; 3563f012e29Smrg 3573f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 3583f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 3593f012e29Smrg 0, &expired); 3603f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3613f012e29Smrg 3623f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 3633f012e29Smrg ib_result_mc_address, 4096); 3643f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3653f012e29Smrg 3663f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce, 3673f012e29Smrg ib_result_ce_mc_address, 4096); 3683f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3693f012e29Smrg 3703f012e29Smrg r = amdgpu_bo_list_destroy(bo_list); 3713f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3723f012e29Smrg 3733f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 3743f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3753f012e29Smrg 3763f012e29Smrg} 3773f012e29Smrg 3783f012e29Smrgstatic void amdgpu_command_submission_gfx_shared_ib(void) 3793f012e29Smrg{ 3803f012e29Smrg amdgpu_context_handle context_handle; 3813f012e29Smrg amdgpu_bo_handle ib_result_handle; 3823f012e29Smrg void *ib_result_cpu; 3833f012e29Smrg uint64_t ib_result_mc_address; 3843f012e29Smrg struct amdgpu_cs_request ibs_request = {0}; 3853f012e29Smrg struct amdgpu_cs_ib_info ib_info[2]; 3863f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 3873f012e29Smrg uint32_t *ptr; 3883f012e29Smrg uint32_t expired; 3893f012e29Smrg amdgpu_bo_list_handle bo_list; 3903f012e29Smrg amdgpu_va_handle va_handle; 3913f012e29Smrg int r; 3923f012e29Smrg 3933f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3943f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3953f012e29Smrg 3963f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 3973f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 3983f012e29Smrg &ib_result_handle, &ib_result_cpu, 3993f012e29Smrg &ib_result_mc_address, &va_handle); 4003f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4013f012e29Smrg 4023f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 4033f012e29Smrg &bo_list); 4043f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4053f012e29Smrg 4063f012e29Smrg memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 4073f012e29Smrg 4083f012e29Smrg /* IT_SET_CE_DE_COUNTERS */ 4093f012e29Smrg ptr = ib_result_cpu; 4103f012e29Smrg ptr[0] = 0xc0008900; 4113f012e29Smrg ptr[1] = 0; 4123f012e29Smrg ptr[2] = 0xc0008400; 4133f012e29Smrg ptr[3] = 1; 4143f012e29Smrg ib_info[0].ib_mc_address = ib_result_mc_address; 4153f012e29Smrg ib_info[0].size = 4; 4163f012e29Smrg ib_info[0].flags = AMDGPU_IB_FLAG_CE; 4173f012e29Smrg 4183f012e29Smrg ptr = (uint32_t *)ib_result_cpu + 4; 4193f012e29Smrg ptr[0] = 0xc0008600; 4203f012e29Smrg ptr[1] = 0x00000001; 4213f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address + 16; 4223f012e29Smrg ib_info[1].size = 2; 4233f012e29Smrg 4243f012e29Smrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 4253f012e29Smrg ibs_request.number_of_ibs = 2; 4263f012e29Smrg ibs_request.ibs = ib_info; 4273f012e29Smrg ibs_request.resources = bo_list; 4283f012e29Smrg ibs_request.fence_info.handle = NULL; 4293f012e29Smrg 4303f012e29Smrg r = amdgpu_cs_submit(context_handle, 0, &ibs_request, 1); 4313f012e29Smrg 4323f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4333f012e29Smrg 4343f012e29Smrg fence_status.context = context_handle; 4353f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 4363f012e29Smrg fence_status.ip_instance = 0; 4373f012e29Smrg fence_status.fence = ibs_request.seq_no; 4383f012e29Smrg 4393f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 4403f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 4413f012e29Smrg 0, &expired); 4423f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4433f012e29Smrg 4443f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4453f012e29Smrg ib_result_mc_address, 4096); 4463f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4473f012e29Smrg 4483f012e29Smrg r = amdgpu_bo_list_destroy(bo_list); 4493f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4503f012e29Smrg 4513f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 4523f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4533f012e29Smrg} 4543f012e29Smrg 4553f012e29Smrgstatic void amdgpu_command_submission_gfx_cp_write_data(void) 4563f012e29Smrg{ 4573f012e29Smrg amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_GFX); 4583f012e29Smrg} 4593f012e29Smrg 4603f012e29Smrgstatic void amdgpu_command_submission_gfx_cp_const_fill(void) 4613f012e29Smrg{ 4623f012e29Smrg amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_GFX); 4633f012e29Smrg} 4643f012e29Smrg 4653f012e29Smrgstatic void amdgpu_command_submission_gfx_cp_copy_data(void) 4663f012e29Smrg{ 4673f012e29Smrg amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_GFX); 4683f012e29Smrg} 4693f012e29Smrg 4703f012e29Smrgstatic void amdgpu_command_submission_gfx(void) 4713f012e29Smrg{ 4723f012e29Smrg /* write data using the CP */ 4733f012e29Smrg amdgpu_command_submission_gfx_cp_write_data(); 4743f012e29Smrg /* const fill using the CP */ 4753f012e29Smrg amdgpu_command_submission_gfx_cp_const_fill(); 4763f012e29Smrg /* copy data using the CP */ 4773f012e29Smrg amdgpu_command_submission_gfx_cp_copy_data(); 4783f012e29Smrg /* separate IB buffers for multi-IB submission */ 4793f012e29Smrg amdgpu_command_submission_gfx_separate_ibs(); 4803f012e29Smrg /* shared IB buffer for multi-IB submission */ 4813f012e29Smrg amdgpu_command_submission_gfx_shared_ib(); 4823f012e29Smrg} 4833f012e29Smrg 4843f012e29Smrgstatic void amdgpu_semaphore_test(void) 4853f012e29Smrg{ 4863f012e29Smrg amdgpu_context_handle context_handle[2]; 4873f012e29Smrg amdgpu_semaphore_handle sem; 4883f012e29Smrg amdgpu_bo_handle ib_result_handle[2]; 4893f012e29Smrg void *ib_result_cpu[2]; 4903f012e29Smrg uint64_t ib_result_mc_address[2]; 4913f012e29Smrg struct amdgpu_cs_request ibs_request[2] = {0}; 4923f012e29Smrg struct amdgpu_cs_ib_info ib_info[2] = {0}; 4933f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 4943f012e29Smrg uint32_t *ptr; 4953f012e29Smrg uint32_t expired; 4963f012e29Smrg amdgpu_bo_list_handle bo_list[2]; 4973f012e29Smrg amdgpu_va_handle va_handle[2]; 4983f012e29Smrg int r, i; 4993f012e29Smrg 5003f012e29Smrg r = amdgpu_cs_create_semaphore(&sem); 5013f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5023f012e29Smrg for (i = 0; i < 2; i++) { 5033f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle[i]); 5043f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5053f012e29Smrg 5063f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 5073f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 5083f012e29Smrg &ib_result_handle[i], &ib_result_cpu[i], 5093f012e29Smrg &ib_result_mc_address[i], &va_handle[i]); 5103f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5113f012e29Smrg 5123f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle[i], 5133f012e29Smrg NULL, &bo_list[i]); 5143f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5153f012e29Smrg } 5163f012e29Smrg 5173f012e29Smrg /* 1. same context different engine */ 5183f012e29Smrg ptr = ib_result_cpu[0]; 5193f012e29Smrg ptr[0] = SDMA_NOP; 5203f012e29Smrg ib_info[0].ib_mc_address = ib_result_mc_address[0]; 5213f012e29Smrg ib_info[0].size = 1; 5223f012e29Smrg 5233f012e29Smrg ibs_request[0].ip_type = AMDGPU_HW_IP_DMA; 5243f012e29Smrg ibs_request[0].number_of_ibs = 1; 5253f012e29Smrg ibs_request[0].ibs = &ib_info[0]; 5263f012e29Smrg ibs_request[0].resources = bo_list[0]; 5273f012e29Smrg ibs_request[0].fence_info.handle = NULL; 5283f012e29Smrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1); 5293f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5303f012e29Smrg r = amdgpu_cs_signal_semaphore(context_handle[0], AMDGPU_HW_IP_DMA, 0, 0, sem); 5313f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5323f012e29Smrg 5333f012e29Smrg r = amdgpu_cs_wait_semaphore(context_handle[0], AMDGPU_HW_IP_GFX, 0, 0, sem); 5343f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5353f012e29Smrg ptr = ib_result_cpu[1]; 5363f012e29Smrg ptr[0] = GFX_COMPUTE_NOP; 5373f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address[1]; 5383f012e29Smrg ib_info[1].size = 1; 5393f012e29Smrg 5403f012e29Smrg ibs_request[1].ip_type = AMDGPU_HW_IP_GFX; 5413f012e29Smrg ibs_request[1].number_of_ibs = 1; 5423f012e29Smrg ibs_request[1].ibs = &ib_info[1]; 5433f012e29Smrg ibs_request[1].resources = bo_list[1]; 5443f012e29Smrg ibs_request[1].fence_info.handle = NULL; 5453f012e29Smrg 5463f012e29Smrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[1], 1); 5473f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5483f012e29Smrg 5493f012e29Smrg fence_status.context = context_handle[0]; 5503f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 5513f012e29Smrg fence_status.ip_instance = 0; 5523f012e29Smrg fence_status.fence = ibs_request[1].seq_no; 5533f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 5543f012e29Smrg 500000000, 0, &expired); 5553f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5563f012e29Smrg CU_ASSERT_EQUAL(expired, true); 5573f012e29Smrg 5583f012e29Smrg /* 2. same engine different context */ 5593f012e29Smrg ptr = ib_result_cpu[0]; 5603f012e29Smrg ptr[0] = GFX_COMPUTE_NOP; 5613f012e29Smrg ib_info[0].ib_mc_address = ib_result_mc_address[0]; 5623f012e29Smrg ib_info[0].size = 1; 5633f012e29Smrg 5643f012e29Smrg ibs_request[0].ip_type = AMDGPU_HW_IP_GFX; 5653f012e29Smrg ibs_request[0].number_of_ibs = 1; 5663f012e29Smrg ibs_request[0].ibs = &ib_info[0]; 5673f012e29Smrg ibs_request[0].resources = bo_list[0]; 5683f012e29Smrg ibs_request[0].fence_info.handle = NULL; 5693f012e29Smrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1); 5703f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5713f012e29Smrg r = amdgpu_cs_signal_semaphore(context_handle[0], AMDGPU_HW_IP_GFX, 0, 0, sem); 5723f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5733f012e29Smrg 5743f012e29Smrg r = amdgpu_cs_wait_semaphore(context_handle[1], AMDGPU_HW_IP_GFX, 0, 0, sem); 5753f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5763f012e29Smrg ptr = ib_result_cpu[1]; 5773f012e29Smrg ptr[0] = GFX_COMPUTE_NOP; 5783f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address[1]; 5793f012e29Smrg ib_info[1].size = 1; 5803f012e29Smrg 5813f012e29Smrg ibs_request[1].ip_type = AMDGPU_HW_IP_GFX; 5823f012e29Smrg ibs_request[1].number_of_ibs = 1; 5833f012e29Smrg ibs_request[1].ibs = &ib_info[1]; 5843f012e29Smrg ibs_request[1].resources = bo_list[1]; 5853f012e29Smrg ibs_request[1].fence_info.handle = NULL; 5863f012e29Smrg r = amdgpu_cs_submit(context_handle[1], 0,&ibs_request[1], 1); 5873f012e29Smrg 5883f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5893f012e29Smrg 5903f012e29Smrg fence_status.context = context_handle[1]; 5913f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 5923f012e29Smrg fence_status.ip_instance = 0; 5933f012e29Smrg fence_status.fence = ibs_request[1].seq_no; 5943f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 5953f012e29Smrg 500000000, 0, &expired); 5963f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5973f012e29Smrg CU_ASSERT_EQUAL(expired, true); 5983f012e29Smrg for (i = 0; i < 2; i++) { 5993f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle[i], va_handle[i], 6003f012e29Smrg ib_result_mc_address[i], 4096); 6013f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6023f012e29Smrg 6033f012e29Smrg r = amdgpu_bo_list_destroy(bo_list[i]); 6043f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6053f012e29Smrg 6063f012e29Smrg r = amdgpu_cs_ctx_free(context_handle[i]); 6073f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6083f012e29Smrg } 6093f012e29Smrg 6103f012e29Smrg r = amdgpu_cs_destroy_semaphore(sem); 6113f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6123f012e29Smrg} 6133f012e29Smrg 6143f012e29Smrgstatic void amdgpu_command_submission_compute_nop(void) 6153f012e29Smrg{ 6163f012e29Smrg amdgpu_context_handle context_handle; 6173f012e29Smrg amdgpu_bo_handle ib_result_handle; 6183f012e29Smrg void *ib_result_cpu; 6193f012e29Smrg uint64_t ib_result_mc_address; 6203f012e29Smrg struct amdgpu_cs_request ibs_request; 6213f012e29Smrg struct amdgpu_cs_ib_info ib_info; 6223f012e29Smrg struct amdgpu_cs_fence fence_status; 6233f012e29Smrg uint32_t *ptr; 6243f012e29Smrg uint32_t expired; 6253f012e29Smrg int i, r, instance; 6263f012e29Smrg amdgpu_bo_list_handle bo_list; 6273f012e29Smrg amdgpu_va_handle va_handle; 6283f012e29Smrg 6293f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 6303f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6313f012e29Smrg 6323f012e29Smrg for (instance = 0; instance < 8; instance++) { 6333f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 6343f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 6353f012e29Smrg &ib_result_handle, &ib_result_cpu, 6363f012e29Smrg &ib_result_mc_address, &va_handle); 6373f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6383f012e29Smrg 6393f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 6403f012e29Smrg &bo_list); 6413f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6423f012e29Smrg 6433f012e29Smrg ptr = ib_result_cpu; 6443f012e29Smrg for (i = 0; i < 16; ++i) 6453f012e29Smrg ptr[i] = 0xffff1000; 6463f012e29Smrg 6473f012e29Smrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 6483f012e29Smrg ib_info.ib_mc_address = ib_result_mc_address; 6493f012e29Smrg ib_info.size = 16; 6503f012e29Smrg 6513f012e29Smrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 6523f012e29Smrg ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE; 6533f012e29Smrg ibs_request.ring = instance; 6543f012e29Smrg ibs_request.number_of_ibs = 1; 6553f012e29Smrg ibs_request.ibs = &ib_info; 6563f012e29Smrg ibs_request.resources = bo_list; 6573f012e29Smrg ibs_request.fence_info.handle = NULL; 6583f012e29Smrg 6593f012e29Smrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 6603f012e29Smrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 6613f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6623f012e29Smrg 6633f012e29Smrg fence_status.context = context_handle; 6643f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_COMPUTE; 6653f012e29Smrg fence_status.ip_instance = 0; 6663f012e29Smrg fence_status.ring = instance; 6673f012e29Smrg fence_status.fence = ibs_request.seq_no; 6683f012e29Smrg 6693f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 6703f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 6713f012e29Smrg 0, &expired); 6723f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6733f012e29Smrg 6743f012e29Smrg r = amdgpu_bo_list_destroy(bo_list); 6753f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6763f012e29Smrg 6773f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 6783f012e29Smrg ib_result_mc_address, 4096); 6793f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6803f012e29Smrg } 6813f012e29Smrg 6823f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 6833f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6843f012e29Smrg} 6853f012e29Smrg 6863f012e29Smrgstatic void amdgpu_command_submission_compute_cp_write_data(void) 6873f012e29Smrg{ 6883f012e29Smrg amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_COMPUTE); 6893f012e29Smrg} 6903f012e29Smrg 6913f012e29Smrgstatic void amdgpu_command_submission_compute_cp_const_fill(void) 6923f012e29Smrg{ 6933f012e29Smrg amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_COMPUTE); 6943f012e29Smrg} 6953f012e29Smrg 6963f012e29Smrgstatic void amdgpu_command_submission_compute_cp_copy_data(void) 6973f012e29Smrg{ 6983f012e29Smrg amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_COMPUTE); 6993f012e29Smrg} 7003f012e29Smrg 7013f012e29Smrgstatic void amdgpu_command_submission_compute(void) 7023f012e29Smrg{ 7033f012e29Smrg /* write data using the CP */ 7043f012e29Smrg amdgpu_command_submission_compute_cp_write_data(); 7053f012e29Smrg /* const fill using the CP */ 7063f012e29Smrg amdgpu_command_submission_compute_cp_const_fill(); 7073f012e29Smrg /* copy data using the CP */ 7083f012e29Smrg amdgpu_command_submission_compute_cp_copy_data(); 7093f012e29Smrg /* nop test */ 7103f012e29Smrg amdgpu_command_submission_compute_nop(); 7113f012e29Smrg} 7123f012e29Smrg 7133f012e29Smrg/* 7143f012e29Smrg * caller need create/release: 7153f012e29Smrg * pm4_src, resources, ib_info, and ibs_request 7163f012e29Smrg * submit command stream described in ibs_request and wait for this IB accomplished 7173f012e29Smrg */ 7183f012e29Smrgstatic void amdgpu_test_exec_cs_helper(amdgpu_context_handle context_handle, 7193f012e29Smrg unsigned ip_type, 7203f012e29Smrg int instance, int pm4_dw, uint32_t *pm4_src, 7213f012e29Smrg int res_cnt, amdgpu_bo_handle *resources, 7223f012e29Smrg struct amdgpu_cs_ib_info *ib_info, 7233f012e29Smrg struct amdgpu_cs_request *ibs_request) 7243f012e29Smrg{ 7253f012e29Smrg int r; 7263f012e29Smrg uint32_t expired; 7273f012e29Smrg uint32_t *ring_ptr; 7283f012e29Smrg amdgpu_bo_handle ib_result_handle; 7293f012e29Smrg void *ib_result_cpu; 7303f012e29Smrg uint64_t ib_result_mc_address; 7313f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 7323f012e29Smrg amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1)); 7333f012e29Smrg amdgpu_va_handle va_handle; 7343f012e29Smrg 7353f012e29Smrg /* prepare CS */ 7363f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4_src, NULL); 7373f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 7383f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 7393f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 7403f012e29Smrg CU_ASSERT_TRUE(pm4_dw <= 1024); 7413f012e29Smrg 7423f012e29Smrg /* allocate IB */ 7433f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 7443f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 7453f012e29Smrg &ib_result_handle, &ib_result_cpu, 7463f012e29Smrg &ib_result_mc_address, &va_handle); 7473f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7483f012e29Smrg 7493f012e29Smrg /* copy PM4 packet to ring from caller */ 7503f012e29Smrg ring_ptr = ib_result_cpu; 7513f012e29Smrg memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src)); 7523f012e29Smrg 7533f012e29Smrg ib_info->ib_mc_address = ib_result_mc_address; 7543f012e29Smrg ib_info->size = pm4_dw; 7553f012e29Smrg 7563f012e29Smrg ibs_request->ip_type = ip_type; 7573f012e29Smrg ibs_request->ring = instance; 7583f012e29Smrg ibs_request->number_of_ibs = 1; 7593f012e29Smrg ibs_request->ibs = ib_info; 7603f012e29Smrg ibs_request->fence_info.handle = NULL; 7613f012e29Smrg 7623f012e29Smrg memcpy(all_res, resources, sizeof(resources[0]) * res_cnt); 7633f012e29Smrg all_res[res_cnt] = ib_result_handle; 7643f012e29Smrg 7653f012e29Smrg r = amdgpu_bo_list_create(device_handle, res_cnt+1, all_res, 7663f012e29Smrg NULL, &ibs_request->resources); 7673f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7683f012e29Smrg 7693f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 7703f012e29Smrg 7713f012e29Smrg /* submit CS */ 7723f012e29Smrg r = amdgpu_cs_submit(context_handle, 0, ibs_request, 1); 7733f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7743f012e29Smrg 7753f012e29Smrg r = amdgpu_bo_list_destroy(ibs_request->resources); 7763f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7773f012e29Smrg 7783f012e29Smrg fence_status.ip_type = ip_type; 7793f012e29Smrg fence_status.ip_instance = 0; 7803f012e29Smrg fence_status.ring = ibs_request->ring; 7813f012e29Smrg fence_status.context = context_handle; 7823f012e29Smrg fence_status.fence = ibs_request->seq_no; 7833f012e29Smrg 7843f012e29Smrg /* wait for IB accomplished */ 7853f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 7863f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 7873f012e29Smrg 0, &expired); 7883f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7893f012e29Smrg CU_ASSERT_EQUAL(expired, true); 7903f012e29Smrg 7913f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 7923f012e29Smrg ib_result_mc_address, 4096); 7933f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7943f012e29Smrg} 7953f012e29Smrg 7963f012e29Smrgstatic void amdgpu_command_submission_write_linear_helper(unsigned ip_type) 7973f012e29Smrg{ 7983f012e29Smrg const int sdma_write_length = 128; 7993f012e29Smrg const int pm4_dw = 256; 8003f012e29Smrg amdgpu_context_handle context_handle; 8013f012e29Smrg amdgpu_bo_handle bo; 8023f012e29Smrg amdgpu_bo_handle *resources; 8033f012e29Smrg uint32_t *pm4; 8043f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 8053f012e29Smrg struct amdgpu_cs_request *ibs_request; 8063f012e29Smrg uint64_t bo_mc; 8073f012e29Smrg volatile uint32_t *bo_cpu; 8083f012e29Smrg int i, j, r, loop; 8093f012e29Smrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 8103f012e29Smrg amdgpu_va_handle va_handle; 8113f012e29Smrg 8123f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 8133f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 8143f012e29Smrg 8153f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 8163f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 8173f012e29Smrg 8183f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 8193f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 8203f012e29Smrg 8213f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 8223f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8233f012e29Smrg 8243f012e29Smrg /* prepare resource */ 8253f012e29Smrg resources = calloc(1, sizeof(amdgpu_bo_handle)); 8263f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 8273f012e29Smrg 8283f012e29Smrg loop = 0; 8293f012e29Smrg while(loop < 2) { 8303f012e29Smrg /* allocate UC bo for sDMA use */ 8313f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 8323f012e29Smrg sdma_write_length * sizeof(uint32_t), 8333f012e29Smrg 4096, AMDGPU_GEM_DOMAIN_GTT, 8343f012e29Smrg gtt_flags[loop], &bo, (void**)&bo_cpu, 8353f012e29Smrg &bo_mc, &va_handle); 8363f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8373f012e29Smrg 8383f012e29Smrg /* clear bo */ 8393f012e29Smrg memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t)); 8403f012e29Smrg 8413f012e29Smrg 8423f012e29Smrg resources[0] = bo; 8433f012e29Smrg 8443f012e29Smrg /* fulfill PM4: test DMA write-linear */ 8453f012e29Smrg i = j = 0; 8463f012e29Smrg if (ip_type == AMDGPU_HW_IP_DMA) { 8473f012e29Smrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 8483f012e29Smrg SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 8493f012e29Smrg pm4[i++] = 0xffffffff & bo_mc; 8503f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 8513f012e29Smrg pm4[i++] = sdma_write_length; 8523f012e29Smrg while(j++ < sdma_write_length) 8533f012e29Smrg pm4[i++] = 0xdeadbeaf; 8543f012e29Smrg } else if ((ip_type == AMDGPU_HW_IP_GFX) || 8553f012e29Smrg (ip_type == AMDGPU_HW_IP_COMPUTE)) { 8563f012e29Smrg pm4[i++] = PACKET3(PACKET3_WRITE_DATA, 2 + sdma_write_length); 8573f012e29Smrg pm4[i++] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM; 8583f012e29Smrg pm4[i++] = 0xfffffffc & bo_mc; 8593f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 8603f012e29Smrg while(j++ < sdma_write_length) 8613f012e29Smrg pm4[i++] = 0xdeadbeaf; 8623f012e29Smrg } 8633f012e29Smrg 8643f012e29Smrg amdgpu_test_exec_cs_helper(context_handle, 8653f012e29Smrg ip_type, 0, 8663f012e29Smrg i, pm4, 8673f012e29Smrg 1, resources, 8683f012e29Smrg ib_info, ibs_request); 8693f012e29Smrg 8703f012e29Smrg /* verify if SDMA test result meets with expected */ 8713f012e29Smrg i = 0; 8723f012e29Smrg while(i < sdma_write_length) { 8733f012e29Smrg CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 8743f012e29Smrg } 8753f012e29Smrg 8763f012e29Smrg r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc, 8773f012e29Smrg sdma_write_length * sizeof(uint32_t)); 8783f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8793f012e29Smrg loop++; 8803f012e29Smrg } 8813f012e29Smrg /* clean resources */ 8823f012e29Smrg free(resources); 8833f012e29Smrg free(ibs_request); 8843f012e29Smrg free(ib_info); 8853f012e29Smrg free(pm4); 8863f012e29Smrg 8873f012e29Smrg /* end of test */ 8883f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 8893f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8903f012e29Smrg} 8913f012e29Smrg 8923f012e29Smrgstatic void amdgpu_command_submission_sdma_write_linear(void) 8933f012e29Smrg{ 8943f012e29Smrg amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_DMA); 8953f012e29Smrg} 8963f012e29Smrg 8973f012e29Smrgstatic void amdgpu_command_submission_const_fill_helper(unsigned ip_type) 8983f012e29Smrg{ 8993f012e29Smrg const int sdma_write_length = 1024 * 1024; 9003f012e29Smrg const int pm4_dw = 256; 9013f012e29Smrg amdgpu_context_handle context_handle; 9023f012e29Smrg amdgpu_bo_handle bo; 9033f012e29Smrg amdgpu_bo_handle *resources; 9043f012e29Smrg uint32_t *pm4; 9053f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 9063f012e29Smrg struct amdgpu_cs_request *ibs_request; 9073f012e29Smrg uint64_t bo_mc; 9083f012e29Smrg volatile uint32_t *bo_cpu; 9093f012e29Smrg int i, j, r, loop; 9103f012e29Smrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 9113f012e29Smrg amdgpu_va_handle va_handle; 9123f012e29Smrg 9133f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 9143f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 9153f012e29Smrg 9163f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 9173f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 9183f012e29Smrg 9193f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 9203f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 9213f012e29Smrg 9223f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 9233f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9243f012e29Smrg 9253f012e29Smrg /* prepare resource */ 9263f012e29Smrg resources = calloc(1, sizeof(amdgpu_bo_handle)); 9273f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 9283f012e29Smrg 9293f012e29Smrg loop = 0; 9303f012e29Smrg while(loop < 2) { 9313f012e29Smrg /* allocate UC bo for sDMA use */ 9323f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 9333f012e29Smrg sdma_write_length, 4096, 9343f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 9353f012e29Smrg gtt_flags[loop], &bo, (void**)&bo_cpu, 9363f012e29Smrg &bo_mc, &va_handle); 9373f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9383f012e29Smrg 9393f012e29Smrg /* clear bo */ 9403f012e29Smrg memset((void*)bo_cpu, 0, sdma_write_length); 9413f012e29Smrg 9423f012e29Smrg resources[0] = bo; 9433f012e29Smrg 9443f012e29Smrg /* fulfill PM4: test DMA const fill */ 9453f012e29Smrg i = j = 0; 9463f012e29Smrg if (ip_type == AMDGPU_HW_IP_DMA) { 9473f012e29Smrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0, 9483f012e29Smrg SDMA_CONSTANT_FILL_EXTRA_SIZE(2)); 9493f012e29Smrg pm4[i++] = 0xffffffff & bo_mc; 9503f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 9513f012e29Smrg pm4[i++] = 0xdeadbeaf; 9523f012e29Smrg pm4[i++] = sdma_write_length; 9533f012e29Smrg } else if ((ip_type == AMDGPU_HW_IP_GFX) || 9543f012e29Smrg (ip_type == AMDGPU_HW_IP_COMPUTE)) { 9553f012e29Smrg pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5); 9563f012e29Smrg pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) | 9573f012e29Smrg PACKET3_DMA_DATA_DST_SEL(0) | 9583f012e29Smrg PACKET3_DMA_DATA_SRC_SEL(2) | 9593f012e29Smrg PACKET3_DMA_DATA_CP_SYNC; 9603f012e29Smrg pm4[i++] = 0xdeadbeaf; 9613f012e29Smrg pm4[i++] = 0; 9623f012e29Smrg pm4[i++] = 0xfffffffc & bo_mc; 9633f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 9643f012e29Smrg pm4[i++] = sdma_write_length; 9653f012e29Smrg } 9663f012e29Smrg 9673f012e29Smrg amdgpu_test_exec_cs_helper(context_handle, 9683f012e29Smrg ip_type, 0, 9693f012e29Smrg i, pm4, 9703f012e29Smrg 1, resources, 9713f012e29Smrg ib_info, ibs_request); 9723f012e29Smrg 9733f012e29Smrg /* verify if SDMA test result meets with expected */ 9743f012e29Smrg i = 0; 9753f012e29Smrg while(i < (sdma_write_length / 4)) { 9763f012e29Smrg CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 9773f012e29Smrg } 9783f012e29Smrg 9793f012e29Smrg r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc, 9803f012e29Smrg sdma_write_length); 9813f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9823f012e29Smrg loop++; 9833f012e29Smrg } 9843f012e29Smrg /* clean resources */ 9853f012e29Smrg free(resources); 9863f012e29Smrg free(ibs_request); 9873f012e29Smrg free(ib_info); 9883f012e29Smrg free(pm4); 9893f012e29Smrg 9903f012e29Smrg /* end of test */ 9913f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 9923f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9933f012e29Smrg} 9943f012e29Smrg 9953f012e29Smrgstatic void amdgpu_command_submission_sdma_const_fill(void) 9963f012e29Smrg{ 9973f012e29Smrg amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_DMA); 9983f012e29Smrg} 9993f012e29Smrg 10003f012e29Smrgstatic void amdgpu_command_submission_copy_linear_helper(unsigned ip_type) 10013f012e29Smrg{ 10023f012e29Smrg const int sdma_write_length = 1024; 10033f012e29Smrg const int pm4_dw = 256; 10043f012e29Smrg amdgpu_context_handle context_handle; 10053f012e29Smrg amdgpu_bo_handle bo1, bo2; 10063f012e29Smrg amdgpu_bo_handle *resources; 10073f012e29Smrg uint32_t *pm4; 10083f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 10093f012e29Smrg struct amdgpu_cs_request *ibs_request; 10103f012e29Smrg uint64_t bo1_mc, bo2_mc; 10113f012e29Smrg volatile unsigned char *bo1_cpu, *bo2_cpu; 10123f012e29Smrg int i, j, r, loop1, loop2; 10133f012e29Smrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 10143f012e29Smrg amdgpu_va_handle bo1_va_handle, bo2_va_handle; 10153f012e29Smrg 10163f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 10173f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 10183f012e29Smrg 10193f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 10203f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 10213f012e29Smrg 10223f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 10233f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 10243f012e29Smrg 10253f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 10263f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10273f012e29Smrg 10283f012e29Smrg /* prepare resource */ 10293f012e29Smrg resources = calloc(2, sizeof(amdgpu_bo_handle)); 10303f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 10313f012e29Smrg 10323f012e29Smrg loop1 = loop2 = 0; 10333f012e29Smrg /* run 9 circle to test all mapping combination */ 10343f012e29Smrg while(loop1 < 2) { 10353f012e29Smrg while(loop2 < 2) { 10363f012e29Smrg /* allocate UC bo1for sDMA use */ 10373f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 10383f012e29Smrg sdma_write_length, 4096, 10393f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 10403f012e29Smrg gtt_flags[loop1], &bo1, 10413f012e29Smrg (void**)&bo1_cpu, &bo1_mc, 10423f012e29Smrg &bo1_va_handle); 10433f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10443f012e29Smrg 10453f012e29Smrg /* set bo1 */ 10463f012e29Smrg memset((void*)bo1_cpu, 0xaa, sdma_write_length); 10473f012e29Smrg 10483f012e29Smrg /* allocate UC bo2 for sDMA use */ 10493f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 10503f012e29Smrg sdma_write_length, 4096, 10513f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 10523f012e29Smrg gtt_flags[loop2], &bo2, 10533f012e29Smrg (void**)&bo2_cpu, &bo2_mc, 10543f012e29Smrg &bo2_va_handle); 10553f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10563f012e29Smrg 10573f012e29Smrg /* clear bo2 */ 10583f012e29Smrg memset((void*)bo2_cpu, 0, sdma_write_length); 10593f012e29Smrg 10603f012e29Smrg resources[0] = bo1; 10613f012e29Smrg resources[1] = bo2; 10623f012e29Smrg 10633f012e29Smrg /* fulfill PM4: test DMA copy linear */ 10643f012e29Smrg i = j = 0; 10653f012e29Smrg if (ip_type == AMDGPU_HW_IP_DMA) { 10663f012e29Smrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0); 10673f012e29Smrg pm4[i++] = sdma_write_length; 10683f012e29Smrg pm4[i++] = 0; 10693f012e29Smrg pm4[i++] = 0xffffffff & bo1_mc; 10703f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 10713f012e29Smrg pm4[i++] = 0xffffffff & bo2_mc; 10723f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 10733f012e29Smrg } else if ((ip_type == AMDGPU_HW_IP_GFX) || 10743f012e29Smrg (ip_type == AMDGPU_HW_IP_COMPUTE)) { 10753f012e29Smrg pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5); 10763f012e29Smrg pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) | 10773f012e29Smrg PACKET3_DMA_DATA_DST_SEL(0) | 10783f012e29Smrg PACKET3_DMA_DATA_SRC_SEL(0) | 10793f012e29Smrg PACKET3_DMA_DATA_CP_SYNC; 10803f012e29Smrg pm4[i++] = 0xfffffffc & bo1_mc; 10813f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 10823f012e29Smrg pm4[i++] = 0xfffffffc & bo2_mc; 10833f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 10843f012e29Smrg pm4[i++] = sdma_write_length; 10853f012e29Smrg } 10863f012e29Smrg 10873f012e29Smrg amdgpu_test_exec_cs_helper(context_handle, 10883f012e29Smrg ip_type, 0, 10893f012e29Smrg i, pm4, 10903f012e29Smrg 2, resources, 10913f012e29Smrg ib_info, ibs_request); 10923f012e29Smrg 10933f012e29Smrg /* verify if SDMA test result meets with expected */ 10943f012e29Smrg i = 0; 10953f012e29Smrg while(i < sdma_write_length) { 10963f012e29Smrg CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa); 10973f012e29Smrg } 10983f012e29Smrg r = amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc, 10993f012e29Smrg sdma_write_length); 11003f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11013f012e29Smrg r = amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc, 11023f012e29Smrg sdma_write_length); 11033f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11043f012e29Smrg loop2++; 11053f012e29Smrg } 11063f012e29Smrg loop1++; 11073f012e29Smrg } 11083f012e29Smrg /* clean resources */ 11093f012e29Smrg free(resources); 11103f012e29Smrg free(ibs_request); 11113f012e29Smrg free(ib_info); 11123f012e29Smrg free(pm4); 11133f012e29Smrg 11143f012e29Smrg /* end of test */ 11153f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 11163f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11173f012e29Smrg} 11183f012e29Smrg 11193f012e29Smrgstatic void amdgpu_command_submission_sdma_copy_linear(void) 11203f012e29Smrg{ 11213f012e29Smrg amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_DMA); 11223f012e29Smrg} 11233f012e29Smrg 11243f012e29Smrgstatic void amdgpu_command_submission_sdma(void) 11253f012e29Smrg{ 11263f012e29Smrg amdgpu_command_submission_sdma_write_linear(); 11273f012e29Smrg amdgpu_command_submission_sdma_const_fill(); 11283f012e29Smrg amdgpu_command_submission_sdma_copy_linear(); 11293f012e29Smrg} 11303f012e29Smrg 11313f012e29Smrgstatic void amdgpu_userptr_test(void) 11323f012e29Smrg{ 11333f012e29Smrg int i, r, j; 11343f012e29Smrg uint32_t *pm4 = NULL; 11353f012e29Smrg uint64_t bo_mc; 11363f012e29Smrg void *ptr = NULL; 11373f012e29Smrg int pm4_dw = 256; 11383f012e29Smrg int sdma_write_length = 4; 11393f012e29Smrg amdgpu_bo_handle handle; 11403f012e29Smrg amdgpu_context_handle context_handle; 11413f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 11423f012e29Smrg struct amdgpu_cs_request *ibs_request; 11433f012e29Smrg amdgpu_bo_handle buf_handle; 11443f012e29Smrg amdgpu_va_handle va_handle; 11453f012e29Smrg 11463f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 11473f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 11483f012e29Smrg 11493f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 11503f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 11513f012e29Smrg 11523f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 11533f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 11543f012e29Smrg 11553f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 11563f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11573f012e29Smrg 11583f012e29Smrg posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE); 11593f012e29Smrg CU_ASSERT_NOT_EQUAL(ptr, NULL); 11603f012e29Smrg memset(ptr, 0, BUFFER_SIZE); 11613f012e29Smrg 11623f012e29Smrg r = amdgpu_create_bo_from_user_mem(device_handle, 11633f012e29Smrg ptr, BUFFER_SIZE, &buf_handle); 11643f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11653f012e29Smrg 11663f012e29Smrg r = amdgpu_va_range_alloc(device_handle, 11673f012e29Smrg amdgpu_gpu_va_range_general, 11683f012e29Smrg BUFFER_SIZE, 1, 0, &bo_mc, 11693f012e29Smrg &va_handle, 0); 11703f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11713f012e29Smrg 11723f012e29Smrg r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_MAP); 11733f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11743f012e29Smrg 11753f012e29Smrg handle = buf_handle; 11763f012e29Smrg 11773f012e29Smrg j = i = 0; 11783f012e29Smrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 11793f012e29Smrg SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 11803f012e29Smrg pm4[i++] = 0xffffffff & bo_mc; 11813f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 11823f012e29Smrg pm4[i++] = sdma_write_length; 11833f012e29Smrg 11843f012e29Smrg while (j++ < sdma_write_length) 11853f012e29Smrg pm4[i++] = 0xdeadbeaf; 11863f012e29Smrg 11873f012e29Smrg amdgpu_test_exec_cs_helper(context_handle, 11883f012e29Smrg AMDGPU_HW_IP_DMA, 0, 11893f012e29Smrg i, pm4, 11903f012e29Smrg 1, &handle, 11913f012e29Smrg ib_info, ibs_request); 11923f012e29Smrg i = 0; 11933f012e29Smrg while (i < sdma_write_length) { 11943f012e29Smrg CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf); 11953f012e29Smrg } 11963f012e29Smrg free(ibs_request); 11973f012e29Smrg free(ib_info); 11983f012e29Smrg free(pm4); 11993f012e29Smrg 12003f012e29Smrg r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_UNMAP); 12013f012e29Smrg CU_ASSERT_EQUAL(r, 0); 12023f012e29Smrg r = amdgpu_va_range_free(va_handle); 12033f012e29Smrg CU_ASSERT_EQUAL(r, 0); 12043f012e29Smrg r = amdgpu_bo_free(buf_handle); 12053f012e29Smrg CU_ASSERT_EQUAL(r, 0); 12063f012e29Smrg free(ptr); 12073f012e29Smrg 12083f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 12093f012e29Smrg CU_ASSERT_EQUAL(r, 0); 12103f012e29Smrg} 1211