basic_tests.c revision 7cdc0497
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#include <stdio.h> 253f012e29Smrg#include <stdlib.h> 263f012e29Smrg#include <unistd.h> 273f012e29Smrg#ifdef HAVE_ALLOCA_H 283f012e29Smrg# include <alloca.h> 293f012e29Smrg#endif 3000a23bdaSmrg#include <sys/wait.h> 313f012e29Smrg 323f012e29Smrg#include "CUnit/Basic.h" 333f012e29Smrg 343f012e29Smrg#include "amdgpu_test.h" 353f012e29Smrg#include "amdgpu_drm.h" 367cdc0497Smrg#include "util_math.h" 373f012e29Smrg 383f012e29Smrgstatic amdgpu_device_handle device_handle; 393f012e29Smrgstatic uint32_t major_version; 403f012e29Smrgstatic uint32_t minor_version; 41d8807b2fSmrgstatic uint32_t family_id; 423f012e29Smrg 433f012e29Smrgstatic void amdgpu_query_info_test(void); 443f012e29Smrgstatic void amdgpu_command_submission_gfx(void); 453f012e29Smrgstatic void amdgpu_command_submission_compute(void); 46d8807b2fSmrgstatic void amdgpu_command_submission_multi_fence(void); 473f012e29Smrgstatic void amdgpu_command_submission_sdma(void); 483f012e29Smrgstatic void amdgpu_userptr_test(void); 493f012e29Smrgstatic void amdgpu_semaphore_test(void); 5000a23bdaSmrgstatic void amdgpu_sync_dependency_test(void); 5100a23bdaSmrgstatic void amdgpu_bo_eviction_test(void); 523f012e29Smrg 533f012e29Smrgstatic void amdgpu_command_submission_write_linear_helper(unsigned ip_type); 543f012e29Smrgstatic void amdgpu_command_submission_const_fill_helper(unsigned ip_type); 553f012e29Smrgstatic void amdgpu_command_submission_copy_linear_helper(unsigned ip_type); 5600a23bdaSmrgstatic void amdgpu_test_exec_cs_helper(amdgpu_context_handle context_handle, 5700a23bdaSmrg unsigned ip_type, 5800a23bdaSmrg int instance, int pm4_dw, uint32_t *pm4_src, 5900a23bdaSmrg int res_cnt, amdgpu_bo_handle *resources, 6000a23bdaSmrg struct amdgpu_cs_ib_info *ib_info, 6100a23bdaSmrg struct amdgpu_cs_request *ibs_request); 6200a23bdaSmrg 633f012e29SmrgCU_TestInfo basic_tests[] = { 643f012e29Smrg { "Query Info Test", amdgpu_query_info_test }, 653f012e29Smrg { "Userptr Test", amdgpu_userptr_test }, 6600a23bdaSmrg { "bo eviction Test", amdgpu_bo_eviction_test }, 673f012e29Smrg { "Command submission Test (GFX)", amdgpu_command_submission_gfx }, 683f012e29Smrg { "Command submission Test (Compute)", amdgpu_command_submission_compute }, 69d8807b2fSmrg { "Command submission Test (Multi-Fence)", amdgpu_command_submission_multi_fence }, 703f012e29Smrg { "Command submission Test (SDMA)", amdgpu_command_submission_sdma }, 713f012e29Smrg { "SW semaphore Test", amdgpu_semaphore_test }, 7200a23bdaSmrg { "Sync dependency Test", amdgpu_sync_dependency_test }, 733f012e29Smrg CU_TEST_INFO_NULL, 743f012e29Smrg}; 753f012e29Smrg#define BUFFER_SIZE (8 * 1024) 763f012e29Smrg#define SDMA_PKT_HEADER_op_offset 0 773f012e29Smrg#define SDMA_PKT_HEADER_op_mask 0x000000FF 783f012e29Smrg#define SDMA_PKT_HEADER_op_shift 0 793f012e29Smrg#define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift) 803f012e29Smrg#define SDMA_OPCODE_CONSTANT_FILL 11 813f012e29Smrg# define SDMA_CONSTANT_FILL_EXTRA_SIZE(x) ((x) << 14) 823f012e29Smrg /* 0 = byte fill 833f012e29Smrg * 2 = DW fill 843f012e29Smrg */ 853f012e29Smrg#define SDMA_PACKET(op, sub_op, e) ((((e) & 0xFFFF) << 16) | \ 863f012e29Smrg (((sub_op) & 0xFF) << 8) | \ 873f012e29Smrg (((op) & 0xFF) << 0)) 883f012e29Smrg#define SDMA_OPCODE_WRITE 2 893f012e29Smrg# define SDMA_WRITE_SUB_OPCODE_LINEAR 0 903f012e29Smrg# define SDMA_WRTIE_SUB_OPCODE_TILED 1 913f012e29Smrg 923f012e29Smrg#define SDMA_OPCODE_COPY 1 933f012e29Smrg# define SDMA_COPY_SUB_OPCODE_LINEAR 0 943f012e29Smrg 953f012e29Smrg#define GFX_COMPUTE_NOP 0xffff1000 963f012e29Smrg#define SDMA_NOP 0x0 973f012e29Smrg 983f012e29Smrg/* PM4 */ 993f012e29Smrg#define PACKET_TYPE0 0 1003f012e29Smrg#define PACKET_TYPE1 1 1013f012e29Smrg#define PACKET_TYPE2 2 1023f012e29Smrg#define PACKET_TYPE3 3 1033f012e29Smrg 1043f012e29Smrg#define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 1053f012e29Smrg#define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 1063f012e29Smrg#define CP_PACKET0_GET_REG(h) ((h) & 0xFFFF) 1073f012e29Smrg#define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 1083f012e29Smrg#define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \ 1093f012e29Smrg ((reg) & 0xFFFF) | \ 1103f012e29Smrg ((n) & 0x3FFF) << 16) 1113f012e29Smrg#define CP_PACKET2 0x80000000 1123f012e29Smrg#define PACKET2_PAD_SHIFT 0 1133f012e29Smrg#define PACKET2_PAD_MASK (0x3fffffff << 0) 1143f012e29Smrg 1153f012e29Smrg#define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v))) 1163f012e29Smrg 1173f012e29Smrg#define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \ 1183f012e29Smrg (((op) & 0xFF) << 8) | \ 1193f012e29Smrg ((n) & 0x3FFF) << 16) 1203f012e29Smrg 1213f012e29Smrg/* Packet 3 types */ 1223f012e29Smrg#define PACKET3_NOP 0x10 1233f012e29Smrg 1243f012e29Smrg#define PACKET3_WRITE_DATA 0x37 1253f012e29Smrg#define WRITE_DATA_DST_SEL(x) ((x) << 8) 1263f012e29Smrg /* 0 - register 1273f012e29Smrg * 1 - memory (sync - via GRBM) 1283f012e29Smrg * 2 - gl2 1293f012e29Smrg * 3 - gds 1303f012e29Smrg * 4 - reserved 1313f012e29Smrg * 5 - memory (async - direct) 1323f012e29Smrg */ 1333f012e29Smrg#define WR_ONE_ADDR (1 << 16) 1343f012e29Smrg#define WR_CONFIRM (1 << 20) 1353f012e29Smrg#define WRITE_DATA_CACHE_POLICY(x) ((x) << 25) 1363f012e29Smrg /* 0 - LRU 1373f012e29Smrg * 1 - Stream 1383f012e29Smrg */ 1393f012e29Smrg#define WRITE_DATA_ENGINE_SEL(x) ((x) << 30) 1403f012e29Smrg /* 0 - me 1413f012e29Smrg * 1 - pfp 1423f012e29Smrg * 2 - ce 1433f012e29Smrg */ 1443f012e29Smrg 1453f012e29Smrg#define PACKET3_DMA_DATA 0x50 1463f012e29Smrg/* 1. header 1473f012e29Smrg * 2. CONTROL 1483f012e29Smrg * 3. SRC_ADDR_LO or DATA [31:0] 1493f012e29Smrg * 4. SRC_ADDR_HI [31:0] 1503f012e29Smrg * 5. DST_ADDR_LO [31:0] 1513f012e29Smrg * 6. DST_ADDR_HI [7:0] 1523f012e29Smrg * 7. COMMAND [30:21] | BYTE_COUNT [20:0] 1533f012e29Smrg */ 1543f012e29Smrg/* CONTROL */ 1553f012e29Smrg# define PACKET3_DMA_DATA_ENGINE(x) ((x) << 0) 1563f012e29Smrg /* 0 - ME 1573f012e29Smrg * 1 - PFP 1583f012e29Smrg */ 1593f012e29Smrg# define PACKET3_DMA_DATA_SRC_CACHE_POLICY(x) ((x) << 13) 1603f012e29Smrg /* 0 - LRU 1613f012e29Smrg * 1 - Stream 1623f012e29Smrg * 2 - Bypass 1633f012e29Smrg */ 1643f012e29Smrg# define PACKET3_DMA_DATA_SRC_VOLATILE (1 << 15) 1653f012e29Smrg# define PACKET3_DMA_DATA_DST_SEL(x) ((x) << 20) 1663f012e29Smrg /* 0 - DST_ADDR using DAS 1673f012e29Smrg * 1 - GDS 1683f012e29Smrg * 3 - DST_ADDR using L2 1693f012e29Smrg */ 1703f012e29Smrg# define PACKET3_DMA_DATA_DST_CACHE_POLICY(x) ((x) << 25) 1713f012e29Smrg /* 0 - LRU 1723f012e29Smrg * 1 - Stream 1733f012e29Smrg * 2 - Bypass 1743f012e29Smrg */ 1753f012e29Smrg# define PACKET3_DMA_DATA_DST_VOLATILE (1 << 27) 1763f012e29Smrg# define PACKET3_DMA_DATA_SRC_SEL(x) ((x) << 29) 1773f012e29Smrg /* 0 - SRC_ADDR using SAS 1783f012e29Smrg * 1 - GDS 1793f012e29Smrg * 2 - DATA 1803f012e29Smrg * 3 - SRC_ADDR using L2 1813f012e29Smrg */ 1823f012e29Smrg# define PACKET3_DMA_DATA_CP_SYNC (1 << 31) 1833f012e29Smrg/* COMMAND */ 1843f012e29Smrg# define PACKET3_DMA_DATA_DIS_WC (1 << 21) 1853f012e29Smrg# define PACKET3_DMA_DATA_CMD_SRC_SWAP(x) ((x) << 22) 1863f012e29Smrg /* 0 - none 1873f012e29Smrg * 1 - 8 in 16 1883f012e29Smrg * 2 - 8 in 32 1893f012e29Smrg * 3 - 8 in 64 1903f012e29Smrg */ 1913f012e29Smrg# define PACKET3_DMA_DATA_CMD_DST_SWAP(x) ((x) << 24) 1923f012e29Smrg /* 0 - none 1933f012e29Smrg * 1 - 8 in 16 1943f012e29Smrg * 2 - 8 in 32 1953f012e29Smrg * 3 - 8 in 64 1963f012e29Smrg */ 1973f012e29Smrg# define PACKET3_DMA_DATA_CMD_SAS (1 << 26) 1983f012e29Smrg /* 0 - memory 1993f012e29Smrg * 1 - register 2003f012e29Smrg */ 2013f012e29Smrg# define PACKET3_DMA_DATA_CMD_DAS (1 << 27) 2023f012e29Smrg /* 0 - memory 2033f012e29Smrg * 1 - register 2043f012e29Smrg */ 2053f012e29Smrg# define PACKET3_DMA_DATA_CMD_SAIC (1 << 28) 2063f012e29Smrg# define PACKET3_DMA_DATA_CMD_DAIC (1 << 29) 2073f012e29Smrg# define PACKET3_DMA_DATA_CMD_RAW_WAIT (1 << 30) 2083f012e29Smrg 209d8807b2fSmrg#define SDMA_PACKET_SI(op, b, t, s, cnt) ((((op) & 0xF) << 28) | \ 210d8807b2fSmrg (((b) & 0x1) << 26) | \ 211d8807b2fSmrg (((t) & 0x1) << 23) | \ 212d8807b2fSmrg (((s) & 0x1) << 22) | \ 213d8807b2fSmrg (((cnt) & 0xFFFFF) << 0)) 214d8807b2fSmrg#define SDMA_OPCODE_COPY_SI 3 215d8807b2fSmrg#define SDMA_OPCODE_CONSTANT_FILL_SI 13 216d8807b2fSmrg#define SDMA_NOP_SI 0xf 217d8807b2fSmrg#define GFX_COMPUTE_NOP_SI 0x80000000 218d8807b2fSmrg#define PACKET3_DMA_DATA_SI 0x41 219d8807b2fSmrg# define PACKET3_DMA_DATA_SI_ENGINE(x) ((x) << 27) 220d8807b2fSmrg /* 0 - ME 221d8807b2fSmrg * 1 - PFP 222d8807b2fSmrg */ 223d8807b2fSmrg# define PACKET3_DMA_DATA_SI_DST_SEL(x) ((x) << 20) 224d8807b2fSmrg /* 0 - DST_ADDR using DAS 225d8807b2fSmrg * 1 - GDS 226d8807b2fSmrg * 3 - DST_ADDR using L2 227d8807b2fSmrg */ 228d8807b2fSmrg# define PACKET3_DMA_DATA_SI_SRC_SEL(x) ((x) << 29) 229d8807b2fSmrg /* 0 - SRC_ADDR using SAS 230d8807b2fSmrg * 1 - GDS 231d8807b2fSmrg * 2 - DATA 232d8807b2fSmrg * 3 - SRC_ADDR using L2 233d8807b2fSmrg */ 234d8807b2fSmrg# define PACKET3_DMA_DATA_SI_CP_SYNC (1 << 31) 235d8807b2fSmrg 23600a23bdaSmrg 23700a23bdaSmrg#define PKT3_CONTEXT_CONTROL 0x28 23800a23bdaSmrg#define CONTEXT_CONTROL_LOAD_ENABLE(x) (((unsigned)(x) & 0x1) << 31) 23900a23bdaSmrg#define CONTEXT_CONTROL_LOAD_CE_RAM(x) (((unsigned)(x) & 0x1) << 28) 24000a23bdaSmrg#define CONTEXT_CONTROL_SHADOW_ENABLE(x) (((unsigned)(x) & 0x1) << 31) 24100a23bdaSmrg 24200a23bdaSmrg#define PKT3_CLEAR_STATE 0x12 24300a23bdaSmrg 24400a23bdaSmrg#define PKT3_SET_SH_REG 0x76 24500a23bdaSmrg#define PACKET3_SET_SH_REG_START 0x00002c00 24600a23bdaSmrg 24700a23bdaSmrg#define PACKET3_DISPATCH_DIRECT 0x15 24800a23bdaSmrg 24900a23bdaSmrg 25000a23bdaSmrg/* gfx 8 */ 25100a23bdaSmrg#define mmCOMPUTE_PGM_LO 0x2e0c 25200a23bdaSmrg#define mmCOMPUTE_PGM_RSRC1 0x2e12 25300a23bdaSmrg#define mmCOMPUTE_TMPRING_SIZE 0x2e18 25400a23bdaSmrg#define mmCOMPUTE_USER_DATA_0 0x2e40 25500a23bdaSmrg#define mmCOMPUTE_USER_DATA_1 0x2e41 25600a23bdaSmrg#define mmCOMPUTE_RESOURCE_LIMITS 0x2e15 25700a23bdaSmrg#define mmCOMPUTE_NUM_THREAD_X 0x2e07 25800a23bdaSmrg 25900a23bdaSmrg 26000a23bdaSmrg 26100a23bdaSmrg#define SWAP_32(num) (((num & 0xff000000) >> 24) | \ 26200a23bdaSmrg ((num & 0x0000ff00) << 8) | \ 26300a23bdaSmrg ((num & 0x00ff0000) >> 8) | \ 26400a23bdaSmrg ((num & 0x000000ff) << 24)) 26500a23bdaSmrg 26600a23bdaSmrg 26700a23bdaSmrg/* Shader code 26800a23bdaSmrg * void main() 26900a23bdaSmrg{ 27000a23bdaSmrg 27100a23bdaSmrg float x = some_input; 27200a23bdaSmrg for (unsigned i = 0; i < 1000000; i++) 27300a23bdaSmrg x = sin(x); 27400a23bdaSmrg 27500a23bdaSmrg u[0] = 42u; 27600a23bdaSmrg} 27700a23bdaSmrg*/ 27800a23bdaSmrg 27900a23bdaSmrgstatic uint32_t shader_bin[] = { 28000a23bdaSmrg SWAP_32(0x800082be), SWAP_32(0x02ff08bf), SWAP_32(0x7f969800), SWAP_32(0x040085bf), 28100a23bdaSmrg SWAP_32(0x02810281), SWAP_32(0x02ff08bf), SWAP_32(0x7f969800), SWAP_32(0xfcff84bf), 28200a23bdaSmrg SWAP_32(0xff0083be), SWAP_32(0x00f00000), SWAP_32(0xc10082be), SWAP_32(0xaa02007e), 28300a23bdaSmrg SWAP_32(0x000070e0), SWAP_32(0x00000080), SWAP_32(0x000081bf) 28400a23bdaSmrg}; 28500a23bdaSmrg 28600a23bdaSmrg#define CODE_OFFSET 512 28700a23bdaSmrg#define DATA_OFFSET 1024 28800a23bdaSmrg 28900a23bdaSmrg 2907cdc0497Smrgint amdgpu_bo_alloc_and_map_raw(amdgpu_device_handle dev, unsigned size, 2917cdc0497Smrg unsigned alignment, unsigned heap, uint64_t alloc_flags, 2927cdc0497Smrg uint64_t mapping_flags, amdgpu_bo_handle *bo, void **cpu, 2937cdc0497Smrg uint64_t *mc_address, 2947cdc0497Smrg amdgpu_va_handle *va_handle) 2957cdc0497Smrg{ 2967cdc0497Smrg struct amdgpu_bo_alloc_request request = {}; 2977cdc0497Smrg amdgpu_bo_handle buf_handle; 2987cdc0497Smrg amdgpu_va_handle handle; 2997cdc0497Smrg uint64_t vmc_addr; 3007cdc0497Smrg int r; 3017cdc0497Smrg 3027cdc0497Smrg request.alloc_size = size; 3037cdc0497Smrg request.phys_alignment = alignment; 3047cdc0497Smrg request.preferred_heap = heap; 3057cdc0497Smrg request.flags = alloc_flags; 3067cdc0497Smrg 3077cdc0497Smrg r = amdgpu_bo_alloc(dev, &request, &buf_handle); 3087cdc0497Smrg if (r) 3097cdc0497Smrg return r; 3107cdc0497Smrg 3117cdc0497Smrg r = amdgpu_va_range_alloc(dev, 3127cdc0497Smrg amdgpu_gpu_va_range_general, 3137cdc0497Smrg size, alignment, 0, &vmc_addr, 3147cdc0497Smrg &handle, 0); 3157cdc0497Smrg if (r) 3167cdc0497Smrg goto error_va_alloc; 3177cdc0497Smrg 3187cdc0497Smrg r = amdgpu_bo_va_op_raw(dev, buf_handle, 0, ALIGN(size, getpagesize()), vmc_addr, 3197cdc0497Smrg AMDGPU_VM_PAGE_READABLE | 3207cdc0497Smrg AMDGPU_VM_PAGE_WRITEABLE | 3217cdc0497Smrg AMDGPU_VM_PAGE_EXECUTABLE | 3227cdc0497Smrg mapping_flags, 3237cdc0497Smrg AMDGPU_VA_OP_MAP); 3247cdc0497Smrg if (r) 3257cdc0497Smrg goto error_va_map; 3267cdc0497Smrg 3277cdc0497Smrg r = amdgpu_bo_cpu_map(buf_handle, cpu); 3287cdc0497Smrg if (r) 3297cdc0497Smrg goto error_cpu_map; 3307cdc0497Smrg 3317cdc0497Smrg *bo = buf_handle; 3327cdc0497Smrg *mc_address = vmc_addr; 3337cdc0497Smrg *va_handle = handle; 3347cdc0497Smrg 3357cdc0497Smrg return 0; 3367cdc0497Smrg 3377cdc0497Smrg error_cpu_map: 3387cdc0497Smrg amdgpu_bo_cpu_unmap(buf_handle); 3397cdc0497Smrg 3407cdc0497Smrg error_va_map: 3417cdc0497Smrg amdgpu_bo_va_op(buf_handle, 0, size, vmc_addr, 0, AMDGPU_VA_OP_UNMAP); 3427cdc0497Smrg 3437cdc0497Smrg error_va_alloc: 3447cdc0497Smrg amdgpu_bo_free(buf_handle); 3457cdc0497Smrg return r; 3467cdc0497Smrg} 3477cdc0497Smrg 3487cdc0497Smrg 3497cdc0497Smrg 3503f012e29Smrgint suite_basic_tests_init(void) 3513f012e29Smrg{ 352d8807b2fSmrg struct amdgpu_gpu_info gpu_info = {0}; 3533f012e29Smrg int r; 3543f012e29Smrg 3553f012e29Smrg r = amdgpu_device_initialize(drm_amdgpu[0], &major_version, 3563f012e29Smrg &minor_version, &device_handle); 3573f012e29Smrg 358d8807b2fSmrg if (r) { 359037b3c26Smrg if ((r == -EACCES) && (errno == EACCES)) 360037b3c26Smrg printf("\n\nError:%s. " 361037b3c26Smrg "Hint:Try to run this test program as root.", 362037b3c26Smrg strerror(errno)); 3633f012e29Smrg return CUE_SINIT_FAILED; 364037b3c26Smrg } 365d8807b2fSmrg 366d8807b2fSmrg r = amdgpu_query_gpu_info(device_handle, &gpu_info); 367d8807b2fSmrg if (r) 368d8807b2fSmrg return CUE_SINIT_FAILED; 369d8807b2fSmrg 370d8807b2fSmrg family_id = gpu_info.family_id; 371d8807b2fSmrg 372d8807b2fSmrg return CUE_SUCCESS; 3733f012e29Smrg} 3743f012e29Smrg 3753f012e29Smrgint suite_basic_tests_clean(void) 3763f012e29Smrg{ 3773f012e29Smrg int r = amdgpu_device_deinitialize(device_handle); 3783f012e29Smrg 3793f012e29Smrg if (r == 0) 3803f012e29Smrg return CUE_SUCCESS; 3813f012e29Smrg else 3823f012e29Smrg return CUE_SCLEAN_FAILED; 3833f012e29Smrg} 3843f012e29Smrg 3853f012e29Smrgstatic void amdgpu_query_info_test(void) 3863f012e29Smrg{ 3873f012e29Smrg struct amdgpu_gpu_info gpu_info = {0}; 3883f012e29Smrg uint32_t version, feature; 3893f012e29Smrg int r; 3903f012e29Smrg 3913f012e29Smrg r = amdgpu_query_gpu_info(device_handle, &gpu_info); 3923f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3933f012e29Smrg 3943f012e29Smrg r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0, 3953f012e29Smrg 0, &version, &feature); 3963f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3973f012e29Smrg} 3983f012e29Smrg 3993f012e29Smrgstatic void amdgpu_command_submission_gfx_separate_ibs(void) 4003f012e29Smrg{ 4013f012e29Smrg amdgpu_context_handle context_handle; 4023f012e29Smrg amdgpu_bo_handle ib_result_handle, ib_result_ce_handle; 4033f012e29Smrg void *ib_result_cpu, *ib_result_ce_cpu; 4043f012e29Smrg uint64_t ib_result_mc_address, ib_result_ce_mc_address; 4053f012e29Smrg struct amdgpu_cs_request ibs_request = {0}; 4063f012e29Smrg struct amdgpu_cs_ib_info ib_info[2]; 4073f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 4083f012e29Smrg uint32_t *ptr; 4093f012e29Smrg uint32_t expired; 4103f012e29Smrg amdgpu_bo_list_handle bo_list; 4113f012e29Smrg amdgpu_va_handle va_handle, va_handle_ce; 412d8807b2fSmrg int r, i = 0; 4133f012e29Smrg 4143f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 4153f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4163f012e29Smrg 4173f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 4183f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 4193f012e29Smrg &ib_result_handle, &ib_result_cpu, 4203f012e29Smrg &ib_result_mc_address, &va_handle); 4213f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4223f012e29Smrg 4233f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 4243f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 4253f012e29Smrg &ib_result_ce_handle, &ib_result_ce_cpu, 4263f012e29Smrg &ib_result_ce_mc_address, &va_handle_ce); 4273f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4283f012e29Smrg 4293f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, 4303f012e29Smrg ib_result_ce_handle, &bo_list); 4313f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4323f012e29Smrg 4333f012e29Smrg memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 4343f012e29Smrg 4353f012e29Smrg /* IT_SET_CE_DE_COUNTERS */ 4363f012e29Smrg ptr = ib_result_ce_cpu; 437d8807b2fSmrg if (family_id != AMDGPU_FAMILY_SI) { 438d8807b2fSmrg ptr[i++] = 0xc0008900; 439d8807b2fSmrg ptr[i++] = 0; 440d8807b2fSmrg } 441d8807b2fSmrg ptr[i++] = 0xc0008400; 442d8807b2fSmrg ptr[i++] = 1; 4433f012e29Smrg ib_info[0].ib_mc_address = ib_result_ce_mc_address; 444d8807b2fSmrg ib_info[0].size = i; 4453f012e29Smrg ib_info[0].flags = AMDGPU_IB_FLAG_CE; 4463f012e29Smrg 4473f012e29Smrg /* IT_WAIT_ON_CE_COUNTER */ 4483f012e29Smrg ptr = ib_result_cpu; 4493f012e29Smrg ptr[0] = 0xc0008600; 4503f012e29Smrg ptr[1] = 0x00000001; 4513f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address; 4523f012e29Smrg ib_info[1].size = 2; 4533f012e29Smrg 4543f012e29Smrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 4553f012e29Smrg ibs_request.number_of_ibs = 2; 4563f012e29Smrg ibs_request.ibs = ib_info; 4573f012e29Smrg ibs_request.resources = bo_list; 4583f012e29Smrg ibs_request.fence_info.handle = NULL; 4593f012e29Smrg 4603f012e29Smrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 4613f012e29Smrg 4623f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4633f012e29Smrg 4643f012e29Smrg fence_status.context = context_handle; 4653f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 4663f012e29Smrg fence_status.ip_instance = 0; 4673f012e29Smrg fence_status.fence = ibs_request.seq_no; 4683f012e29Smrg 4693f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 4703f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 4713f012e29Smrg 0, &expired); 4723f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4733f012e29Smrg 4743f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4753f012e29Smrg ib_result_mc_address, 4096); 4763f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4773f012e29Smrg 4783f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce, 4793f012e29Smrg ib_result_ce_mc_address, 4096); 4803f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4813f012e29Smrg 4823f012e29Smrg r = amdgpu_bo_list_destroy(bo_list); 4833f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4843f012e29Smrg 4853f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 4863f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4873f012e29Smrg 4883f012e29Smrg} 4893f012e29Smrg 4903f012e29Smrgstatic void amdgpu_command_submission_gfx_shared_ib(void) 4913f012e29Smrg{ 4923f012e29Smrg amdgpu_context_handle context_handle; 4933f012e29Smrg amdgpu_bo_handle ib_result_handle; 4943f012e29Smrg void *ib_result_cpu; 4953f012e29Smrg uint64_t ib_result_mc_address; 4963f012e29Smrg struct amdgpu_cs_request ibs_request = {0}; 4973f012e29Smrg struct amdgpu_cs_ib_info ib_info[2]; 4983f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 4993f012e29Smrg uint32_t *ptr; 5003f012e29Smrg uint32_t expired; 5013f012e29Smrg amdgpu_bo_list_handle bo_list; 5023f012e29Smrg amdgpu_va_handle va_handle; 503d8807b2fSmrg int r, i = 0; 5043f012e29Smrg 5053f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 5063f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5073f012e29Smrg 5083f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 5093f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 5103f012e29Smrg &ib_result_handle, &ib_result_cpu, 5113f012e29Smrg &ib_result_mc_address, &va_handle); 5123f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5133f012e29Smrg 5143f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 5153f012e29Smrg &bo_list); 5163f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5173f012e29Smrg 5183f012e29Smrg memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 5193f012e29Smrg 5203f012e29Smrg /* IT_SET_CE_DE_COUNTERS */ 5213f012e29Smrg ptr = ib_result_cpu; 522d8807b2fSmrg if (family_id != AMDGPU_FAMILY_SI) { 523d8807b2fSmrg ptr[i++] = 0xc0008900; 524d8807b2fSmrg ptr[i++] = 0; 525d8807b2fSmrg } 526d8807b2fSmrg ptr[i++] = 0xc0008400; 527d8807b2fSmrg ptr[i++] = 1; 5283f012e29Smrg ib_info[0].ib_mc_address = ib_result_mc_address; 529d8807b2fSmrg ib_info[0].size = i; 5303f012e29Smrg ib_info[0].flags = AMDGPU_IB_FLAG_CE; 5313f012e29Smrg 5323f012e29Smrg ptr = (uint32_t *)ib_result_cpu + 4; 5333f012e29Smrg ptr[0] = 0xc0008600; 5343f012e29Smrg ptr[1] = 0x00000001; 5353f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address + 16; 5363f012e29Smrg ib_info[1].size = 2; 5373f012e29Smrg 5383f012e29Smrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 5393f012e29Smrg ibs_request.number_of_ibs = 2; 5403f012e29Smrg ibs_request.ibs = ib_info; 5413f012e29Smrg ibs_request.resources = bo_list; 5423f012e29Smrg ibs_request.fence_info.handle = NULL; 5433f012e29Smrg 5443f012e29Smrg r = amdgpu_cs_submit(context_handle, 0, &ibs_request, 1); 5453f012e29Smrg 5463f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5473f012e29Smrg 5483f012e29Smrg fence_status.context = context_handle; 5493f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 5503f012e29Smrg fence_status.ip_instance = 0; 5513f012e29Smrg fence_status.fence = ibs_request.seq_no; 5523f012e29Smrg 5533f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 5543f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 5553f012e29Smrg 0, &expired); 5563f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5573f012e29Smrg 5583f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 5593f012e29Smrg ib_result_mc_address, 4096); 5603f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5613f012e29Smrg 5623f012e29Smrg r = amdgpu_bo_list_destroy(bo_list); 5633f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5643f012e29Smrg 5653f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 5663f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5673f012e29Smrg} 5683f012e29Smrg 5693f012e29Smrgstatic void amdgpu_command_submission_gfx_cp_write_data(void) 5703f012e29Smrg{ 5713f012e29Smrg amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_GFX); 5723f012e29Smrg} 5733f012e29Smrg 5743f012e29Smrgstatic void amdgpu_command_submission_gfx_cp_const_fill(void) 5753f012e29Smrg{ 5763f012e29Smrg amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_GFX); 5773f012e29Smrg} 5783f012e29Smrg 5793f012e29Smrgstatic void amdgpu_command_submission_gfx_cp_copy_data(void) 5803f012e29Smrg{ 5813f012e29Smrg amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_GFX); 5823f012e29Smrg} 5833f012e29Smrg 58400a23bdaSmrgstatic void amdgpu_bo_eviction_test(void) 58500a23bdaSmrg{ 58600a23bdaSmrg const int sdma_write_length = 1024; 58700a23bdaSmrg const int pm4_dw = 256; 58800a23bdaSmrg amdgpu_context_handle context_handle; 58900a23bdaSmrg amdgpu_bo_handle bo1, bo2, vram_max[2], gtt_max[2]; 59000a23bdaSmrg amdgpu_bo_handle *resources; 59100a23bdaSmrg uint32_t *pm4; 59200a23bdaSmrg struct amdgpu_cs_ib_info *ib_info; 59300a23bdaSmrg struct amdgpu_cs_request *ibs_request; 59400a23bdaSmrg uint64_t bo1_mc, bo2_mc; 59500a23bdaSmrg volatile unsigned char *bo1_cpu, *bo2_cpu; 59600a23bdaSmrg int i, j, r, loop1, loop2; 59700a23bdaSmrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 59800a23bdaSmrg amdgpu_va_handle bo1_va_handle, bo2_va_handle; 59900a23bdaSmrg struct amdgpu_heap_info vram_info, gtt_info; 60000a23bdaSmrg 60100a23bdaSmrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 60200a23bdaSmrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 60300a23bdaSmrg 60400a23bdaSmrg ib_info = calloc(1, sizeof(*ib_info)); 60500a23bdaSmrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 60600a23bdaSmrg 60700a23bdaSmrg ibs_request = calloc(1, sizeof(*ibs_request)); 60800a23bdaSmrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 60900a23bdaSmrg 61000a23bdaSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 61100a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 61200a23bdaSmrg 61300a23bdaSmrg /* prepare resource */ 61400a23bdaSmrg resources = calloc(4, sizeof(amdgpu_bo_handle)); 61500a23bdaSmrg CU_ASSERT_NOT_EQUAL(resources, NULL); 61600a23bdaSmrg 61700a23bdaSmrg r = amdgpu_query_heap_info(device_handle, AMDGPU_GEM_DOMAIN_VRAM, 61800a23bdaSmrg 0, &vram_info); 61900a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 62000a23bdaSmrg 62100a23bdaSmrg r = amdgpu_bo_alloc_wrap(device_handle, vram_info.max_allocation, 4096, 62200a23bdaSmrg AMDGPU_GEM_DOMAIN_VRAM, 0, &vram_max[0]); 62300a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 62400a23bdaSmrg r = amdgpu_bo_alloc_wrap(device_handle, vram_info.max_allocation, 4096, 62500a23bdaSmrg AMDGPU_GEM_DOMAIN_VRAM, 0, &vram_max[1]); 62600a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 62700a23bdaSmrg 62800a23bdaSmrg r = amdgpu_query_heap_info(device_handle, AMDGPU_GEM_DOMAIN_GTT, 62900a23bdaSmrg 0, >t_info); 63000a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 63100a23bdaSmrg 63200a23bdaSmrg r = amdgpu_bo_alloc_wrap(device_handle, gtt_info.max_allocation, 4096, 63300a23bdaSmrg AMDGPU_GEM_DOMAIN_GTT, 0, >t_max[0]); 63400a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 63500a23bdaSmrg r = amdgpu_bo_alloc_wrap(device_handle, gtt_info.max_allocation, 4096, 63600a23bdaSmrg AMDGPU_GEM_DOMAIN_GTT, 0, >t_max[1]); 63700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 63800a23bdaSmrg 63900a23bdaSmrg 64000a23bdaSmrg 64100a23bdaSmrg loop1 = loop2 = 0; 64200a23bdaSmrg /* run 9 circle to test all mapping combination */ 64300a23bdaSmrg while(loop1 < 2) { 64400a23bdaSmrg while(loop2 < 2) { 64500a23bdaSmrg /* allocate UC bo1for sDMA use */ 64600a23bdaSmrg r = amdgpu_bo_alloc_and_map(device_handle, 64700a23bdaSmrg sdma_write_length, 4096, 64800a23bdaSmrg AMDGPU_GEM_DOMAIN_GTT, 64900a23bdaSmrg gtt_flags[loop1], &bo1, 65000a23bdaSmrg (void**)&bo1_cpu, &bo1_mc, 65100a23bdaSmrg &bo1_va_handle); 65200a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 65300a23bdaSmrg 65400a23bdaSmrg /* set bo1 */ 65500a23bdaSmrg memset((void*)bo1_cpu, 0xaa, sdma_write_length); 65600a23bdaSmrg 65700a23bdaSmrg /* allocate UC bo2 for sDMA use */ 65800a23bdaSmrg r = amdgpu_bo_alloc_and_map(device_handle, 65900a23bdaSmrg sdma_write_length, 4096, 66000a23bdaSmrg AMDGPU_GEM_DOMAIN_GTT, 66100a23bdaSmrg gtt_flags[loop2], &bo2, 66200a23bdaSmrg (void**)&bo2_cpu, &bo2_mc, 66300a23bdaSmrg &bo2_va_handle); 66400a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 66500a23bdaSmrg 66600a23bdaSmrg /* clear bo2 */ 66700a23bdaSmrg memset((void*)bo2_cpu, 0, sdma_write_length); 66800a23bdaSmrg 66900a23bdaSmrg resources[0] = bo1; 67000a23bdaSmrg resources[1] = bo2; 67100a23bdaSmrg resources[2] = vram_max[loop2]; 67200a23bdaSmrg resources[3] = gtt_max[loop2]; 67300a23bdaSmrg 67400a23bdaSmrg /* fulfill PM4: test DMA copy linear */ 67500a23bdaSmrg i = j = 0; 67600a23bdaSmrg if (family_id == AMDGPU_FAMILY_SI) { 67700a23bdaSmrg pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_COPY_SI, 0, 0, 0, 67800a23bdaSmrg sdma_write_length); 67900a23bdaSmrg pm4[i++] = 0xffffffff & bo2_mc; 68000a23bdaSmrg pm4[i++] = 0xffffffff & bo1_mc; 68100a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 68200a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 68300a23bdaSmrg } else { 68400a23bdaSmrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0); 68500a23bdaSmrg if (family_id >= AMDGPU_FAMILY_AI) 68600a23bdaSmrg pm4[i++] = sdma_write_length - 1; 68700a23bdaSmrg else 68800a23bdaSmrg pm4[i++] = sdma_write_length; 68900a23bdaSmrg pm4[i++] = 0; 69000a23bdaSmrg pm4[i++] = 0xffffffff & bo1_mc; 69100a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 69200a23bdaSmrg pm4[i++] = 0xffffffff & bo2_mc; 69300a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 69400a23bdaSmrg } 69500a23bdaSmrg 69600a23bdaSmrg amdgpu_test_exec_cs_helper(context_handle, 69700a23bdaSmrg AMDGPU_HW_IP_DMA, 0, 69800a23bdaSmrg i, pm4, 69900a23bdaSmrg 4, resources, 70000a23bdaSmrg ib_info, ibs_request); 70100a23bdaSmrg 70200a23bdaSmrg /* verify if SDMA test result meets with expected */ 70300a23bdaSmrg i = 0; 70400a23bdaSmrg while(i < sdma_write_length) { 70500a23bdaSmrg CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa); 70600a23bdaSmrg } 70700a23bdaSmrg r = amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc, 70800a23bdaSmrg sdma_write_length); 70900a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 71000a23bdaSmrg r = amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc, 71100a23bdaSmrg sdma_write_length); 71200a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 71300a23bdaSmrg loop2++; 71400a23bdaSmrg } 71500a23bdaSmrg loop2 = 0; 71600a23bdaSmrg loop1++; 71700a23bdaSmrg } 71800a23bdaSmrg amdgpu_bo_free(vram_max[0]); 71900a23bdaSmrg amdgpu_bo_free(vram_max[1]); 72000a23bdaSmrg amdgpu_bo_free(gtt_max[0]); 72100a23bdaSmrg amdgpu_bo_free(gtt_max[1]); 72200a23bdaSmrg /* clean resources */ 72300a23bdaSmrg free(resources); 72400a23bdaSmrg free(ibs_request); 72500a23bdaSmrg free(ib_info); 72600a23bdaSmrg free(pm4); 72700a23bdaSmrg 72800a23bdaSmrg /* end of test */ 72900a23bdaSmrg r = amdgpu_cs_ctx_free(context_handle); 73000a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 73100a23bdaSmrg} 73200a23bdaSmrg 73300a23bdaSmrg 7343f012e29Smrgstatic void amdgpu_command_submission_gfx(void) 7353f012e29Smrg{ 7363f012e29Smrg /* write data using the CP */ 7373f012e29Smrg amdgpu_command_submission_gfx_cp_write_data(); 7383f012e29Smrg /* const fill using the CP */ 7393f012e29Smrg amdgpu_command_submission_gfx_cp_const_fill(); 7403f012e29Smrg /* copy data using the CP */ 7413f012e29Smrg amdgpu_command_submission_gfx_cp_copy_data(); 7423f012e29Smrg /* separate IB buffers for multi-IB submission */ 7433f012e29Smrg amdgpu_command_submission_gfx_separate_ibs(); 7443f012e29Smrg /* shared IB buffer for multi-IB submission */ 7453f012e29Smrg amdgpu_command_submission_gfx_shared_ib(); 7463f012e29Smrg} 7473f012e29Smrg 7483f012e29Smrgstatic void amdgpu_semaphore_test(void) 7493f012e29Smrg{ 7503f012e29Smrg amdgpu_context_handle context_handle[2]; 7513f012e29Smrg amdgpu_semaphore_handle sem; 7523f012e29Smrg amdgpu_bo_handle ib_result_handle[2]; 7533f012e29Smrg void *ib_result_cpu[2]; 7543f012e29Smrg uint64_t ib_result_mc_address[2]; 7553f012e29Smrg struct amdgpu_cs_request ibs_request[2] = {0}; 7563f012e29Smrg struct amdgpu_cs_ib_info ib_info[2] = {0}; 7573f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 7583f012e29Smrg uint32_t *ptr; 7593f012e29Smrg uint32_t expired; 760d8807b2fSmrg uint32_t sdma_nop, gfx_nop; 7613f012e29Smrg amdgpu_bo_list_handle bo_list[2]; 7623f012e29Smrg amdgpu_va_handle va_handle[2]; 7633f012e29Smrg int r, i; 7643f012e29Smrg 765d8807b2fSmrg if (family_id == AMDGPU_FAMILY_SI) { 766d8807b2fSmrg sdma_nop = SDMA_PACKET_SI(SDMA_NOP_SI, 0, 0, 0, 0); 767d8807b2fSmrg gfx_nop = GFX_COMPUTE_NOP_SI; 768d8807b2fSmrg } else { 769d8807b2fSmrg sdma_nop = SDMA_PKT_HEADER_OP(SDMA_NOP); 770d8807b2fSmrg gfx_nop = GFX_COMPUTE_NOP; 771d8807b2fSmrg } 772d8807b2fSmrg 7733f012e29Smrg r = amdgpu_cs_create_semaphore(&sem); 7743f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7753f012e29Smrg for (i = 0; i < 2; i++) { 7763f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle[i]); 7773f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7783f012e29Smrg 7793f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 7803f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 7813f012e29Smrg &ib_result_handle[i], &ib_result_cpu[i], 7823f012e29Smrg &ib_result_mc_address[i], &va_handle[i]); 7833f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7843f012e29Smrg 7853f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle[i], 7863f012e29Smrg NULL, &bo_list[i]); 7873f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7883f012e29Smrg } 7893f012e29Smrg 7903f012e29Smrg /* 1. same context different engine */ 7913f012e29Smrg ptr = ib_result_cpu[0]; 792d8807b2fSmrg ptr[0] = sdma_nop; 7933f012e29Smrg ib_info[0].ib_mc_address = ib_result_mc_address[0]; 7943f012e29Smrg ib_info[0].size = 1; 7953f012e29Smrg 7963f012e29Smrg ibs_request[0].ip_type = AMDGPU_HW_IP_DMA; 7973f012e29Smrg ibs_request[0].number_of_ibs = 1; 7983f012e29Smrg ibs_request[0].ibs = &ib_info[0]; 7993f012e29Smrg ibs_request[0].resources = bo_list[0]; 8003f012e29Smrg ibs_request[0].fence_info.handle = NULL; 8013f012e29Smrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1); 8023f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8033f012e29Smrg r = amdgpu_cs_signal_semaphore(context_handle[0], AMDGPU_HW_IP_DMA, 0, 0, sem); 8043f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8053f012e29Smrg 8063f012e29Smrg r = amdgpu_cs_wait_semaphore(context_handle[0], AMDGPU_HW_IP_GFX, 0, 0, sem); 8073f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8083f012e29Smrg ptr = ib_result_cpu[1]; 809d8807b2fSmrg ptr[0] = gfx_nop; 8103f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address[1]; 8113f012e29Smrg ib_info[1].size = 1; 8123f012e29Smrg 8133f012e29Smrg ibs_request[1].ip_type = AMDGPU_HW_IP_GFX; 8143f012e29Smrg ibs_request[1].number_of_ibs = 1; 8153f012e29Smrg ibs_request[1].ibs = &ib_info[1]; 8163f012e29Smrg ibs_request[1].resources = bo_list[1]; 8173f012e29Smrg ibs_request[1].fence_info.handle = NULL; 8183f012e29Smrg 8193f012e29Smrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[1], 1); 8203f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8213f012e29Smrg 8223f012e29Smrg fence_status.context = context_handle[0]; 8233f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 8243f012e29Smrg fence_status.ip_instance = 0; 8253f012e29Smrg fence_status.fence = ibs_request[1].seq_no; 8263f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 8273f012e29Smrg 500000000, 0, &expired); 8283f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8293f012e29Smrg CU_ASSERT_EQUAL(expired, true); 8303f012e29Smrg 8313f012e29Smrg /* 2. same engine different context */ 8323f012e29Smrg ptr = ib_result_cpu[0]; 833d8807b2fSmrg ptr[0] = gfx_nop; 8343f012e29Smrg ib_info[0].ib_mc_address = ib_result_mc_address[0]; 8353f012e29Smrg ib_info[0].size = 1; 8363f012e29Smrg 8373f012e29Smrg ibs_request[0].ip_type = AMDGPU_HW_IP_GFX; 8383f012e29Smrg ibs_request[0].number_of_ibs = 1; 8393f012e29Smrg ibs_request[0].ibs = &ib_info[0]; 8403f012e29Smrg ibs_request[0].resources = bo_list[0]; 8413f012e29Smrg ibs_request[0].fence_info.handle = NULL; 8423f012e29Smrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1); 8433f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8443f012e29Smrg r = amdgpu_cs_signal_semaphore(context_handle[0], AMDGPU_HW_IP_GFX, 0, 0, sem); 8453f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8463f012e29Smrg 8473f012e29Smrg r = amdgpu_cs_wait_semaphore(context_handle[1], AMDGPU_HW_IP_GFX, 0, 0, sem); 8483f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8493f012e29Smrg ptr = ib_result_cpu[1]; 850d8807b2fSmrg ptr[0] = gfx_nop; 8513f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address[1]; 8523f012e29Smrg ib_info[1].size = 1; 8533f012e29Smrg 8543f012e29Smrg ibs_request[1].ip_type = AMDGPU_HW_IP_GFX; 8553f012e29Smrg ibs_request[1].number_of_ibs = 1; 8563f012e29Smrg ibs_request[1].ibs = &ib_info[1]; 8573f012e29Smrg ibs_request[1].resources = bo_list[1]; 8583f012e29Smrg ibs_request[1].fence_info.handle = NULL; 8593f012e29Smrg r = amdgpu_cs_submit(context_handle[1], 0,&ibs_request[1], 1); 8603f012e29Smrg 8613f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8623f012e29Smrg 8633f012e29Smrg fence_status.context = context_handle[1]; 8643f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 8653f012e29Smrg fence_status.ip_instance = 0; 8663f012e29Smrg fence_status.fence = ibs_request[1].seq_no; 8673f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 8683f012e29Smrg 500000000, 0, &expired); 8693f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8703f012e29Smrg CU_ASSERT_EQUAL(expired, true); 871d8807b2fSmrg 8723f012e29Smrg for (i = 0; i < 2; i++) { 8733f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle[i], va_handle[i], 8743f012e29Smrg ib_result_mc_address[i], 4096); 8753f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8763f012e29Smrg 8773f012e29Smrg r = amdgpu_bo_list_destroy(bo_list[i]); 8783f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8793f012e29Smrg 8803f012e29Smrg r = amdgpu_cs_ctx_free(context_handle[i]); 8813f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8823f012e29Smrg } 8833f012e29Smrg 8843f012e29Smrg r = amdgpu_cs_destroy_semaphore(sem); 8853f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8863f012e29Smrg} 8873f012e29Smrg 8883f012e29Smrgstatic void amdgpu_command_submission_compute_nop(void) 8893f012e29Smrg{ 8903f012e29Smrg amdgpu_context_handle context_handle; 8913f012e29Smrg amdgpu_bo_handle ib_result_handle; 8923f012e29Smrg void *ib_result_cpu; 8933f012e29Smrg uint64_t ib_result_mc_address; 8943f012e29Smrg struct amdgpu_cs_request ibs_request; 8953f012e29Smrg struct amdgpu_cs_ib_info ib_info; 8963f012e29Smrg struct amdgpu_cs_fence fence_status; 8973f012e29Smrg uint32_t *ptr; 8983f012e29Smrg uint32_t expired; 89900a23bdaSmrg int r, instance; 9003f012e29Smrg amdgpu_bo_list_handle bo_list; 9013f012e29Smrg amdgpu_va_handle va_handle; 902d8807b2fSmrg struct drm_amdgpu_info_hw_ip info; 903d8807b2fSmrg 904d8807b2fSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_COMPUTE, 0, &info); 905d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 9063f012e29Smrg 9073f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 9083f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9093f012e29Smrg 910d8807b2fSmrg for (instance = 0; (1 << instance) & info.available_rings; instance++) { 9113f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 9123f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 9133f012e29Smrg &ib_result_handle, &ib_result_cpu, 9143f012e29Smrg &ib_result_mc_address, &va_handle); 9153f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9163f012e29Smrg 9173f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 9183f012e29Smrg &bo_list); 9193f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9203f012e29Smrg 9213f012e29Smrg ptr = ib_result_cpu; 922d8807b2fSmrg memset(ptr, 0, 16); 923d8807b2fSmrg ptr[0]=PACKET3(PACKET3_NOP, 14); 9243f012e29Smrg 9253f012e29Smrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 9263f012e29Smrg ib_info.ib_mc_address = ib_result_mc_address; 9273f012e29Smrg ib_info.size = 16; 9283f012e29Smrg 9293f012e29Smrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 9303f012e29Smrg ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE; 9313f012e29Smrg ibs_request.ring = instance; 9323f012e29Smrg ibs_request.number_of_ibs = 1; 9333f012e29Smrg ibs_request.ibs = &ib_info; 9343f012e29Smrg ibs_request.resources = bo_list; 9353f012e29Smrg ibs_request.fence_info.handle = NULL; 9363f012e29Smrg 9373f012e29Smrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 9383f012e29Smrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 9393f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9403f012e29Smrg 9413f012e29Smrg fence_status.context = context_handle; 9423f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_COMPUTE; 9433f012e29Smrg fence_status.ip_instance = 0; 9443f012e29Smrg fence_status.ring = instance; 9453f012e29Smrg fence_status.fence = ibs_request.seq_no; 9463f012e29Smrg 9473f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 9483f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 9493f012e29Smrg 0, &expired); 9503f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9513f012e29Smrg 9523f012e29Smrg r = amdgpu_bo_list_destroy(bo_list); 9533f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9543f012e29Smrg 9553f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 9563f012e29Smrg ib_result_mc_address, 4096); 9573f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9583f012e29Smrg } 9593f012e29Smrg 9603f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 9613f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9623f012e29Smrg} 9633f012e29Smrg 9643f012e29Smrgstatic void amdgpu_command_submission_compute_cp_write_data(void) 9653f012e29Smrg{ 9663f012e29Smrg amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_COMPUTE); 9673f012e29Smrg} 9683f012e29Smrg 9693f012e29Smrgstatic void amdgpu_command_submission_compute_cp_const_fill(void) 9703f012e29Smrg{ 9713f012e29Smrg amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_COMPUTE); 9723f012e29Smrg} 9733f012e29Smrg 9743f012e29Smrgstatic void amdgpu_command_submission_compute_cp_copy_data(void) 9753f012e29Smrg{ 9763f012e29Smrg amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_COMPUTE); 9773f012e29Smrg} 9783f012e29Smrg 9793f012e29Smrgstatic void amdgpu_command_submission_compute(void) 9803f012e29Smrg{ 9813f012e29Smrg /* write data using the CP */ 9823f012e29Smrg amdgpu_command_submission_compute_cp_write_data(); 9833f012e29Smrg /* const fill using the CP */ 9843f012e29Smrg amdgpu_command_submission_compute_cp_const_fill(); 9853f012e29Smrg /* copy data using the CP */ 9863f012e29Smrg amdgpu_command_submission_compute_cp_copy_data(); 9873f012e29Smrg /* nop test */ 9883f012e29Smrg amdgpu_command_submission_compute_nop(); 9893f012e29Smrg} 9903f012e29Smrg 9913f012e29Smrg/* 9923f012e29Smrg * caller need create/release: 9933f012e29Smrg * pm4_src, resources, ib_info, and ibs_request 9943f012e29Smrg * submit command stream described in ibs_request and wait for this IB accomplished 9953f012e29Smrg */ 9963f012e29Smrgstatic void amdgpu_test_exec_cs_helper(amdgpu_context_handle context_handle, 9973f012e29Smrg unsigned ip_type, 9983f012e29Smrg int instance, int pm4_dw, uint32_t *pm4_src, 9993f012e29Smrg int res_cnt, amdgpu_bo_handle *resources, 10003f012e29Smrg struct amdgpu_cs_ib_info *ib_info, 10013f012e29Smrg struct amdgpu_cs_request *ibs_request) 10023f012e29Smrg{ 10033f012e29Smrg int r; 10043f012e29Smrg uint32_t expired; 10053f012e29Smrg uint32_t *ring_ptr; 10063f012e29Smrg amdgpu_bo_handle ib_result_handle; 10073f012e29Smrg void *ib_result_cpu; 10083f012e29Smrg uint64_t ib_result_mc_address; 10093f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 10103f012e29Smrg amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1)); 10113f012e29Smrg amdgpu_va_handle va_handle; 10123f012e29Smrg 10133f012e29Smrg /* prepare CS */ 10143f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4_src, NULL); 10153f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 10163f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 10173f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 10183f012e29Smrg CU_ASSERT_TRUE(pm4_dw <= 1024); 10193f012e29Smrg 10203f012e29Smrg /* allocate IB */ 10213f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 10223f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 10233f012e29Smrg &ib_result_handle, &ib_result_cpu, 10243f012e29Smrg &ib_result_mc_address, &va_handle); 10253f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10263f012e29Smrg 10273f012e29Smrg /* copy PM4 packet to ring from caller */ 10283f012e29Smrg ring_ptr = ib_result_cpu; 10293f012e29Smrg memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src)); 10303f012e29Smrg 10313f012e29Smrg ib_info->ib_mc_address = ib_result_mc_address; 10323f012e29Smrg ib_info->size = pm4_dw; 10333f012e29Smrg 10343f012e29Smrg ibs_request->ip_type = ip_type; 10353f012e29Smrg ibs_request->ring = instance; 10363f012e29Smrg ibs_request->number_of_ibs = 1; 10373f012e29Smrg ibs_request->ibs = ib_info; 10383f012e29Smrg ibs_request->fence_info.handle = NULL; 10393f012e29Smrg 10403f012e29Smrg memcpy(all_res, resources, sizeof(resources[0]) * res_cnt); 10413f012e29Smrg all_res[res_cnt] = ib_result_handle; 10423f012e29Smrg 10433f012e29Smrg r = amdgpu_bo_list_create(device_handle, res_cnt+1, all_res, 10443f012e29Smrg NULL, &ibs_request->resources); 10453f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10463f012e29Smrg 10473f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 10483f012e29Smrg 10493f012e29Smrg /* submit CS */ 10503f012e29Smrg r = amdgpu_cs_submit(context_handle, 0, ibs_request, 1); 10513f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10523f012e29Smrg 10533f012e29Smrg r = amdgpu_bo_list_destroy(ibs_request->resources); 10543f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10553f012e29Smrg 10563f012e29Smrg fence_status.ip_type = ip_type; 10573f012e29Smrg fence_status.ip_instance = 0; 10583f012e29Smrg fence_status.ring = ibs_request->ring; 10593f012e29Smrg fence_status.context = context_handle; 10603f012e29Smrg fence_status.fence = ibs_request->seq_no; 10613f012e29Smrg 10623f012e29Smrg /* wait for IB accomplished */ 10633f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 10643f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 10653f012e29Smrg 0, &expired); 10663f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10673f012e29Smrg CU_ASSERT_EQUAL(expired, true); 10683f012e29Smrg 10693f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 10703f012e29Smrg ib_result_mc_address, 4096); 10713f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10723f012e29Smrg} 10733f012e29Smrg 10743f012e29Smrgstatic void amdgpu_command_submission_write_linear_helper(unsigned ip_type) 10753f012e29Smrg{ 10763f012e29Smrg const int sdma_write_length = 128; 10773f012e29Smrg const int pm4_dw = 256; 10783f012e29Smrg amdgpu_context_handle context_handle; 10793f012e29Smrg amdgpu_bo_handle bo; 10803f012e29Smrg amdgpu_bo_handle *resources; 10813f012e29Smrg uint32_t *pm4; 10823f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 10833f012e29Smrg struct amdgpu_cs_request *ibs_request; 10843f012e29Smrg uint64_t bo_mc; 10853f012e29Smrg volatile uint32_t *bo_cpu; 108600a23bdaSmrg int i, j, r, loop, ring_id; 10873f012e29Smrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 10883f012e29Smrg amdgpu_va_handle va_handle; 108900a23bdaSmrg struct drm_amdgpu_info_hw_ip hw_ip_info; 10903f012e29Smrg 10913f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 10923f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 10933f012e29Smrg 10943f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 10953f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 10963f012e29Smrg 10973f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 10983f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 10993f012e29Smrg 110000a23bdaSmrg r = amdgpu_query_hw_ip_info(device_handle, ip_type, 0, &hw_ip_info); 110100a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 110200a23bdaSmrg 11033f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 11043f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11053f012e29Smrg 11063f012e29Smrg /* prepare resource */ 11073f012e29Smrg resources = calloc(1, sizeof(amdgpu_bo_handle)); 11083f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 11093f012e29Smrg 111000a23bdaSmrg for (ring_id = 0; (1 << ring_id) & hw_ip_info.available_rings; ring_id++) { 111100a23bdaSmrg loop = 0; 111200a23bdaSmrg while(loop < 2) { 111300a23bdaSmrg /* allocate UC bo for sDMA use */ 111400a23bdaSmrg r = amdgpu_bo_alloc_and_map(device_handle, 111500a23bdaSmrg sdma_write_length * sizeof(uint32_t), 111600a23bdaSmrg 4096, AMDGPU_GEM_DOMAIN_GTT, 111700a23bdaSmrg gtt_flags[loop], &bo, (void**)&bo_cpu, 111800a23bdaSmrg &bo_mc, &va_handle); 111900a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 11203f012e29Smrg 112100a23bdaSmrg /* clear bo */ 112200a23bdaSmrg memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t)); 11233f012e29Smrg 112400a23bdaSmrg resources[0] = bo; 11253f012e29Smrg 112600a23bdaSmrg /* fulfill PM4: test DMA write-linear */ 112700a23bdaSmrg i = j = 0; 112800a23bdaSmrg if (ip_type == AMDGPU_HW_IP_DMA) { 112900a23bdaSmrg if (family_id == AMDGPU_FAMILY_SI) 113000a23bdaSmrg pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_WRITE, 0, 0, 0, 113100a23bdaSmrg sdma_write_length); 113200a23bdaSmrg else 113300a23bdaSmrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 113400a23bdaSmrg SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 113500a23bdaSmrg pm4[i++] = 0xffffffff & bo_mc; 113600a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 113700a23bdaSmrg if (family_id >= AMDGPU_FAMILY_AI) 113800a23bdaSmrg pm4[i++] = sdma_write_length - 1; 113900a23bdaSmrg else if (family_id != AMDGPU_FAMILY_SI) 114000a23bdaSmrg pm4[i++] = sdma_write_length; 114100a23bdaSmrg while(j++ < sdma_write_length) 114200a23bdaSmrg pm4[i++] = 0xdeadbeaf; 114300a23bdaSmrg } else if ((ip_type == AMDGPU_HW_IP_GFX) || 114400a23bdaSmrg (ip_type == AMDGPU_HW_IP_COMPUTE)) { 114500a23bdaSmrg pm4[i++] = PACKET3(PACKET3_WRITE_DATA, 2 + sdma_write_length); 114600a23bdaSmrg pm4[i++] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM; 114700a23bdaSmrg pm4[i++] = 0xfffffffc & bo_mc; 114800a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 114900a23bdaSmrg while(j++ < sdma_write_length) 115000a23bdaSmrg pm4[i++] = 0xdeadbeaf; 115100a23bdaSmrg } 11523f012e29Smrg 115300a23bdaSmrg amdgpu_test_exec_cs_helper(context_handle, 115400a23bdaSmrg ip_type, ring_id, 115500a23bdaSmrg i, pm4, 115600a23bdaSmrg 1, resources, 115700a23bdaSmrg ib_info, ibs_request); 11583f012e29Smrg 115900a23bdaSmrg /* verify if SDMA test result meets with expected */ 116000a23bdaSmrg i = 0; 116100a23bdaSmrg while(i < sdma_write_length) { 116200a23bdaSmrg CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 116300a23bdaSmrg } 11643f012e29Smrg 116500a23bdaSmrg r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc, 116600a23bdaSmrg sdma_write_length * sizeof(uint32_t)); 116700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 116800a23bdaSmrg loop++; 11693f012e29Smrg } 11703f012e29Smrg } 11713f012e29Smrg /* clean resources */ 11723f012e29Smrg free(resources); 11733f012e29Smrg free(ibs_request); 11743f012e29Smrg free(ib_info); 11753f012e29Smrg free(pm4); 11763f012e29Smrg 11773f012e29Smrg /* end of test */ 11783f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 11793f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11803f012e29Smrg} 11813f012e29Smrg 11823f012e29Smrgstatic void amdgpu_command_submission_sdma_write_linear(void) 11833f012e29Smrg{ 11843f012e29Smrg amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_DMA); 11853f012e29Smrg} 11863f012e29Smrg 11873f012e29Smrgstatic void amdgpu_command_submission_const_fill_helper(unsigned ip_type) 11883f012e29Smrg{ 11893f012e29Smrg const int sdma_write_length = 1024 * 1024; 11903f012e29Smrg const int pm4_dw = 256; 11913f012e29Smrg amdgpu_context_handle context_handle; 11923f012e29Smrg amdgpu_bo_handle bo; 11933f012e29Smrg amdgpu_bo_handle *resources; 11943f012e29Smrg uint32_t *pm4; 11953f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 11963f012e29Smrg struct amdgpu_cs_request *ibs_request; 11973f012e29Smrg uint64_t bo_mc; 11983f012e29Smrg volatile uint32_t *bo_cpu; 119900a23bdaSmrg int i, j, r, loop, ring_id; 12003f012e29Smrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 12013f012e29Smrg amdgpu_va_handle va_handle; 120200a23bdaSmrg struct drm_amdgpu_info_hw_ip hw_ip_info; 12033f012e29Smrg 12043f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 12053f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 12063f012e29Smrg 12073f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 12083f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 12093f012e29Smrg 12103f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 12113f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 12123f012e29Smrg 121300a23bdaSmrg r = amdgpu_query_hw_ip_info(device_handle, ip_type, 0, &hw_ip_info); 121400a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 121500a23bdaSmrg 12163f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 12173f012e29Smrg CU_ASSERT_EQUAL(r, 0); 12183f012e29Smrg 12193f012e29Smrg /* prepare resource */ 12203f012e29Smrg resources = calloc(1, sizeof(amdgpu_bo_handle)); 12213f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 12223f012e29Smrg 122300a23bdaSmrg for (ring_id = 0; (1 << ring_id) & hw_ip_info.available_rings; ring_id++) { 122400a23bdaSmrg loop = 0; 122500a23bdaSmrg while(loop < 2) { 122600a23bdaSmrg /* allocate UC bo for sDMA use */ 122700a23bdaSmrg r = amdgpu_bo_alloc_and_map(device_handle, 122800a23bdaSmrg sdma_write_length, 4096, 122900a23bdaSmrg AMDGPU_GEM_DOMAIN_GTT, 123000a23bdaSmrg gtt_flags[loop], &bo, (void**)&bo_cpu, 123100a23bdaSmrg &bo_mc, &va_handle); 123200a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 12333f012e29Smrg 123400a23bdaSmrg /* clear bo */ 123500a23bdaSmrg memset((void*)bo_cpu, 0, sdma_write_length); 12363f012e29Smrg 123700a23bdaSmrg resources[0] = bo; 12383f012e29Smrg 123900a23bdaSmrg /* fulfill PM4: test DMA const fill */ 124000a23bdaSmrg i = j = 0; 124100a23bdaSmrg if (ip_type == AMDGPU_HW_IP_DMA) { 124200a23bdaSmrg if (family_id == AMDGPU_FAMILY_SI) { 124300a23bdaSmrg pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_CONSTANT_FILL_SI, 124400a23bdaSmrg 0, 0, 0, 124500a23bdaSmrg sdma_write_length / 4); 124600a23bdaSmrg pm4[i++] = 0xfffffffc & bo_mc; 124700a23bdaSmrg pm4[i++] = 0xdeadbeaf; 124800a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 16; 124900a23bdaSmrg } else { 125000a23bdaSmrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0, 125100a23bdaSmrg SDMA_CONSTANT_FILL_EXTRA_SIZE(2)); 125200a23bdaSmrg pm4[i++] = 0xffffffff & bo_mc; 125300a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 125400a23bdaSmrg pm4[i++] = 0xdeadbeaf; 125500a23bdaSmrg if (family_id >= AMDGPU_FAMILY_AI) 125600a23bdaSmrg pm4[i++] = sdma_write_length - 1; 125700a23bdaSmrg else 125800a23bdaSmrg pm4[i++] = sdma_write_length; 125900a23bdaSmrg } 126000a23bdaSmrg } else if ((ip_type == AMDGPU_HW_IP_GFX) || 126100a23bdaSmrg (ip_type == AMDGPU_HW_IP_COMPUTE)) { 126200a23bdaSmrg if (family_id == AMDGPU_FAMILY_SI) { 126300a23bdaSmrg pm4[i++] = PACKET3(PACKET3_DMA_DATA_SI, 4); 126400a23bdaSmrg pm4[i++] = 0xdeadbeaf; 126500a23bdaSmrg pm4[i++] = PACKET3_DMA_DATA_SI_ENGINE(0) | 126600a23bdaSmrg PACKET3_DMA_DATA_SI_DST_SEL(0) | 126700a23bdaSmrg PACKET3_DMA_DATA_SI_SRC_SEL(2) | 126800a23bdaSmrg PACKET3_DMA_DATA_SI_CP_SYNC; 126900a23bdaSmrg pm4[i++] = 0xffffffff & bo_mc; 127000a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 1271d8807b2fSmrg pm4[i++] = sdma_write_length; 127200a23bdaSmrg } else { 127300a23bdaSmrg pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5); 127400a23bdaSmrg pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) | 127500a23bdaSmrg PACKET3_DMA_DATA_DST_SEL(0) | 127600a23bdaSmrg PACKET3_DMA_DATA_SRC_SEL(2) | 127700a23bdaSmrg PACKET3_DMA_DATA_CP_SYNC; 127800a23bdaSmrg pm4[i++] = 0xdeadbeaf; 127900a23bdaSmrg pm4[i++] = 0; 128000a23bdaSmrg pm4[i++] = 0xfffffffc & bo_mc; 128100a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 128200a23bdaSmrg pm4[i++] = sdma_write_length; 128300a23bdaSmrg } 1284d8807b2fSmrg } 12853f012e29Smrg 128600a23bdaSmrg amdgpu_test_exec_cs_helper(context_handle, 128700a23bdaSmrg ip_type, ring_id, 128800a23bdaSmrg i, pm4, 128900a23bdaSmrg 1, resources, 129000a23bdaSmrg ib_info, ibs_request); 12913f012e29Smrg 129200a23bdaSmrg /* verify if SDMA test result meets with expected */ 129300a23bdaSmrg i = 0; 129400a23bdaSmrg while(i < (sdma_write_length / 4)) { 129500a23bdaSmrg CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 129600a23bdaSmrg } 12973f012e29Smrg 129800a23bdaSmrg r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc, 129900a23bdaSmrg sdma_write_length); 130000a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 130100a23bdaSmrg loop++; 130200a23bdaSmrg } 13033f012e29Smrg } 13043f012e29Smrg /* clean resources */ 13053f012e29Smrg free(resources); 13063f012e29Smrg free(ibs_request); 13073f012e29Smrg free(ib_info); 13083f012e29Smrg free(pm4); 13093f012e29Smrg 13103f012e29Smrg /* end of test */ 13113f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 13123f012e29Smrg CU_ASSERT_EQUAL(r, 0); 13133f012e29Smrg} 13143f012e29Smrg 13153f012e29Smrgstatic void amdgpu_command_submission_sdma_const_fill(void) 13163f012e29Smrg{ 13173f012e29Smrg amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_DMA); 13183f012e29Smrg} 13193f012e29Smrg 13203f012e29Smrgstatic void amdgpu_command_submission_copy_linear_helper(unsigned ip_type) 13213f012e29Smrg{ 13223f012e29Smrg const int sdma_write_length = 1024; 13233f012e29Smrg const int pm4_dw = 256; 13243f012e29Smrg amdgpu_context_handle context_handle; 13253f012e29Smrg amdgpu_bo_handle bo1, bo2; 13263f012e29Smrg amdgpu_bo_handle *resources; 13273f012e29Smrg uint32_t *pm4; 13283f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 13293f012e29Smrg struct amdgpu_cs_request *ibs_request; 13303f012e29Smrg uint64_t bo1_mc, bo2_mc; 13313f012e29Smrg volatile unsigned char *bo1_cpu, *bo2_cpu; 133200a23bdaSmrg int i, j, r, loop1, loop2, ring_id; 13333f012e29Smrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 13343f012e29Smrg amdgpu_va_handle bo1_va_handle, bo2_va_handle; 133500a23bdaSmrg struct drm_amdgpu_info_hw_ip hw_ip_info; 13363f012e29Smrg 13373f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 13383f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 13393f012e29Smrg 13403f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 13413f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 13423f012e29Smrg 13433f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 13443f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 13453f012e29Smrg 134600a23bdaSmrg r = amdgpu_query_hw_ip_info(device_handle, ip_type, 0, &hw_ip_info); 134700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 134800a23bdaSmrg 13493f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 13503f012e29Smrg CU_ASSERT_EQUAL(r, 0); 13513f012e29Smrg 13523f012e29Smrg /* prepare resource */ 13533f012e29Smrg resources = calloc(2, sizeof(amdgpu_bo_handle)); 13543f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 13553f012e29Smrg 135600a23bdaSmrg for (ring_id = 0; (1 << ring_id) & hw_ip_info.available_rings; ring_id++) { 135700a23bdaSmrg loop1 = loop2 = 0; 135800a23bdaSmrg /* run 9 circle to test all mapping combination */ 135900a23bdaSmrg while(loop1 < 2) { 136000a23bdaSmrg while(loop2 < 2) { 136100a23bdaSmrg /* allocate UC bo1for sDMA use */ 136200a23bdaSmrg r = amdgpu_bo_alloc_and_map(device_handle, 136300a23bdaSmrg sdma_write_length, 4096, 136400a23bdaSmrg AMDGPU_GEM_DOMAIN_GTT, 136500a23bdaSmrg gtt_flags[loop1], &bo1, 136600a23bdaSmrg (void**)&bo1_cpu, &bo1_mc, 136700a23bdaSmrg &bo1_va_handle); 136800a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 136900a23bdaSmrg 137000a23bdaSmrg /* set bo1 */ 137100a23bdaSmrg memset((void*)bo1_cpu, 0xaa, sdma_write_length); 137200a23bdaSmrg 137300a23bdaSmrg /* allocate UC bo2 for sDMA use */ 137400a23bdaSmrg r = amdgpu_bo_alloc_and_map(device_handle, 137500a23bdaSmrg sdma_write_length, 4096, 137600a23bdaSmrg AMDGPU_GEM_DOMAIN_GTT, 137700a23bdaSmrg gtt_flags[loop2], &bo2, 137800a23bdaSmrg (void**)&bo2_cpu, &bo2_mc, 137900a23bdaSmrg &bo2_va_handle); 138000a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 138100a23bdaSmrg 138200a23bdaSmrg /* clear bo2 */ 138300a23bdaSmrg memset((void*)bo2_cpu, 0, sdma_write_length); 138400a23bdaSmrg 138500a23bdaSmrg resources[0] = bo1; 138600a23bdaSmrg resources[1] = bo2; 138700a23bdaSmrg 138800a23bdaSmrg /* fulfill PM4: test DMA copy linear */ 138900a23bdaSmrg i = j = 0; 139000a23bdaSmrg if (ip_type == AMDGPU_HW_IP_DMA) { 139100a23bdaSmrg if (family_id == AMDGPU_FAMILY_SI) { 139200a23bdaSmrg pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_COPY_SI, 139300a23bdaSmrg 0, 0, 0, 139400a23bdaSmrg sdma_write_length); 139500a23bdaSmrg pm4[i++] = 0xffffffff & bo2_mc; 139600a23bdaSmrg pm4[i++] = 0xffffffff & bo1_mc; 139700a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 139800a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 139900a23bdaSmrg } else { 140000a23bdaSmrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, 140100a23bdaSmrg SDMA_COPY_SUB_OPCODE_LINEAR, 140200a23bdaSmrg 0); 140300a23bdaSmrg if (family_id >= AMDGPU_FAMILY_AI) 140400a23bdaSmrg pm4[i++] = sdma_write_length - 1; 140500a23bdaSmrg else 140600a23bdaSmrg pm4[i++] = sdma_write_length; 140700a23bdaSmrg pm4[i++] = 0; 140800a23bdaSmrg pm4[i++] = 0xffffffff & bo1_mc; 140900a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 141000a23bdaSmrg pm4[i++] = 0xffffffff & bo2_mc; 141100a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 141200a23bdaSmrg } 141300a23bdaSmrg } else if ((ip_type == AMDGPU_HW_IP_GFX) || 141400a23bdaSmrg (ip_type == AMDGPU_HW_IP_COMPUTE)) { 141500a23bdaSmrg if (family_id == AMDGPU_FAMILY_SI) { 141600a23bdaSmrg pm4[i++] = PACKET3(PACKET3_DMA_DATA_SI, 4); 141700a23bdaSmrg pm4[i++] = 0xfffffffc & bo1_mc; 141800a23bdaSmrg pm4[i++] = PACKET3_DMA_DATA_SI_ENGINE(0) | 141900a23bdaSmrg PACKET3_DMA_DATA_SI_DST_SEL(0) | 142000a23bdaSmrg PACKET3_DMA_DATA_SI_SRC_SEL(0) | 142100a23bdaSmrg PACKET3_DMA_DATA_SI_CP_SYNC | 142200a23bdaSmrg (0xffff00000000 & bo1_mc) >> 32; 142300a23bdaSmrg pm4[i++] = 0xfffffffc & bo2_mc; 142400a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 1425d8807b2fSmrg pm4[i++] = sdma_write_length; 142600a23bdaSmrg } else { 142700a23bdaSmrg pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5); 142800a23bdaSmrg pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) | 142900a23bdaSmrg PACKET3_DMA_DATA_DST_SEL(0) | 143000a23bdaSmrg PACKET3_DMA_DATA_SRC_SEL(0) | 143100a23bdaSmrg PACKET3_DMA_DATA_CP_SYNC; 143200a23bdaSmrg pm4[i++] = 0xfffffffc & bo1_mc; 143300a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 143400a23bdaSmrg pm4[i++] = 0xfffffffc & bo2_mc; 143500a23bdaSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 143600a23bdaSmrg pm4[i++] = sdma_write_length; 143700a23bdaSmrg } 1438d8807b2fSmrg } 14393f012e29Smrg 144000a23bdaSmrg amdgpu_test_exec_cs_helper(context_handle, 144100a23bdaSmrg ip_type, ring_id, 144200a23bdaSmrg i, pm4, 144300a23bdaSmrg 2, resources, 144400a23bdaSmrg ib_info, ibs_request); 14453f012e29Smrg 144600a23bdaSmrg /* verify if SDMA test result meets with expected */ 144700a23bdaSmrg i = 0; 144800a23bdaSmrg while(i < sdma_write_length) { 144900a23bdaSmrg CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa); 145000a23bdaSmrg } 145100a23bdaSmrg r = amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc, 145200a23bdaSmrg sdma_write_length); 145300a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 145400a23bdaSmrg r = amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc, 145500a23bdaSmrg sdma_write_length); 145600a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 145700a23bdaSmrg loop2++; 14583f012e29Smrg } 145900a23bdaSmrg loop1++; 14603f012e29Smrg } 14613f012e29Smrg } 14623f012e29Smrg /* clean resources */ 14633f012e29Smrg free(resources); 14643f012e29Smrg free(ibs_request); 14653f012e29Smrg free(ib_info); 14663f012e29Smrg free(pm4); 14673f012e29Smrg 14683f012e29Smrg /* end of test */ 14693f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 14703f012e29Smrg CU_ASSERT_EQUAL(r, 0); 14713f012e29Smrg} 14723f012e29Smrg 14733f012e29Smrgstatic void amdgpu_command_submission_sdma_copy_linear(void) 14743f012e29Smrg{ 14753f012e29Smrg amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_DMA); 14763f012e29Smrg} 14773f012e29Smrg 14783f012e29Smrgstatic void amdgpu_command_submission_sdma(void) 14793f012e29Smrg{ 14803f012e29Smrg amdgpu_command_submission_sdma_write_linear(); 14813f012e29Smrg amdgpu_command_submission_sdma_const_fill(); 14823f012e29Smrg amdgpu_command_submission_sdma_copy_linear(); 14833f012e29Smrg} 14843f012e29Smrg 1485d8807b2fSmrgstatic void amdgpu_command_submission_multi_fence_wait_all(bool wait_all) 1486d8807b2fSmrg{ 1487d8807b2fSmrg amdgpu_context_handle context_handle; 1488d8807b2fSmrg amdgpu_bo_handle ib_result_handle, ib_result_ce_handle; 1489d8807b2fSmrg void *ib_result_cpu, *ib_result_ce_cpu; 1490d8807b2fSmrg uint64_t ib_result_mc_address, ib_result_ce_mc_address; 1491d8807b2fSmrg struct amdgpu_cs_request ibs_request[2] = {0}; 1492d8807b2fSmrg struct amdgpu_cs_ib_info ib_info[2]; 1493d8807b2fSmrg struct amdgpu_cs_fence fence_status[2] = {0}; 1494d8807b2fSmrg uint32_t *ptr; 1495d8807b2fSmrg uint32_t expired; 1496d8807b2fSmrg amdgpu_bo_list_handle bo_list; 1497d8807b2fSmrg amdgpu_va_handle va_handle, va_handle_ce; 1498d8807b2fSmrg int r; 1499d8807b2fSmrg int i = 0, ib_cs_num = 2; 1500d8807b2fSmrg 1501d8807b2fSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 1502d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1503d8807b2fSmrg 1504d8807b2fSmrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 1505d8807b2fSmrg AMDGPU_GEM_DOMAIN_GTT, 0, 1506d8807b2fSmrg &ib_result_handle, &ib_result_cpu, 1507d8807b2fSmrg &ib_result_mc_address, &va_handle); 1508d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1509d8807b2fSmrg 1510d8807b2fSmrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 1511d8807b2fSmrg AMDGPU_GEM_DOMAIN_GTT, 0, 1512d8807b2fSmrg &ib_result_ce_handle, &ib_result_ce_cpu, 1513d8807b2fSmrg &ib_result_ce_mc_address, &va_handle_ce); 1514d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1515d8807b2fSmrg 1516d8807b2fSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, 1517d8807b2fSmrg ib_result_ce_handle, &bo_list); 1518d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1519d8807b2fSmrg 1520d8807b2fSmrg memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 1521d8807b2fSmrg 1522d8807b2fSmrg /* IT_SET_CE_DE_COUNTERS */ 1523d8807b2fSmrg ptr = ib_result_ce_cpu; 1524d8807b2fSmrg if (family_id != AMDGPU_FAMILY_SI) { 1525d8807b2fSmrg ptr[i++] = 0xc0008900; 1526d8807b2fSmrg ptr[i++] = 0; 1527d8807b2fSmrg } 1528d8807b2fSmrg ptr[i++] = 0xc0008400; 1529d8807b2fSmrg ptr[i++] = 1; 1530d8807b2fSmrg ib_info[0].ib_mc_address = ib_result_ce_mc_address; 1531d8807b2fSmrg ib_info[0].size = i; 1532d8807b2fSmrg ib_info[0].flags = AMDGPU_IB_FLAG_CE; 1533d8807b2fSmrg 1534d8807b2fSmrg /* IT_WAIT_ON_CE_COUNTER */ 1535d8807b2fSmrg ptr = ib_result_cpu; 1536d8807b2fSmrg ptr[0] = 0xc0008600; 1537d8807b2fSmrg ptr[1] = 0x00000001; 1538d8807b2fSmrg ib_info[1].ib_mc_address = ib_result_mc_address; 1539d8807b2fSmrg ib_info[1].size = 2; 1540d8807b2fSmrg 1541d8807b2fSmrg for (i = 0; i < ib_cs_num; i++) { 1542d8807b2fSmrg ibs_request[i].ip_type = AMDGPU_HW_IP_GFX; 1543d8807b2fSmrg ibs_request[i].number_of_ibs = 2; 1544d8807b2fSmrg ibs_request[i].ibs = ib_info; 1545d8807b2fSmrg ibs_request[i].resources = bo_list; 1546d8807b2fSmrg ibs_request[i].fence_info.handle = NULL; 1547d8807b2fSmrg } 1548d8807b2fSmrg 1549d8807b2fSmrg r = amdgpu_cs_submit(context_handle, 0,ibs_request, ib_cs_num); 1550d8807b2fSmrg 1551d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1552d8807b2fSmrg 1553d8807b2fSmrg for (i = 0; i < ib_cs_num; i++) { 1554d8807b2fSmrg fence_status[i].context = context_handle; 1555d8807b2fSmrg fence_status[i].ip_type = AMDGPU_HW_IP_GFX; 1556d8807b2fSmrg fence_status[i].fence = ibs_request[i].seq_no; 1557d8807b2fSmrg } 1558d8807b2fSmrg 1559d8807b2fSmrg r = amdgpu_cs_wait_fences(fence_status, ib_cs_num, wait_all, 1560d8807b2fSmrg AMDGPU_TIMEOUT_INFINITE, 1561d8807b2fSmrg &expired, NULL); 1562d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1563d8807b2fSmrg 1564d8807b2fSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 1565d8807b2fSmrg ib_result_mc_address, 4096); 1566d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1567d8807b2fSmrg 1568d8807b2fSmrg r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce, 1569d8807b2fSmrg ib_result_ce_mc_address, 4096); 1570d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1571d8807b2fSmrg 1572d8807b2fSmrg r = amdgpu_bo_list_destroy(bo_list); 1573d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1574d8807b2fSmrg 1575d8807b2fSmrg r = amdgpu_cs_ctx_free(context_handle); 1576d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1577d8807b2fSmrg} 1578d8807b2fSmrg 1579d8807b2fSmrgstatic void amdgpu_command_submission_multi_fence(void) 1580d8807b2fSmrg{ 1581d8807b2fSmrg amdgpu_command_submission_multi_fence_wait_all(true); 1582d8807b2fSmrg amdgpu_command_submission_multi_fence_wait_all(false); 1583d8807b2fSmrg} 1584d8807b2fSmrg 15853f012e29Smrgstatic void amdgpu_userptr_test(void) 15863f012e29Smrg{ 15873f012e29Smrg int i, r, j; 15883f012e29Smrg uint32_t *pm4 = NULL; 15893f012e29Smrg uint64_t bo_mc; 15903f012e29Smrg void *ptr = NULL; 15913f012e29Smrg int pm4_dw = 256; 15923f012e29Smrg int sdma_write_length = 4; 15933f012e29Smrg amdgpu_bo_handle handle; 15943f012e29Smrg amdgpu_context_handle context_handle; 15953f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 15963f012e29Smrg struct amdgpu_cs_request *ibs_request; 15973f012e29Smrg amdgpu_bo_handle buf_handle; 15983f012e29Smrg amdgpu_va_handle va_handle; 15993f012e29Smrg 16003f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 16013f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 16023f012e29Smrg 16033f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 16043f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 16053f012e29Smrg 16063f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 16073f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 16083f012e29Smrg 16093f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 16103f012e29Smrg CU_ASSERT_EQUAL(r, 0); 16113f012e29Smrg 16123f012e29Smrg posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE); 16133f012e29Smrg CU_ASSERT_NOT_EQUAL(ptr, NULL); 16143f012e29Smrg memset(ptr, 0, BUFFER_SIZE); 16153f012e29Smrg 16163f012e29Smrg r = amdgpu_create_bo_from_user_mem(device_handle, 16173f012e29Smrg ptr, BUFFER_SIZE, &buf_handle); 16183f012e29Smrg CU_ASSERT_EQUAL(r, 0); 16193f012e29Smrg 16203f012e29Smrg r = amdgpu_va_range_alloc(device_handle, 16213f012e29Smrg amdgpu_gpu_va_range_general, 16223f012e29Smrg BUFFER_SIZE, 1, 0, &bo_mc, 16233f012e29Smrg &va_handle, 0); 16243f012e29Smrg CU_ASSERT_EQUAL(r, 0); 16253f012e29Smrg 16263f012e29Smrg r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_MAP); 16273f012e29Smrg CU_ASSERT_EQUAL(r, 0); 16283f012e29Smrg 16293f012e29Smrg handle = buf_handle; 16303f012e29Smrg 16313f012e29Smrg j = i = 0; 1632d8807b2fSmrg 1633d8807b2fSmrg if (family_id == AMDGPU_FAMILY_SI) 1634d8807b2fSmrg pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_WRITE, 0, 0, 0, 1635d8807b2fSmrg sdma_write_length); 1636d8807b2fSmrg else 1637d8807b2fSmrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 1638d8807b2fSmrg SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 16393f012e29Smrg pm4[i++] = 0xffffffff & bo_mc; 16403f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 1641d8807b2fSmrg if (family_id >= AMDGPU_FAMILY_AI) 1642d8807b2fSmrg pm4[i++] = sdma_write_length - 1; 1643d8807b2fSmrg else if (family_id != AMDGPU_FAMILY_SI) 1644d8807b2fSmrg pm4[i++] = sdma_write_length; 16453f012e29Smrg 16463f012e29Smrg while (j++ < sdma_write_length) 16473f012e29Smrg pm4[i++] = 0xdeadbeaf; 16483f012e29Smrg 164900a23bdaSmrg if (!fork()) { 165000a23bdaSmrg pm4[0] = 0x0; 165100a23bdaSmrg exit(0); 165200a23bdaSmrg } 165300a23bdaSmrg 16543f012e29Smrg amdgpu_test_exec_cs_helper(context_handle, 16553f012e29Smrg AMDGPU_HW_IP_DMA, 0, 16563f012e29Smrg i, pm4, 16573f012e29Smrg 1, &handle, 16583f012e29Smrg ib_info, ibs_request); 16593f012e29Smrg i = 0; 16603f012e29Smrg while (i < sdma_write_length) { 16613f012e29Smrg CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf); 16623f012e29Smrg } 16633f012e29Smrg free(ibs_request); 16643f012e29Smrg free(ib_info); 16653f012e29Smrg free(pm4); 16663f012e29Smrg 16673f012e29Smrg r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_UNMAP); 16683f012e29Smrg CU_ASSERT_EQUAL(r, 0); 16693f012e29Smrg r = amdgpu_va_range_free(va_handle); 16703f012e29Smrg CU_ASSERT_EQUAL(r, 0); 16713f012e29Smrg r = amdgpu_bo_free(buf_handle); 16723f012e29Smrg CU_ASSERT_EQUAL(r, 0); 16733f012e29Smrg free(ptr); 16743f012e29Smrg 16753f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 16763f012e29Smrg CU_ASSERT_EQUAL(r, 0); 167700a23bdaSmrg 167800a23bdaSmrg wait(NULL); 167900a23bdaSmrg} 168000a23bdaSmrg 168100a23bdaSmrgstatic void amdgpu_sync_dependency_test(void) 168200a23bdaSmrg{ 168300a23bdaSmrg amdgpu_context_handle context_handle[2]; 168400a23bdaSmrg amdgpu_bo_handle ib_result_handle; 168500a23bdaSmrg void *ib_result_cpu; 168600a23bdaSmrg uint64_t ib_result_mc_address; 168700a23bdaSmrg struct amdgpu_cs_request ibs_request; 168800a23bdaSmrg struct amdgpu_cs_ib_info ib_info; 168900a23bdaSmrg struct amdgpu_cs_fence fence_status; 169000a23bdaSmrg uint32_t expired; 169100a23bdaSmrg int i, j, r; 169200a23bdaSmrg amdgpu_bo_list_handle bo_list; 169300a23bdaSmrg amdgpu_va_handle va_handle; 169400a23bdaSmrg static uint32_t *ptr; 169500a23bdaSmrg uint64_t seq_no; 169600a23bdaSmrg 169700a23bdaSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle[0]); 169800a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 169900a23bdaSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle[1]); 170000a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 170100a23bdaSmrg 170200a23bdaSmrg r = amdgpu_bo_alloc_and_map(device_handle, 8192, 4096, 170300a23bdaSmrg AMDGPU_GEM_DOMAIN_GTT, 0, 170400a23bdaSmrg &ib_result_handle, &ib_result_cpu, 170500a23bdaSmrg &ib_result_mc_address, &va_handle); 170600a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 170700a23bdaSmrg 170800a23bdaSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 170900a23bdaSmrg &bo_list); 171000a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 171100a23bdaSmrg 171200a23bdaSmrg ptr = ib_result_cpu; 171300a23bdaSmrg i = 0; 171400a23bdaSmrg 171500a23bdaSmrg memcpy(ptr + CODE_OFFSET , shader_bin, sizeof(shader_bin)); 171600a23bdaSmrg 171700a23bdaSmrg /* Dispatch minimal init config and verify it's executed */ 171800a23bdaSmrg ptr[i++] = PACKET3(PKT3_CONTEXT_CONTROL, 1); 171900a23bdaSmrg ptr[i++] = 0x80000000; 172000a23bdaSmrg ptr[i++] = 0x80000000; 172100a23bdaSmrg 172200a23bdaSmrg ptr[i++] = PACKET3(PKT3_CLEAR_STATE, 0); 172300a23bdaSmrg ptr[i++] = 0x80000000; 172400a23bdaSmrg 172500a23bdaSmrg 172600a23bdaSmrg /* Program compute regs */ 172700a23bdaSmrg ptr[i++] = PACKET3(PKT3_SET_SH_REG, 2); 172800a23bdaSmrg ptr[i++] = mmCOMPUTE_PGM_LO - PACKET3_SET_SH_REG_START; 172900a23bdaSmrg ptr[i++] = (ib_result_mc_address + CODE_OFFSET * 4) >> 8; 173000a23bdaSmrg ptr[i++] = (ib_result_mc_address + CODE_OFFSET * 4) >> 40; 173100a23bdaSmrg 173200a23bdaSmrg 173300a23bdaSmrg ptr[i++] = PACKET3(PKT3_SET_SH_REG, 2); 173400a23bdaSmrg ptr[i++] = mmCOMPUTE_PGM_RSRC1 - PACKET3_SET_SH_REG_START; 173500a23bdaSmrg /* 173600a23bdaSmrg * 002c0040 COMPUTE_PGM_RSRC1 <- VGPRS = 0 173700a23bdaSmrg SGPRS = 1 173800a23bdaSmrg PRIORITY = 0 173900a23bdaSmrg FLOAT_MODE = 192 (0xc0) 174000a23bdaSmrg PRIV = 0 174100a23bdaSmrg DX10_CLAMP = 1 174200a23bdaSmrg DEBUG_MODE = 0 174300a23bdaSmrg IEEE_MODE = 0 174400a23bdaSmrg BULKY = 0 174500a23bdaSmrg CDBG_USER = 0 174600a23bdaSmrg * 174700a23bdaSmrg */ 174800a23bdaSmrg ptr[i++] = 0x002c0040; 174900a23bdaSmrg 175000a23bdaSmrg 175100a23bdaSmrg /* 175200a23bdaSmrg * 00000010 COMPUTE_PGM_RSRC2 <- SCRATCH_EN = 0 175300a23bdaSmrg USER_SGPR = 8 175400a23bdaSmrg TRAP_PRESENT = 0 175500a23bdaSmrg TGID_X_EN = 0 175600a23bdaSmrg TGID_Y_EN = 0 175700a23bdaSmrg TGID_Z_EN = 0 175800a23bdaSmrg TG_SIZE_EN = 0 175900a23bdaSmrg TIDIG_COMP_CNT = 0 176000a23bdaSmrg EXCP_EN_MSB = 0 176100a23bdaSmrg LDS_SIZE = 0 176200a23bdaSmrg EXCP_EN = 0 176300a23bdaSmrg * 176400a23bdaSmrg */ 176500a23bdaSmrg ptr[i++] = 0x00000010; 176600a23bdaSmrg 176700a23bdaSmrg 176800a23bdaSmrg/* 176900a23bdaSmrg * 00000100 COMPUTE_TMPRING_SIZE <- WAVES = 256 (0x100) 177000a23bdaSmrg WAVESIZE = 0 177100a23bdaSmrg * 177200a23bdaSmrg */ 177300a23bdaSmrg ptr[i++] = PACKET3(PKT3_SET_SH_REG, 1); 177400a23bdaSmrg ptr[i++] = mmCOMPUTE_TMPRING_SIZE - PACKET3_SET_SH_REG_START; 177500a23bdaSmrg ptr[i++] = 0x00000100; 177600a23bdaSmrg 177700a23bdaSmrg ptr[i++] = PACKET3(PKT3_SET_SH_REG, 2); 177800a23bdaSmrg ptr[i++] = mmCOMPUTE_USER_DATA_0 - PACKET3_SET_SH_REG_START; 177900a23bdaSmrg ptr[i++] = 0xffffffff & (ib_result_mc_address + DATA_OFFSET * 4); 178000a23bdaSmrg ptr[i++] = (0xffffffff00000000 & (ib_result_mc_address + DATA_OFFSET * 4)) >> 32; 178100a23bdaSmrg 178200a23bdaSmrg ptr[i++] = PACKET3(PKT3_SET_SH_REG, 1); 178300a23bdaSmrg ptr[i++] = mmCOMPUTE_RESOURCE_LIMITS - PACKET3_SET_SH_REG_START; 178400a23bdaSmrg ptr[i++] = 0; 178500a23bdaSmrg 178600a23bdaSmrg ptr[i++] = PACKET3(PKT3_SET_SH_REG, 3); 178700a23bdaSmrg ptr[i++] = mmCOMPUTE_NUM_THREAD_X - PACKET3_SET_SH_REG_START; 178800a23bdaSmrg ptr[i++] = 1; 178900a23bdaSmrg ptr[i++] = 1; 179000a23bdaSmrg ptr[i++] = 1; 179100a23bdaSmrg 179200a23bdaSmrg 179300a23bdaSmrg /* Dispatch */ 179400a23bdaSmrg ptr[i++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3); 179500a23bdaSmrg ptr[i++] = 1; 179600a23bdaSmrg ptr[i++] = 1; 179700a23bdaSmrg ptr[i++] = 1; 179800a23bdaSmrg ptr[i++] = 0x00000045; /* DISPATCH DIRECT field */ 179900a23bdaSmrg 180000a23bdaSmrg 180100a23bdaSmrg while (i & 7) 180200a23bdaSmrg ptr[i++] = 0xffff1000; /* type3 nop packet */ 180300a23bdaSmrg 180400a23bdaSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 180500a23bdaSmrg ib_info.ib_mc_address = ib_result_mc_address; 180600a23bdaSmrg ib_info.size = i; 180700a23bdaSmrg 180800a23bdaSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 180900a23bdaSmrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 181000a23bdaSmrg ibs_request.ring = 0; 181100a23bdaSmrg ibs_request.number_of_ibs = 1; 181200a23bdaSmrg ibs_request.ibs = &ib_info; 181300a23bdaSmrg ibs_request.resources = bo_list; 181400a23bdaSmrg ibs_request.fence_info.handle = NULL; 181500a23bdaSmrg 181600a23bdaSmrg r = amdgpu_cs_submit(context_handle[1], 0,&ibs_request, 1); 181700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 181800a23bdaSmrg seq_no = ibs_request.seq_no; 181900a23bdaSmrg 182000a23bdaSmrg 182100a23bdaSmrg 182200a23bdaSmrg /* Prepare second command with dependency on the first */ 182300a23bdaSmrg j = i; 182400a23bdaSmrg ptr[i++] = PACKET3(PACKET3_WRITE_DATA, 3); 182500a23bdaSmrg ptr[i++] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM; 182600a23bdaSmrg ptr[i++] = 0xfffffffc & (ib_result_mc_address + DATA_OFFSET * 4); 182700a23bdaSmrg ptr[i++] = (0xffffffff00000000 & (ib_result_mc_address + DATA_OFFSET * 4)) >> 32; 182800a23bdaSmrg ptr[i++] = 99; 182900a23bdaSmrg 183000a23bdaSmrg while (i & 7) 183100a23bdaSmrg ptr[i++] = 0xffff1000; /* type3 nop packet */ 183200a23bdaSmrg 183300a23bdaSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 183400a23bdaSmrg ib_info.ib_mc_address = ib_result_mc_address + j * 4; 183500a23bdaSmrg ib_info.size = i - j; 183600a23bdaSmrg 183700a23bdaSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 183800a23bdaSmrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 183900a23bdaSmrg ibs_request.ring = 0; 184000a23bdaSmrg ibs_request.number_of_ibs = 1; 184100a23bdaSmrg ibs_request.ibs = &ib_info; 184200a23bdaSmrg ibs_request.resources = bo_list; 184300a23bdaSmrg ibs_request.fence_info.handle = NULL; 184400a23bdaSmrg 184500a23bdaSmrg ibs_request.number_of_dependencies = 1; 184600a23bdaSmrg 184700a23bdaSmrg ibs_request.dependencies = calloc(1, sizeof(*ibs_request.dependencies)); 184800a23bdaSmrg ibs_request.dependencies[0].context = context_handle[1]; 184900a23bdaSmrg ibs_request.dependencies[0].ip_instance = 0; 185000a23bdaSmrg ibs_request.dependencies[0].ring = 0; 185100a23bdaSmrg ibs_request.dependencies[0].fence = seq_no; 185200a23bdaSmrg 185300a23bdaSmrg 185400a23bdaSmrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request, 1); 185500a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 185600a23bdaSmrg 185700a23bdaSmrg 185800a23bdaSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 185900a23bdaSmrg fence_status.context = context_handle[0]; 186000a23bdaSmrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 186100a23bdaSmrg fence_status.ip_instance = 0; 186200a23bdaSmrg fence_status.ring = 0; 186300a23bdaSmrg fence_status.fence = ibs_request.seq_no; 186400a23bdaSmrg 186500a23bdaSmrg r = amdgpu_cs_query_fence_status(&fence_status, 186600a23bdaSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 186700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 186800a23bdaSmrg 186900a23bdaSmrg /* Expect the second command to wait for shader to complete */ 187000a23bdaSmrg CU_ASSERT_EQUAL(ptr[DATA_OFFSET], 99); 187100a23bdaSmrg 187200a23bdaSmrg r = amdgpu_bo_list_destroy(bo_list); 187300a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 187400a23bdaSmrg 187500a23bdaSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 187600a23bdaSmrg ib_result_mc_address, 4096); 187700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 187800a23bdaSmrg 187900a23bdaSmrg r = amdgpu_cs_ctx_free(context_handle[0]); 188000a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 188100a23bdaSmrg r = amdgpu_cs_ctx_free(context_handle[1]); 188200a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 188300a23bdaSmrg 188400a23bdaSmrg free(ibs_request.dependencies); 18853f012e29Smrg} 1886