basic_tests.c revision f91b56dc8c604ec1c6f092d69550266d20dc9764
13c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/*
23c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Copyright 2014 Advanced Micro Devices, Inc.
33c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher *
43c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Permission is hereby granted, free of charge, to any person obtaining a
53c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * copy of this software and associated documentation files (the "Software"),
63c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * to deal in the Software without restriction, including without limitation
73c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * the rights to use, copy, modify, merge, publish, distribute, sublicense,
83c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * and/or sell copies of the Software, and to permit persons to whom the
93c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Software is furnished to do so, subject to the following conditions:
103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher *
113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * The above copyright notice and this permission notice shall be included in
123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * all copies or substantial portions of the Software.
133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher *
143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * OTHER DEALINGS IN THE SOFTWARE.
213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher *
223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher*/
233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdio.h>
243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdlib.h>
253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <unistd.h>
263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "CUnit/Basic.h"
283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_test.h"
303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_drm.h"
313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  amdgpu_device_handle device_handle;
333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  uint32_t  major_version;
343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  uint32_t  minor_version;
353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void);
373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void);
383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_gfx(void);
393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void);
403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void);
413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void);
423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex DeucherCU_TestInfo basic_tests[] = {
443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Query Info Test",  amdgpu_query_info_test },
453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Memory alloc Test",  amdgpu_memory_alloc },
463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Userptr Test",  amdgpu_userptr_test },
473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (GFX)",  amdgpu_command_submission_gfx },
483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (Compute)", amdgpu_command_submission_compute },
493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (SDMA)", amdgpu_command_submission_sdma },
503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_TEST_INFO_NULL,
513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher};
523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define BUFFER_SIZE (8 * 1024)
533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_offset 0
543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_mask   0x000000FF
553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_shift  0
563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift)
573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_CONSTANT_FILL  11
583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_CONSTANT_FILL_EXTRA_SIZE(x)           ((x) << 14)
593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* 0 = byte fill
603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	 * 2 = DW fill
613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	 */
623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PACKET(op, sub_op, e)	((((e) & 0xFFFF) << 16) |	\
633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					(((sub_op) & 0xFF) << 8) |	\
643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					(((op) & 0xFF) << 0))
653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define	SDMA_OPCODE_WRITE				  2
663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_WRITE_SUB_OPCODE_LINEAR               0
673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_WRTIE_SUB_OPCODE_TILED                1
683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define	SDMA_OPCODE_COPY				  1
703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_COPY_SUB_OPCODE_LINEAR                0
713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_init(void)
733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_device_initialize(drm_amdgpu[0], &major_version,
773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				   &minor_version, &device_handle);
783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	if (r == 0)
803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SUCCESS;
813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	else
823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SINIT_FAILED;
833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_clean(void)
863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r = amdgpu_device_deinitialize(device_handle);
883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	if (r == 0)
903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SUCCESS;
913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	else
923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SCLEAN_FAILED;
933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void)
963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_gpu_info gpu_info = {0};
983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t version, feature;
993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_query_gpu_info(device_handle, &gpu_info);
1023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0,
1053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					  0, &version, &feature);
1063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void)
1103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
1123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
1133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test visible VRAM */
1163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_VRAM,
1193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
1203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			&bo_mc);
1213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(bo);
1233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test invisible VRAM */
1263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_VRAM,
1293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_CREATE_NO_CPU_ACCESS,
1303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			&bo_mc);
1313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(bo);
1333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test GART Cacheable */
1363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_GTT,
1393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			0,
1403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			&bo_mc);
1413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(bo);
1433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test GART USWC */
1463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_GTT,
149a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou			AMDGPU_GEM_CREATE_CPU_GTT_USWC,
1503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			&bo_mc);
1513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(bo);
1533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
156ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_separate_ibs(void)
1573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
159646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle, ib_result_ce_handle;
160646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu, *ib_result_ce_cpu;
161646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address, ib_result_ce_mc_address;
1623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request = {0};
1633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info[2];
1643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_query_fence fence_status = {0};
1653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
1663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
16776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_list_handle bo_list;
1683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
173646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
174646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
175646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
176646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_mc_address);
1773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
179646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
180646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
181646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_ce_handle, &ib_result_ce_cpu,
182646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_ce_mc_address);
1833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
18576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_get_bo_list(device_handle, ib_result_handle,
18676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák			       ib_result_ce_handle, &bo_list);
18776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
18876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
1893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
1903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_SET_CE_DE_COUNTERS */
192646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_ce_cpu;
1933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008900;
1943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0;
1953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[2] = 0xc0008400;
1963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[3] = 1;
19776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[0].ib_mc_address = ib_result_ce_mc_address;
1983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[0].size = 4;
199db126d1d8a764b9d3ad322779b13904867b14e5cJammy Zhou	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
2003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_WAIT_ON_CE_COUNTER */
202646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_cpu;
2033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008600;
2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0x00000001;
20576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[1].ib_mc_address = ib_result_mc_address;
2063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[1].size = 2;
2073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.number_of_ibs = 2;
2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ibs = ib_info;
21176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ibs_request.resources = bo_list;
2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2139c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_submit(context_handle, 0,
2143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			     &ibs_request, 1, &fence_status.fence);
2153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
2183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_GFX;
2193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
220f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status,
221f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 AMDGPU_TIMEOUT_INFINITE,
222f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 0, &expired);
2233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
225646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_free(ib_result_handle);
2261041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
2271041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
228646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_free(ib_result_ce_handle);
2291041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
2301041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
23176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_bo_list_destroy(bo_list);
23276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
23376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
2349c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
2353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
2373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
238ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_shared_ib(void)
239ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{
240ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_context_handle context_handle;
241646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
242646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
243646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
244ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_request ibs_request = {0};
245ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_ib_info ib_info[2];
246ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_query_fence fence_status = {0};
247ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	uint32_t *ptr;
248ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	uint32_t expired;
24976af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_list_handle bo_list;
250ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	int r;
251ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
252ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
253ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
254ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
255646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
256646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
257646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
258646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_mc_address);
259ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
260ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
26176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL,
26276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák			       &bo_list);
26376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
26476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
265ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
266ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
267ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* IT_SET_CE_DE_COUNTERS */
268646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_cpu;
269ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[0] = 0xc0008900;
270ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[1] = 0;
271ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[2] = 0xc0008400;
272ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[3] = 1;
27376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[0].ib_mc_address = ib_result_mc_address;
274ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[0].size = 4;
275ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
276ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
277646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = (uint32_t *)ib_result_cpu + 4;
278ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[0] = 0xc0008600;
279ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[1] = 0x00000001;
28076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[1].ib_mc_address = ib_result_mc_address + 16;
281ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[1].size = 2;
282ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
283ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
284ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.number_of_ibs = 2;
285ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.ibs = ib_info;
28676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ibs_request.resources = bo_list;
287ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
288ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_submit(context_handle, 0,
289ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou			&ibs_request, 1, &fence_status.fence);
290ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
291ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
292ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	fence_status.context = context_handle;
293ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	fence_status.ip_type = AMDGPU_HW_IP_GFX;
294ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
295f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status,
296f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 AMDGPU_TIMEOUT_INFINITE,
297f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 0, &expired);
298ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
299ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
300646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_free(ib_result_handle);
3011041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
3021041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
30376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_bo_list_destroy(bo_list);
30476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
30576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
306ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_ctx_free(context_handle);
307ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
308ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou}
309ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
310ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx(void)
311ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{
312ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* separate IB buffers for multi-IB submission */
313ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_command_submission_gfx_separate_ibs();
314ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* shared IB buffer for multi-IB submission */
315ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_command_submission_gfx_shared_ib();
316ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou}
317ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
3183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void)
3193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
3203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
321646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
322646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
323646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
3243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request;
3253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info;
3263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_query_fence fence_status;
3273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
3283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
3293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, instance;
33076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_list_handle bo_list;
3313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
3333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	for (instance = 0; instance < 8; instance++) {
336646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
337646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    AMDGPU_GEM_DOMAIN_GTT, 0,
338646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    &ib_result_handle, &ib_result_cpu,
339646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    &ib_result_mc_address);
3403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
34276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL,
34376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák				       &bo_list);
34476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		CU_ASSERT_EQUAL(r, 0);
34576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
346646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		ptr = ib_result_cpu;
3473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		for (i = 0; i < 16; ++i)
3483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			ptr[i] = 0xffff1000;
3493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
35176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		ib_info.ib_mc_address = ib_result_mc_address;
3523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ib_info.size = 16;
3533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
3553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE;
3563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ring = instance;
3573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.number_of_ibs = 1;
3583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ibs = &ib_info;
35976af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		ibs_request.resources = bo_list;
3603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&fence_status, 0, sizeof(struct amdgpu_cs_query_fence));
3629c2afffedb773da27fd7506b31fc2164f329d3a8Christian König		r = amdgpu_cs_submit(context_handle, 0,
3633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				     &ibs_request, 1, &fence_status.fence);
3643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.context = context_handle;
3673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ip_type = AMDGPU_HW_IP_COMPUTE;
3683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ring = instance;
3693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
370f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou		r = amdgpu_cs_query_fence_status(&fence_status,
371f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou						 AMDGPU_TIMEOUT_INFINITE,
372f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou						 0, &expired);
3733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3741041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
37576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		r = amdgpu_bo_list_destroy(bo_list);
37676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		CU_ASSERT_EQUAL(r, 0);
37776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
378646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		r = amdgpu_bo_free(ib_result_handle);
3791041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou		CU_ASSERT_EQUAL(r, 0);
3803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
3813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3829c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
3833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
3853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/*
3873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * caller need create/release:
3883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * pm4_src, resources, ib_info, and ibs_request
3893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * submit command stream described in ibs_request and wait for this IB accomplished
3903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */
3913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_sdma_test_exec_cs(amdgpu_context_handle context_handle,
3923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int instance, int pm4_dw, uint32_t *pm4_src,
3933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int res_cnt, amdgpu_bo_handle *resources,
3943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_ib_info *ib_info,
3953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_request *ibs_request)
3963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
39776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	int r;
3983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
3993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ring_ptr;
400646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
401646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
402646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
4033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_query_fence fence_status = {0};
40476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1));
4053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare CS */
4073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4_src, NULL);
4083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
4093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
4103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_TRUE(pm4_dw <= 1024);
4123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* allocate IB */
414646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
415646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
416646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
417646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_mc_address);
4183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* copy PM4 packet to ring from caller */
421646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ring_ptr = ib_result_cpu;
4223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src));
4233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
42476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info->ib_mc_address = ib_result_mc_address;
4253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info->size = pm4_dw;
4263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ip_type = AMDGPU_HW_IP_DMA;
4283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ring = instance;
4293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->number_of_ibs = 1;
4303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ibs = ib_info;
4313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
43276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	memcpy(all_res, resources, sizeof(resources[0]) * res_cnt);
43376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	all_res[res_cnt] = ib_result_handle;
43476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
43576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_bo_list_create(device_handle, res_cnt+1, all_res,
4366dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König				  NULL, &ibs_request->resources);
4376dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	CU_ASSERT_EQUAL(r, 0);
4383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* submit CS */
4429c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_submit(context_handle, 0,
4433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			 ibs_request, 1, &fence_status.fence);
4443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4466dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	r = amdgpu_bo_list_destroy(ibs_request->resources);
4476dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	CU_ASSERT_EQUAL(r, 0);
4486dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König
4493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_DMA;
4503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ring = ibs_request->ring;
4513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
4523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* wait for IB accomplished */
454f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status,
455f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 AMDGPU_TIMEOUT_INFINITE,
456f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 0, &expired);
4573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(expired, true);
4591041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
460646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_free(ib_result_handle);
4611041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
4623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
4633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_write_linear(void)
4653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
4663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 128;
4673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
4683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
4693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
4703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
4713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
4723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
4733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
4743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
4753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
4763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
477a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
4783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
4803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
4813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
4833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
4843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
4863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
4893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
4923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
4933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
4943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
496a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop < 2) {
4973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
4983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		bo = gpu_mem_alloc(device_handle,
4993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				sdma_write_length * sizeof(uint32_t),
5003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				4096, AMDGPU_GEM_DOMAIN_GTT,
5013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				gtt_flags[loop], &bo_mc);
5023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0);
5043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_NOT_EQUAL(bo_cpu, NULL);
5053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
5073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t));
5083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
5113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA write-linear */
5133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
5143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
5153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
5163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
5173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
5183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
5193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(j++ < sdma_write_length)
5203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xdeadbeaf;
5213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
5233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
5243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
5253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
5263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
5283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
5293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < sdma_write_length) {
5303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
5313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
5323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_bo_free(bo);
5333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
5343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
5353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
5363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
5373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
5383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
5393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
5403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
5429c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
5433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
5453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_const_fill(void)
5473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
5483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024 * 1024;
5493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
5503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
5513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
5523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
5533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
5543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
5553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
5563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
5573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
5583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
559a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
5603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
5623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
5633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
5653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
5663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
5683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
5693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
5713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
5743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
5753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
5763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
578a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop < 2) {
5793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
5803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		bo = gpu_mem_alloc(device_handle,
5813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				sdma_write_length, 4096,
5823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				AMDGPU_GEM_DOMAIN_GTT,
5833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				gtt_flags[loop], &bo_mc);
5843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0);
5863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_NOT_EQUAL(bo_cpu, NULL);
5873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
5893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length);
5903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
5923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA const fill */
5943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
5953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0,
5963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				   SDMA_CONSTANT_FILL_EXTRA_SIZE(2));
5973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
5983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
5993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
6003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
6013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
6033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
6043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
6053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
6063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
6083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
6093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < (sdma_write_length / 4)) {
6103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
6113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
6123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_bo_free(bo);
6133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
6143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
6153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
6163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
6173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
6183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
6193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
6203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
6229c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
6233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
6253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_copy_linear(void)
6273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
6283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024;
6293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
6303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
6313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo1, bo2;
6323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
6333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
6343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
6353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
6363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo1_mc, bo2_mc;
6373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile unsigned char *bo1_cpu, *bo2_cpu;
6383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop1, loop2;
639a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
6403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
6423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
6433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
6453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
6463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
6483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
6493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
6513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
6543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(2, sizeof(amdgpu_bo_handle));
6553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
6563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop1 = loop2 = 0;
6583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* run 9 circle to test all mapping combination */
659a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop1 < 2) {
660a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou		while(loop2 < 2) {
6613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo1for sDMA use */
6623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			bo1 = gpu_mem_alloc(device_handle,
6633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					sdma_write_length, 4096,
6643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					AMDGPU_GEM_DOMAIN_GTT,
6653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					gtt_flags[loop1], &bo1_mc);
6663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo1, (void **)&bo1_cpu), 0);
6683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_NOT_EQUAL(bo1_cpu, NULL);
6693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* set bo1 */
6713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo1_cpu, 0xaa, sdma_write_length);
6723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo2 for sDMA use */
6743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			bo2 = gpu_mem_alloc(device_handle,
6753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					sdma_write_length, 4096,
6763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					AMDGPU_GEM_DOMAIN_GTT,
6773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					gtt_flags[loop2], &bo2_mc);
6783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo2, (void **)&bo2_cpu), 0);
6803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_NOT_EQUAL(bo2_cpu, NULL);
6813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* clear bo2 */
6833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo2_cpu, 0, sdma_write_length);
6843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[0] = bo1;
6863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[1] = bo2;
6873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* fullfill PM4: test DMA copy linear */
6893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = j = 0;
6903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0);
6913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = sdma_write_length;
6923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0;
6933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo1_mc;
6943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
6953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo2_mc;
6963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
6973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_sdma_test_exec_cs(context_handle, 0,
7003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						i, pm4,
7013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						2, resources,
7023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						ib_info, ibs_request);
7033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* verify if SDMA test result meets with expected */
7053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = 0;
7063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			while(i < sdma_write_length) {
7073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa);
7083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			}
7093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_bo_free(bo1);
7103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_bo_free(bo2);
7113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			loop2++;
7123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
7133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop1++;
7143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
7153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
7163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
7173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
7183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
7193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
7203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
7229c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
7233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
7253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void)
7273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
7283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_write_linear();
7293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_const_fill();
7303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_copy_linear();
7313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
7323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void)
7343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
7353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, j;
7363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4 = NULL;
7373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
7383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	void *ptr = NULL;
7393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int pm4_dw = 256;
7403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int sdma_write_length = 4;
7413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle handle;
7423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
7433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
7443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
7453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_bo_alloc_result res;
7463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(&res, 0, sizeof(res));
7483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
7503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
7513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
7533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
7543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
7563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
7573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
7593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE);
7623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ptr, NULL);
7633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ptr, 0, BUFFER_SIZE);
7643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_create_bo_from_user_mem(device_handle,
7663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					   ptr, BUFFER_SIZE, &res);
7673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo_mc = res.virtual_mc_base_address;
7693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	handle = res.buf_handle;
7703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	j = i = 0;
7723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
7733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			       SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
7743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = 0xffffffff & bo_mc;
7753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
7763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = sdma_write_length;
7773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (j++ < sdma_write_length)
7793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
7803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_sdma_test_exec_cs(context_handle, 0,
7823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 i, pm4,
7833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 1, &handle,
7843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 ib_info, ibs_request);
7853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	i = 0;
7863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (i < sdma_write_length) {
7873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf);
7883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
7893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
7903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
7913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
7923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(res.buf_handle);
7933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ptr);
7953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7969c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
7973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
799