deadlock_tests.c revision 9bd392ad
100a23bdaSmrg/* 200a23bdaSmrg * Copyright 2017 Advanced Micro Devices, Inc. 300a23bdaSmrg * 400a23bdaSmrg * Permission is hereby granted, free of charge, to any person obtaining a 500a23bdaSmrg * copy of this software and associated documentation files (the "Software"), 600a23bdaSmrg * to deal in the Software without restriction, including without limitation 700a23bdaSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 800a23bdaSmrg * and/or sell copies of the Software, and to permit persons to whom the 900a23bdaSmrg * Software is furnished to do so, subject to the following conditions: 1000a23bdaSmrg * 1100a23bdaSmrg * The above copyright notice and this permission notice shall be included in 1200a23bdaSmrg * all copies or substantial portions of the Software. 1300a23bdaSmrg * 1400a23bdaSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1500a23bdaSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1600a23bdaSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1700a23bdaSmrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1800a23bdaSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1900a23bdaSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2000a23bdaSmrg * OTHER DEALINGS IN THE SOFTWARE. 2100a23bdaSmrg * 2200a23bdaSmrg*/ 2300a23bdaSmrg 2400a23bdaSmrg#include <stdio.h> 2500a23bdaSmrg#include <stdlib.h> 2600a23bdaSmrg#include <unistd.h> 279bd392adSmrg#if HAVE_ALLOCA_H 2800a23bdaSmrg# include <alloca.h> 2900a23bdaSmrg#endif 3000a23bdaSmrg 3100a23bdaSmrg#include "CUnit/Basic.h" 3200a23bdaSmrg 3300a23bdaSmrg#include "amdgpu_test.h" 3400a23bdaSmrg#include "amdgpu_drm.h" 3500a23bdaSmrg#include "amdgpu_internal.h" 3600a23bdaSmrg 3700a23bdaSmrg#include <pthread.h> 3800a23bdaSmrg 3900a23bdaSmrg 4000a23bdaSmrg/* 4100a23bdaSmrg * This defines the delay in MS after which memory location designated for 4200a23bdaSmrg * compression against reference value is written to, unblocking command 4300a23bdaSmrg * processor 4400a23bdaSmrg */ 4500a23bdaSmrg#define WRITE_MEM_ADDRESS_DELAY_MS 100 4600a23bdaSmrg 4700a23bdaSmrg#define PACKET_TYPE3 3 4800a23bdaSmrg 4900a23bdaSmrg#define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \ 5000a23bdaSmrg (((op) & 0xFF) << 8) | \ 5100a23bdaSmrg ((n) & 0x3FFF) << 16) 5200a23bdaSmrg 5300a23bdaSmrg#define PACKET3_WAIT_REG_MEM 0x3C 5400a23bdaSmrg#define WAIT_REG_MEM_FUNCTION(x) ((x) << 0) 5500a23bdaSmrg /* 0 - always 5600a23bdaSmrg * 1 - < 5700a23bdaSmrg * 2 - <= 5800a23bdaSmrg * 3 - == 5900a23bdaSmrg * 4 - != 6000a23bdaSmrg * 5 - >= 6100a23bdaSmrg * 6 - > 6200a23bdaSmrg */ 6300a23bdaSmrg#define WAIT_REG_MEM_MEM_SPACE(x) ((x) << 4) 6400a23bdaSmrg /* 0 - reg 6500a23bdaSmrg * 1 - mem 6600a23bdaSmrg */ 6700a23bdaSmrg#define WAIT_REG_MEM_OPERATION(x) ((x) << 6) 6800a23bdaSmrg /* 0 - wait_reg_mem 6900a23bdaSmrg * 1 - wr_wait_wr_reg 7000a23bdaSmrg */ 7100a23bdaSmrg#define WAIT_REG_MEM_ENGINE(x) ((x) << 8) 7200a23bdaSmrg /* 0 - me 7300a23bdaSmrg * 1 - pfp 7400a23bdaSmrg */ 7500a23bdaSmrg 766532f28eSmrg#define PACKET3_WRITE_DATA 0x37 776532f28eSmrg#define WRITE_DATA_DST_SEL(x) ((x) << 8) 786532f28eSmrg /* 0 - register 796532f28eSmrg * 1 - memory (sync - via GRBM) 806532f28eSmrg * 2 - gl2 816532f28eSmrg * 3 - gds 826532f28eSmrg * 4 - reserved 836532f28eSmrg * 5 - memory (async - direct) 846532f28eSmrg */ 856532f28eSmrg#define WR_ONE_ADDR (1 << 16) 866532f28eSmrg#define WR_CONFIRM (1 << 20) 876532f28eSmrg#define WRITE_DATA_CACHE_POLICY(x) ((x) << 25) 886532f28eSmrg /* 0 - LRU 896532f28eSmrg * 1 - Stream 906532f28eSmrg */ 916532f28eSmrg#define WRITE_DATA_ENGINE_SEL(x) ((x) << 30) 926532f28eSmrg /* 0 - me 936532f28eSmrg * 1 - pfp 946532f28eSmrg * 2 - ce 956532f28eSmrg */ 966532f28eSmrg 976532f28eSmrg#define mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR 0x54f 986532f28eSmrg 995324fb0dSmrg#define SDMA_PKT_HEADER_OP(x) (x & 0xff) 1005324fb0dSmrg#define SDMA_OP_POLL_REGMEM 8 1015324fb0dSmrg 10200a23bdaSmrgstatic amdgpu_device_handle device_handle; 10300a23bdaSmrgstatic uint32_t major_version; 10400a23bdaSmrgstatic uint32_t minor_version; 10500a23bdaSmrg 10600a23bdaSmrgstatic pthread_t stress_thread; 10700a23bdaSmrgstatic uint32_t *ptr; 10800a23bdaSmrg 1097cdc0497Smrgint use_uc_mtype = 0; 1107cdc0497Smrg 11100a23bdaSmrgstatic void amdgpu_deadlock_helper(unsigned ip_type); 11200a23bdaSmrgstatic void amdgpu_deadlock_gfx(void); 11300a23bdaSmrgstatic void amdgpu_deadlock_compute(void); 1146532f28eSmrgstatic void amdgpu_illegal_reg_access(); 1156532f28eSmrgstatic void amdgpu_illegal_mem_access(); 1165324fb0dSmrgstatic void amdgpu_deadlock_sdma(void); 1179bd392adSmrgstatic void amdgpu_dispatch_hang_gfx(void); 1189bd392adSmrgstatic void amdgpu_dispatch_hang_compute(void); 1199bd392adSmrgstatic void amdgpu_dispatch_hang_slow_gfx(void); 1209bd392adSmrgstatic void amdgpu_dispatch_hang_slow_compute(void); 1219bd392adSmrgstatic void amdgpu_draw_hang_gfx(void); 1229bd392adSmrgstatic void amdgpu_draw_hang_slow_gfx(void); 12300a23bdaSmrg 12400a23bdaSmrgCU_BOOL suite_deadlock_tests_enable(void) 12500a23bdaSmrg{ 12600a23bdaSmrg CU_BOOL enable = CU_TRUE; 12700a23bdaSmrg 12800a23bdaSmrg if (amdgpu_device_initialize(drm_amdgpu[0], &major_version, 12900a23bdaSmrg &minor_version, &device_handle)) 13000a23bdaSmrg return CU_FALSE; 13100a23bdaSmrg 1326532f28eSmrg /* 1336532f28eSmrg * Only enable for ASICs supporting GPU reset and for which it's enabled 1346532f28eSmrg * by default (currently GFX8/9 dGPUS) 1356532f28eSmrg */ 1366532f28eSmrg if (device_handle->info.family_id != AMDGPU_FAMILY_VI && 1376532f28eSmrg device_handle->info.family_id != AMDGPU_FAMILY_AI && 1386532f28eSmrg device_handle->info.family_id != AMDGPU_FAMILY_CI) { 1396532f28eSmrg printf("\n\nGPU reset is not enabled for the ASIC, deadlock suite disabled\n"); 14000a23bdaSmrg enable = CU_FALSE; 14100a23bdaSmrg } 14200a23bdaSmrg 1437cdc0497Smrg if (device_handle->info.family_id >= AMDGPU_FAMILY_AI) 1447cdc0497Smrg use_uc_mtype = 1; 1457cdc0497Smrg 14600a23bdaSmrg if (amdgpu_device_deinitialize(device_handle)) 14700a23bdaSmrg return CU_FALSE; 14800a23bdaSmrg 14900a23bdaSmrg return enable; 15000a23bdaSmrg} 15100a23bdaSmrg 15200a23bdaSmrgint suite_deadlock_tests_init(void) 15300a23bdaSmrg{ 15400a23bdaSmrg int r; 15500a23bdaSmrg 15600a23bdaSmrg r = amdgpu_device_initialize(drm_amdgpu[0], &major_version, 15700a23bdaSmrg &minor_version, &device_handle); 15800a23bdaSmrg 15900a23bdaSmrg if (r) { 16000a23bdaSmrg if ((r == -EACCES) && (errno == EACCES)) 16100a23bdaSmrg printf("\n\nError:%s. " 16200a23bdaSmrg "Hint:Try to run this test program as root.", 16300a23bdaSmrg strerror(errno)); 16400a23bdaSmrg return CUE_SINIT_FAILED; 16500a23bdaSmrg } 16600a23bdaSmrg 16700a23bdaSmrg return CUE_SUCCESS; 16800a23bdaSmrg} 16900a23bdaSmrg 17000a23bdaSmrgint suite_deadlock_tests_clean(void) 17100a23bdaSmrg{ 17200a23bdaSmrg int r = amdgpu_device_deinitialize(device_handle); 17300a23bdaSmrg 17400a23bdaSmrg if (r == 0) 17500a23bdaSmrg return CUE_SUCCESS; 17600a23bdaSmrg else 17700a23bdaSmrg return CUE_SCLEAN_FAILED; 17800a23bdaSmrg} 17900a23bdaSmrg 18000a23bdaSmrg 18100a23bdaSmrgCU_TestInfo deadlock_tests[] = { 1826532f28eSmrg { "gfx ring block test (set amdgpu.lockup_timeout=50)", amdgpu_deadlock_gfx }, 1836532f28eSmrg { "compute ring block test (set amdgpu.lockup_timeout=50)", amdgpu_deadlock_compute }, 1845324fb0dSmrg { "sdma ring block test (set amdgpu.lockup_timeout=50)", amdgpu_deadlock_sdma }, 1856532f28eSmrg { "illegal reg access test", amdgpu_illegal_reg_access }, 1866532f28eSmrg { "illegal mem access test (set amdgpu.vm_fault_stop=2)", amdgpu_illegal_mem_access }, 1879bd392adSmrg { "gfx ring bad dispatch test (set amdgpu.lockup_timeout=50)", amdgpu_dispatch_hang_gfx }, 1889bd392adSmrg { "compute ring bad dispatch test (set amdgpu.lockup_timeout=50,50)", amdgpu_dispatch_hang_compute }, 1899bd392adSmrg { "gfx ring bad slow dispatch test (set amdgpu.lockup_timeout=50)", amdgpu_dispatch_hang_slow_gfx }, 1909bd392adSmrg { "compute ring bad slow dispatch test (set amdgpu.lockup_timeout=50,50)", amdgpu_dispatch_hang_slow_compute }, 1919bd392adSmrg { "gfx ring bad draw test (set amdgpu.lockup_timeout=50)", amdgpu_draw_hang_gfx }, 1929bd392adSmrg { "gfx ring slow bad draw test (set amdgpu.lockup_timeout=50)", amdgpu_draw_hang_slow_gfx }, 19300a23bdaSmrg CU_TEST_INFO_NULL, 19400a23bdaSmrg}; 19500a23bdaSmrg 19600a23bdaSmrgstatic void *write_mem_address(void *data) 19700a23bdaSmrg{ 19800a23bdaSmrg int i; 19900a23bdaSmrg 20000a23bdaSmrg /* useconds_t range is [0, 1,000,000] so use loop for waits > 1s */ 20100a23bdaSmrg for (i = 0; i < WRITE_MEM_ADDRESS_DELAY_MS; i++) 20200a23bdaSmrg usleep(1000); 20300a23bdaSmrg 20400a23bdaSmrg ptr[256] = 0x1; 20500a23bdaSmrg 20600a23bdaSmrg return 0; 20700a23bdaSmrg} 20800a23bdaSmrg 20900a23bdaSmrgstatic void amdgpu_deadlock_gfx(void) 21000a23bdaSmrg{ 21100a23bdaSmrg amdgpu_deadlock_helper(AMDGPU_HW_IP_GFX); 21200a23bdaSmrg} 21300a23bdaSmrg 21400a23bdaSmrgstatic void amdgpu_deadlock_compute(void) 21500a23bdaSmrg{ 21600a23bdaSmrg amdgpu_deadlock_helper(AMDGPU_HW_IP_COMPUTE); 21700a23bdaSmrg} 21800a23bdaSmrg 21900a23bdaSmrgstatic void amdgpu_deadlock_helper(unsigned ip_type) 22000a23bdaSmrg{ 22100a23bdaSmrg amdgpu_context_handle context_handle; 22200a23bdaSmrg amdgpu_bo_handle ib_result_handle; 22300a23bdaSmrg void *ib_result_cpu; 22400a23bdaSmrg uint64_t ib_result_mc_address; 22500a23bdaSmrg struct amdgpu_cs_request ibs_request; 22600a23bdaSmrg struct amdgpu_cs_ib_info ib_info; 22700a23bdaSmrg struct amdgpu_cs_fence fence_status; 22800a23bdaSmrg uint32_t expired; 22900a23bdaSmrg int i, r; 23000a23bdaSmrg amdgpu_bo_list_handle bo_list; 23100a23bdaSmrg amdgpu_va_handle va_handle; 23200a23bdaSmrg 23300a23bdaSmrg r = pthread_create(&stress_thread, NULL, write_mem_address, NULL); 23400a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 23500a23bdaSmrg 23600a23bdaSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 23700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 23800a23bdaSmrg 2397cdc0497Smrg r = amdgpu_bo_alloc_and_map_raw(device_handle, 4096, 4096, 2407cdc0497Smrg AMDGPU_GEM_DOMAIN_GTT, 0, use_uc_mtype ? AMDGPU_VM_MTYPE_UC : 0, 24100a23bdaSmrg &ib_result_handle, &ib_result_cpu, 24200a23bdaSmrg &ib_result_mc_address, &va_handle); 24300a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 24400a23bdaSmrg 24500a23bdaSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 24600a23bdaSmrg &bo_list); 24700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 24800a23bdaSmrg 24900a23bdaSmrg ptr = ib_result_cpu; 25000a23bdaSmrg 25100a23bdaSmrg ptr[0] = PACKET3(PACKET3_WAIT_REG_MEM, 5); 25200a23bdaSmrg ptr[1] = (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ 25300a23bdaSmrg WAIT_REG_MEM_FUNCTION(4) | /* != */ 25400a23bdaSmrg WAIT_REG_MEM_ENGINE(0)); /* me */ 25500a23bdaSmrg ptr[2] = (ib_result_mc_address + 256*4) & 0xfffffffc; 25600a23bdaSmrg ptr[3] = ((ib_result_mc_address + 256*4) >> 32) & 0xffffffff; 25700a23bdaSmrg ptr[4] = 0x00000000; /* reference value */ 25800a23bdaSmrg ptr[5] = 0xffffffff; /* and mask */ 25900a23bdaSmrg ptr[6] = 0x00000004; /* poll interval */ 26000a23bdaSmrg 26100a23bdaSmrg for (i = 7; i < 16; ++i) 26200a23bdaSmrg ptr[i] = 0xffff1000; 26300a23bdaSmrg 26400a23bdaSmrg 26500a23bdaSmrg ptr[256] = 0x0; /* the memory we wait on to change */ 26600a23bdaSmrg 26700a23bdaSmrg 26800a23bdaSmrg 26900a23bdaSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 27000a23bdaSmrg ib_info.ib_mc_address = ib_result_mc_address; 27100a23bdaSmrg ib_info.size = 16; 27200a23bdaSmrg 27300a23bdaSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 27400a23bdaSmrg ibs_request.ip_type = ip_type; 27500a23bdaSmrg ibs_request.ring = 0; 27600a23bdaSmrg ibs_request.number_of_ibs = 1; 27700a23bdaSmrg ibs_request.ibs = &ib_info; 27800a23bdaSmrg ibs_request.resources = bo_list; 27900a23bdaSmrg ibs_request.fence_info.handle = NULL; 28000a23bdaSmrg for (i = 0; i < 200; i++) { 28100a23bdaSmrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 28200a23bdaSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 28300a23bdaSmrg 28400a23bdaSmrg } 28500a23bdaSmrg 28600a23bdaSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 28700a23bdaSmrg fence_status.context = context_handle; 28800a23bdaSmrg fence_status.ip_type = ip_type; 28900a23bdaSmrg fence_status.ip_instance = 0; 29000a23bdaSmrg fence_status.ring = 0; 29100a23bdaSmrg fence_status.fence = ibs_request.seq_no; 29200a23bdaSmrg 29300a23bdaSmrg r = amdgpu_cs_query_fence_status(&fence_status, 29400a23bdaSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 29500a23bdaSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 29600a23bdaSmrg 29700a23bdaSmrg pthread_join(stress_thread, NULL); 29800a23bdaSmrg 29900a23bdaSmrg r = amdgpu_bo_list_destroy(bo_list); 30000a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 30100a23bdaSmrg 30200a23bdaSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 30300a23bdaSmrg ib_result_mc_address, 4096); 30400a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 30500a23bdaSmrg 30600a23bdaSmrg r = amdgpu_cs_ctx_free(context_handle); 30700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 30800a23bdaSmrg} 3096532f28eSmrg 3105324fb0dSmrgstatic void amdgpu_deadlock_sdma(void) 3115324fb0dSmrg{ 3125324fb0dSmrg amdgpu_context_handle context_handle; 3135324fb0dSmrg amdgpu_bo_handle ib_result_handle; 3145324fb0dSmrg void *ib_result_cpu; 3155324fb0dSmrg uint64_t ib_result_mc_address; 3165324fb0dSmrg struct amdgpu_cs_request ibs_request; 3175324fb0dSmrg struct amdgpu_cs_ib_info ib_info; 3185324fb0dSmrg struct amdgpu_cs_fence fence_status; 3195324fb0dSmrg uint32_t expired; 3205324fb0dSmrg int i, r; 3215324fb0dSmrg amdgpu_bo_list_handle bo_list; 3225324fb0dSmrg amdgpu_va_handle va_handle; 3235324fb0dSmrg struct drm_amdgpu_info_hw_ip info; 3245324fb0dSmrg uint32_t ring_id; 3255324fb0dSmrg 3265324fb0dSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_DMA, 0, &info); 3275324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3285324fb0dSmrg 3295324fb0dSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3305324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3315324fb0dSmrg 3325324fb0dSmrg for (ring_id = 0; (1 << ring_id) & info.available_rings; ring_id++) { 3335324fb0dSmrg r = pthread_create(&stress_thread, NULL, write_mem_address, NULL); 3345324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3355324fb0dSmrg 3365324fb0dSmrg r = amdgpu_bo_alloc_and_map_raw(device_handle, 4096, 4096, 3375324fb0dSmrg AMDGPU_GEM_DOMAIN_GTT, 0, use_uc_mtype ? AMDGPU_VM_MTYPE_UC : 0, 3385324fb0dSmrg &ib_result_handle, &ib_result_cpu, 3395324fb0dSmrg &ib_result_mc_address, &va_handle); 3405324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3415324fb0dSmrg 3425324fb0dSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 3435324fb0dSmrg &bo_list); 3445324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3455324fb0dSmrg 3465324fb0dSmrg ptr = ib_result_cpu; 3475324fb0dSmrg i = 0; 3485324fb0dSmrg 3495324fb0dSmrg ptr[i++] = SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) | 3505324fb0dSmrg (0 << 26) | /* WAIT_REG_MEM */ 3515324fb0dSmrg (4 << 28) | /* != */ 3525324fb0dSmrg (1 << 31); /* memory */ 3535324fb0dSmrg ptr[i++] = (ib_result_mc_address + 256*4) & 0xfffffffc; 3545324fb0dSmrg ptr[i++] = ((ib_result_mc_address + 256*4) >> 32) & 0xffffffff; 3555324fb0dSmrg ptr[i++] = 0x00000000; /* reference value */ 3565324fb0dSmrg ptr[i++] = 0xffffffff; /* and mask */ 3575324fb0dSmrg ptr[i++] = 4 | /* poll interval */ 3585324fb0dSmrg (0xfff << 16); /* retry count */ 3595324fb0dSmrg 3605324fb0dSmrg for (; i < 16; i++) 3615324fb0dSmrg ptr[i] = 0; 3625324fb0dSmrg 3635324fb0dSmrg ptr[256] = 0x0; /* the memory we wait on to change */ 3645324fb0dSmrg 3655324fb0dSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 3665324fb0dSmrg ib_info.ib_mc_address = ib_result_mc_address; 3675324fb0dSmrg ib_info.size = 16; 3685324fb0dSmrg 3695324fb0dSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 3705324fb0dSmrg ibs_request.ip_type = AMDGPU_HW_IP_DMA; 3715324fb0dSmrg ibs_request.ring = ring_id; 3725324fb0dSmrg ibs_request.number_of_ibs = 1; 3735324fb0dSmrg ibs_request.ibs = &ib_info; 3745324fb0dSmrg ibs_request.resources = bo_list; 3755324fb0dSmrg ibs_request.fence_info.handle = NULL; 3765324fb0dSmrg 3775324fb0dSmrg for (i = 0; i < 200; i++) { 3785324fb0dSmrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 3795324fb0dSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 3805324fb0dSmrg 3815324fb0dSmrg } 3825324fb0dSmrg 3835324fb0dSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 3845324fb0dSmrg fence_status.context = context_handle; 3855324fb0dSmrg fence_status.ip_type = AMDGPU_HW_IP_DMA; 3865324fb0dSmrg fence_status.ip_instance = 0; 3875324fb0dSmrg fence_status.ring = ring_id; 3885324fb0dSmrg fence_status.fence = ibs_request.seq_no; 3895324fb0dSmrg 3905324fb0dSmrg r = amdgpu_cs_query_fence_status(&fence_status, 3915324fb0dSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 3925324fb0dSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 3935324fb0dSmrg 3945324fb0dSmrg pthread_join(stress_thread, NULL); 3955324fb0dSmrg 3965324fb0dSmrg r = amdgpu_bo_list_destroy(bo_list); 3975324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3985324fb0dSmrg 3995324fb0dSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4005324fb0dSmrg ib_result_mc_address, 4096); 4015324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 4025324fb0dSmrg } 4035324fb0dSmrg r = amdgpu_cs_ctx_free(context_handle); 4045324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 4055324fb0dSmrg} 4065324fb0dSmrg 4076532f28eSmrgstatic void bad_access_helper(int reg_access) 4086532f28eSmrg{ 4096532f28eSmrg amdgpu_context_handle context_handle; 4106532f28eSmrg amdgpu_bo_handle ib_result_handle; 4116532f28eSmrg void *ib_result_cpu; 4126532f28eSmrg uint64_t ib_result_mc_address; 4136532f28eSmrg struct amdgpu_cs_request ibs_request; 4146532f28eSmrg struct amdgpu_cs_ib_info ib_info; 4156532f28eSmrg struct amdgpu_cs_fence fence_status; 4166532f28eSmrg uint32_t expired; 4176532f28eSmrg int i, r; 4186532f28eSmrg amdgpu_bo_list_handle bo_list; 4196532f28eSmrg amdgpu_va_handle va_handle; 4206532f28eSmrg 4216532f28eSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 4226532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4236532f28eSmrg 4246532f28eSmrg r = amdgpu_bo_alloc_and_map_raw(device_handle, 4096, 4096, 4256532f28eSmrg AMDGPU_GEM_DOMAIN_GTT, 0, 0, 4266532f28eSmrg &ib_result_handle, &ib_result_cpu, 4276532f28eSmrg &ib_result_mc_address, &va_handle); 4286532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4296532f28eSmrg 4306532f28eSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 4316532f28eSmrg &bo_list); 4326532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4336532f28eSmrg 4346532f28eSmrg ptr = ib_result_cpu; 4356532f28eSmrg i = 0; 4366532f28eSmrg 4376532f28eSmrg ptr[i++] = PACKET3(PACKET3_WRITE_DATA, 3); 4386532f28eSmrg ptr[i++] = (reg_access ? WRITE_DATA_DST_SEL(0) : WRITE_DATA_DST_SEL(5))| WR_CONFIRM; 4396532f28eSmrg ptr[i++] = reg_access ? mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR : 0xdeadbee0; 4406532f28eSmrg ptr[i++] = 0; 4416532f28eSmrg ptr[i++] = 0xdeadbeef; 4426532f28eSmrg 4436532f28eSmrg for (; i < 16; ++i) 4446532f28eSmrg ptr[i] = 0xffff1000; 4456532f28eSmrg 4466532f28eSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 4476532f28eSmrg ib_info.ib_mc_address = ib_result_mc_address; 4486532f28eSmrg ib_info.size = 16; 4496532f28eSmrg 4506532f28eSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 4516532f28eSmrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 4526532f28eSmrg ibs_request.ring = 0; 4536532f28eSmrg ibs_request.number_of_ibs = 1; 4546532f28eSmrg ibs_request.ibs = &ib_info; 4556532f28eSmrg ibs_request.resources = bo_list; 4566532f28eSmrg ibs_request.fence_info.handle = NULL; 4576532f28eSmrg 4586532f28eSmrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 4596532f28eSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 4606532f28eSmrg 4616532f28eSmrg 4626532f28eSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 4636532f28eSmrg fence_status.context = context_handle; 4646532f28eSmrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 4656532f28eSmrg fence_status.ip_instance = 0; 4666532f28eSmrg fence_status.ring = 0; 4676532f28eSmrg fence_status.fence = ibs_request.seq_no; 4686532f28eSmrg 4696532f28eSmrg r = amdgpu_cs_query_fence_status(&fence_status, 4706532f28eSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 4716532f28eSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 4726532f28eSmrg 4736532f28eSmrg r = amdgpu_bo_list_destroy(bo_list); 4746532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4756532f28eSmrg 4766532f28eSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4776532f28eSmrg ib_result_mc_address, 4096); 4786532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4796532f28eSmrg 4806532f28eSmrg r = amdgpu_cs_ctx_free(context_handle); 4816532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4826532f28eSmrg} 4836532f28eSmrg 4846532f28eSmrgstatic void amdgpu_illegal_reg_access() 4856532f28eSmrg{ 4866532f28eSmrg bad_access_helper(1); 4876532f28eSmrg} 4886532f28eSmrg 4896532f28eSmrgstatic void amdgpu_illegal_mem_access() 4906532f28eSmrg{ 4916532f28eSmrg bad_access_helper(0); 4926532f28eSmrg} 4939bd392adSmrg 4949bd392adSmrgstatic void amdgpu_dispatch_hang_gfx(void) 4959bd392adSmrg{ 4969bd392adSmrg amdgpu_dispatch_hang_helper(device_handle, AMDGPU_HW_IP_GFX); 4979bd392adSmrg} 4989bd392adSmrg 4999bd392adSmrgstatic void amdgpu_dispatch_hang_compute(void) 5009bd392adSmrg{ 5019bd392adSmrg amdgpu_dispatch_hang_helper(device_handle, AMDGPU_HW_IP_COMPUTE); 5029bd392adSmrg} 5039bd392adSmrg 5049bd392adSmrgstatic void amdgpu_dispatch_hang_slow_gfx(void) 5059bd392adSmrg{ 5069bd392adSmrg amdgpu_dispatch_hang_slow_helper(device_handle, AMDGPU_HW_IP_GFX); 5079bd392adSmrg} 5089bd392adSmrg 5099bd392adSmrgstatic void amdgpu_dispatch_hang_slow_compute(void) 5109bd392adSmrg{ 5119bd392adSmrg amdgpu_dispatch_hang_slow_helper(device_handle, AMDGPU_HW_IP_COMPUTE); 5129bd392adSmrg} 5139bd392adSmrg 5149bd392adSmrgstatic void amdgpu_draw_hang_gfx(void) 5159bd392adSmrg{ 5169bd392adSmrg int r; 5179bd392adSmrg struct drm_amdgpu_info_hw_ip info; 5189bd392adSmrg uint32_t ring_id; 5199bd392adSmrg 5209bd392adSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_GFX, 0, &info); 5219bd392adSmrg CU_ASSERT_EQUAL(r, 0); 5229bd392adSmrg if (!info.available_rings) 5239bd392adSmrg printf("SKIP ... as there's no graphic ring\n"); 5249bd392adSmrg 5259bd392adSmrg for (ring_id = 0; (1 << ring_id) & info.available_rings; ring_id++) { 5269bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 0); 5279bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 1); 5289bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 0); 5299bd392adSmrg } 5309bd392adSmrg} 5319bd392adSmrg 5329bd392adSmrgstatic void amdgpu_draw_hang_slow_gfx(void) 5339bd392adSmrg{ 5349bd392adSmrg struct drm_amdgpu_info_hw_ip info; 5359bd392adSmrg uint32_t ring_id; 5369bd392adSmrg int r; 5379bd392adSmrg 5389bd392adSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_GFX, 0, &info); 5399bd392adSmrg CU_ASSERT_EQUAL(r, 0); 5409bd392adSmrg 5419bd392adSmrg for (ring_id = 0; (1 << ring_id) & info.available_rings; ring_id++) { 5429bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 0); 5439bd392adSmrg amdgpu_memcpy_draw_hang_slow_test(device_handle, ring_id); 5449bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 0); 5459bd392adSmrg } 5469bd392adSmrg} 547