deadlock_tests.c revision 41687f09
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; 12741687f09Smrg uint32_t asic_id; 12800a23bdaSmrg 12900a23bdaSmrg if (amdgpu_device_initialize(drm_amdgpu[0], &major_version, 13000a23bdaSmrg &minor_version, &device_handle)) 13100a23bdaSmrg return CU_FALSE; 13200a23bdaSmrg 1336532f28eSmrg /* 1346532f28eSmrg * Only enable for ASICs supporting GPU reset and for which it's enabled 1356532f28eSmrg * by default (currently GFX8/9 dGPUS) 1366532f28eSmrg */ 1376532f28eSmrg if (device_handle->info.family_id != AMDGPU_FAMILY_VI && 1386532f28eSmrg device_handle->info.family_id != AMDGPU_FAMILY_AI && 1396532f28eSmrg device_handle->info.family_id != AMDGPU_FAMILY_CI) { 1406532f28eSmrg printf("\n\nGPU reset is not enabled for the ASIC, deadlock suite disabled\n"); 14100a23bdaSmrg enable = CU_FALSE; 14200a23bdaSmrg } 14300a23bdaSmrg 14441687f09Smrg asic_id = device_handle->info.asic_id; 14541687f09Smrg if (asic_is_arcturus(asic_id)) { 14641687f09Smrg if (amdgpu_set_test_active("Deadlock Tests", 14741687f09Smrg "gfx ring block test (set amdgpu.lockup_timeout=50)", 14841687f09Smrg CU_FALSE)) 14941687f09Smrg fprintf(stderr, "test deactivation failed - %s\n", 15041687f09Smrg CU_get_error_msg()); 15141687f09Smrg } 15241687f09Smrg 1537cdc0497Smrg if (device_handle->info.family_id >= AMDGPU_FAMILY_AI) 1547cdc0497Smrg use_uc_mtype = 1; 1557cdc0497Smrg 15600a23bdaSmrg if (amdgpu_device_deinitialize(device_handle)) 15700a23bdaSmrg return CU_FALSE; 15800a23bdaSmrg 15900a23bdaSmrg return enable; 16000a23bdaSmrg} 16100a23bdaSmrg 16200a23bdaSmrgint suite_deadlock_tests_init(void) 16300a23bdaSmrg{ 16400a23bdaSmrg int r; 16500a23bdaSmrg 16600a23bdaSmrg r = amdgpu_device_initialize(drm_amdgpu[0], &major_version, 16700a23bdaSmrg &minor_version, &device_handle); 16800a23bdaSmrg 16900a23bdaSmrg if (r) { 17000a23bdaSmrg if ((r == -EACCES) && (errno == EACCES)) 17100a23bdaSmrg printf("\n\nError:%s. " 17200a23bdaSmrg "Hint:Try to run this test program as root.", 17300a23bdaSmrg strerror(errno)); 17400a23bdaSmrg return CUE_SINIT_FAILED; 17500a23bdaSmrg } 17600a23bdaSmrg 17700a23bdaSmrg return CUE_SUCCESS; 17800a23bdaSmrg} 17900a23bdaSmrg 18000a23bdaSmrgint suite_deadlock_tests_clean(void) 18100a23bdaSmrg{ 18200a23bdaSmrg int r = amdgpu_device_deinitialize(device_handle); 18300a23bdaSmrg 18400a23bdaSmrg if (r == 0) 18500a23bdaSmrg return CUE_SUCCESS; 18600a23bdaSmrg else 18700a23bdaSmrg return CUE_SCLEAN_FAILED; 18800a23bdaSmrg} 18900a23bdaSmrg 19000a23bdaSmrg 19100a23bdaSmrgCU_TestInfo deadlock_tests[] = { 1926532f28eSmrg { "gfx ring block test (set amdgpu.lockup_timeout=50)", amdgpu_deadlock_gfx }, 1936532f28eSmrg { "compute ring block test (set amdgpu.lockup_timeout=50)", amdgpu_deadlock_compute }, 1945324fb0dSmrg { "sdma ring block test (set amdgpu.lockup_timeout=50)", amdgpu_deadlock_sdma }, 1956532f28eSmrg { "illegal reg access test", amdgpu_illegal_reg_access }, 1966532f28eSmrg { "illegal mem access test (set amdgpu.vm_fault_stop=2)", amdgpu_illegal_mem_access }, 1979bd392adSmrg { "gfx ring bad dispatch test (set amdgpu.lockup_timeout=50)", amdgpu_dispatch_hang_gfx }, 1989bd392adSmrg { "compute ring bad dispatch test (set amdgpu.lockup_timeout=50,50)", amdgpu_dispatch_hang_compute }, 1999bd392adSmrg { "gfx ring bad slow dispatch test (set amdgpu.lockup_timeout=50)", amdgpu_dispatch_hang_slow_gfx }, 2009bd392adSmrg { "compute ring bad slow dispatch test (set amdgpu.lockup_timeout=50,50)", amdgpu_dispatch_hang_slow_compute }, 2019bd392adSmrg { "gfx ring bad draw test (set amdgpu.lockup_timeout=50)", amdgpu_draw_hang_gfx }, 2029bd392adSmrg { "gfx ring slow bad draw test (set amdgpu.lockup_timeout=50)", amdgpu_draw_hang_slow_gfx }, 20300a23bdaSmrg CU_TEST_INFO_NULL, 20400a23bdaSmrg}; 20500a23bdaSmrg 20600a23bdaSmrgstatic void *write_mem_address(void *data) 20700a23bdaSmrg{ 20800a23bdaSmrg int i; 20900a23bdaSmrg 21000a23bdaSmrg /* useconds_t range is [0, 1,000,000] so use loop for waits > 1s */ 21100a23bdaSmrg for (i = 0; i < WRITE_MEM_ADDRESS_DELAY_MS; i++) 21200a23bdaSmrg usleep(1000); 21300a23bdaSmrg 21400a23bdaSmrg ptr[256] = 0x1; 21500a23bdaSmrg 21600a23bdaSmrg return 0; 21700a23bdaSmrg} 21800a23bdaSmrg 21900a23bdaSmrgstatic void amdgpu_deadlock_gfx(void) 22000a23bdaSmrg{ 22100a23bdaSmrg amdgpu_deadlock_helper(AMDGPU_HW_IP_GFX); 22200a23bdaSmrg} 22300a23bdaSmrg 22400a23bdaSmrgstatic void amdgpu_deadlock_compute(void) 22500a23bdaSmrg{ 22600a23bdaSmrg amdgpu_deadlock_helper(AMDGPU_HW_IP_COMPUTE); 22700a23bdaSmrg} 22800a23bdaSmrg 22900a23bdaSmrgstatic void amdgpu_deadlock_helper(unsigned ip_type) 23000a23bdaSmrg{ 23100a23bdaSmrg amdgpu_context_handle context_handle; 23200a23bdaSmrg amdgpu_bo_handle ib_result_handle; 23300a23bdaSmrg void *ib_result_cpu; 23400a23bdaSmrg uint64_t ib_result_mc_address; 23500a23bdaSmrg struct amdgpu_cs_request ibs_request; 23600a23bdaSmrg struct amdgpu_cs_ib_info ib_info; 23700a23bdaSmrg struct amdgpu_cs_fence fence_status; 23800a23bdaSmrg uint32_t expired; 23900a23bdaSmrg int i, r; 24000a23bdaSmrg amdgpu_bo_list_handle bo_list; 24100a23bdaSmrg amdgpu_va_handle va_handle; 24200a23bdaSmrg 24300a23bdaSmrg r = pthread_create(&stress_thread, NULL, write_mem_address, NULL); 24400a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 24500a23bdaSmrg 24600a23bdaSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 24700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 24800a23bdaSmrg 2497cdc0497Smrg r = amdgpu_bo_alloc_and_map_raw(device_handle, 4096, 4096, 2507cdc0497Smrg AMDGPU_GEM_DOMAIN_GTT, 0, use_uc_mtype ? AMDGPU_VM_MTYPE_UC : 0, 25100a23bdaSmrg &ib_result_handle, &ib_result_cpu, 25200a23bdaSmrg &ib_result_mc_address, &va_handle); 25300a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 25400a23bdaSmrg 25500a23bdaSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 25600a23bdaSmrg &bo_list); 25700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 25800a23bdaSmrg 25900a23bdaSmrg ptr = ib_result_cpu; 26000a23bdaSmrg 26100a23bdaSmrg ptr[0] = PACKET3(PACKET3_WAIT_REG_MEM, 5); 26200a23bdaSmrg ptr[1] = (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ 26300a23bdaSmrg WAIT_REG_MEM_FUNCTION(4) | /* != */ 26400a23bdaSmrg WAIT_REG_MEM_ENGINE(0)); /* me */ 26500a23bdaSmrg ptr[2] = (ib_result_mc_address + 256*4) & 0xfffffffc; 26600a23bdaSmrg ptr[3] = ((ib_result_mc_address + 256*4) >> 32) & 0xffffffff; 26700a23bdaSmrg ptr[4] = 0x00000000; /* reference value */ 26800a23bdaSmrg ptr[5] = 0xffffffff; /* and mask */ 26900a23bdaSmrg ptr[6] = 0x00000004; /* poll interval */ 27000a23bdaSmrg 27100a23bdaSmrg for (i = 7; i < 16; ++i) 27200a23bdaSmrg ptr[i] = 0xffff1000; 27300a23bdaSmrg 27400a23bdaSmrg 27500a23bdaSmrg ptr[256] = 0x0; /* the memory we wait on to change */ 27600a23bdaSmrg 27700a23bdaSmrg 27800a23bdaSmrg 27900a23bdaSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 28000a23bdaSmrg ib_info.ib_mc_address = ib_result_mc_address; 28100a23bdaSmrg ib_info.size = 16; 28200a23bdaSmrg 28300a23bdaSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 28400a23bdaSmrg ibs_request.ip_type = ip_type; 28500a23bdaSmrg ibs_request.ring = 0; 28600a23bdaSmrg ibs_request.number_of_ibs = 1; 28700a23bdaSmrg ibs_request.ibs = &ib_info; 28800a23bdaSmrg ibs_request.resources = bo_list; 28900a23bdaSmrg ibs_request.fence_info.handle = NULL; 29000a23bdaSmrg for (i = 0; i < 200; i++) { 29100a23bdaSmrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 29200a23bdaSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 29300a23bdaSmrg 29400a23bdaSmrg } 29500a23bdaSmrg 29600a23bdaSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 29700a23bdaSmrg fence_status.context = context_handle; 29800a23bdaSmrg fence_status.ip_type = ip_type; 29900a23bdaSmrg fence_status.ip_instance = 0; 30000a23bdaSmrg fence_status.ring = 0; 30100a23bdaSmrg fence_status.fence = ibs_request.seq_no; 30200a23bdaSmrg 30300a23bdaSmrg r = amdgpu_cs_query_fence_status(&fence_status, 30400a23bdaSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 30500a23bdaSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 30600a23bdaSmrg 30700a23bdaSmrg pthread_join(stress_thread, NULL); 30800a23bdaSmrg 30900a23bdaSmrg r = amdgpu_bo_list_destroy(bo_list); 31000a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 31100a23bdaSmrg 31200a23bdaSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 31300a23bdaSmrg ib_result_mc_address, 4096); 31400a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 31500a23bdaSmrg 31600a23bdaSmrg r = amdgpu_cs_ctx_free(context_handle); 31700a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 31800a23bdaSmrg} 3196532f28eSmrg 3205324fb0dSmrgstatic void amdgpu_deadlock_sdma(void) 3215324fb0dSmrg{ 3225324fb0dSmrg amdgpu_context_handle context_handle; 3235324fb0dSmrg amdgpu_bo_handle ib_result_handle; 3245324fb0dSmrg void *ib_result_cpu; 3255324fb0dSmrg uint64_t ib_result_mc_address; 3265324fb0dSmrg struct amdgpu_cs_request ibs_request; 3275324fb0dSmrg struct amdgpu_cs_ib_info ib_info; 3285324fb0dSmrg struct amdgpu_cs_fence fence_status; 3295324fb0dSmrg uint32_t expired; 3305324fb0dSmrg int i, r; 3315324fb0dSmrg amdgpu_bo_list_handle bo_list; 3325324fb0dSmrg amdgpu_va_handle va_handle; 3335324fb0dSmrg struct drm_amdgpu_info_hw_ip info; 3345324fb0dSmrg uint32_t ring_id; 3355324fb0dSmrg 3365324fb0dSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_DMA, 0, &info); 3375324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3385324fb0dSmrg 3395324fb0dSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3405324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3415324fb0dSmrg 3425324fb0dSmrg for (ring_id = 0; (1 << ring_id) & info.available_rings; ring_id++) { 3435324fb0dSmrg r = pthread_create(&stress_thread, NULL, write_mem_address, NULL); 3445324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3455324fb0dSmrg 3465324fb0dSmrg r = amdgpu_bo_alloc_and_map_raw(device_handle, 4096, 4096, 3475324fb0dSmrg AMDGPU_GEM_DOMAIN_GTT, 0, use_uc_mtype ? AMDGPU_VM_MTYPE_UC : 0, 3485324fb0dSmrg &ib_result_handle, &ib_result_cpu, 3495324fb0dSmrg &ib_result_mc_address, &va_handle); 3505324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3515324fb0dSmrg 3525324fb0dSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 3535324fb0dSmrg &bo_list); 3545324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3555324fb0dSmrg 3565324fb0dSmrg ptr = ib_result_cpu; 3575324fb0dSmrg i = 0; 3585324fb0dSmrg 3595324fb0dSmrg ptr[i++] = SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) | 3605324fb0dSmrg (0 << 26) | /* WAIT_REG_MEM */ 3615324fb0dSmrg (4 << 28) | /* != */ 3625324fb0dSmrg (1 << 31); /* memory */ 3635324fb0dSmrg ptr[i++] = (ib_result_mc_address + 256*4) & 0xfffffffc; 3645324fb0dSmrg ptr[i++] = ((ib_result_mc_address + 256*4) >> 32) & 0xffffffff; 3655324fb0dSmrg ptr[i++] = 0x00000000; /* reference value */ 3665324fb0dSmrg ptr[i++] = 0xffffffff; /* and mask */ 3675324fb0dSmrg ptr[i++] = 4 | /* poll interval */ 3685324fb0dSmrg (0xfff << 16); /* retry count */ 3695324fb0dSmrg 3705324fb0dSmrg for (; i < 16; i++) 3715324fb0dSmrg ptr[i] = 0; 3725324fb0dSmrg 3735324fb0dSmrg ptr[256] = 0x0; /* the memory we wait on to change */ 3745324fb0dSmrg 3755324fb0dSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 3765324fb0dSmrg ib_info.ib_mc_address = ib_result_mc_address; 3775324fb0dSmrg ib_info.size = 16; 3785324fb0dSmrg 3795324fb0dSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 3805324fb0dSmrg ibs_request.ip_type = AMDGPU_HW_IP_DMA; 3815324fb0dSmrg ibs_request.ring = ring_id; 3825324fb0dSmrg ibs_request.number_of_ibs = 1; 3835324fb0dSmrg ibs_request.ibs = &ib_info; 3845324fb0dSmrg ibs_request.resources = bo_list; 3855324fb0dSmrg ibs_request.fence_info.handle = NULL; 3865324fb0dSmrg 3875324fb0dSmrg for (i = 0; i < 200; i++) { 3885324fb0dSmrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 3895324fb0dSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 3905324fb0dSmrg 3915324fb0dSmrg } 3925324fb0dSmrg 3935324fb0dSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 3945324fb0dSmrg fence_status.context = context_handle; 3955324fb0dSmrg fence_status.ip_type = AMDGPU_HW_IP_DMA; 3965324fb0dSmrg fence_status.ip_instance = 0; 3975324fb0dSmrg fence_status.ring = ring_id; 3985324fb0dSmrg fence_status.fence = ibs_request.seq_no; 3995324fb0dSmrg 4005324fb0dSmrg r = amdgpu_cs_query_fence_status(&fence_status, 4015324fb0dSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 4025324fb0dSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 4035324fb0dSmrg 4045324fb0dSmrg pthread_join(stress_thread, NULL); 4055324fb0dSmrg 4065324fb0dSmrg r = amdgpu_bo_list_destroy(bo_list); 4075324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 4085324fb0dSmrg 4095324fb0dSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4105324fb0dSmrg ib_result_mc_address, 4096); 4115324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 4125324fb0dSmrg } 4135324fb0dSmrg r = amdgpu_cs_ctx_free(context_handle); 4145324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 4155324fb0dSmrg} 4165324fb0dSmrg 4176532f28eSmrgstatic void bad_access_helper(int reg_access) 4186532f28eSmrg{ 4196532f28eSmrg amdgpu_context_handle context_handle; 4206532f28eSmrg amdgpu_bo_handle ib_result_handle; 4216532f28eSmrg void *ib_result_cpu; 4226532f28eSmrg uint64_t ib_result_mc_address; 4236532f28eSmrg struct amdgpu_cs_request ibs_request; 4246532f28eSmrg struct amdgpu_cs_ib_info ib_info; 4256532f28eSmrg struct amdgpu_cs_fence fence_status; 4266532f28eSmrg uint32_t expired; 4276532f28eSmrg int i, r; 4286532f28eSmrg amdgpu_bo_list_handle bo_list; 4296532f28eSmrg amdgpu_va_handle va_handle; 4306532f28eSmrg 4316532f28eSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 4326532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4336532f28eSmrg 4346532f28eSmrg r = amdgpu_bo_alloc_and_map_raw(device_handle, 4096, 4096, 4356532f28eSmrg AMDGPU_GEM_DOMAIN_GTT, 0, 0, 4366532f28eSmrg &ib_result_handle, &ib_result_cpu, 4376532f28eSmrg &ib_result_mc_address, &va_handle); 4386532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4396532f28eSmrg 4406532f28eSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 4416532f28eSmrg &bo_list); 4426532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4436532f28eSmrg 4446532f28eSmrg ptr = ib_result_cpu; 4456532f28eSmrg i = 0; 4466532f28eSmrg 4476532f28eSmrg ptr[i++] = PACKET3(PACKET3_WRITE_DATA, 3); 4486532f28eSmrg ptr[i++] = (reg_access ? WRITE_DATA_DST_SEL(0) : WRITE_DATA_DST_SEL(5))| WR_CONFIRM; 4496532f28eSmrg ptr[i++] = reg_access ? mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR : 0xdeadbee0; 4506532f28eSmrg ptr[i++] = 0; 4516532f28eSmrg ptr[i++] = 0xdeadbeef; 4526532f28eSmrg 4536532f28eSmrg for (; i < 16; ++i) 4546532f28eSmrg ptr[i] = 0xffff1000; 4556532f28eSmrg 4566532f28eSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 4576532f28eSmrg ib_info.ib_mc_address = ib_result_mc_address; 4586532f28eSmrg ib_info.size = 16; 4596532f28eSmrg 4606532f28eSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 4616532f28eSmrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 4626532f28eSmrg ibs_request.ring = 0; 4636532f28eSmrg ibs_request.number_of_ibs = 1; 4646532f28eSmrg ibs_request.ibs = &ib_info; 4656532f28eSmrg ibs_request.resources = bo_list; 4666532f28eSmrg ibs_request.fence_info.handle = NULL; 4676532f28eSmrg 4686532f28eSmrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 4696532f28eSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 4706532f28eSmrg 4716532f28eSmrg 4726532f28eSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 4736532f28eSmrg fence_status.context = context_handle; 4746532f28eSmrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 4756532f28eSmrg fence_status.ip_instance = 0; 4766532f28eSmrg fence_status.ring = 0; 4776532f28eSmrg fence_status.fence = ibs_request.seq_no; 4786532f28eSmrg 4796532f28eSmrg r = amdgpu_cs_query_fence_status(&fence_status, 4806532f28eSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 4816532f28eSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 4826532f28eSmrg 4836532f28eSmrg r = amdgpu_bo_list_destroy(bo_list); 4846532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4856532f28eSmrg 4866532f28eSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4876532f28eSmrg ib_result_mc_address, 4096); 4886532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4896532f28eSmrg 4906532f28eSmrg r = amdgpu_cs_ctx_free(context_handle); 4916532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4926532f28eSmrg} 4936532f28eSmrg 4946532f28eSmrgstatic void amdgpu_illegal_reg_access() 4956532f28eSmrg{ 4966532f28eSmrg bad_access_helper(1); 4976532f28eSmrg} 4986532f28eSmrg 4996532f28eSmrgstatic void amdgpu_illegal_mem_access() 5006532f28eSmrg{ 5016532f28eSmrg bad_access_helper(0); 5026532f28eSmrg} 5039bd392adSmrg 5049bd392adSmrgstatic void amdgpu_dispatch_hang_gfx(void) 5059bd392adSmrg{ 5069bd392adSmrg amdgpu_dispatch_hang_helper(device_handle, AMDGPU_HW_IP_GFX); 5079bd392adSmrg} 5089bd392adSmrg 5099bd392adSmrgstatic void amdgpu_dispatch_hang_compute(void) 5109bd392adSmrg{ 5119bd392adSmrg amdgpu_dispatch_hang_helper(device_handle, AMDGPU_HW_IP_COMPUTE); 5129bd392adSmrg} 5139bd392adSmrg 5149bd392adSmrgstatic void amdgpu_dispatch_hang_slow_gfx(void) 5159bd392adSmrg{ 5169bd392adSmrg amdgpu_dispatch_hang_slow_helper(device_handle, AMDGPU_HW_IP_GFX); 5179bd392adSmrg} 5189bd392adSmrg 5199bd392adSmrgstatic void amdgpu_dispatch_hang_slow_compute(void) 5209bd392adSmrg{ 5219bd392adSmrg amdgpu_dispatch_hang_slow_helper(device_handle, AMDGPU_HW_IP_COMPUTE); 5229bd392adSmrg} 5239bd392adSmrg 5249bd392adSmrgstatic void amdgpu_draw_hang_gfx(void) 5259bd392adSmrg{ 5269bd392adSmrg int r; 5279bd392adSmrg struct drm_amdgpu_info_hw_ip info; 5289bd392adSmrg uint32_t ring_id; 5299bd392adSmrg 5309bd392adSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_GFX, 0, &info); 5319bd392adSmrg CU_ASSERT_EQUAL(r, 0); 5329bd392adSmrg if (!info.available_rings) 5339bd392adSmrg printf("SKIP ... as there's no graphic ring\n"); 5349bd392adSmrg 5359bd392adSmrg for (ring_id = 0; (1 << ring_id) & info.available_rings; ring_id++) { 5369bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 0); 5379bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 1); 5389bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 0); 5399bd392adSmrg } 5409bd392adSmrg} 5419bd392adSmrg 5429bd392adSmrgstatic void amdgpu_draw_hang_slow_gfx(void) 5439bd392adSmrg{ 5449bd392adSmrg struct drm_amdgpu_info_hw_ip info; 5459bd392adSmrg uint32_t ring_id; 5469bd392adSmrg int r; 5479bd392adSmrg 5489bd392adSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_GFX, 0, &info); 5499bd392adSmrg CU_ASSERT_EQUAL(r, 0); 5509bd392adSmrg 5519bd392adSmrg for (ring_id = 0; (1 << ring_id) & info.available_rings; ring_id++) { 5529bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 0); 5539bd392adSmrg amdgpu_memcpy_draw_hang_slow_test(device_handle, ring_id); 5549bd392adSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, 0); 5559bd392adSmrg } 5569bd392adSmrg} 557