deadlock_tests.c revision 0ed5401b
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 1094babd585Smrgstatic uint32_t family_id; 1104babd585Smrgstatic uint32_t chip_rev; 1114babd585Smrgstatic uint32_t chip_id; 1124babd585Smrg 1137cdc0497Smrgint use_uc_mtype = 0; 1147cdc0497Smrg 11500a23bdaSmrgstatic void amdgpu_deadlock_helper(unsigned ip_type); 11600a23bdaSmrgstatic void amdgpu_deadlock_gfx(void); 11700a23bdaSmrgstatic void amdgpu_deadlock_compute(void); 1186532f28eSmrgstatic void amdgpu_illegal_reg_access(); 1196532f28eSmrgstatic void amdgpu_illegal_mem_access(); 1205324fb0dSmrgstatic void amdgpu_deadlock_sdma(void); 1219bd392adSmrgstatic void amdgpu_dispatch_hang_gfx(void); 1229bd392adSmrgstatic void amdgpu_dispatch_hang_compute(void); 1239bd392adSmrgstatic void amdgpu_dispatch_hang_slow_gfx(void); 1249bd392adSmrgstatic void amdgpu_dispatch_hang_slow_compute(void); 1259bd392adSmrgstatic void amdgpu_draw_hang_gfx(void); 1269bd392adSmrgstatic void amdgpu_draw_hang_slow_gfx(void); 12700a23bdaSmrg 12800a23bdaSmrgCU_BOOL suite_deadlock_tests_enable(void) 12900a23bdaSmrg{ 13000a23bdaSmrg CU_BOOL enable = CU_TRUE; 13100a23bdaSmrg 13200a23bdaSmrg if (amdgpu_device_initialize(drm_amdgpu[0], &major_version, 13300a23bdaSmrg &minor_version, &device_handle)) 13400a23bdaSmrg return CU_FALSE; 13500a23bdaSmrg 1364babd585Smrg family_id = device_handle->info.family_id; 1374babd585Smrg chip_id = device_handle->info.chip_external_rev; 1384babd585Smrg chip_rev = device_handle->info.chip_rev; 1394babd585Smrg 1406532f28eSmrg /* 1416532f28eSmrg * Only enable for ASICs supporting GPU reset and for which it's enabled 1420ed5401bSmrg * by default (currently GFX8+ dGPUS and gfx9+ APUs). Note that Raven1 1430ed5401bSmrg * did not support GPU reset, but newer variants do. 1446532f28eSmrg */ 1450ed5401bSmrg if (family_id == AMDGPU_FAMILY_SI || 1460ed5401bSmrg family_id == AMDGPU_FAMILY_KV || 1470ed5401bSmrg family_id == AMDGPU_FAMILY_CZ || 1480ed5401bSmrg family_id == AMDGPU_FAMILY_RV) { 1496532f28eSmrg printf("\n\nGPU reset is not enabled for the ASIC, deadlock suite disabled\n"); 15000a23bdaSmrg enable = CU_FALSE; 15100a23bdaSmrg } 15200a23bdaSmrg 1534babd585Smrg if (asic_is_gfx_pipe_removed(family_id, chip_id, chip_rev)) { 15441687f09Smrg if (amdgpu_set_test_active("Deadlock Tests", 15541687f09Smrg "gfx ring block test (set amdgpu.lockup_timeout=50)", 15641687f09Smrg CU_FALSE)) 15741687f09Smrg fprintf(stderr, "test deactivation failed - %s\n", 15841687f09Smrg CU_get_error_msg()); 15941687f09Smrg } 16041687f09Smrg 1617cdc0497Smrg if (device_handle->info.family_id >= AMDGPU_FAMILY_AI) 1627cdc0497Smrg use_uc_mtype = 1; 1637cdc0497Smrg 16400a23bdaSmrg if (amdgpu_device_deinitialize(device_handle)) 16500a23bdaSmrg return CU_FALSE; 16600a23bdaSmrg 16700a23bdaSmrg return enable; 16800a23bdaSmrg} 16900a23bdaSmrg 17000a23bdaSmrgint suite_deadlock_tests_init(void) 17100a23bdaSmrg{ 17200a23bdaSmrg int r; 17300a23bdaSmrg 17400a23bdaSmrg r = amdgpu_device_initialize(drm_amdgpu[0], &major_version, 17500a23bdaSmrg &minor_version, &device_handle); 17600a23bdaSmrg 17700a23bdaSmrg if (r) { 17800a23bdaSmrg if ((r == -EACCES) && (errno == EACCES)) 17900a23bdaSmrg printf("\n\nError:%s. " 18000a23bdaSmrg "Hint:Try to run this test program as root.", 18100a23bdaSmrg strerror(errno)); 18200a23bdaSmrg return CUE_SINIT_FAILED; 18300a23bdaSmrg } 18400a23bdaSmrg 18500a23bdaSmrg return CUE_SUCCESS; 18600a23bdaSmrg} 18700a23bdaSmrg 18800a23bdaSmrgint suite_deadlock_tests_clean(void) 18900a23bdaSmrg{ 19000a23bdaSmrg int r = amdgpu_device_deinitialize(device_handle); 19100a23bdaSmrg 19200a23bdaSmrg if (r == 0) 19300a23bdaSmrg return CUE_SUCCESS; 19400a23bdaSmrg else 19500a23bdaSmrg return CUE_SCLEAN_FAILED; 19600a23bdaSmrg} 19700a23bdaSmrg 19800a23bdaSmrg 19900a23bdaSmrgCU_TestInfo deadlock_tests[] = { 2006532f28eSmrg { "gfx ring block test (set amdgpu.lockup_timeout=50)", amdgpu_deadlock_gfx }, 2016532f28eSmrg { "compute ring block test (set amdgpu.lockup_timeout=50)", amdgpu_deadlock_compute }, 2025324fb0dSmrg { "sdma ring block test (set amdgpu.lockup_timeout=50)", amdgpu_deadlock_sdma }, 2036532f28eSmrg { "illegal reg access test", amdgpu_illegal_reg_access }, 2046532f28eSmrg { "illegal mem access test (set amdgpu.vm_fault_stop=2)", amdgpu_illegal_mem_access }, 2059bd392adSmrg { "gfx ring bad dispatch test (set amdgpu.lockup_timeout=50)", amdgpu_dispatch_hang_gfx }, 2069bd392adSmrg { "compute ring bad dispatch test (set amdgpu.lockup_timeout=50,50)", amdgpu_dispatch_hang_compute }, 2079bd392adSmrg { "gfx ring bad slow dispatch test (set amdgpu.lockup_timeout=50)", amdgpu_dispatch_hang_slow_gfx }, 2089bd392adSmrg { "compute ring bad slow dispatch test (set amdgpu.lockup_timeout=50,50)", amdgpu_dispatch_hang_slow_compute }, 2099bd392adSmrg { "gfx ring bad draw test (set amdgpu.lockup_timeout=50)", amdgpu_draw_hang_gfx }, 2109bd392adSmrg { "gfx ring slow bad draw test (set amdgpu.lockup_timeout=50)", amdgpu_draw_hang_slow_gfx }, 21100a23bdaSmrg CU_TEST_INFO_NULL, 21200a23bdaSmrg}; 21300a23bdaSmrg 21400a23bdaSmrgstatic void *write_mem_address(void *data) 21500a23bdaSmrg{ 21600a23bdaSmrg int i; 21700a23bdaSmrg 21800a23bdaSmrg /* useconds_t range is [0, 1,000,000] so use loop for waits > 1s */ 21900a23bdaSmrg for (i = 0; i < WRITE_MEM_ADDRESS_DELAY_MS; i++) 22000a23bdaSmrg usleep(1000); 22100a23bdaSmrg 22200a23bdaSmrg ptr[256] = 0x1; 22300a23bdaSmrg 22400a23bdaSmrg return 0; 22500a23bdaSmrg} 22600a23bdaSmrg 22700a23bdaSmrgstatic void amdgpu_deadlock_gfx(void) 22800a23bdaSmrg{ 22900a23bdaSmrg amdgpu_deadlock_helper(AMDGPU_HW_IP_GFX); 23000a23bdaSmrg} 23100a23bdaSmrg 23200a23bdaSmrgstatic void amdgpu_deadlock_compute(void) 23300a23bdaSmrg{ 23400a23bdaSmrg amdgpu_deadlock_helper(AMDGPU_HW_IP_COMPUTE); 23500a23bdaSmrg} 23600a23bdaSmrg 23700a23bdaSmrgstatic void amdgpu_deadlock_helper(unsigned ip_type) 23800a23bdaSmrg{ 23900a23bdaSmrg amdgpu_context_handle context_handle; 24000a23bdaSmrg amdgpu_bo_handle ib_result_handle; 24100a23bdaSmrg void *ib_result_cpu; 24200a23bdaSmrg uint64_t ib_result_mc_address; 24300a23bdaSmrg struct amdgpu_cs_request ibs_request; 24400a23bdaSmrg struct amdgpu_cs_ib_info ib_info; 24500a23bdaSmrg struct amdgpu_cs_fence fence_status; 24600a23bdaSmrg uint32_t expired; 24700a23bdaSmrg int i, r; 24800a23bdaSmrg amdgpu_bo_list_handle bo_list; 24900a23bdaSmrg amdgpu_va_handle va_handle; 25000a23bdaSmrg 25100a23bdaSmrg r = pthread_create(&stress_thread, NULL, write_mem_address, NULL); 25200a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 25300a23bdaSmrg 25400a23bdaSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 25500a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 25600a23bdaSmrg 2577cdc0497Smrg r = amdgpu_bo_alloc_and_map_raw(device_handle, 4096, 4096, 2587cdc0497Smrg AMDGPU_GEM_DOMAIN_GTT, 0, use_uc_mtype ? AMDGPU_VM_MTYPE_UC : 0, 25900a23bdaSmrg &ib_result_handle, &ib_result_cpu, 26000a23bdaSmrg &ib_result_mc_address, &va_handle); 26100a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 26200a23bdaSmrg 26300a23bdaSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 26400a23bdaSmrg &bo_list); 26500a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 26600a23bdaSmrg 26700a23bdaSmrg ptr = ib_result_cpu; 26800a23bdaSmrg 26900a23bdaSmrg ptr[0] = PACKET3(PACKET3_WAIT_REG_MEM, 5); 27000a23bdaSmrg ptr[1] = (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ 27100a23bdaSmrg WAIT_REG_MEM_FUNCTION(4) | /* != */ 27200a23bdaSmrg WAIT_REG_MEM_ENGINE(0)); /* me */ 27300a23bdaSmrg ptr[2] = (ib_result_mc_address + 256*4) & 0xfffffffc; 27400a23bdaSmrg ptr[3] = ((ib_result_mc_address + 256*4) >> 32) & 0xffffffff; 27500a23bdaSmrg ptr[4] = 0x00000000; /* reference value */ 27600a23bdaSmrg ptr[5] = 0xffffffff; /* and mask */ 27700a23bdaSmrg ptr[6] = 0x00000004; /* poll interval */ 27800a23bdaSmrg 27900a23bdaSmrg for (i = 7; i < 16; ++i) 28000a23bdaSmrg ptr[i] = 0xffff1000; 28100a23bdaSmrg 28200a23bdaSmrg 28300a23bdaSmrg ptr[256] = 0x0; /* the memory we wait on to change */ 28400a23bdaSmrg 28500a23bdaSmrg 28600a23bdaSmrg 28700a23bdaSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 28800a23bdaSmrg ib_info.ib_mc_address = ib_result_mc_address; 28900a23bdaSmrg ib_info.size = 16; 29000a23bdaSmrg 29100a23bdaSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 29200a23bdaSmrg ibs_request.ip_type = ip_type; 29300a23bdaSmrg ibs_request.ring = 0; 29400a23bdaSmrg ibs_request.number_of_ibs = 1; 29500a23bdaSmrg ibs_request.ibs = &ib_info; 29600a23bdaSmrg ibs_request.resources = bo_list; 29700a23bdaSmrg ibs_request.fence_info.handle = NULL; 29800a23bdaSmrg for (i = 0; i < 200; i++) { 29900a23bdaSmrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 30000a23bdaSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 30100a23bdaSmrg 30200a23bdaSmrg } 30300a23bdaSmrg 30400a23bdaSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 30500a23bdaSmrg fence_status.context = context_handle; 30600a23bdaSmrg fence_status.ip_type = ip_type; 30700a23bdaSmrg fence_status.ip_instance = 0; 30800a23bdaSmrg fence_status.ring = 0; 30900a23bdaSmrg fence_status.fence = ibs_request.seq_no; 31000a23bdaSmrg 31100a23bdaSmrg r = amdgpu_cs_query_fence_status(&fence_status, 31200a23bdaSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 31300a23bdaSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 31400a23bdaSmrg 31500a23bdaSmrg pthread_join(stress_thread, NULL); 31600a23bdaSmrg 31700a23bdaSmrg r = amdgpu_bo_list_destroy(bo_list); 31800a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 31900a23bdaSmrg 32000a23bdaSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 32100a23bdaSmrg ib_result_mc_address, 4096); 32200a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 32300a23bdaSmrg 32400a23bdaSmrg r = amdgpu_cs_ctx_free(context_handle); 32500a23bdaSmrg CU_ASSERT_EQUAL(r, 0); 32600a23bdaSmrg} 3276532f28eSmrg 3285324fb0dSmrgstatic void amdgpu_deadlock_sdma(void) 3295324fb0dSmrg{ 3305324fb0dSmrg amdgpu_context_handle context_handle; 3315324fb0dSmrg amdgpu_bo_handle ib_result_handle; 3325324fb0dSmrg void *ib_result_cpu; 3335324fb0dSmrg uint64_t ib_result_mc_address; 3345324fb0dSmrg struct amdgpu_cs_request ibs_request; 3355324fb0dSmrg struct amdgpu_cs_ib_info ib_info; 3365324fb0dSmrg struct amdgpu_cs_fence fence_status; 3375324fb0dSmrg uint32_t expired; 3385324fb0dSmrg int i, r; 3395324fb0dSmrg amdgpu_bo_list_handle bo_list; 3405324fb0dSmrg amdgpu_va_handle va_handle; 3415324fb0dSmrg struct drm_amdgpu_info_hw_ip info; 3425324fb0dSmrg uint32_t ring_id; 3435324fb0dSmrg 3445324fb0dSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_DMA, 0, &info); 3455324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3465324fb0dSmrg 3475324fb0dSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 3485324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3495324fb0dSmrg 3505324fb0dSmrg for (ring_id = 0; (1 << ring_id) & info.available_rings; ring_id++) { 3515324fb0dSmrg r = pthread_create(&stress_thread, NULL, write_mem_address, NULL); 3525324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3535324fb0dSmrg 3545324fb0dSmrg r = amdgpu_bo_alloc_and_map_raw(device_handle, 4096, 4096, 3555324fb0dSmrg AMDGPU_GEM_DOMAIN_GTT, 0, use_uc_mtype ? AMDGPU_VM_MTYPE_UC : 0, 3565324fb0dSmrg &ib_result_handle, &ib_result_cpu, 3575324fb0dSmrg &ib_result_mc_address, &va_handle); 3585324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3595324fb0dSmrg 3605324fb0dSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 3615324fb0dSmrg &bo_list); 3625324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 3635324fb0dSmrg 3645324fb0dSmrg ptr = ib_result_cpu; 3655324fb0dSmrg i = 0; 3665324fb0dSmrg 3675324fb0dSmrg ptr[i++] = SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) | 3685324fb0dSmrg (0 << 26) | /* WAIT_REG_MEM */ 3695324fb0dSmrg (4 << 28) | /* != */ 3705324fb0dSmrg (1 << 31); /* memory */ 3715324fb0dSmrg ptr[i++] = (ib_result_mc_address + 256*4) & 0xfffffffc; 3725324fb0dSmrg ptr[i++] = ((ib_result_mc_address + 256*4) >> 32) & 0xffffffff; 3735324fb0dSmrg ptr[i++] = 0x00000000; /* reference value */ 3745324fb0dSmrg ptr[i++] = 0xffffffff; /* and mask */ 3755324fb0dSmrg ptr[i++] = 4 | /* poll interval */ 3765324fb0dSmrg (0xfff << 16); /* retry count */ 3775324fb0dSmrg 3785324fb0dSmrg for (; i < 16; i++) 3795324fb0dSmrg ptr[i] = 0; 3805324fb0dSmrg 3815324fb0dSmrg ptr[256] = 0x0; /* the memory we wait on to change */ 3825324fb0dSmrg 3835324fb0dSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 3845324fb0dSmrg ib_info.ib_mc_address = ib_result_mc_address; 3855324fb0dSmrg ib_info.size = 16; 3865324fb0dSmrg 3875324fb0dSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 3885324fb0dSmrg ibs_request.ip_type = AMDGPU_HW_IP_DMA; 3895324fb0dSmrg ibs_request.ring = ring_id; 3905324fb0dSmrg ibs_request.number_of_ibs = 1; 3915324fb0dSmrg ibs_request.ibs = &ib_info; 3925324fb0dSmrg ibs_request.resources = bo_list; 3935324fb0dSmrg ibs_request.fence_info.handle = NULL; 3945324fb0dSmrg 3955324fb0dSmrg for (i = 0; i < 200; i++) { 3965324fb0dSmrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 3975324fb0dSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 3985324fb0dSmrg 3995324fb0dSmrg } 4005324fb0dSmrg 4015324fb0dSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 4025324fb0dSmrg fence_status.context = context_handle; 4035324fb0dSmrg fence_status.ip_type = AMDGPU_HW_IP_DMA; 4045324fb0dSmrg fence_status.ip_instance = 0; 4055324fb0dSmrg fence_status.ring = ring_id; 4065324fb0dSmrg fence_status.fence = ibs_request.seq_no; 4075324fb0dSmrg 4085324fb0dSmrg r = amdgpu_cs_query_fence_status(&fence_status, 4095324fb0dSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 4105324fb0dSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 4115324fb0dSmrg 4125324fb0dSmrg pthread_join(stress_thread, NULL); 4135324fb0dSmrg 4145324fb0dSmrg r = amdgpu_bo_list_destroy(bo_list); 4155324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 4165324fb0dSmrg 4175324fb0dSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4185324fb0dSmrg ib_result_mc_address, 4096); 4195324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 4205324fb0dSmrg } 4215324fb0dSmrg r = amdgpu_cs_ctx_free(context_handle); 4225324fb0dSmrg CU_ASSERT_EQUAL(r, 0); 4235324fb0dSmrg} 4245324fb0dSmrg 4256532f28eSmrgstatic void bad_access_helper(int reg_access) 4266532f28eSmrg{ 4276532f28eSmrg amdgpu_context_handle context_handle; 4286532f28eSmrg amdgpu_bo_handle ib_result_handle; 4296532f28eSmrg void *ib_result_cpu; 4306532f28eSmrg uint64_t ib_result_mc_address; 4316532f28eSmrg struct amdgpu_cs_request ibs_request; 4326532f28eSmrg struct amdgpu_cs_ib_info ib_info; 4336532f28eSmrg struct amdgpu_cs_fence fence_status; 4346532f28eSmrg uint32_t expired; 4356532f28eSmrg int i, r; 4366532f28eSmrg amdgpu_bo_list_handle bo_list; 4376532f28eSmrg amdgpu_va_handle va_handle; 4386532f28eSmrg 4396532f28eSmrg r = amdgpu_cs_ctx_create(device_handle, &context_handle); 4406532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4416532f28eSmrg 4426532f28eSmrg r = amdgpu_bo_alloc_and_map_raw(device_handle, 4096, 4096, 4436532f28eSmrg AMDGPU_GEM_DOMAIN_GTT, 0, 0, 4446532f28eSmrg &ib_result_handle, &ib_result_cpu, 4456532f28eSmrg &ib_result_mc_address, &va_handle); 4466532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4476532f28eSmrg 4486532f28eSmrg r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL, 4496532f28eSmrg &bo_list); 4506532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4516532f28eSmrg 4526532f28eSmrg ptr = ib_result_cpu; 4536532f28eSmrg i = 0; 4546532f28eSmrg 4556532f28eSmrg ptr[i++] = PACKET3(PACKET3_WRITE_DATA, 3); 4566532f28eSmrg ptr[i++] = (reg_access ? WRITE_DATA_DST_SEL(0) : WRITE_DATA_DST_SEL(5))| WR_CONFIRM; 4576532f28eSmrg ptr[i++] = reg_access ? mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR : 0xdeadbee0; 4586532f28eSmrg ptr[i++] = 0; 4596532f28eSmrg ptr[i++] = 0xdeadbeef; 4606532f28eSmrg 4616532f28eSmrg for (; i < 16; ++i) 4626532f28eSmrg ptr[i] = 0xffff1000; 4636532f28eSmrg 4646532f28eSmrg memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info)); 4656532f28eSmrg ib_info.ib_mc_address = ib_result_mc_address; 4666532f28eSmrg ib_info.size = 16; 4676532f28eSmrg 4686532f28eSmrg memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request)); 4696532f28eSmrg ibs_request.ip_type = AMDGPU_HW_IP_GFX; 4706532f28eSmrg ibs_request.ring = 0; 4716532f28eSmrg ibs_request.number_of_ibs = 1; 4726532f28eSmrg ibs_request.ibs = &ib_info; 4736532f28eSmrg ibs_request.resources = bo_list; 4746532f28eSmrg ibs_request.fence_info.handle = NULL; 4756532f28eSmrg 4766532f28eSmrg r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1); 4776532f28eSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 4786532f28eSmrg 4796532f28eSmrg 4806532f28eSmrg memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence)); 4816532f28eSmrg fence_status.context = context_handle; 4826532f28eSmrg fence_status.ip_type = AMDGPU_HW_IP_GFX; 4836532f28eSmrg fence_status.ip_instance = 0; 4846532f28eSmrg fence_status.ring = 0; 4856532f28eSmrg fence_status.fence = ibs_request.seq_no; 4866532f28eSmrg 4876532f28eSmrg r = amdgpu_cs_query_fence_status(&fence_status, 4886532f28eSmrg AMDGPU_TIMEOUT_INFINITE,0, &expired); 4896532f28eSmrg CU_ASSERT_EQUAL((r == 0 || r == -ECANCELED), 1); 4906532f28eSmrg 4916532f28eSmrg r = amdgpu_bo_list_destroy(bo_list); 4926532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4936532f28eSmrg 4946532f28eSmrg r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle, 4956532f28eSmrg ib_result_mc_address, 4096); 4966532f28eSmrg CU_ASSERT_EQUAL(r, 0); 4976532f28eSmrg 4986532f28eSmrg r = amdgpu_cs_ctx_free(context_handle); 4996532f28eSmrg CU_ASSERT_EQUAL(r, 0); 5006532f28eSmrg} 5016532f28eSmrg 5026532f28eSmrgstatic void amdgpu_illegal_reg_access() 5036532f28eSmrg{ 5046532f28eSmrg bad_access_helper(1); 5056532f28eSmrg} 5066532f28eSmrg 5076532f28eSmrgstatic void amdgpu_illegal_mem_access() 5086532f28eSmrg{ 5096532f28eSmrg bad_access_helper(0); 5106532f28eSmrg} 5119bd392adSmrg 5129bd392adSmrgstatic void amdgpu_dispatch_hang_gfx(void) 5139bd392adSmrg{ 5149bd392adSmrg amdgpu_dispatch_hang_helper(device_handle, AMDGPU_HW_IP_GFX); 5159bd392adSmrg} 5169bd392adSmrg 5179bd392adSmrgstatic void amdgpu_dispatch_hang_compute(void) 5189bd392adSmrg{ 5199bd392adSmrg amdgpu_dispatch_hang_helper(device_handle, AMDGPU_HW_IP_COMPUTE); 5209bd392adSmrg} 5219bd392adSmrg 5229bd392adSmrgstatic void amdgpu_dispatch_hang_slow_gfx(void) 5239bd392adSmrg{ 5249bd392adSmrg amdgpu_dispatch_hang_slow_helper(device_handle, AMDGPU_HW_IP_GFX); 5259bd392adSmrg} 5269bd392adSmrg 5279bd392adSmrgstatic void amdgpu_dispatch_hang_slow_compute(void) 5289bd392adSmrg{ 5299bd392adSmrg amdgpu_dispatch_hang_slow_helper(device_handle, AMDGPU_HW_IP_COMPUTE); 5309bd392adSmrg} 5319bd392adSmrg 5329bd392adSmrgstatic void amdgpu_draw_hang_gfx(void) 5339bd392adSmrg{ 5349bd392adSmrg int r; 5359bd392adSmrg struct drm_amdgpu_info_hw_ip info; 5360ed5401bSmrg uint32_t ring_id, version; 5379bd392adSmrg 5389bd392adSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_GFX, 0, &info); 5399bd392adSmrg CU_ASSERT_EQUAL(r, 0); 5409bd392adSmrg if (!info.available_rings) 5419bd392adSmrg printf("SKIP ... as there's no graphic ring\n"); 5429bd392adSmrg 5430ed5401bSmrg version = info.hw_ip_version_major; 5440ed5401bSmrg if (version != 9 && version != 10) { 5450ed5401bSmrg printf("SKIP ... unsupported gfx version %d\n", version); 5460ed5401bSmrg return; 5470ed5401bSmrg } 5480ed5401bSmrg 5499bd392adSmrg for (ring_id = 0; (1 << ring_id) & info.available_rings; ring_id++) { 5500ed5401bSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, version, 0); 5510ed5401bSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, version, 1); 5520ed5401bSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, version, 0); 5539bd392adSmrg } 5549bd392adSmrg} 5559bd392adSmrg 5569bd392adSmrgstatic void amdgpu_draw_hang_slow_gfx(void) 5579bd392adSmrg{ 5589bd392adSmrg struct drm_amdgpu_info_hw_ip info; 5590ed5401bSmrg uint32_t ring_id, version; 5609bd392adSmrg int r; 5619bd392adSmrg 5629bd392adSmrg r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_GFX, 0, &info); 5639bd392adSmrg CU_ASSERT_EQUAL(r, 0); 5649bd392adSmrg 5650ed5401bSmrg version = info.hw_ip_version_major; 5660ed5401bSmrg if (version != 9 && version != 10) { 5670ed5401bSmrg printf("SKIP ... unsupported gfx version %d\n", version); 5680ed5401bSmrg return; 5690ed5401bSmrg } 5700ed5401bSmrg 5719bd392adSmrg for (ring_id = 0; (1 << ring_id) & info.available_rings; ring_id++) { 5720ed5401bSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, version, 0); 5730ed5401bSmrg amdgpu_memcpy_draw_hang_slow_test(device_handle, ring_id, version); 5740ed5401bSmrg amdgpu_memcpy_draw_test(device_handle, ring_id, version, 0); 5759bd392adSmrg } 5769bd392adSmrg} 577