basic_tests.c revision d8807b2f
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; 43d8807b2fSmrgstatic uint32_t family_id; 443f012e29Smrg 453f012e29Smrgstatic void amdgpu_query_info_test(void); 463f012e29Smrgstatic void amdgpu_memory_alloc(void); 473f012e29Smrgstatic void amdgpu_command_submission_gfx(void); 483f012e29Smrgstatic void amdgpu_command_submission_compute(void); 49d8807b2fSmrgstatic void amdgpu_command_submission_multi_fence(void); 503f012e29Smrgstatic void amdgpu_command_submission_sdma(void); 513f012e29Smrgstatic void amdgpu_userptr_test(void); 523f012e29Smrgstatic void amdgpu_semaphore_test(void); 533f012e29Smrg 543f012e29Smrgstatic void amdgpu_command_submission_write_linear_helper(unsigned ip_type); 553f012e29Smrgstatic void amdgpu_command_submission_const_fill_helper(unsigned ip_type); 563f012e29Smrgstatic void amdgpu_command_submission_copy_linear_helper(unsigned ip_type); 573f012e29Smrg 583f012e29SmrgCU_TestInfo basic_tests[] = { 593f012e29Smrg { "Query Info Test", amdgpu_query_info_test }, 603f012e29Smrg { "Memory alloc Test", amdgpu_memory_alloc }, 613f012e29Smrg { "Userptr Test", amdgpu_userptr_test }, 623f012e29Smrg { "Command submission Test (GFX)", amdgpu_command_submission_gfx }, 633f012e29Smrg { "Command submission Test (Compute)", amdgpu_command_submission_compute }, 64d8807b2fSmrg { "Command submission Test (Multi-Fence)", amdgpu_command_submission_multi_fence }, 653f012e29Smrg { "Command submission Test (SDMA)", amdgpu_command_submission_sdma }, 663f012e29Smrg { "SW semaphore Test", amdgpu_semaphore_test }, 673f012e29Smrg CU_TEST_INFO_NULL, 683f012e29Smrg}; 693f012e29Smrg#define BUFFER_SIZE (8 * 1024) 703f012e29Smrg#define SDMA_PKT_HEADER_op_offset 0 713f012e29Smrg#define SDMA_PKT_HEADER_op_mask 0x000000FF 723f012e29Smrg#define SDMA_PKT_HEADER_op_shift 0 733f012e29Smrg#define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift) 743f012e29Smrg#define SDMA_OPCODE_CONSTANT_FILL 11 753f012e29Smrg# define SDMA_CONSTANT_FILL_EXTRA_SIZE(x) ((x) << 14) 763f012e29Smrg /* 0 = byte fill 773f012e29Smrg * 2 = DW fill 783f012e29Smrg */ 793f012e29Smrg#define SDMA_PACKET(op, sub_op, e) ((((e) & 0xFFFF) << 16) | \ 803f012e29Smrg (((sub_op) & 0xFF) << 8) | \ 813f012e29Smrg (((op) & 0xFF) << 0)) 823f012e29Smrg#define SDMA_OPCODE_WRITE 2 833f012e29Smrg# define SDMA_WRITE_SUB_OPCODE_LINEAR 0 843f012e29Smrg# define SDMA_WRTIE_SUB_OPCODE_TILED 1 853f012e29Smrg 863f012e29Smrg#define SDMA_OPCODE_COPY 1 873f012e29Smrg# define SDMA_COPY_SUB_OPCODE_LINEAR 0 883f012e29Smrg 893f012e29Smrg#define GFX_COMPUTE_NOP 0xffff1000 903f012e29Smrg#define SDMA_NOP 0x0 913f012e29Smrg 923f012e29Smrg/* PM4 */ 933f012e29Smrg#define PACKET_TYPE0 0 943f012e29Smrg#define PACKET_TYPE1 1 953f012e29Smrg#define PACKET_TYPE2 2 963f012e29Smrg#define PACKET_TYPE3 3 973f012e29Smrg 983f012e29Smrg#define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 993f012e29Smrg#define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 1003f012e29Smrg#define CP_PACKET0_GET_REG(h) ((h) & 0xFFFF) 1013f012e29Smrg#define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 1023f012e29Smrg#define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \ 1033f012e29Smrg ((reg) & 0xFFFF) | \ 1043f012e29Smrg ((n) & 0x3FFF) << 16) 1053f012e29Smrg#define CP_PACKET2 0x80000000 1063f012e29Smrg#define PACKET2_PAD_SHIFT 0 1073f012e29Smrg#define PACKET2_PAD_MASK (0x3fffffff << 0) 1083f012e29Smrg 1093f012e29Smrg#define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v))) 1103f012e29Smrg 1113f012e29Smrg#define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \ 1123f012e29Smrg (((op) & 0xFF) << 8) | \ 1133f012e29Smrg ((n) & 0x3FFF) << 16) 1143f012e29Smrg 1153f012e29Smrg/* Packet 3 types */ 1163f012e29Smrg#define PACKET3_NOP 0x10 1173f012e29Smrg 1183f012e29Smrg#define PACKET3_WRITE_DATA 0x37 1193f012e29Smrg#define WRITE_DATA_DST_SEL(x) ((x) << 8) 1203f012e29Smrg /* 0 - register 1213f012e29Smrg * 1 - memory (sync - via GRBM) 1223f012e29Smrg * 2 - gl2 1233f012e29Smrg * 3 - gds 1243f012e29Smrg * 4 - reserved 1253f012e29Smrg * 5 - memory (async - direct) 1263f012e29Smrg */ 1273f012e29Smrg#define WR_ONE_ADDR (1 << 16) 1283f012e29Smrg#define WR_CONFIRM (1 << 20) 1293f012e29Smrg#define WRITE_DATA_CACHE_POLICY(x) ((x) << 25) 1303f012e29Smrg /* 0 - LRU 1313f012e29Smrg * 1 - Stream 1323f012e29Smrg */ 1333f012e29Smrg#define WRITE_DATA_ENGINE_SEL(x) ((x) << 30) 1343f012e29Smrg /* 0 - me 1353f012e29Smrg * 1 - pfp 1363f012e29Smrg * 2 - ce 1373f012e29Smrg */ 1383f012e29Smrg 1393f012e29Smrg#define PACKET3_DMA_DATA 0x50 1403f012e29Smrg/* 1. header 1413f012e29Smrg * 2. CONTROL 1423f012e29Smrg * 3. SRC_ADDR_LO or DATA [31:0] 1433f012e29Smrg * 4. SRC_ADDR_HI [31:0] 1443f012e29Smrg * 5. DST_ADDR_LO [31:0] 1453f012e29Smrg * 6. DST_ADDR_HI [7:0] 1463f012e29Smrg * 7. COMMAND [30:21] | BYTE_COUNT [20:0] 1473f012e29Smrg */ 1483f012e29Smrg/* CONTROL */ 1493f012e29Smrg# define PACKET3_DMA_DATA_ENGINE(x) ((x) << 0) 1503f012e29Smrg /* 0 - ME 1513f012e29Smrg * 1 - PFP 1523f012e29Smrg */ 1533f012e29Smrg# define PACKET3_DMA_DATA_SRC_CACHE_POLICY(x) ((x) << 13) 1543f012e29Smrg /* 0 - LRU 1553f012e29Smrg * 1 - Stream 1563f012e29Smrg * 2 - Bypass 1573f012e29Smrg */ 1583f012e29Smrg# define PACKET3_DMA_DATA_SRC_VOLATILE (1 << 15) 1593f012e29Smrg# define PACKET3_DMA_DATA_DST_SEL(x) ((x) << 20) 1603f012e29Smrg /* 0 - DST_ADDR using DAS 1613f012e29Smrg * 1 - GDS 1623f012e29Smrg * 3 - DST_ADDR using L2 1633f012e29Smrg */ 1643f012e29Smrg# define PACKET3_DMA_DATA_DST_CACHE_POLICY(x) ((x) << 25) 1653f012e29Smrg /* 0 - LRU 1663f012e29Smrg * 1 - Stream 1673f012e29Smrg * 2 - Bypass 1683f012e29Smrg */ 1693f012e29Smrg# define PACKET3_DMA_DATA_DST_VOLATILE (1 << 27) 1703f012e29Smrg# define PACKET3_DMA_DATA_SRC_SEL(x) ((x) << 29) 1713f012e29Smrg /* 0 - SRC_ADDR using SAS 1723f012e29Smrg * 1 - GDS 1733f012e29Smrg * 2 - DATA 1743f012e29Smrg * 3 - SRC_ADDR using L2 1753f012e29Smrg */ 1763f012e29Smrg# define PACKET3_DMA_DATA_CP_SYNC (1 << 31) 1773f012e29Smrg/* COMMAND */ 1783f012e29Smrg# define PACKET3_DMA_DATA_DIS_WC (1 << 21) 1793f012e29Smrg# define PACKET3_DMA_DATA_CMD_SRC_SWAP(x) ((x) << 22) 1803f012e29Smrg /* 0 - none 1813f012e29Smrg * 1 - 8 in 16 1823f012e29Smrg * 2 - 8 in 32 1833f012e29Smrg * 3 - 8 in 64 1843f012e29Smrg */ 1853f012e29Smrg# define PACKET3_DMA_DATA_CMD_DST_SWAP(x) ((x) << 24) 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_SAS (1 << 26) 1923f012e29Smrg /* 0 - memory 1933f012e29Smrg * 1 - register 1943f012e29Smrg */ 1953f012e29Smrg# define PACKET3_DMA_DATA_CMD_DAS (1 << 27) 1963f012e29Smrg /* 0 - memory 1973f012e29Smrg * 1 - register 1983f012e29Smrg */ 1993f012e29Smrg# define PACKET3_DMA_DATA_CMD_SAIC (1 << 28) 2003f012e29Smrg# define PACKET3_DMA_DATA_CMD_DAIC (1 << 29) 2013f012e29Smrg# define PACKET3_DMA_DATA_CMD_RAW_WAIT (1 << 30) 2023f012e29Smrg 203d8807b2fSmrg#define SDMA_PACKET_SI(op, b, t, s, cnt) ((((op) & 0xF) << 28) | \ 204d8807b2fSmrg (((b) & 0x1) << 26) | \ 205d8807b2fSmrg (((t) & 0x1) << 23) | \ 206d8807b2fSmrg (((s) & 0x1) << 22) | \ 207d8807b2fSmrg (((cnt) & 0xFFFFF) << 0)) 208d8807b2fSmrg#define SDMA_OPCODE_COPY_SI 3 209d8807b2fSmrg#define SDMA_OPCODE_CONSTANT_FILL_SI 13 210d8807b2fSmrg#define SDMA_NOP_SI 0xf 211d8807b2fSmrg#define GFX_COMPUTE_NOP_SI 0x80000000 212d8807b2fSmrg#define PACKET3_DMA_DATA_SI 0x41 213d8807b2fSmrg# define PACKET3_DMA_DATA_SI_ENGINE(x) ((x) << 27) 214d8807b2fSmrg /* 0 - ME 215d8807b2fSmrg * 1 - PFP 216d8807b2fSmrg */ 217d8807b2fSmrg# define PACKET3_DMA_DATA_SI_DST_SEL(x) ((x) << 20) 218d8807b2fSmrg /* 0 - DST_ADDR using DAS 219d8807b2fSmrg * 1 - GDS 220d8807b2fSmrg * 3 - DST_ADDR using L2 221d8807b2fSmrg */ 222d8807b2fSmrg# define PACKET3_DMA_DATA_SI_SRC_SEL(x) ((x) << 29) 223d8807b2fSmrg /* 0 - SRC_ADDR using SAS 224d8807b2fSmrg * 1 - GDS 225d8807b2fSmrg * 2 - DATA 226d8807b2fSmrg * 3 - SRC_ADDR using L2 227d8807b2fSmrg */ 228d8807b2fSmrg# define PACKET3_DMA_DATA_SI_CP_SYNC (1 << 31) 229d8807b2fSmrg 2303f012e29Smrgint suite_basic_tests_init(void) 2313f012e29Smrg{ 232d8807b2fSmrg struct amdgpu_gpu_info gpu_info = {0}; 2333f012e29Smrg int r; 2343f012e29Smrg 2353f012e29Smrg r = amdgpu_device_initialize(drm_amdgpu[0], &major_version, 2363f012e29Smrg &minor_version, &device_handle); 2373f012e29Smrg 238d8807b2fSmrg if (r) { 239037b3c26Smrg if ((r == -EACCES) && (errno == EACCES)) 240037b3c26Smrg printf("\n\nError:%s. " 241037b3c26Smrg "Hint:Try to run this test program as root.", 242037b3c26Smrg strerror(errno)); 2433f012e29Smrg return CUE_SINIT_FAILED; 244037b3c26Smrg } 245d8807b2fSmrg 246d8807b2fSmrg r = amdgpu_query_gpu_info(device_handle, &gpu_info); 247d8807b2fSmrg if (r) 248d8807b2fSmrg return CUE_SINIT_FAILED; 249d8807b2fSmrg 250d8807b2fSmrg family_id = gpu_info.family_id; 251d8807b2fSmrg 252d8807b2fSmrg return CUE_SUCCESS; 2533f012e29Smrg} 2543f012e29Smrg 2553f012e29Smrgint suite_basic_tests_clean(void) 2563f012e29Smrg{ 2573f012e29Smrg int r = amdgpu_device_deinitialize(device_handle); 2583f012e29Smrg 2593f012e29Smrg if (r == 0) 2603f012e29Smrg return CUE_SUCCESS; 2613f012e29Smrg else 2623f012e29Smrg return CUE_SCLEAN_FAILED; 2633f012e29Smrg} 2643f012e29Smrg 2653f012e29Smrgstatic void amdgpu_query_info_test(void) 2663f012e29Smrg{ 2673f012e29Smrg struct amdgpu_gpu_info gpu_info = {0}; 2683f012e29Smrg uint32_t version, feature; 2693f012e29Smrg int r; 2703f012e29Smrg 2713f012e29Smrg r = amdgpu_query_gpu_info(device_handle, &gpu_info); 2723f012e29Smrg CU_ASSERT_EQUAL(r, 0); 2733f012e29Smrg 2743f012e29Smrg r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0, 2753f012e29Smrg 0, &version, &feature); 2763f012e29Smrg CU_ASSERT_EQUAL(r, 0); 2773f012e29Smrg} 2783f012e29Smrg 2793f012e29Smrgstatic void amdgpu_memory_alloc(void) 2803f012e29Smrg{ 2813f012e29Smrg amdgpu_bo_handle bo; 2823f012e29Smrg amdgpu_va_handle va_handle; 2833f012e29Smrg uint64_t bo_mc; 2843f012e29Smrg int r; 2853f012e29Smrg 2863f012e29Smrg /* Test visible VRAM */ 2873f012e29Smrg bo = gpu_mem_alloc(device_handle, 2883f012e29Smrg 4096, 4096, 2893f012e29Smrg AMDGPU_GEM_DOMAIN_VRAM, 2903f012e29Smrg AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 2913f012e29Smrg &bo_mc, &va_handle); 2923f012e29Smrg 2933f012e29Smrg r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 2943f012e29Smrg CU_ASSERT_EQUAL(r, 0); 2953f012e29Smrg 2963f012e29Smrg /* Test invisible VRAM */ 2973f012e29Smrg bo = gpu_mem_alloc(device_handle, 2983f012e29Smrg 4096, 4096, 2993f012e29Smrg AMDGPU_GEM_DOMAIN_VRAM, 3003f012e29Smrg AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 3013f012e29Smrg &bo_mc, &va_handle); 3023f012e29Smrg 3033f012e29Smrg r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 3043f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3053f012e29Smrg 3063f012e29Smrg /* Test GART Cacheable */ 3073f012e29Smrg bo = gpu_mem_alloc(device_handle, 3083f012e29Smrg 4096, 4096, 3093f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 3103f012e29Smrg 0, &bo_mc, &va_handle); 3113f012e29Smrg 3123f012e29Smrg r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 3133f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3143f012e29Smrg 3153f012e29Smrg /* Test GART USWC */ 3163f012e29Smrg bo = gpu_mem_alloc(device_handle, 3173f012e29Smrg 4096, 4096, 3183f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 3193f012e29Smrg AMDGPU_GEM_CREATE_CPU_GTT_USWC, 3203f012e29Smrg &bo_mc, &va_handle); 3213f012e29Smrg 3223f012e29Smrg r = gpu_mem_free(bo, va_handle, bo_mc, 4096); 3233f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3243f012e29Smrg} 3253f012e29Smrg 3263f012e29Smrgstatic void amdgpu_command_submission_gfx_separate_ibs(void) 3273f012e29Smrg{ 3283f012e29Smrg amdgpu_context_handle context_handle; 3293f012e29Smrg amdgpu_bo_handle ib_result_handle, ib_result_ce_handle; 3303f012e29Smrg void *ib_result_cpu, *ib_result_ce_cpu; 3313f012e29Smrg uint64_t ib_result_mc_address, ib_result_ce_mc_address; 3323f012e29Smrg struct amdgpu_cs_request ibs_request = {0}; 3333f012e29Smrg struct amdgpu_cs_ib_info ib_info[2]; 3343f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 3353f012e29Smrg uint32_t *ptr; 3363f012e29Smrg uint32_t expired; 3373f012e29Smrg amdgpu_bo_list_handle bo_list; 3383f012e29Smrg amdgpu_va_handle va_handle, va_handle_ce; 339d8807b2fSmrg int r, i = 0; 3403f012e29Smrg 3413f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3423f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3433f012e29Smrg 3443f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 3453f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 3463f012e29Smrg &ib_result_handle, &ib_result_cpu, 3473f012e29Smrg &ib_result_mc_address, &va_handle); 3483f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3493f012e29Smrg 3503f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 3513f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 3523f012e29Smrg &ib_result_ce_handle, &ib_result_ce_cpu, 3533f012e29Smrg &ib_result_ce_mc_address, &va_handle_ce); 3543f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3553f012e29Smrg 3563f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, 3573f012e29Smrg ib_result_ce_handle, &bo_list); 3583f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3593f012e29Smrg 3603f012e29Smrg memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 3613f012e29Smrg 3623f012e29Smrg /* IT_SET_CE_DE_COUNTERS */ 3633f012e29Smrg ptr = ib_result_ce_cpu; 364d8807b2fSmrg if (family_id != AMDGPU_FAMILY_SI) { 365d8807b2fSmrg ptr[i++] = 0xc0008900; 366d8807b2fSmrg ptr[i++] = 0; 367d8807b2fSmrg } 368d8807b2fSmrg ptr[i++] = 0xc0008400; 369d8807b2fSmrg ptr[i++] = 1; 3703f012e29Smrg ib_info[0].ib_mc_address = ib_result_ce_mc_address; 371d8807b2fSmrg ib_info[0].size = i; 3723f012e29Smrg ib_info[0].flags = AMDGPU_IB_FLAG_CE; 3733f012e29Smrg 3743f012e29Smrg /* IT_WAIT_ON_CE_COUNTER */ 3753f012e29Smrg ptr = ib_result_cpu; 3763f012e29Smrg ptr[0] = 0xc0008600; 3773f012e29Smrg ptr[1] = 0x00000001; 3783f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address; 3793f012e29Smrg ib_info[1].size = 2; 3803f012e29Smrg 3813f012e29Smrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 3823f012e29Smrg ibs_request.number_of_ibs = 2; 3833f012e29Smrg ibs_request.ibs = ib_info; 3843f012e29Smrg ibs_request.resources = bo_list; 3853f012e29Smrg ibs_request.fence_info.handle = NULL; 3863f012e29Smrg 3873f012e29Smrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 3883f012e29Smrg 3893f012e29Smrg CU_ASSERT_EQUAL(r, 0); 3903f012e29Smrg 3913f012e29Smrg fence_status.context = context_handle; 3923f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 3933f012e29Smrg fence_status.ip_instance = 0; 3943f012e29Smrg fence_status.fence = ibs_request.seq_no; 3953f012e29Smrg 3963f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 3973f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 3983f012e29Smrg 0, &expired); 3993f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4003f012e29Smrg 4013f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4023f012e29Smrg ib_result_mc_address, 4096); 4033f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4043f012e29Smrg 4053f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce, 4063f012e29Smrg ib_result_ce_mc_address, 4096); 4073f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4083f012e29Smrg 4093f012e29Smrg r = amdgpu_bo_list_destroy(bo_list); 4103f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4113f012e29Smrg 4123f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 4133f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4143f012e29Smrg 4153f012e29Smrg} 4163f012e29Smrg 4173f012e29Smrgstatic void amdgpu_command_submission_gfx_shared_ib(void) 4183f012e29Smrg{ 4193f012e29Smrg amdgpu_context_handle context_handle; 4203f012e29Smrg amdgpu_bo_handle ib_result_handle; 4213f012e29Smrg void *ib_result_cpu; 4223f012e29Smrg uint64_t ib_result_mc_address; 4233f012e29Smrg struct amdgpu_cs_request ibs_request = {0}; 4243f012e29Smrg struct amdgpu_cs_ib_info ib_info[2]; 4253f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 4263f012e29Smrg uint32_t *ptr; 4273f012e29Smrg uint32_t expired; 4283f012e29Smrg amdgpu_bo_list_handle bo_list; 4293f012e29Smrg amdgpu_va_handle va_handle; 430d8807b2fSmrg int r, i = 0; 4313f012e29Smrg 4323f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 4333f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4343f012e29Smrg 4353f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 4363f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 4373f012e29Smrg &ib_result_handle, &ib_result_cpu, 4383f012e29Smrg &ib_result_mc_address, &va_handle); 4393f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4403f012e29Smrg 4413f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 4423f012e29Smrg &bo_list); 4433f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4443f012e29Smrg 4453f012e29Smrg memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 4463f012e29Smrg 4473f012e29Smrg /* IT_SET_CE_DE_COUNTERS */ 4483f012e29Smrg ptr = ib_result_cpu; 449d8807b2fSmrg if (family_id != AMDGPU_FAMILY_SI) { 450d8807b2fSmrg ptr[i++] = 0xc0008900; 451d8807b2fSmrg ptr[i++] = 0; 452d8807b2fSmrg } 453d8807b2fSmrg ptr[i++] = 0xc0008400; 454d8807b2fSmrg ptr[i++] = 1; 4553f012e29Smrg ib_info[0].ib_mc_address = ib_result_mc_address; 456d8807b2fSmrg ib_info[0].size = i; 4573f012e29Smrg ib_info[0].flags = AMDGPU_IB_FLAG_CE; 4583f012e29Smrg 4593f012e29Smrg ptr = (uint32_t *)ib_result_cpu + 4; 4603f012e29Smrg ptr[0] = 0xc0008600; 4613f012e29Smrg ptr[1] = 0x00000001; 4623f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address + 16; 4633f012e29Smrg ib_info[1].size = 2; 4643f012e29Smrg 4653f012e29Smrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 4663f012e29Smrg ibs_request.number_of_ibs = 2; 4673f012e29Smrg ibs_request.ibs = ib_info; 4683f012e29Smrg ibs_request.resources = bo_list; 4693f012e29Smrg ibs_request.fence_info.handle = NULL; 4703f012e29Smrg 4713f012e29Smrg r = amdgpu_cs_submit(context_handle, 0, &ibs_request, 1); 4723f012e29Smrg 4733f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4743f012e29Smrg 4753f012e29Smrg fence_status.context = context_handle; 4763f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 4773f012e29Smrg fence_status.ip_instance = 0; 4783f012e29Smrg fence_status.fence = ibs_request.seq_no; 4793f012e29Smrg 4803f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 4813f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 4823f012e29Smrg 0, &expired); 4833f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4843f012e29Smrg 4853f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4863f012e29Smrg ib_result_mc_address, 4096); 4873f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4883f012e29Smrg 4893f012e29Smrg r = amdgpu_bo_list_destroy(bo_list); 4903f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4913f012e29Smrg 4923f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 4933f012e29Smrg CU_ASSERT_EQUAL(r, 0); 4943f012e29Smrg} 4953f012e29Smrg 4963f012e29Smrgstatic void amdgpu_command_submission_gfx_cp_write_data(void) 4973f012e29Smrg{ 4983f012e29Smrg amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_GFX); 4993f012e29Smrg} 5003f012e29Smrg 5013f012e29Smrgstatic void amdgpu_command_submission_gfx_cp_const_fill(void) 5023f012e29Smrg{ 5033f012e29Smrg amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_GFX); 5043f012e29Smrg} 5053f012e29Smrg 5063f012e29Smrgstatic void amdgpu_command_submission_gfx_cp_copy_data(void) 5073f012e29Smrg{ 5083f012e29Smrg amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_GFX); 5093f012e29Smrg} 5103f012e29Smrg 5113f012e29Smrgstatic void amdgpu_command_submission_gfx(void) 5123f012e29Smrg{ 5133f012e29Smrg /* write data using the CP */ 5143f012e29Smrg amdgpu_command_submission_gfx_cp_write_data(); 5153f012e29Smrg /* const fill using the CP */ 5163f012e29Smrg amdgpu_command_submission_gfx_cp_const_fill(); 5173f012e29Smrg /* copy data using the CP */ 5183f012e29Smrg amdgpu_command_submission_gfx_cp_copy_data(); 5193f012e29Smrg /* separate IB buffers for multi-IB submission */ 5203f012e29Smrg amdgpu_command_submission_gfx_separate_ibs(); 5213f012e29Smrg /* shared IB buffer for multi-IB submission */ 5223f012e29Smrg amdgpu_command_submission_gfx_shared_ib(); 5233f012e29Smrg} 5243f012e29Smrg 5253f012e29Smrgstatic void amdgpu_semaphore_test(void) 5263f012e29Smrg{ 5273f012e29Smrg amdgpu_context_handle context_handle[2]; 5283f012e29Smrg amdgpu_semaphore_handle sem; 5293f012e29Smrg amdgpu_bo_handle ib_result_handle[2]; 5303f012e29Smrg void *ib_result_cpu[2]; 5313f012e29Smrg uint64_t ib_result_mc_address[2]; 5323f012e29Smrg struct amdgpu_cs_request ibs_request[2] = {0}; 5333f012e29Smrg struct amdgpu_cs_ib_info ib_info[2] = {0}; 5343f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 5353f012e29Smrg uint32_t *ptr; 5363f012e29Smrg uint32_t expired; 537d8807b2fSmrg uint32_t sdma_nop, gfx_nop; 5383f012e29Smrg amdgpu_bo_list_handle bo_list[2]; 5393f012e29Smrg amdgpu_va_handle va_handle[2]; 5403f012e29Smrg int r, i; 5413f012e29Smrg 542d8807b2fSmrg if (family_id == AMDGPU_FAMILY_SI) { 543d8807b2fSmrg sdma_nop = SDMA_PACKET_SI(SDMA_NOP_SI, 0, 0, 0, 0); 544d8807b2fSmrg gfx_nop = GFX_COMPUTE_NOP_SI; 545d8807b2fSmrg } else { 546d8807b2fSmrg sdma_nop = SDMA_PKT_HEADER_OP(SDMA_NOP); 547d8807b2fSmrg gfx_nop = GFX_COMPUTE_NOP; 548d8807b2fSmrg } 549d8807b2fSmrg 5503f012e29Smrg r = amdgpu_cs_create_semaphore(&sem); 5513f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5523f012e29Smrg for (i = 0; i < 2; i++) { 5533f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle[i]); 5543f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5553f012e29Smrg 5563f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 5573f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 5583f012e29Smrg &ib_result_handle[i], &ib_result_cpu[i], 5593f012e29Smrg &ib_result_mc_address[i], &va_handle[i]); 5603f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5613f012e29Smrg 5623f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle[i], 5633f012e29Smrg NULL, &bo_list[i]); 5643f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5653f012e29Smrg } 5663f012e29Smrg 5673f012e29Smrg /* 1. same context different engine */ 5683f012e29Smrg ptr = ib_result_cpu[0]; 569d8807b2fSmrg ptr[0] = sdma_nop; 5703f012e29Smrg ib_info[0].ib_mc_address = ib_result_mc_address[0]; 5713f012e29Smrg ib_info[0].size = 1; 5723f012e29Smrg 5733f012e29Smrg ibs_request[0].ip_type = AMDGPU_HW_IP_DMA; 5743f012e29Smrg ibs_request[0].number_of_ibs = 1; 5753f012e29Smrg ibs_request[0].ibs = &ib_info[0]; 5763f012e29Smrg ibs_request[0].resources = bo_list[0]; 5773f012e29Smrg ibs_request[0].fence_info.handle = NULL; 5783f012e29Smrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1); 5793f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5803f012e29Smrg r = amdgpu_cs_signal_semaphore(context_handle[0], AMDGPU_HW_IP_DMA, 0, 0, sem); 5813f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5823f012e29Smrg 5833f012e29Smrg r = amdgpu_cs_wait_semaphore(context_handle[0], AMDGPU_HW_IP_GFX, 0, 0, sem); 5843f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5853f012e29Smrg ptr = ib_result_cpu[1]; 586d8807b2fSmrg ptr[0] = gfx_nop; 5873f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address[1]; 5883f012e29Smrg ib_info[1].size = 1; 5893f012e29Smrg 5903f012e29Smrg ibs_request[1].ip_type = AMDGPU_HW_IP_GFX; 5913f012e29Smrg ibs_request[1].number_of_ibs = 1; 5923f012e29Smrg ibs_request[1].ibs = &ib_info[1]; 5933f012e29Smrg ibs_request[1].resources = bo_list[1]; 5943f012e29Smrg ibs_request[1].fence_info.handle = NULL; 5953f012e29Smrg 5963f012e29Smrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[1], 1); 5973f012e29Smrg CU_ASSERT_EQUAL(r, 0); 5983f012e29Smrg 5993f012e29Smrg fence_status.context = context_handle[0]; 6003f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 6013f012e29Smrg fence_status.ip_instance = 0; 6023f012e29Smrg fence_status.fence = ibs_request[1].seq_no; 6033f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 6043f012e29Smrg 500000000, 0, &expired); 6053f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6063f012e29Smrg CU_ASSERT_EQUAL(expired, true); 6073f012e29Smrg 6083f012e29Smrg /* 2. same engine different context */ 6093f012e29Smrg ptr = ib_result_cpu[0]; 610d8807b2fSmrg ptr[0] = gfx_nop; 6113f012e29Smrg ib_info[0].ib_mc_address = ib_result_mc_address[0]; 6123f012e29Smrg ib_info[0].size = 1; 6133f012e29Smrg 6143f012e29Smrg ibs_request[0].ip_type = AMDGPU_HW_IP_GFX; 6153f012e29Smrg ibs_request[0].number_of_ibs = 1; 6163f012e29Smrg ibs_request[0].ibs = &ib_info[0]; 6173f012e29Smrg ibs_request[0].resources = bo_list[0]; 6183f012e29Smrg ibs_request[0].fence_info.handle = NULL; 6193f012e29Smrg r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1); 6203f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6213f012e29Smrg r = amdgpu_cs_signal_semaphore(context_handle[0], AMDGPU_HW_IP_GFX, 0, 0, sem); 6223f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6233f012e29Smrg 6243f012e29Smrg r = amdgpu_cs_wait_semaphore(context_handle[1], AMDGPU_HW_IP_GFX, 0, 0, sem); 6253f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6263f012e29Smrg ptr = ib_result_cpu[1]; 627d8807b2fSmrg ptr[0] = gfx_nop; 6283f012e29Smrg ib_info[1].ib_mc_address = ib_result_mc_address[1]; 6293f012e29Smrg ib_info[1].size = 1; 6303f012e29Smrg 6313f012e29Smrg ibs_request[1].ip_type = AMDGPU_HW_IP_GFX; 6323f012e29Smrg ibs_request[1].number_of_ibs = 1; 6333f012e29Smrg ibs_request[1].ibs = &ib_info[1]; 6343f012e29Smrg ibs_request[1].resources = bo_list[1]; 6353f012e29Smrg ibs_request[1].fence_info.handle = NULL; 6363f012e29Smrg r = amdgpu_cs_submit(context_handle[1], 0,&ibs_request[1], 1); 6373f012e29Smrg 6383f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6393f012e29Smrg 6403f012e29Smrg fence_status.context = context_handle[1]; 6413f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 6423f012e29Smrg fence_status.ip_instance = 0; 6433f012e29Smrg fence_status.fence = ibs_request[1].seq_no; 6443f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 6453f012e29Smrg 500000000, 0, &expired); 6463f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6473f012e29Smrg CU_ASSERT_EQUAL(expired, true); 648d8807b2fSmrg 6493f012e29Smrg for (i = 0; i < 2; i++) { 6503f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle[i], va_handle[i], 6513f012e29Smrg ib_result_mc_address[i], 4096); 6523f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6533f012e29Smrg 6543f012e29Smrg r = amdgpu_bo_list_destroy(bo_list[i]); 6553f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6563f012e29Smrg 6573f012e29Smrg r = amdgpu_cs_ctx_free(context_handle[i]); 6583f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6593f012e29Smrg } 6603f012e29Smrg 6613f012e29Smrg r = amdgpu_cs_destroy_semaphore(sem); 6623f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6633f012e29Smrg} 6643f012e29Smrg 6653f012e29Smrgstatic void amdgpu_command_submission_compute_nop(void) 6663f012e29Smrg{ 6673f012e29Smrg amdgpu_context_handle context_handle; 6683f012e29Smrg amdgpu_bo_handle ib_result_handle; 6693f012e29Smrg void *ib_result_cpu; 6703f012e29Smrg uint64_t ib_result_mc_address; 6713f012e29Smrg struct amdgpu_cs_request ibs_request; 6723f012e29Smrg struct amdgpu_cs_ib_info ib_info; 6733f012e29Smrg struct amdgpu_cs_fence fence_status; 6743f012e29Smrg uint32_t *ptr; 6753f012e29Smrg uint32_t expired; 6763f012e29Smrg int i, r, instance; 6773f012e29Smrg amdgpu_bo_list_handle bo_list; 6783f012e29Smrg amdgpu_va_handle va_handle; 679d8807b2fSmrg struct drm_amdgpu_info_hw_ip info; 680d8807b2fSmrg 681d8807b2fSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_COMPUTE, 0, &info); 682d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 6833f012e29Smrg 6843f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 6853f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6863f012e29Smrg 687d8807b2fSmrg for (instance = 0; (1 << instance) & info.available_rings; instance++) { 6883f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 6893f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 6903f012e29Smrg &ib_result_handle, &ib_result_cpu, 6913f012e29Smrg &ib_result_mc_address, &va_handle); 6923f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6933f012e29Smrg 6943f012e29Smrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 6953f012e29Smrg &bo_list); 6963f012e29Smrg CU_ASSERT_EQUAL(r, 0); 6973f012e29Smrg 6983f012e29Smrg ptr = ib_result_cpu; 699d8807b2fSmrg memset(ptr, 0, 16); 700d8807b2fSmrg ptr[0]=PACKET3(PACKET3_NOP, 14); 7013f012e29Smrg 7023f012e29Smrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 7033f012e29Smrg ib_info.ib_mc_address = ib_result_mc_address; 7043f012e29Smrg ib_info.size = 16; 7053f012e29Smrg 7063f012e29Smrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 7073f012e29Smrg ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE; 7083f012e29Smrg ibs_request.ring = instance; 7093f012e29Smrg ibs_request.number_of_ibs = 1; 7103f012e29Smrg ibs_request.ibs = &ib_info; 7113f012e29Smrg ibs_request.resources = bo_list; 7123f012e29Smrg ibs_request.fence_info.handle = NULL; 7133f012e29Smrg 7143f012e29Smrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 7153f012e29Smrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 7163f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7173f012e29Smrg 7183f012e29Smrg fence_status.context = context_handle; 7193f012e29Smrg fence_status.ip_type = AMDGPU_HW_IP_COMPUTE; 7203f012e29Smrg fence_status.ip_instance = 0; 7213f012e29Smrg fence_status.ring = instance; 7223f012e29Smrg fence_status.fence = ibs_request.seq_no; 7233f012e29Smrg 7243f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 7253f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 7263f012e29Smrg 0, &expired); 7273f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7283f012e29Smrg 7293f012e29Smrg r = amdgpu_bo_list_destroy(bo_list); 7303f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7313f012e29Smrg 7323f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 7333f012e29Smrg ib_result_mc_address, 4096); 7343f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7353f012e29Smrg } 7363f012e29Smrg 7373f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 7383f012e29Smrg CU_ASSERT_EQUAL(r, 0); 7393f012e29Smrg} 7403f012e29Smrg 7413f012e29Smrgstatic void amdgpu_command_submission_compute_cp_write_data(void) 7423f012e29Smrg{ 7433f012e29Smrg amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_COMPUTE); 7443f012e29Smrg} 7453f012e29Smrg 7463f012e29Smrgstatic void amdgpu_command_submission_compute_cp_const_fill(void) 7473f012e29Smrg{ 7483f012e29Smrg amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_COMPUTE); 7493f012e29Smrg} 7503f012e29Smrg 7513f012e29Smrgstatic void amdgpu_command_submission_compute_cp_copy_data(void) 7523f012e29Smrg{ 7533f012e29Smrg amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_COMPUTE); 7543f012e29Smrg} 7553f012e29Smrg 7563f012e29Smrgstatic void amdgpu_command_submission_compute(void) 7573f012e29Smrg{ 7583f012e29Smrg /* write data using the CP */ 7593f012e29Smrg amdgpu_command_submission_compute_cp_write_data(); 7603f012e29Smrg /* const fill using the CP */ 7613f012e29Smrg amdgpu_command_submission_compute_cp_const_fill(); 7623f012e29Smrg /* copy data using the CP */ 7633f012e29Smrg amdgpu_command_submission_compute_cp_copy_data(); 7643f012e29Smrg /* nop test */ 7653f012e29Smrg amdgpu_command_submission_compute_nop(); 7663f012e29Smrg} 7673f012e29Smrg 7683f012e29Smrg/* 7693f012e29Smrg * caller need create/release: 7703f012e29Smrg * pm4_src, resources, ib_info, and ibs_request 7713f012e29Smrg * submit command stream described in ibs_request and wait for this IB accomplished 7723f012e29Smrg */ 7733f012e29Smrgstatic void amdgpu_test_exec_cs_helper(amdgpu_context_handle context_handle, 7743f012e29Smrg unsigned ip_type, 7753f012e29Smrg int instance, int pm4_dw, uint32_t *pm4_src, 7763f012e29Smrg int res_cnt, amdgpu_bo_handle *resources, 7773f012e29Smrg struct amdgpu_cs_ib_info *ib_info, 7783f012e29Smrg struct amdgpu_cs_request *ibs_request) 7793f012e29Smrg{ 7803f012e29Smrg int r; 7813f012e29Smrg uint32_t expired; 7823f012e29Smrg uint32_t *ring_ptr; 7833f012e29Smrg amdgpu_bo_handle ib_result_handle; 7843f012e29Smrg void *ib_result_cpu; 7853f012e29Smrg uint64_t ib_result_mc_address; 7863f012e29Smrg struct amdgpu_cs_fence fence_status = {0}; 7873f012e29Smrg amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1)); 7883f012e29Smrg amdgpu_va_handle va_handle; 7893f012e29Smrg 7903f012e29Smrg /* prepare CS */ 7913f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4_src, NULL); 7923f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 7933f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 7943f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 7953f012e29Smrg CU_ASSERT_TRUE(pm4_dw <= 1024); 7963f012e29Smrg 7973f012e29Smrg /* allocate IB */ 7983f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 7993f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 0, 8003f012e29Smrg &ib_result_handle, &ib_result_cpu, 8013f012e29Smrg &ib_result_mc_address, &va_handle); 8023f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8033f012e29Smrg 8043f012e29Smrg /* copy PM4 packet to ring from caller */ 8053f012e29Smrg ring_ptr = ib_result_cpu; 8063f012e29Smrg memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src)); 8073f012e29Smrg 8083f012e29Smrg ib_info->ib_mc_address = ib_result_mc_address; 8093f012e29Smrg ib_info->size = pm4_dw; 8103f012e29Smrg 8113f012e29Smrg ibs_request->ip_type = ip_type; 8123f012e29Smrg ibs_request->ring = instance; 8133f012e29Smrg ibs_request->number_of_ibs = 1; 8143f012e29Smrg ibs_request->ibs = ib_info; 8153f012e29Smrg ibs_request->fence_info.handle = NULL; 8163f012e29Smrg 8173f012e29Smrg memcpy(all_res, resources, sizeof(resources[0]) * res_cnt); 8183f012e29Smrg all_res[res_cnt] = ib_result_handle; 8193f012e29Smrg 8203f012e29Smrg r = amdgpu_bo_list_create(device_handle, res_cnt+1, all_res, 8213f012e29Smrg NULL, &ibs_request->resources); 8223f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8233f012e29Smrg 8243f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 8253f012e29Smrg 8263f012e29Smrg /* submit CS */ 8273f012e29Smrg r = amdgpu_cs_submit(context_handle, 0, ibs_request, 1); 8283f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8293f012e29Smrg 8303f012e29Smrg r = amdgpu_bo_list_destroy(ibs_request->resources); 8313f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8323f012e29Smrg 8333f012e29Smrg fence_status.ip_type = ip_type; 8343f012e29Smrg fence_status.ip_instance = 0; 8353f012e29Smrg fence_status.ring = ibs_request->ring; 8363f012e29Smrg fence_status.context = context_handle; 8373f012e29Smrg fence_status.fence = ibs_request->seq_no; 8383f012e29Smrg 8393f012e29Smrg /* wait for IB accomplished */ 8403f012e29Smrg r = amdgpu_cs_query_fence_status(&fence_status, 8413f012e29Smrg AMDGPU_TIMEOUT_INFINITE, 8423f012e29Smrg 0, &expired); 8433f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8443f012e29Smrg CU_ASSERT_EQUAL(expired, true); 8453f012e29Smrg 8463f012e29Smrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 8473f012e29Smrg ib_result_mc_address, 4096); 8483f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8493f012e29Smrg} 8503f012e29Smrg 8513f012e29Smrgstatic void amdgpu_command_submission_write_linear_helper(unsigned ip_type) 8523f012e29Smrg{ 8533f012e29Smrg const int sdma_write_length = 128; 8543f012e29Smrg const int pm4_dw = 256; 8553f012e29Smrg amdgpu_context_handle context_handle; 8563f012e29Smrg amdgpu_bo_handle bo; 8573f012e29Smrg amdgpu_bo_handle *resources; 8583f012e29Smrg uint32_t *pm4; 8593f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 8603f012e29Smrg struct amdgpu_cs_request *ibs_request; 8613f012e29Smrg uint64_t bo_mc; 8623f012e29Smrg volatile uint32_t *bo_cpu; 8633f012e29Smrg int i, j, r, loop; 8643f012e29Smrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 8653f012e29Smrg amdgpu_va_handle va_handle; 8663f012e29Smrg 8673f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 8683f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 8693f012e29Smrg 8703f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 8713f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 8723f012e29Smrg 8733f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 8743f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 8753f012e29Smrg 8763f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 8773f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8783f012e29Smrg 8793f012e29Smrg /* prepare resource */ 8803f012e29Smrg resources = calloc(1, sizeof(amdgpu_bo_handle)); 8813f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 8823f012e29Smrg 8833f012e29Smrg loop = 0; 8843f012e29Smrg while(loop < 2) { 8853f012e29Smrg /* allocate UC bo for sDMA use */ 8863f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 8873f012e29Smrg sdma_write_length * sizeof(uint32_t), 8883f012e29Smrg 4096, AMDGPU_GEM_DOMAIN_GTT, 8893f012e29Smrg gtt_flags[loop], &bo, (void**)&bo_cpu, 8903f012e29Smrg &bo_mc, &va_handle); 8913f012e29Smrg CU_ASSERT_EQUAL(r, 0); 8923f012e29Smrg 8933f012e29Smrg /* clear bo */ 8943f012e29Smrg memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t)); 8953f012e29Smrg 8963f012e29Smrg 8973f012e29Smrg resources[0] = bo; 8983f012e29Smrg 8993f012e29Smrg /* fulfill PM4: test DMA write-linear */ 9003f012e29Smrg i = j = 0; 9013f012e29Smrg if (ip_type == AMDGPU_HW_IP_DMA) { 902d8807b2fSmrg if (family_id == AMDGPU_FAMILY_SI) 903d8807b2fSmrg pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_WRITE, 0, 0, 0, 904d8807b2fSmrg sdma_write_length); 905d8807b2fSmrg else 906d8807b2fSmrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 907d8807b2fSmrg SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 9083f012e29Smrg pm4[i++] = 0xffffffff & bo_mc; 9093f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 910d8807b2fSmrg if (family_id >= AMDGPU_FAMILY_AI) 911d8807b2fSmrg pm4[i++] = sdma_write_length - 1; 912d8807b2fSmrg else if (family_id != AMDGPU_FAMILY_SI) 913d8807b2fSmrg pm4[i++] = sdma_write_length; 9143f012e29Smrg while(j++ < sdma_write_length) 9153f012e29Smrg pm4[i++] = 0xdeadbeaf; 9163f012e29Smrg } else if ((ip_type == AMDGPU_HW_IP_GFX) || 9173f012e29Smrg (ip_type == AMDGPU_HW_IP_COMPUTE)) { 9183f012e29Smrg pm4[i++] = PACKET3(PACKET3_WRITE_DATA, 2 + sdma_write_length); 9193f012e29Smrg pm4[i++] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM; 9203f012e29Smrg pm4[i++] = 0xfffffffc & bo_mc; 9213f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 9223f012e29Smrg while(j++ < sdma_write_length) 9233f012e29Smrg pm4[i++] = 0xdeadbeaf; 9243f012e29Smrg } 9253f012e29Smrg 9263f012e29Smrg amdgpu_test_exec_cs_helper(context_handle, 9273f012e29Smrg ip_type, 0, 9283f012e29Smrg i, pm4, 9293f012e29Smrg 1, resources, 9303f012e29Smrg ib_info, ibs_request); 9313f012e29Smrg 9323f012e29Smrg /* verify if SDMA test result meets with expected */ 9333f012e29Smrg i = 0; 9343f012e29Smrg while(i < sdma_write_length) { 9353f012e29Smrg CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 9363f012e29Smrg } 9373f012e29Smrg 9383f012e29Smrg r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc, 9393f012e29Smrg sdma_write_length * sizeof(uint32_t)); 9403f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9413f012e29Smrg loop++; 9423f012e29Smrg } 9433f012e29Smrg /* clean resources */ 9443f012e29Smrg free(resources); 9453f012e29Smrg free(ibs_request); 9463f012e29Smrg free(ib_info); 9473f012e29Smrg free(pm4); 9483f012e29Smrg 9493f012e29Smrg /* end of test */ 9503f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 9513f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9523f012e29Smrg} 9533f012e29Smrg 9543f012e29Smrgstatic void amdgpu_command_submission_sdma_write_linear(void) 9553f012e29Smrg{ 9563f012e29Smrg amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_DMA); 9573f012e29Smrg} 9583f012e29Smrg 9593f012e29Smrgstatic void amdgpu_command_submission_const_fill_helper(unsigned ip_type) 9603f012e29Smrg{ 9613f012e29Smrg const int sdma_write_length = 1024 * 1024; 9623f012e29Smrg const int pm4_dw = 256; 9633f012e29Smrg amdgpu_context_handle context_handle; 9643f012e29Smrg amdgpu_bo_handle bo; 9653f012e29Smrg amdgpu_bo_handle *resources; 9663f012e29Smrg uint32_t *pm4; 9673f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 9683f012e29Smrg struct amdgpu_cs_request *ibs_request; 9693f012e29Smrg uint64_t bo_mc; 9703f012e29Smrg volatile uint32_t *bo_cpu; 9713f012e29Smrg int i, j, r, loop; 9723f012e29Smrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 9733f012e29Smrg amdgpu_va_handle va_handle; 9743f012e29Smrg 9753f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 9763f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 9773f012e29Smrg 9783f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 9793f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 9803f012e29Smrg 9813f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 9823f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 9833f012e29Smrg 9843f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 9853f012e29Smrg CU_ASSERT_EQUAL(r, 0); 9863f012e29Smrg 9873f012e29Smrg /* prepare resource */ 9883f012e29Smrg resources = calloc(1, sizeof(amdgpu_bo_handle)); 9893f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 9903f012e29Smrg 9913f012e29Smrg loop = 0; 9923f012e29Smrg while(loop < 2) { 9933f012e29Smrg /* allocate UC bo for sDMA use */ 9943f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 9953f012e29Smrg sdma_write_length, 4096, 9963f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 9973f012e29Smrg gtt_flags[loop], &bo, (void**)&bo_cpu, 9983f012e29Smrg &bo_mc, &va_handle); 9993f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10003f012e29Smrg 10013f012e29Smrg /* clear bo */ 10023f012e29Smrg memset((void*)bo_cpu, 0, sdma_write_length); 10033f012e29Smrg 10043f012e29Smrg resources[0] = bo; 10053f012e29Smrg 10063f012e29Smrg /* fulfill PM4: test DMA const fill */ 10073f012e29Smrg i = j = 0; 10083f012e29Smrg if (ip_type == AMDGPU_HW_IP_DMA) { 1009d8807b2fSmrg if (family_id == AMDGPU_FAMILY_SI) { 1010d8807b2fSmrg pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_CONSTANT_FILL_SI, 0, 0, 0, 1011d8807b2fSmrg sdma_write_length / 4); 1012d8807b2fSmrg pm4[i++] = 0xfffffffc & bo_mc; 1013d8807b2fSmrg pm4[i++] = 0xdeadbeaf; 1014d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 16; 1015d8807b2fSmrg } else { 1016d8807b2fSmrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0, 1017d8807b2fSmrg SDMA_CONSTANT_FILL_EXTRA_SIZE(2)); 1018d8807b2fSmrg pm4[i++] = 0xffffffff & bo_mc; 1019d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 1020d8807b2fSmrg pm4[i++] = 0xdeadbeaf; 1021d8807b2fSmrg if (family_id >= AMDGPU_FAMILY_AI) 1022d8807b2fSmrg pm4[i++] = sdma_write_length - 1; 1023d8807b2fSmrg else 1024d8807b2fSmrg pm4[i++] = sdma_write_length; 1025d8807b2fSmrg } 10263f012e29Smrg } else if ((ip_type == AMDGPU_HW_IP_GFX) || 10273f012e29Smrg (ip_type == AMDGPU_HW_IP_COMPUTE)) { 1028d8807b2fSmrg if (family_id == AMDGPU_FAMILY_SI) { 1029d8807b2fSmrg pm4[i++] = PACKET3(PACKET3_DMA_DATA_SI, 4); 1030d8807b2fSmrg pm4[i++] = 0xdeadbeaf; 1031d8807b2fSmrg pm4[i++] = PACKET3_DMA_DATA_SI_ENGINE(0) | 1032d8807b2fSmrg PACKET3_DMA_DATA_SI_DST_SEL(0) | 1033d8807b2fSmrg PACKET3_DMA_DATA_SI_SRC_SEL(2) | 1034d8807b2fSmrg PACKET3_DMA_DATA_SI_CP_SYNC; 1035d8807b2fSmrg pm4[i++] = 0xffffffff & bo_mc; 1036d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 1037d8807b2fSmrg pm4[i++] = sdma_write_length; 1038d8807b2fSmrg } else { 1039d8807b2fSmrg pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5); 1040d8807b2fSmrg pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) | 1041d8807b2fSmrg PACKET3_DMA_DATA_DST_SEL(0) | 1042d8807b2fSmrg PACKET3_DMA_DATA_SRC_SEL(2) | 1043d8807b2fSmrg PACKET3_DMA_DATA_CP_SYNC; 1044d8807b2fSmrg pm4[i++] = 0xdeadbeaf; 1045d8807b2fSmrg pm4[i++] = 0; 1046d8807b2fSmrg pm4[i++] = 0xfffffffc & bo_mc; 1047d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 1048d8807b2fSmrg pm4[i++] = sdma_write_length; 1049d8807b2fSmrg } 10503f012e29Smrg } 10513f012e29Smrg 10523f012e29Smrg amdgpu_test_exec_cs_helper(context_handle, 10533f012e29Smrg ip_type, 0, 10543f012e29Smrg i, pm4, 10553f012e29Smrg 1, resources, 10563f012e29Smrg ib_info, ibs_request); 10573f012e29Smrg 10583f012e29Smrg /* verify if SDMA test result meets with expected */ 10593f012e29Smrg i = 0; 10603f012e29Smrg while(i < (sdma_write_length / 4)) { 10613f012e29Smrg CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf); 10623f012e29Smrg } 10633f012e29Smrg 10643f012e29Smrg r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc, 10653f012e29Smrg sdma_write_length); 10663f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10673f012e29Smrg loop++; 10683f012e29Smrg } 10693f012e29Smrg /* clean resources */ 10703f012e29Smrg free(resources); 10713f012e29Smrg free(ibs_request); 10723f012e29Smrg free(ib_info); 10733f012e29Smrg free(pm4); 10743f012e29Smrg 10753f012e29Smrg /* end of test */ 10763f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 10773f012e29Smrg CU_ASSERT_EQUAL(r, 0); 10783f012e29Smrg} 10793f012e29Smrg 10803f012e29Smrgstatic void amdgpu_command_submission_sdma_const_fill(void) 10813f012e29Smrg{ 10823f012e29Smrg amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_DMA); 10833f012e29Smrg} 10843f012e29Smrg 10853f012e29Smrgstatic void amdgpu_command_submission_copy_linear_helper(unsigned ip_type) 10863f012e29Smrg{ 10873f012e29Smrg const int sdma_write_length = 1024; 10883f012e29Smrg const int pm4_dw = 256; 10893f012e29Smrg amdgpu_context_handle context_handle; 10903f012e29Smrg amdgpu_bo_handle bo1, bo2; 10913f012e29Smrg amdgpu_bo_handle *resources; 10923f012e29Smrg uint32_t *pm4; 10933f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 10943f012e29Smrg struct amdgpu_cs_request *ibs_request; 10953f012e29Smrg uint64_t bo1_mc, bo2_mc; 10963f012e29Smrg volatile unsigned char *bo1_cpu, *bo2_cpu; 10973f012e29Smrg int i, j, r, loop1, loop2; 10983f012e29Smrg uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC}; 10993f012e29Smrg amdgpu_va_handle bo1_va_handle, bo2_va_handle; 11003f012e29Smrg 11013f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 11023f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 11033f012e29Smrg 11043f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 11053f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 11063f012e29Smrg 11073f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 11083f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 11093f012e29Smrg 11103f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 11113f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11123f012e29Smrg 11133f012e29Smrg /* prepare resource */ 11143f012e29Smrg resources = calloc(2, sizeof(amdgpu_bo_handle)); 11153f012e29Smrg CU_ASSERT_NOT_EQUAL(resources, NULL); 11163f012e29Smrg 11173f012e29Smrg loop1 = loop2 = 0; 11183f012e29Smrg /* run 9 circle to test all mapping combination */ 11193f012e29Smrg while(loop1 < 2) { 11203f012e29Smrg while(loop2 < 2) { 11213f012e29Smrg /* allocate UC bo1for sDMA use */ 11223f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 11233f012e29Smrg sdma_write_length, 4096, 11243f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 11253f012e29Smrg gtt_flags[loop1], &bo1, 11263f012e29Smrg (void**)&bo1_cpu, &bo1_mc, 11273f012e29Smrg &bo1_va_handle); 11283f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11293f012e29Smrg 11303f012e29Smrg /* set bo1 */ 11313f012e29Smrg memset((void*)bo1_cpu, 0xaa, sdma_write_length); 11323f012e29Smrg 11333f012e29Smrg /* allocate UC bo2 for sDMA use */ 11343f012e29Smrg r = amdgpu_bo_alloc_and_map(device_handle, 11353f012e29Smrg sdma_write_length, 4096, 11363f012e29Smrg AMDGPU_GEM_DOMAIN_GTT, 11373f012e29Smrg gtt_flags[loop2], &bo2, 11383f012e29Smrg (void**)&bo2_cpu, &bo2_mc, 11393f012e29Smrg &bo2_va_handle); 11403f012e29Smrg CU_ASSERT_EQUAL(r, 0); 11413f012e29Smrg 11423f012e29Smrg /* clear bo2 */ 11433f012e29Smrg memset((void*)bo2_cpu, 0, sdma_write_length); 11443f012e29Smrg 11453f012e29Smrg resources[0] = bo1; 11463f012e29Smrg resources[1] = bo2; 11473f012e29Smrg 11483f012e29Smrg /* fulfill PM4: test DMA copy linear */ 11493f012e29Smrg i = j = 0; 11503f012e29Smrg if (ip_type == AMDGPU_HW_IP_DMA) { 1151d8807b2fSmrg if (family_id == AMDGPU_FAMILY_SI) { 1152d8807b2fSmrg pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_COPY_SI, 0, 0, 0, 1153d8807b2fSmrg sdma_write_length); 1154d8807b2fSmrg pm4[i++] = 0xffffffff & bo2_mc; 1155d8807b2fSmrg pm4[i++] = 0xffffffff & bo1_mc; 1156d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 1157d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 1158d8807b2fSmrg } else { 1159d8807b2fSmrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0); 1160d8807b2fSmrg if (family_id >= AMDGPU_FAMILY_AI) 1161d8807b2fSmrg pm4[i++] = sdma_write_length - 1; 1162d8807b2fSmrg else 1163d8807b2fSmrg pm4[i++] = sdma_write_length; 1164d8807b2fSmrg pm4[i++] = 0; 1165d8807b2fSmrg pm4[i++] = 0xffffffff & bo1_mc; 1166d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 1167d8807b2fSmrg pm4[i++] = 0xffffffff & bo2_mc; 1168d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 1169d8807b2fSmrg } 1170d8807b2fSmrg 11713f012e29Smrg } else if ((ip_type == AMDGPU_HW_IP_GFX) || 11723f012e29Smrg (ip_type == AMDGPU_HW_IP_COMPUTE)) { 1173d8807b2fSmrg if (family_id == AMDGPU_FAMILY_SI) { 1174d8807b2fSmrg pm4[i++] = PACKET3(PACKET3_DMA_DATA_SI, 4); 1175d8807b2fSmrg pm4[i++] = 0xfffffffc & bo1_mc; 1176d8807b2fSmrg pm4[i++] = PACKET3_DMA_DATA_SI_ENGINE(0) | 1177d8807b2fSmrg PACKET3_DMA_DATA_SI_DST_SEL(0) | 1178d8807b2fSmrg PACKET3_DMA_DATA_SI_SRC_SEL(0) | 1179d8807b2fSmrg PACKET3_DMA_DATA_SI_CP_SYNC | 1180d8807b2fSmrg (0xffff00000000 & bo1_mc) >> 32; 1181d8807b2fSmrg pm4[i++] = 0xfffffffc & bo2_mc; 1182d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 1183d8807b2fSmrg pm4[i++] = sdma_write_length; 1184d8807b2fSmrg } else { 1185d8807b2fSmrg pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5); 1186d8807b2fSmrg pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) | 1187d8807b2fSmrg PACKET3_DMA_DATA_DST_SEL(0) | 1188d8807b2fSmrg PACKET3_DMA_DATA_SRC_SEL(0) | 1189d8807b2fSmrg PACKET3_DMA_DATA_CP_SYNC; 1190d8807b2fSmrg pm4[i++] = 0xfffffffc & bo1_mc; 1191d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32; 1192d8807b2fSmrg pm4[i++] = 0xfffffffc & bo2_mc; 1193d8807b2fSmrg pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32; 1194d8807b2fSmrg pm4[i++] = sdma_write_length; 1195d8807b2fSmrg } 11963f012e29Smrg } 11973f012e29Smrg 11983f012e29Smrg amdgpu_test_exec_cs_helper(context_handle, 11993f012e29Smrg ip_type, 0, 12003f012e29Smrg i, pm4, 12013f012e29Smrg 2, resources, 12023f012e29Smrg ib_info, ibs_request); 12033f012e29Smrg 12043f012e29Smrg /* verify if SDMA test result meets with expected */ 12053f012e29Smrg i = 0; 12063f012e29Smrg while(i < sdma_write_length) { 12073f012e29Smrg CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa); 12083f012e29Smrg } 12093f012e29Smrg r = amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc, 12103f012e29Smrg sdma_write_length); 12113f012e29Smrg CU_ASSERT_EQUAL(r, 0); 12123f012e29Smrg r = amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc, 12133f012e29Smrg sdma_write_length); 12143f012e29Smrg CU_ASSERT_EQUAL(r, 0); 12153f012e29Smrg loop2++; 12163f012e29Smrg } 12173f012e29Smrg loop1++; 12183f012e29Smrg } 12193f012e29Smrg /* clean resources */ 12203f012e29Smrg free(resources); 12213f012e29Smrg free(ibs_request); 12223f012e29Smrg free(ib_info); 12233f012e29Smrg free(pm4); 12243f012e29Smrg 12253f012e29Smrg /* end of test */ 12263f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 12273f012e29Smrg CU_ASSERT_EQUAL(r, 0); 12283f012e29Smrg} 12293f012e29Smrg 12303f012e29Smrgstatic void amdgpu_command_submission_sdma_copy_linear(void) 12313f012e29Smrg{ 12323f012e29Smrg amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_DMA); 12333f012e29Smrg} 12343f012e29Smrg 12353f012e29Smrgstatic void amdgpu_command_submission_sdma(void) 12363f012e29Smrg{ 12373f012e29Smrg amdgpu_command_submission_sdma_write_linear(); 12383f012e29Smrg amdgpu_command_submission_sdma_const_fill(); 12393f012e29Smrg amdgpu_command_submission_sdma_copy_linear(); 12403f012e29Smrg} 12413f012e29Smrg 1242d8807b2fSmrgstatic void amdgpu_command_submission_multi_fence_wait_all(bool wait_all) 1243d8807b2fSmrg{ 1244d8807b2fSmrg amdgpu_context_handle context_handle; 1245d8807b2fSmrg amdgpu_bo_handle ib_result_handle, ib_result_ce_handle; 1246d8807b2fSmrg void *ib_result_cpu, *ib_result_ce_cpu; 1247d8807b2fSmrg uint64_t ib_result_mc_address, ib_result_ce_mc_address; 1248d8807b2fSmrg struct amdgpu_cs_request ibs_request[2] = {0}; 1249d8807b2fSmrg struct amdgpu_cs_ib_info ib_info[2]; 1250d8807b2fSmrg struct amdgpu_cs_fence fence_status[2] = {0}; 1251d8807b2fSmrg uint32_t *ptr; 1252d8807b2fSmrg uint32_t expired; 1253d8807b2fSmrg amdgpu_bo_list_handle bo_list; 1254d8807b2fSmrg amdgpu_va_handle va_handle, va_handle_ce; 1255d8807b2fSmrg int r; 1256d8807b2fSmrg int i = 0, ib_cs_num = 2; 1257d8807b2fSmrg 1258d8807b2fSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 1259d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1260d8807b2fSmrg 1261d8807b2fSmrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 1262d8807b2fSmrg AMDGPU_GEM_DOMAIN_GTT, 0, 1263d8807b2fSmrg &ib_result_handle, &ib_result_cpu, 1264d8807b2fSmrg &ib_result_mc_address, &va_handle); 1265d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1266d8807b2fSmrg 1267d8807b2fSmrg r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096, 1268d8807b2fSmrg AMDGPU_GEM_DOMAIN_GTT, 0, 1269d8807b2fSmrg &ib_result_ce_handle, &ib_result_ce_cpu, 1270d8807b2fSmrg &ib_result_ce_mc_address, &va_handle_ce); 1271d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1272d8807b2fSmrg 1273d8807b2fSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, 1274d8807b2fSmrg ib_result_ce_handle, &bo_list); 1275d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1276d8807b2fSmrg 1277d8807b2fSmrg memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info)); 1278d8807b2fSmrg 1279d8807b2fSmrg /* IT_SET_CE_DE_COUNTERS */ 1280d8807b2fSmrg ptr = ib_result_ce_cpu; 1281d8807b2fSmrg if (family_id != AMDGPU_FAMILY_SI) { 1282d8807b2fSmrg ptr[i++] = 0xc0008900; 1283d8807b2fSmrg ptr[i++] = 0; 1284d8807b2fSmrg } 1285d8807b2fSmrg ptr[i++] = 0xc0008400; 1286d8807b2fSmrg ptr[i++] = 1; 1287d8807b2fSmrg ib_info[0].ib_mc_address = ib_result_ce_mc_address; 1288d8807b2fSmrg ib_info[0].size = i; 1289d8807b2fSmrg ib_info[0].flags = AMDGPU_IB_FLAG_CE; 1290d8807b2fSmrg 1291d8807b2fSmrg /* IT_WAIT_ON_CE_COUNTER */ 1292d8807b2fSmrg ptr = ib_result_cpu; 1293d8807b2fSmrg ptr[0] = 0xc0008600; 1294d8807b2fSmrg ptr[1] = 0x00000001; 1295d8807b2fSmrg ib_info[1].ib_mc_address = ib_result_mc_address; 1296d8807b2fSmrg ib_info[1].size = 2; 1297d8807b2fSmrg 1298d8807b2fSmrg for (i = 0; i < ib_cs_num; i++) { 1299d8807b2fSmrg ibs_request[i].ip_type = AMDGPU_HW_IP_GFX; 1300d8807b2fSmrg ibs_request[i].number_of_ibs = 2; 1301d8807b2fSmrg ibs_request[i].ibs = ib_info; 1302d8807b2fSmrg ibs_request[i].resources = bo_list; 1303d8807b2fSmrg ibs_request[i].fence_info.handle = NULL; 1304d8807b2fSmrg } 1305d8807b2fSmrg 1306d8807b2fSmrg r = amdgpu_cs_submit(context_handle, 0,ibs_request, ib_cs_num); 1307d8807b2fSmrg 1308d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1309d8807b2fSmrg 1310d8807b2fSmrg for (i = 0; i < ib_cs_num; i++) { 1311d8807b2fSmrg fence_status[i].context = context_handle; 1312d8807b2fSmrg fence_status[i].ip_type = AMDGPU_HW_IP_GFX; 1313d8807b2fSmrg fence_status[i].fence = ibs_request[i].seq_no; 1314d8807b2fSmrg } 1315d8807b2fSmrg 1316d8807b2fSmrg r = amdgpu_cs_wait_fences(fence_status, ib_cs_num, wait_all, 1317d8807b2fSmrg AMDGPU_TIMEOUT_INFINITE, 1318d8807b2fSmrg &expired, NULL); 1319d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1320d8807b2fSmrg 1321d8807b2fSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 1322d8807b2fSmrg ib_result_mc_address, 4096); 1323d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1324d8807b2fSmrg 1325d8807b2fSmrg r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce, 1326d8807b2fSmrg ib_result_ce_mc_address, 4096); 1327d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1328d8807b2fSmrg 1329d8807b2fSmrg r = amdgpu_bo_list_destroy(bo_list); 1330d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1331d8807b2fSmrg 1332d8807b2fSmrg r = amdgpu_cs_ctx_free(context_handle); 1333d8807b2fSmrg CU_ASSERT_EQUAL(r, 0); 1334d8807b2fSmrg} 1335d8807b2fSmrg 1336d8807b2fSmrgstatic void amdgpu_command_submission_multi_fence(void) 1337d8807b2fSmrg{ 1338d8807b2fSmrg amdgpu_command_submission_multi_fence_wait_all(true); 1339d8807b2fSmrg amdgpu_command_submission_multi_fence_wait_all(false); 1340d8807b2fSmrg} 1341d8807b2fSmrg 13423f012e29Smrgstatic void amdgpu_userptr_test(void) 13433f012e29Smrg{ 13443f012e29Smrg int i, r, j; 13453f012e29Smrg uint32_t *pm4 = NULL; 13463f012e29Smrg uint64_t bo_mc; 13473f012e29Smrg void *ptr = NULL; 13483f012e29Smrg int pm4_dw = 256; 13493f012e29Smrg int sdma_write_length = 4; 13503f012e29Smrg amdgpu_bo_handle handle; 13513f012e29Smrg amdgpu_context_handle context_handle; 13523f012e29Smrg struct amdgpu_cs_ib_info *ib_info; 13533f012e29Smrg struct amdgpu_cs_request *ibs_request; 13543f012e29Smrg amdgpu_bo_handle buf_handle; 13553f012e29Smrg amdgpu_va_handle va_handle; 13563f012e29Smrg 13573f012e29Smrg pm4 = calloc(pm4_dw, sizeof(*pm4)); 13583f012e29Smrg CU_ASSERT_NOT_EQUAL(pm4, NULL); 13593f012e29Smrg 13603f012e29Smrg ib_info = calloc(1, sizeof(*ib_info)); 13613f012e29Smrg CU_ASSERT_NOT_EQUAL(ib_info, NULL); 13623f012e29Smrg 13633f012e29Smrg ibs_request = calloc(1, sizeof(*ibs_request)); 13643f012e29Smrg CU_ASSERT_NOT_EQUAL(ibs_request, NULL); 13653f012e29Smrg 13663f012e29Smrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 13673f012e29Smrg CU_ASSERT_EQUAL(r, 0); 13683f012e29Smrg 13693f012e29Smrg posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE); 13703f012e29Smrg CU_ASSERT_NOT_EQUAL(ptr, NULL); 13713f012e29Smrg memset(ptr, 0, BUFFER_SIZE); 13723f012e29Smrg 13733f012e29Smrg r = amdgpu_create_bo_from_user_mem(device_handle, 13743f012e29Smrg ptr, BUFFER_SIZE, &buf_handle); 13753f012e29Smrg CU_ASSERT_EQUAL(r, 0); 13763f012e29Smrg 13773f012e29Smrg r = amdgpu_va_range_alloc(device_handle, 13783f012e29Smrg amdgpu_gpu_va_range_general, 13793f012e29Smrg BUFFER_SIZE, 1, 0, &bo_mc, 13803f012e29Smrg &va_handle, 0); 13813f012e29Smrg CU_ASSERT_EQUAL(r, 0); 13823f012e29Smrg 13833f012e29Smrg r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_MAP); 13843f012e29Smrg CU_ASSERT_EQUAL(r, 0); 13853f012e29Smrg 13863f012e29Smrg handle = buf_handle; 13873f012e29Smrg 13883f012e29Smrg j = i = 0; 1389d8807b2fSmrg 1390d8807b2fSmrg if (family_id == AMDGPU_FAMILY_SI) 1391d8807b2fSmrg pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_WRITE, 0, 0, 0, 1392d8807b2fSmrg sdma_write_length); 1393d8807b2fSmrg else 1394d8807b2fSmrg pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 1395d8807b2fSmrg SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 13963f012e29Smrg pm4[i++] = 0xffffffff & bo_mc; 13973f012e29Smrg pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32; 1398d8807b2fSmrg if (family_id >= AMDGPU_FAMILY_AI) 1399d8807b2fSmrg pm4[i++] = sdma_write_length - 1; 1400d8807b2fSmrg else if (family_id != AMDGPU_FAMILY_SI) 1401d8807b2fSmrg pm4[i++] = sdma_write_length; 14023f012e29Smrg 14033f012e29Smrg while (j++ < sdma_write_length) 14043f012e29Smrg pm4[i++] = 0xdeadbeaf; 14053f012e29Smrg 14063f012e29Smrg amdgpu_test_exec_cs_helper(context_handle, 14073f012e29Smrg AMDGPU_HW_IP_DMA, 0, 14083f012e29Smrg i, pm4, 14093f012e29Smrg 1, &handle, 14103f012e29Smrg ib_info, ibs_request); 14113f012e29Smrg i = 0; 14123f012e29Smrg while (i < sdma_write_length) { 14133f012e29Smrg CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf); 14143f012e29Smrg } 14153f012e29Smrg free(ibs_request); 14163f012e29Smrg free(ib_info); 14173f012e29Smrg free(pm4); 14183f012e29Smrg 14193f012e29Smrg r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_UNMAP); 14203f012e29Smrg CU_ASSERT_EQUAL(r, 0); 14213f012e29Smrg r = amdgpu_va_range_free(va_handle); 14223f012e29Smrg CU_ASSERT_EQUAL(r, 0); 14233f012e29Smrg r = amdgpu_bo_free(buf_handle); 14243f012e29Smrg CU_ASSERT_EQUAL(r, 0); 14253f012e29Smrg free(ptr); 14263f012e29Smrg 14273f012e29Smrg r = amdgpu_cs_ctx_free(context_handle); 14283f012e29Smrg CU_ASSERT_EQUAL(r, 0); 14293f012e29Smrg} 1430