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*/
2325784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer
2425784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer#ifdef HAVE_CONFIG_H
2525784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer#include "config.h"
2625784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer#endif
2725784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer
283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdio.h>
293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdlib.h>
303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <unistd.h>
3194ecdcb8b11dd3eb6b047ad72030d775014aadeeAlan Coopersmith#ifdef HAVE_ALLOCA_H
3294ecdcb8b11dd3eb6b047ad72030d775014aadeeAlan Coopersmith# include <alloca.h>
3394ecdcb8b11dd3eb6b047ad72030d775014aadeeAlan Coopersmith#endif
343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "CUnit/Basic.h"
363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_test.h"
383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_drm.h"
393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  amdgpu_device_handle device_handle;
413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  uint32_t  major_version;
423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  uint32_t  minor_version;
433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void);
453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void);
463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_gfx(void);
473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void);
483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void);
493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void);
503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex DeucherCU_TestInfo basic_tests[] = {
523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Query Info Test",  amdgpu_query_info_test },
533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Memory alloc Test",  amdgpu_memory_alloc },
543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Userptr Test",  amdgpu_userptr_test },
553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (GFX)",  amdgpu_command_submission_gfx },
563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (Compute)", amdgpu_command_submission_compute },
573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (SDMA)", amdgpu_command_submission_sdma },
583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_TEST_INFO_NULL,
593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher};
603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define BUFFER_SIZE (8 * 1024)
613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_offset 0
623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_mask   0x000000FF
633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_shift  0
643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift)
653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_CONSTANT_FILL  11
663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_CONSTANT_FILL_EXTRA_SIZE(x)           ((x) << 14)
673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* 0 = byte fill
683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	 * 2 = DW fill
693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	 */
703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PACKET(op, sub_op, e)	((((e) & 0xFFFF) << 16) |	\
713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					(((sub_op) & 0xFF) << 8) |	\
723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					(((op) & 0xFF) << 0))
733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define	SDMA_OPCODE_WRITE				  2
743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_WRITE_SUB_OPCODE_LINEAR               0
753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_WRTIE_SUB_OPCODE_TILED                1
763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define	SDMA_OPCODE_COPY				  1
783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_COPY_SUB_OPCODE_LINEAR                0
793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_init(void)
813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_device_initialize(drm_amdgpu[0], &major_version,
853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				   &minor_version, &device_handle);
863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	if (r == 0)
883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SUCCESS;
893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	else
903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SINIT_FAILED;
913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_clean(void)
943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r = amdgpu_device_deinitialize(device_handle);
963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	if (r == 0)
983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SUCCESS;
993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	else
1003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SCLEAN_FAILED;
1013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void)
1043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_gpu_info gpu_info = {0};
1063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t version, feature;
1073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_query_gpu_info(device_handle, &gpu_info);
1103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0,
1133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					  0, &version, &feature);
1143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void)
1183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
1208aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
1213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
1223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test visible VRAM */
1253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_VRAM,
1283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
1298aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			&bo_mc, &va_handle);
1303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1318aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
1323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test invisible VRAM */
1353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_VRAM,
1383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_CREATE_NO_CPU_ACCESS,
1398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			&bo_mc, &va_handle);
1403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1418aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
1423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test GART Cacheable */
1453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_GTT,
1488aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			0, &bo_mc, &va_handle);
1493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1508aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
1513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test GART USWC */
1543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_GTT,
157a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou			AMDGPU_GEM_CREATE_CPU_GTT_USWC,
1588aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			&bo_mc, &va_handle);
1593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1608aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
1613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
164ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_separate_ibs(void)
1653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
167646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle, ib_result_ce_handle;
168646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu, *ib_result_ce_cpu;
169646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address, ib_result_ce_mc_address;
1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request = {0};
1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info[2];
1725463d2e83a450a0428f6c46561c5e2a54a229589Christian König	struct amdgpu_cs_fence fence_status = {0};
1733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
1743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
17576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_list_handle bo_list;
1768aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle, va_handle_ce;
1773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
1803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
182646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
183646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
184646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
1858aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				    &ib_result_mc_address, &va_handle);
1863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
188646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
189646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
190646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_ce_handle, &ib_result_ce_cpu,
1918aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				    &ib_result_ce_mc_address, &va_handle_ce);
1923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
19476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_get_bo_list(device_handle, ib_result_handle,
19576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák			       ib_result_ce_handle, &bo_list);
19676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
19776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
1983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
1993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_SET_CE_DE_COUNTERS */
201646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_ce_cpu;
2023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008900;
2033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0;
2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[2] = 0xc0008400;
2053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[3] = 1;
20676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[0].ib_mc_address = ib_result_ce_mc_address;
2073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[0].size = 4;
208db126d1d8a764b9d3ad322779b13904867b14e5cJammy Zhou	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_WAIT_ON_CE_COUNTER */
211646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_cpu;
2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008600;
2133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0x00000001;
21476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[1].ib_mc_address = ib_result_mc_address;
2153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[1].size = 2;
2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
2183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.number_of_ibs = 2;
2193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ibs = ib_info;
22076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ibs_request.resources = bo_list;
221926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	ibs_request.fence_info.handle = NULL;
222926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang
223926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1);
2243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
2283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_GFX;
229926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	fence_status.fence = ibs_request.seq_no;
2303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
231f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status,
232f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 AMDGPU_TIMEOUT_INFINITE,
233f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 0, &expired);
2343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2368aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
2378aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				     ib_result_mc_address, 4096);
2381041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
2391041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
2408aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce,
2418aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				     ib_result_ce_mc_address, 4096);
2421041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
2431041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
24476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_bo_list_destroy(bo_list);
24576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
24676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
2479c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
2483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
249926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang
2503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
2513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
252ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_shared_ib(void)
253ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{
254ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_context_handle context_handle;
255646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
256646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
257646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
258ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_request ibs_request = {0};
259ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_ib_info ib_info[2];
2605463d2e83a450a0428f6c46561c5e2a54a229589Christian König	struct amdgpu_cs_fence fence_status = {0};
261ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	uint32_t *ptr;
262ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	uint32_t expired;
26376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_list_handle bo_list;
2648aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
265ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	int r;
266ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
267ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
268ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
269ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
270646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
271646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
272646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
2738aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				    &ib_result_mc_address, &va_handle);
274ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
275ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
27676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL,
27776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák			       &bo_list);
27876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
27976af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
280ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
281ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
282ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* IT_SET_CE_DE_COUNTERS */
283646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_cpu;
284ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[0] = 0xc0008900;
285ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[1] = 0;
286ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[2] = 0xc0008400;
287ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[3] = 1;
28876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[0].ib_mc_address = ib_result_mc_address;
289ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[0].size = 4;
290ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
291ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
292646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = (uint32_t *)ib_result_cpu + 4;
293ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[0] = 0xc0008600;
294ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[1] = 0x00000001;
29576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[1].ib_mc_address = ib_result_mc_address + 16;
296ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[1].size = 2;
297ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
298ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
299ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.number_of_ibs = 2;
300ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.ibs = ib_info;
30176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ibs_request.resources = bo_list;
302926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	ibs_request.fence_info.handle = NULL;
303926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang
304926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	r = amdgpu_cs_submit(context_handle, 0, &ibs_request, 1);
305ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
306ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
307ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
308ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	fence_status.context = context_handle;
309ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	fence_status.ip_type = AMDGPU_HW_IP_GFX;
310926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	fence_status.fence = ibs_request.seq_no;
311ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
312f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status,
313f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 AMDGPU_TIMEOUT_INFINITE,
314f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 0, &expired);
315ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
316ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
3178aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
3188aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				     ib_result_mc_address, 4096);
3191041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
3201041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
32176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_bo_list_destroy(bo_list);
32276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
32376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
324ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_ctx_free(context_handle);
325ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
326ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou}
327ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
328ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx(void)
329ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{
330ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* separate IB buffers for multi-IB submission */
331ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_command_submission_gfx_separate_ibs();
332ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* shared IB buffer for multi-IB submission */
333ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_command_submission_gfx_shared_ib();
334ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou}
335ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
3363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void)
3373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
3383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
339646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
340646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
341646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
3423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request;
3433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info;
3445463d2e83a450a0428f6c46561c5e2a54a229589Christian König	struct amdgpu_cs_fence fence_status;
3453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
3463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
3473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, instance;
34876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_list_handle bo_list;
3498aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
3503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
3523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	for (instance = 0; instance < 8; instance++) {
355646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
356646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    AMDGPU_GEM_DOMAIN_GTT, 0,
357646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    &ib_result_handle, &ib_result_cpu,
3588aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    &ib_result_mc_address, &va_handle);
3593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
36176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL,
36276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák				       &bo_list);
36376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		CU_ASSERT_EQUAL(r, 0);
36476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
365646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		ptr = ib_result_cpu;
3663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		for (i = 0; i < 16; ++i)
3673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			ptr[i] = 0xffff1000;
3683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
37076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		ib_info.ib_mc_address = ib_result_mc_address;
3713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ib_info.size = 16;
3723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
3743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE;
3753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ring = instance;
3763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.number_of_ibs = 1;
3773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ibs = &ib_info;
37876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		ibs_request.resources = bo_list;
379926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang		ibs_request.fence_info.handle = NULL;
3803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3815463d2e83a450a0428f6c46561c5e2a54a229589Christian König		memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence));
382926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang		r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1);
3833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.context = context_handle;
3863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ip_type = AMDGPU_HW_IP_COMPUTE;
3873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ring = instance;
388926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang		fence_status.fence = ibs_request.seq_no;
3893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
390f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou		r = amdgpu_cs_query_fence_status(&fence_status,
391f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou						 AMDGPU_TIMEOUT_INFINITE,
392f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou						 0, &expired);
3933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3941041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
39576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		r = amdgpu_bo_list_destroy(bo_list);
39676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		CU_ASSERT_EQUAL(r, 0);
39776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
3988aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
3998aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					     ib_result_mc_address, 4096);
4001041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou		CU_ASSERT_EQUAL(r, 0);
4013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
4023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4039c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
4043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
4063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/*
4083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * caller need create/release:
4093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * pm4_src, resources, ib_info, and ibs_request
4103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * submit command stream described in ibs_request and wait for this IB accomplished
4113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */
4123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_sdma_test_exec_cs(amdgpu_context_handle context_handle,
4133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int instance, int pm4_dw, uint32_t *pm4_src,
4143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int res_cnt, amdgpu_bo_handle *resources,
4153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_ib_info *ib_info,
4163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_request *ibs_request)
4173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
41876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	int r;
4193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
4203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ring_ptr;
421646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
422646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
423646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
4245463d2e83a450a0428f6c46561c5e2a54a229589Christian König	struct amdgpu_cs_fence fence_status = {0};
42576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1));
4268aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
4273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare CS */
4293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4_src, NULL);
4303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
4313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
4323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_TRUE(pm4_dw <= 1024);
4343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* allocate IB */
436646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
437646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
438646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
4398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				    &ib_result_mc_address, &va_handle);
4403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* copy PM4 packet to ring from caller */
443646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ring_ptr = ib_result_cpu;
4443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src));
4453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
44676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info->ib_mc_address = ib_result_mc_address;
4473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info->size = pm4_dw;
4483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ip_type = AMDGPU_HW_IP_DMA;
4503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ring = instance;
4513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->number_of_ibs = 1;
4523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ibs = ib_info;
453926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	ibs_request->fence_info.handle = NULL;
4543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
45576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	memcpy(all_res, resources, sizeof(resources[0]) * res_cnt);
45676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	all_res[res_cnt] = ib_result_handle;
45776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
45876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_bo_list_create(device_handle, res_cnt+1, all_res,
4596dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König				  NULL, &ibs_request->resources);
4606dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	CU_ASSERT_EQUAL(r, 0);
4613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* submit CS */
465926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	r = amdgpu_cs_submit(context_handle, 0, ibs_request, 1);
4663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4686dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	r = amdgpu_bo_list_destroy(ibs_request->resources);
4696dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	CU_ASSERT_EQUAL(r, 0);
4706dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König
4713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_DMA;
4723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ring = ibs_request->ring;
4733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
474926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	fence_status.fence = ibs_request->seq_no;
4753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* wait for IB accomplished */
477f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status,
478f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 AMDGPU_TIMEOUT_INFINITE,
479f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 0, &expired);
4803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(expired, true);
4821041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
4838aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
4848aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				     ib_result_mc_address, 4096);
4851041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
4863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
4873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_write_linear(void)
4893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
4903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 128;
4913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
4923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
4933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
4943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
4953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
4963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
4973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
4983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
4993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
5003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
501a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
5028aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
5033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
5053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
5063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
5083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
5093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
5113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
5123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
5143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
5173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
5183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
5193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
521a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop < 2) {
5223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
5238aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_alloc_and_map(device_handle,
5248aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    sdma_write_length * sizeof(uint32_t),
5258aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    4096, AMDGPU_GEM_DOMAIN_GTT,
526d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer					    gtt_flags[loop], &bo, (void**)&bo_cpu,
5278aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    &bo_mc, &va_handle);
5288aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		CU_ASSERT_EQUAL(r, 0);
5293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
5313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t));
5323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
5353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA write-linear */
5373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
5383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
5393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
5403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
5413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
5423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
5433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(j++ < sdma_write_length)
5443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xdeadbeaf;
5453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
5473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
5483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
5493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
5503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
5523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
5533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < sdma_write_length) {
5543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
5553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
5568aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
5578aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc,
5588aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					     sdma_write_length * sizeof(uint32_t));
5598aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		CU_ASSERT_EQUAL(r, 0);
5603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
5613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
5623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
5633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
5643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
5653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
5663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
5673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
5699c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
5703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
5723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_const_fill(void)
5743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
5753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024 * 1024;
5763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
5773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
5783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
5793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
5803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
5813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
5823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
5833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
5843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
5853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
586a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
5878aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
5883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
5903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
5913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
5933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
5943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
5963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
5973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
5993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
6023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
6033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
6043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
606a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop < 2) {
6073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
6088aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_alloc_and_map(device_handle,
6098aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    sdma_write_length, 4096,
6108aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    AMDGPU_GEM_DOMAIN_GTT,
611d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer					    gtt_flags[loop], &bo, (void**)&bo_cpu,
6128aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    &bo_mc, &va_handle);
6138aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		CU_ASSERT_EQUAL(r, 0);
6143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
6163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length);
6173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
6193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA const fill */
6213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
6223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0,
6233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				   SDMA_CONSTANT_FILL_EXTRA_SIZE(2));
6243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
6253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
6263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
6273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
6283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
6303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
6313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
6323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
6333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
6353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
6363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < (sdma_write_length / 4)) {
6373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
6383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
6398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
6408aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc,
6418aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					     sdma_write_length);
6428aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		CU_ASSERT_EQUAL(r, 0);
6433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
6443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
6453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
6463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
6473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
6483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
6493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
6503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
6529c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
6533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
6553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_copy_linear(void)
6573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
6583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024;
6593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
6603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
6613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo1, bo2;
6623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
6633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
6643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
6653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
6663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo1_mc, bo2_mc;
6673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile unsigned char *bo1_cpu, *bo2_cpu;
6683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop1, loop2;
669a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
6708aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle bo1_va_handle, bo2_va_handle;
6713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
6733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
6743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
6763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
6773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
6793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
6803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
6823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
6853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(2, sizeof(amdgpu_bo_handle));
6863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
6873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop1 = loop2 = 0;
6893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* run 9 circle to test all mapping combination */
690a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop1 < 2) {
691a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou		while(loop2 < 2) {
6923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo1for sDMA use */
6938aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			r = amdgpu_bo_alloc_and_map(device_handle,
6948aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						    sdma_write_length, 4096,
6958aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						    AMDGPU_GEM_DOMAIN_GTT,
696d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    gtt_flags[loop1], &bo1,
697d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    (void**)&bo1_cpu, &bo1_mc,
698d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    &bo1_va_handle);
6998aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			CU_ASSERT_EQUAL(r, 0);
7003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* set bo1 */
7023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo1_cpu, 0xaa, sdma_write_length);
7033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo2 for sDMA use */
7058aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			r = amdgpu_bo_alloc_and_map(device_handle,
7068aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						    sdma_write_length, 4096,
7078aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						    AMDGPU_GEM_DOMAIN_GTT,
708d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    gtt_flags[loop2], &bo2,
709d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    (void**)&bo2_cpu, &bo2_mc,
710d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    &bo2_va_handle);
7118aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			CU_ASSERT_EQUAL(r, 0);
7123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* clear bo2 */
7143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo2_cpu, 0, sdma_write_length);
7153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[0] = bo1;
7173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[1] = bo2;
7183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* fullfill PM4: test DMA copy linear */
7203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = j = 0;
7213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0);
7223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = sdma_write_length;
7233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0;
7243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo1_mc;
7253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
7263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo2_mc;
7273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
7283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_sdma_test_exec_cs(context_handle, 0,
7313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						i, pm4,
7323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						2, resources,
7333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						ib_info, ibs_request);
7343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* verify if SDMA test result meets with expected */
7363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = 0;
7373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			while(i < sdma_write_length) {
7383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa);
7393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			}
7408aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			r = amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc,
7418aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						     sdma_write_length);
7428aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			CU_ASSERT_EQUAL(r, 0);
7438aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			r = amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc,
7448aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						     sdma_write_length);
7458aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			CU_ASSERT_EQUAL(r, 0);
7463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			loop2++;
7473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
7483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop1++;
7493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
7503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
7513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
7523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
7533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
7543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
7553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
7579c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
7583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
7603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void)
7623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
7633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_write_linear();
7643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_const_fill();
7653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_copy_linear();
7663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
7673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void)
7693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
7703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, j;
7713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4 = NULL;
7723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
7733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	void *ptr = NULL;
7743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int pm4_dw = 256;
7753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int sdma_write_length = 4;
7763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle handle;
7773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
7783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
7793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
7808aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_bo_handle buf_handle;
7818aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
7823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
7843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
7853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
7873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
7883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
7903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
7913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
7933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE);
7963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ptr, NULL);
7973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ptr, 0, BUFFER_SIZE);
7983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_create_bo_from_user_mem(device_handle,
8008aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					   ptr, BUFFER_SIZE, &buf_handle);
8018aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	CU_ASSERT_EQUAL(r, 0);
8028aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
8038aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_va_range_alloc(device_handle,
8048aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				  amdgpu_gpu_va_range_general,
8058aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				  BUFFER_SIZE, 1, 0, &bo_mc,
8068aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				  &va_handle, 0);
8078aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	CU_ASSERT_EQUAL(r, 0);
8088aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
8098aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_MAP);
8103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
8118aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
8128aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	handle = buf_handle;
8133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
8143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	j = i = 0;
8153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
8163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			       SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
8173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = 0xffffffff & bo_mc;
8183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
8193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = sdma_write_length;
8203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
8213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (j++ < sdma_write_length)
8223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
8233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
8243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_sdma_test_exec_cs(context_handle, 0,
8253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 i, pm4,
8263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 1, &handle,
8273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 ib_info, ibs_request);
8283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	i = 0;
8293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (i < sdma_write_length) {
8303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf);
8313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
8323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
8333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
8343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
8358aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
8368aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_UNMAP);
8378aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	CU_ASSERT_EQUAL(r, 0);
8388aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_va_range_free(va_handle);
8398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	CU_ASSERT_EQUAL(r, 0);
8408aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_free(buf_handle);
8413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
8423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ptr);
8433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
8449c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
8453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
8463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
847