basic_tests.c revision 25784d3af2f37d86fb25ee6cfa4afa6f3448af9b
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>
313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "CUnit/Basic.h"
333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_test.h"
353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_drm.h"
363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  amdgpu_device_handle device_handle;
383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  uint32_t  major_version;
393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  uint32_t  minor_version;
403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void);
423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void);
433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_gfx(void);
443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void);
453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void);
463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void);
473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex DeucherCU_TestInfo basic_tests[] = {
493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Query Info Test",  amdgpu_query_info_test },
503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Memory alloc Test",  amdgpu_memory_alloc },
513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Userptr Test",  amdgpu_userptr_test },
523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (GFX)",  amdgpu_command_submission_gfx },
533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (Compute)", amdgpu_command_submission_compute },
543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (SDMA)", amdgpu_command_submission_sdma },
553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_TEST_INFO_NULL,
563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher};
573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define BUFFER_SIZE (8 * 1024)
583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_offset 0
593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_mask   0x000000FF
603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_shift  0
613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift)
623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_CONSTANT_FILL  11
633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_CONSTANT_FILL_EXTRA_SIZE(x)           ((x) << 14)
643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* 0 = byte fill
653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	 * 2 = DW fill
663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	 */
673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PACKET(op, sub_op, e)	((((e) & 0xFFFF) << 16) |	\
683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					(((sub_op) & 0xFF) << 8) |	\
693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					(((op) & 0xFF) << 0))
703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define	SDMA_OPCODE_WRITE				  2
713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_WRITE_SUB_OPCODE_LINEAR               0
723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_WRTIE_SUB_OPCODE_TILED                1
733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define	SDMA_OPCODE_COPY				  1
753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_COPY_SUB_OPCODE_LINEAR                0
763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_init(void)
783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_device_initialize(drm_amdgpu[0], &major_version,
823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				   &minor_version, &device_handle);
833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	if (r == 0)
853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SUCCESS;
863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	else
873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SINIT_FAILED;
883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_clean(void)
913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r = amdgpu_device_deinitialize(device_handle);
933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	if (r == 0)
953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SUCCESS;
963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	else
973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SCLEAN_FAILED;
983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void)
1013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_gpu_info gpu_info = {0};
1033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t version, feature;
1043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_query_gpu_info(device_handle, &gpu_info);
1073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0,
1103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					  0, &version, &feature);
1113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void)
1153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
1178aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
1183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
1193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test visible VRAM */
1223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_VRAM,
1253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
1268aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			&bo_mc, &va_handle);
1273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1288aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
1293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test invisible VRAM */
1323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_VRAM,
1353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_CREATE_NO_CPU_ACCESS,
1368aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			&bo_mc, &va_handle);
1373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1388aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
1393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test GART Cacheable */
1423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_GTT,
1458aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			0, &bo_mc, &va_handle);
1463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1478aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
1483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test GART USWC */
1513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_GTT,
154a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou			AMDGPU_GEM_CREATE_CPU_GTT_USWC,
1558aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			&bo_mc, &va_handle);
1563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1578aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
1583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
161ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_separate_ibs(void)
1623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
164646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle, ib_result_ce_handle;
165646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu, *ib_result_ce_cpu;
166646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address, ib_result_ce_mc_address;
1673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request = {0};
1683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info[2];
1695463d2e83a450a0428f6c46561c5e2a54a229589Christian König	struct amdgpu_cs_fence fence_status = {0};
1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
17276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_list_handle bo_list;
1738aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle, va_handle_ce;
1743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
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_handle, &ib_result_cpu,
1828aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				    &ib_result_mc_address, &va_handle);
1833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
185646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
186646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
187646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_ce_handle, &ib_result_ce_cpu,
1888aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				    &ib_result_ce_mc_address, &va_handle_ce);
1893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
19176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_get_bo_list(device_handle, ib_result_handle,
19276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák			       ib_result_ce_handle, &bo_list);
19376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
19476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
1953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
1963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_SET_CE_DE_COUNTERS */
198646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_ce_cpu;
1993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008900;
2003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0;
2013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[2] = 0xc0008400;
2023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[3] = 1;
20376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[0].ib_mc_address = ib_result_ce_mc_address;
2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[0].size = 4;
205db126d1d8a764b9d3ad322779b13904867b14e5cJammy Zhou	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
2063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_WAIT_ON_CE_COUNTER */
208646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_cpu;
2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008600;
2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0x00000001;
21176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[1].ib_mc_address = ib_result_mc_address;
2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[1].size = 2;
2133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
2153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.number_of_ibs = 2;
2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ibs = ib_info;
21776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ibs_request.resources = bo_list;
218926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	ibs_request.fence_info.handle = NULL;
219926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang
220926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1);
2213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
2253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_GFX;
226926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	fence_status.fence = ibs_request.seq_no;
2273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
228f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status,
229f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 AMDGPU_TIMEOUT_INFINITE,
230f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 0, &expired);
2313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2338aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
2348aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				     ib_result_mc_address, 4096);
2351041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
2361041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
2378aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce,
2388aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				     ib_result_ce_mc_address, 4096);
2391041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
2401041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
24176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_bo_list_destroy(bo_list);
24276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
24376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
2449c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
2453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
246926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang
2473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
2483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
249ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_shared_ib(void)
250ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{
251ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_context_handle context_handle;
252646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
253646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
254646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
255ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_request ibs_request = {0};
256ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_ib_info ib_info[2];
2575463d2e83a450a0428f6c46561c5e2a54a229589Christian König	struct amdgpu_cs_fence fence_status = {0};
258ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	uint32_t *ptr;
259ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	uint32_t expired;
26076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_list_handle bo_list;
2618aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
262ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	int r;
263ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
264ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
265ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
266ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
267646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
268646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
269646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
2708aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				    &ib_result_mc_address, &va_handle);
271ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
272ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
27376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL,
27476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák			       &bo_list);
27576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
27676af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
277ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
278ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
279ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* IT_SET_CE_DE_COUNTERS */
280646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_cpu;
281ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[0] = 0xc0008900;
282ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[1] = 0;
283ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[2] = 0xc0008400;
284ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[3] = 1;
28576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[0].ib_mc_address = ib_result_mc_address;
286ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[0].size = 4;
287ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
288ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
289646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = (uint32_t *)ib_result_cpu + 4;
290ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[0] = 0xc0008600;
291ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[1] = 0x00000001;
29276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info[1].ib_mc_address = ib_result_mc_address + 16;
293ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[1].size = 2;
294ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
295ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
296ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.number_of_ibs = 2;
297ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.ibs = ib_info;
29876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ibs_request.resources = bo_list;
299926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	ibs_request.fence_info.handle = NULL;
300926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang
301926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	r = amdgpu_cs_submit(context_handle, 0, &ibs_request, 1);
302ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
303ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
304ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
305ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	fence_status.context = context_handle;
306ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	fence_status.ip_type = AMDGPU_HW_IP_GFX;
307926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	fence_status.fence = ibs_request.seq_no;
308ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
309f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status,
310f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 AMDGPU_TIMEOUT_INFINITE,
311f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 0, &expired);
312ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
313ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
3148aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
3158aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				     ib_result_mc_address, 4096);
3161041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
3171041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
31876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_bo_list_destroy(bo_list);
31976af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	CU_ASSERT_EQUAL(r, 0);
32076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
321ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_ctx_free(context_handle);
322ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
323ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou}
324ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
325ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx(void)
326ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{
327ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* separate IB buffers for multi-IB submission */
328ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_command_submission_gfx_separate_ibs();
329ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* shared IB buffer for multi-IB submission */
330ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_command_submission_gfx_shared_ib();
331ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou}
332ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
3333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void)
3343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
3353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
336646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
337646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
338646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
3393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request;
3403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info;
3415463d2e83a450a0428f6c46561c5e2a54a229589Christian König	struct amdgpu_cs_fence fence_status;
3423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
3433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
3443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, instance;
34576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_list_handle bo_list;
3468aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
3473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
3493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	for (instance = 0; instance < 8; instance++) {
352646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
353646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    AMDGPU_GEM_DOMAIN_GTT, 0,
354646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    &ib_result_handle, &ib_result_cpu,
3558aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    &ib_result_mc_address, &va_handle);
3563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
35876af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL,
35976af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák				       &bo_list);
36076af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		CU_ASSERT_EQUAL(r, 0);
36176af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
362646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		ptr = ib_result_cpu;
3633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		for (i = 0; i < 16; ++i)
3643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			ptr[i] = 0xffff1000;
3653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
36776af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		ib_info.ib_mc_address = ib_result_mc_address;
3683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ib_info.size = 16;
3693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
3713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE;
3723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ring = instance;
3733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.number_of_ibs = 1;
3743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ibs = &ib_info;
37576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		ibs_request.resources = bo_list;
376926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang		ibs_request.fence_info.handle = NULL;
3773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3785463d2e83a450a0428f6c46561c5e2a54a229589Christian König		memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence));
379926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang		r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1);
3803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.context = context_handle;
3833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ip_type = AMDGPU_HW_IP_COMPUTE;
3843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ring = instance;
385926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang		fence_status.fence = ibs_request.seq_no;
3863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
387f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou		r = amdgpu_cs_query_fence_status(&fence_status,
388f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou						 AMDGPU_TIMEOUT_INFINITE,
389f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou						 0, &expired);
3903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3911041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
39276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		r = amdgpu_bo_list_destroy(bo_list);
39376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák		CU_ASSERT_EQUAL(r, 0);
39476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
3958aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
3968aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					     ib_result_mc_address, 4096);
3971041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou		CU_ASSERT_EQUAL(r, 0);
3983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
3993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4009c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
4013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
4033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/*
4053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * caller need create/release:
4063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * pm4_src, resources, ib_info, and ibs_request
4073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * submit command stream described in ibs_request and wait for this IB accomplished
4083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */
4093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_sdma_test_exec_cs(amdgpu_context_handle context_handle,
4103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int instance, int pm4_dw, uint32_t *pm4_src,
4113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int res_cnt, amdgpu_bo_handle *resources,
4123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_ib_info *ib_info,
4133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_request *ibs_request)
4143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
41576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	int r;
4163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
4173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ring_ptr;
418646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
419646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
420646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
4215463d2e83a450a0428f6c46561c5e2a54a229589Christian König	struct amdgpu_cs_fence fence_status = {0};
42276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1));
4238aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
4243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare CS */
4263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4_src, NULL);
4273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
4283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
4293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_TRUE(pm4_dw <= 1024);
4313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* allocate IB */
433646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
434646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
435646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
4368aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				    &ib_result_mc_address, &va_handle);
4373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* copy PM4 packet to ring from caller */
440646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ring_ptr = ib_result_cpu;
4413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src));
4423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
44376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	ib_info->ib_mc_address = ib_result_mc_address;
4443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info->size = pm4_dw;
4453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ip_type = AMDGPU_HW_IP_DMA;
4473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ring = instance;
4483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->number_of_ibs = 1;
4493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ibs = ib_info;
450926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	ibs_request->fence_info.handle = NULL;
4513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
45276af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	memcpy(all_res, resources, sizeof(resources[0]) * res_cnt);
45376af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	all_res[res_cnt] = ib_result_handle;
45476af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák
45576af5c249fa438d8466b7e7dbda318da8f829eacMarek Olšák	r = amdgpu_bo_list_create(device_handle, res_cnt+1, all_res,
4566dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König				  NULL, &ibs_request->resources);
4576dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	CU_ASSERT_EQUAL(r, 0);
4583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* submit CS */
462926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	r = amdgpu_cs_submit(context_handle, 0, ibs_request, 1);
4633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4656dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	r = amdgpu_bo_list_destroy(ibs_request->resources);
4666dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	CU_ASSERT_EQUAL(r, 0);
4676dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König
4683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_DMA;
4693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ring = ibs_request->ring;
4703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
471926c80568691e04abdfcd21b6e9be61331e95b03Ken Wang	fence_status.fence = ibs_request->seq_no;
4723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* wait for IB accomplished */
474f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status,
475f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 AMDGPU_TIMEOUT_INFINITE,
476f91b56dc8c604ec1c6f092d69550266d20dc9764Jammy Zhou					 0, &expired);
4773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(expired, true);
4791041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
4808aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
4818aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				     ib_result_mc_address, 4096);
4821041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
4833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
4843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_write_linear(void)
4863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
4873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 128;
4883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
4893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
4903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
4913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
4923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
4933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
4943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
4953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
4963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
4973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
498a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
4998aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
5003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
5023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
5033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
5053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
5063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
5083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
5093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
5113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
5143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
5153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
5163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
518a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop < 2) {
5193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
5208aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_alloc_and_map(device_handle,
5218aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    sdma_write_length * sizeof(uint32_t),
5228aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    4096, AMDGPU_GEM_DOMAIN_GTT,
523d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer					    gtt_flags[loop], &bo, (void**)&bo_cpu,
5248aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    &bo_mc, &va_handle);
5258aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		CU_ASSERT_EQUAL(r, 0);
5263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
5283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t));
5293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
5323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA write-linear */
5343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
5353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
5363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
5373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
5383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
5393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
5403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(j++ < sdma_write_length)
5413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xdeadbeaf;
5423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
5443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
5453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
5463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
5473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
5493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
5503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < sdma_write_length) {
5513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
5523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
5538aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
5548aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc,
5558aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					     sdma_write_length * sizeof(uint32_t));
5568aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		CU_ASSERT_EQUAL(r, 0);
5573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
5583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
5593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
5603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
5613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
5623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
5633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
5643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
5669c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
5673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
5693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_const_fill(void)
5713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
5723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024 * 1024;
5733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
5743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
5753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
5763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
5773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
5783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
5793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
5803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
5813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
5823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
583a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
5848aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
5853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
5873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
5883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
5903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
5913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
5933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
5943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
5963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
5993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
6003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
6013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
603a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop < 2) {
6043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
6058aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_alloc_and_map(device_handle,
6068aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    sdma_write_length, 4096,
6078aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    AMDGPU_GEM_DOMAIN_GTT,
608d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer					    gtt_flags[loop], &bo, (void**)&bo_cpu,
6098aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					    &bo_mc, &va_handle);
6108aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		CU_ASSERT_EQUAL(r, 0);
6113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
6133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length);
6143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
6163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA const fill */
6183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
6193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0,
6203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				   SDMA_CONSTANT_FILL_EXTRA_SIZE(2));
6213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
6223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
6233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
6243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
6253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
6273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
6283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
6293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
6303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
6323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
6333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < (sdma_write_length / 4)) {
6343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
6353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
6368aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
6378aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc,
6388aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					     sdma_write_length);
6398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou		CU_ASSERT_EQUAL(r, 0);
6403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
6413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
6423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
6433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
6443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
6453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
6463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
6473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
6499c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
6503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
6523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_copy_linear(void)
6543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
6553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024;
6563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
6573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
6583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo1, bo2;
6593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
6603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
6613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
6623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
6633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo1_mc, bo2_mc;
6643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile unsigned char *bo1_cpu, *bo2_cpu;
6653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop1, loop2;
666a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
6678aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle bo1_va_handle, bo2_va_handle;
6683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
6703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
6713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
6733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
6743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
6763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
6773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
6793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
6823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(2, sizeof(amdgpu_bo_handle));
6833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
6843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop1 = loop2 = 0;
6863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* run 9 circle to test all mapping combination */
687a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop1 < 2) {
688a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou		while(loop2 < 2) {
6893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo1for sDMA use */
6908aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			r = amdgpu_bo_alloc_and_map(device_handle,
6918aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						    sdma_write_length, 4096,
6928aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						    AMDGPU_GEM_DOMAIN_GTT,
693d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    gtt_flags[loop1], &bo1,
694d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    (void**)&bo1_cpu, &bo1_mc,
695d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    &bo1_va_handle);
6968aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			CU_ASSERT_EQUAL(r, 0);
6973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* set bo1 */
6993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo1_cpu, 0xaa, sdma_write_length);
7003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo2 for sDMA use */
7028aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			r = amdgpu_bo_alloc_and_map(device_handle,
7038aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						    sdma_write_length, 4096,
7048aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						    AMDGPU_GEM_DOMAIN_GTT,
705d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    gtt_flags[loop2], &bo2,
706d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    (void**)&bo2_cpu, &bo2_mc,
707d9b282593e74ccbbb3a605dd72367a2262f39d12Michel Dänzer						    &bo2_va_handle);
7088aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			CU_ASSERT_EQUAL(r, 0);
7093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* clear bo2 */
7113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo2_cpu, 0, sdma_write_length);
7123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[0] = bo1;
7143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[1] = bo2;
7153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* fullfill PM4: test DMA copy linear */
7173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = j = 0;
7183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0);
7193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = sdma_write_length;
7203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0;
7213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo1_mc;
7223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
7233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo2_mc;
7243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
7253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_sdma_test_exec_cs(context_handle, 0,
7283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						i, pm4,
7293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						2, resources,
7303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						ib_info, ibs_request);
7313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* verify if SDMA test result meets with expected */
7333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = 0;
7343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			while(i < sdma_write_length) {
7353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa);
7363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			}
7378aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			r = amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc,
7388aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						     sdma_write_length);
7398aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			CU_ASSERT_EQUAL(r, 0);
7408aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			r = amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc,
7418aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou						     sdma_write_length);
7428aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou			CU_ASSERT_EQUAL(r, 0);
7433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			loop2++;
7443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
7453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop1++;
7463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
7473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
7483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
7493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
7503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
7513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
7523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
7549c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
7553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
7573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void)
7593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
7603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_write_linear();
7613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_const_fill();
7623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_copy_linear();
7633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
7643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void)
7663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
7673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, j;
7683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4 = NULL;
7693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
7703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	void *ptr = NULL;
7713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int pm4_dw = 256;
7723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int sdma_write_length = 4;
7733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle handle;
7743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
7753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
7763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
7778aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_bo_handle buf_handle;
7788aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	amdgpu_va_handle va_handle;
7793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
7813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
7823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
7843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
7853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
7873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
7883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
7903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE);
7933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ptr, NULL);
7943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ptr, 0, BUFFER_SIZE);
7953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_create_bo_from_user_mem(device_handle,
7978aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou					   ptr, BUFFER_SIZE, &buf_handle);
7988aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	CU_ASSERT_EQUAL(r, 0);
7998aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
8008aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_va_range_alloc(device_handle,
8018aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				  amdgpu_gpu_va_range_general,
8028aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				  BUFFER_SIZE, 1, 0, &bo_mc,
8038aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou				  &va_handle, 0);
8048aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	CU_ASSERT_EQUAL(r, 0);
8058aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
8068aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_MAP);
8073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
8088aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
8098aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	handle = buf_handle;
8103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
8113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	j = i = 0;
8123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
8133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			       SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
8143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = 0xffffffff & bo_mc;
8153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
8163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = sdma_write_length;
8173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
8183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (j++ < sdma_write_length)
8193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
8203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
8213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_sdma_test_exec_cs(context_handle, 0,
8223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 i, pm4,
8233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 1, &handle,
8243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 ib_info, ibs_request);
8253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	i = 0;
8263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (i < sdma_write_length) {
8273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf);
8283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
8293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
8303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
8313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
8328aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou
8338aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_UNMAP);
8348aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	CU_ASSERT_EQUAL(r, 0);
8358aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_va_range_free(va_handle);
8368aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	CU_ASSERT_EQUAL(r, 0);
8378aeffcc1cf3360fddd97f4a6b6f7300f401142aeJammy Zhou	r = amdgpu_bo_free(buf_handle);
8383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
8393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ptr);
8403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
8419c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
8423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
8433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
844