basic_tests.c revision 646f5411cf36413c903eb6db48b5e7febd893ec5
13c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/*
23c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Copyright 2014 Advanced Micro Devices, Inc.
33c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher *
43c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Permission is hereby granted, free of charge, to any person obtaining a
53c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * copy of this software and associated documentation files (the "Software"),
63c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * to deal in the Software without restriction, including without limitation
73c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * the rights to use, copy, modify, merge, publish, distribute, sublicense,
83c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * and/or sell copies of the Software, and to permit persons to whom the
93c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Software is furnished to do so, subject to the following conditions:
103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher *
113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * The above copyright notice and this permission notice shall be included in
123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * all copies or substantial portions of the Software.
133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher *
143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * OTHER DEALINGS IN THE SOFTWARE.
213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher *
223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher*/
233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdio.h>
243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdlib.h>
253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <unistd.h>
263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "CUnit/Basic.h"
283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_test.h"
303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_drm.h"
313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  amdgpu_device_handle device_handle;
333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  uint32_t  major_version;
343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic  uint32_t  minor_version;
353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void);
373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void);
383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_gfx(void);
393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void);
403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void);
413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void);
423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex DeucherCU_TestInfo basic_tests[] = {
443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Query Info Test",  amdgpu_query_info_test },
453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Memory alloc Test",  amdgpu_memory_alloc },
463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Userptr Test",  amdgpu_userptr_test },
473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (GFX)",  amdgpu_command_submission_gfx },
483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (Compute)", amdgpu_command_submission_compute },
493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	{ "Command submission Test (SDMA)", amdgpu_command_submission_sdma },
503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_TEST_INFO_NULL,
513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher};
523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define BUFFER_SIZE (8 * 1024)
533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_offset 0
543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_mask   0x000000FF
553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_op_shift  0
563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift)
573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_OPCODE_CONSTANT_FILL  11
583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_CONSTANT_FILL_EXTRA_SIZE(x)           ((x) << 14)
593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* 0 = byte fill
603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	 * 2 = DW fill
613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	 */
623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define SDMA_PACKET(op, sub_op, e)	((((e) & 0xFFFF) << 16) |	\
633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					(((sub_op) & 0xFF) << 8) |	\
643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					(((op) & 0xFF) << 0))
653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define	SDMA_OPCODE_WRITE				  2
663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_WRITE_SUB_OPCODE_LINEAR               0
673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_WRTIE_SUB_OPCODE_TILED                1
683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#define	SDMA_OPCODE_COPY				  1
703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#       define SDMA_COPY_SUB_OPCODE_LINEAR                0
713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_init(void)
733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_device_initialize(drm_amdgpu[0], &major_version,
773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				   &minor_version, &device_handle);
783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	if (r == 0)
803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SUCCESS;
813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	else
823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SINIT_FAILED;
833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint suite_basic_tests_clean(void)
863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r = amdgpu_device_deinitialize(device_handle);
883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	if (r == 0)
903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SUCCESS;
913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	else
923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		return CUE_SCLEAN_FAILED;
933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_query_info_test(void)
963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_gpu_info gpu_info = {0};
983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t version, feature;
993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_query_gpu_info(device_handle, &gpu_info);
1023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0,
1053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					  0, &version, &feature);
1063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_memory_alloc(void)
1103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
1123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
1133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test visible VRAM */
1163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_VRAM,
1193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
1203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			&bo_mc);
1213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(bo);
1233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test invisible VRAM */
1263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_VRAM,
1293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_CREATE_NO_CPU_ACCESS,
1303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			&bo_mc);
1313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(bo);
1333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test GART Cacheable */
1363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_GTT,
1393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			0,
1403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			&bo_mc);
1413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(bo);
1433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* Test GART USWC */
1463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo = gpu_mem_alloc(device_handle,
1473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			4096, 4096,
1483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_DOMAIN_GTT,
149a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou			AMDGPU_GEM_CREATE_CPU_GTT_USWC,
1503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			&bo_mc);
1513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(bo);
1533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
156ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_separate_ibs(void)
1573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
159646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle, ib_result_ce_handle;
160646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu, *ib_result_ce_cpu;
161646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address, ib_result_ce_mc_address;
1623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request = {0};
1633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info[2];
1643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_query_fence fence_status = {0};
1653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
1663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
1673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
172646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
173646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
174646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
175646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_mc_address);
1763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
178646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
179646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
180646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_ce_handle, &ib_result_ce_cpu,
181646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_ce_mc_address);
1823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
1853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_SET_CE_DE_COUNTERS */
187646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_ce_cpu;
1883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008900;
1893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0;
1903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[2] = 0xc0008400;
1913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[3] = 1;
192646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ib_info[0].bo_handle = ib_result_ce_handle;
1933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[0].size = 4;
194db126d1d8a764b9d3ad322779b13904867b14e5cJammy Zhou	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
1953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_WAIT_ON_CE_COUNTER */
197646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_cpu;
1983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008600;
1993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0x00000001;
200646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ib_info[1].bo_handle = ib_result_handle;
2013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[1].size = 2;
2023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.number_of_ibs = 2;
2053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ibs = ib_info;
2063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2079c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_submit(context_handle, 0,
2083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			     &ibs_request, 1, &fence_status.fence);
2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE;
2133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_GFX;
2143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2159c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_query_fence_status(&fence_status, &expired);
2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
218646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_free(ib_result_handle);
2191041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
2201041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
221646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_free(ib_result_ce_handle);
2221041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
2231041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
2249c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
2253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
2273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
228ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx_shared_ib(void)
229ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{
230ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_context_handle context_handle;
231646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
232646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
233646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
234ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_request ibs_request = {0};
235ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_ib_info ib_info[2];
236ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	struct amdgpu_cs_query_fence fence_status = {0};
237ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	uint32_t *ptr;
238ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	uint32_t expired;
239ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	int r;
240ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
241ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
242ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
243ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
244646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
245646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
246646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
247646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_mc_address);
248ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
249ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
250ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
251ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
252ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* IT_SET_CE_DE_COUNTERS */
253646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = ib_result_cpu;
254ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[0] = 0xc0008900;
255ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[1] = 0;
256ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[2] = 0xc0008400;
257ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[3] = 1;
258646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ib_info[0].bo_handle = ib_result_handle;
259ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[0].size = 4;
260ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
261ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
262646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ptr = (uint32_t *)ib_result_cpu + 4;
263ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[0] = 0xc0008600;
264ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ptr[1] = 0x00000001;
265646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ib_info[1].bo_handle = ib_result_handle;
266ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[1].size = 2;
267ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ib_info[1].offset_dw = 4;
268ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
269ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
270ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.number_of_ibs = 2;
271ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	ibs_request.ibs = ib_info;
272ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
273ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_submit(context_handle, 0,
274ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou			&ibs_request, 1, &fence_status.fence);
275ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
276ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
277ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	fence_status.context = context_handle;
278ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE;
279ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	fence_status.ip_type = AMDGPU_HW_IP_GFX;
280ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
281ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_query_fence_status(&fence_status, &expired);
282ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
283ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
284646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_free(ib_result_handle);
2851041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
2861041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
287ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	r = amdgpu_cs_ctx_free(context_handle);
288ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	CU_ASSERT_EQUAL(r, 0);
289ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou}
290ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
291ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhoustatic void amdgpu_command_submission_gfx(void)
292ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou{
293ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* separate IB buffers for multi-IB submission */
294ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_command_submission_gfx_separate_ibs();
295ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	/* shared IB buffer for multi-IB submission */
296ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou	amdgpu_command_submission_gfx_shared_ib();
297ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou}
298ba1653eff8bd8ecc3d5fd5b2bbab604878cfa7e0Jammy Zhou
2993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void)
3003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
3013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
302646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
303646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
304646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
3053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request;
3063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info;
3073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_query_fence fence_status;
3083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
3093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
3103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, instance;
3113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
3133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	for (instance = 0; instance < 8; instance++) {
316646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
317646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    AMDGPU_GEM_DOMAIN_GTT, 0,
318646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    &ib_result_handle, &ib_result_cpu,
319646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák					    &ib_result_mc_address);
3203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
322646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		ptr = ib_result_cpu;
3233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		for (i = 0; i < 16; ++i)
3243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			ptr[i] = 0xffff1000;
3253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
327646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		ib_info.bo_handle = ib_result_handle;
3283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ib_info.size = 16;
3293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
3313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE;
3323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ring = instance;
3333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.number_of_ibs = 1;
3343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ibs = &ib_info;
3353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&fence_status, 0, sizeof(struct amdgpu_cs_query_fence));
3379c2afffedb773da27fd7506b31fc2164f329d3a8Christian König		r = amdgpu_cs_submit(context_handle, 0,
3383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				     &ibs_request, 1, &fence_status.fence);
3393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.context = context_handle;
3423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE;
3433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ip_type = AMDGPU_HW_IP_COMPUTE;
3443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ring = instance;
3453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3469c2afffedb773da27fd7506b31fc2164f329d3a8Christian König		r = amdgpu_cs_query_fence_status(&fence_status, &expired);
3473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
3481041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
349646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák		r = amdgpu_bo_free(ib_result_handle);
3501041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou		CU_ASSERT_EQUAL(r, 0);
3513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
3523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3539c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
3543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
3563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/*
3583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * caller need create/release:
3593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * pm4_src, resources, ib_info, and ibs_request
3603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * submit command stream described in ibs_request and wait for this IB accomplished
3613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */
3623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_sdma_test_exec_cs(amdgpu_context_handle context_handle,
3633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int instance, int pm4_dw, uint32_t *pm4_src,
3643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int res_cnt, amdgpu_bo_handle *resources,
3653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_ib_info *ib_info,
3663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_request *ibs_request)
3673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
3683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r, i, j;
3693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
3703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ring_ptr;
371646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	amdgpu_bo_handle ib_result_handle;
372646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	void *ib_result_cpu;
373646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	uint64_t ib_result_mc_address;
3743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_query_fence fence_status = {0};
3753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare CS */
3773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4_src, NULL);
3783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
3793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
3803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
3813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_TRUE(pm4_dw <= 1024);
3823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* allocate IB */
384646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
385646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    AMDGPU_GEM_DOMAIN_GTT, 0,
386646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_handle, &ib_result_cpu,
387646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák				    &ib_result_mc_address);
3883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* copy PM4 packet to ring from caller */
391646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ring_ptr = ib_result_cpu;
3923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src));
3933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
394646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	ib_info->bo_handle = ib_result_handle;
3953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info->size = pm4_dw;
3963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ip_type = AMDGPU_HW_IP_DMA;
3983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ring = instance;
3993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->number_of_ibs = 1;
4003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ibs = ib_info;
4013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4026dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	r = amdgpu_bo_list_create(device_handle, res_cnt, resources,
4036dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König				  NULL, &ibs_request->resources);
4046dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	CU_ASSERT_EQUAL(r, 0);
4053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* submit CS */
4099c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_submit(context_handle, 0,
4103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			 ibs_request, 1, &fence_status.fence);
4113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4136dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	r = amdgpu_bo_list_destroy(ibs_request->resources);
4146dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König	CU_ASSERT_EQUAL(r, 0);
4156dc2eaf2cc8428d11498a57bbe72cdf0df4a3306Christian König
4163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_DMA;
4173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ring = ibs_request->ring;
4183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
4193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE;
4203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* wait for IB accomplished */
4229c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_query_fence_status(&fence_status, &expired);
4233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(expired, true);
4251041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou
426646f5411cf36413c903eb6db48b5e7febd893ec5Marek Olšák	r = amdgpu_bo_free(ib_result_handle);
4271041cfdc38692721364557ce61d7abe71a1a9cbfJammy Zhou	CU_ASSERT_EQUAL(r, 0);
4283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
4293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_write_linear(void)
4313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
4323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 128;
4333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
4343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
4353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
4363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
4373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
4383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
4393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
4403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
4413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
4423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
443a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
4443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
4463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
4473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
4493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
4503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
4523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
4553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
4583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
4593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
4603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
462a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop < 2) {
4633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
4643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		bo = gpu_mem_alloc(device_handle,
4653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				sdma_write_length * sizeof(uint32_t),
4663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				4096, AMDGPU_GEM_DOMAIN_GTT,
4673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				gtt_flags[loop], &bo_mc);
4683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0);
4703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_NOT_EQUAL(bo_cpu, NULL);
4713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
4733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t));
4743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
4773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA write-linear */
4793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
4803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
4813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
4823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
4833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
4843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
4853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(j++ < sdma_write_length)
4863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xdeadbeaf;
4873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
4893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
4903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
4913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
4923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
4943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
4953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < sdma_write_length) {
4963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
4973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
4983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_bo_free(bo);
4993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
5003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
5013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
5023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
5033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
5043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
5053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
5063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
5089c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
5093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
5113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_const_fill(void)
5133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
5143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024 * 1024;
5153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
5163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
5173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
5183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
5193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
5203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
5213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
5223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
5233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
5243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
525a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
5263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
5283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
5293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
5313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
5323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
5343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
5353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
5373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
5403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
5413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
5423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
544a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop < 2) {
5453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
5463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		bo = gpu_mem_alloc(device_handle,
5473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				sdma_write_length, 4096,
5483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				AMDGPU_GEM_DOMAIN_GTT,
5493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				gtt_flags[loop], &bo_mc);
5503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0);
5523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_NOT_EQUAL(bo_cpu, NULL);
5533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
5553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length);
5563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
5583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA const fill */
5603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
5613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0,
5623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				   SDMA_CONSTANT_FILL_EXTRA_SIZE(2));
5633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
5643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
5653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
5663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
5673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
5693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
5703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
5713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
5723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
5743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
5753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < (sdma_write_length / 4)) {
5763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
5773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
5783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_bo_free(bo);
5793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
5803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
5813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
5823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
5833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
5843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
5853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
5863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
5889c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
5893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
5913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_copy_linear(void)
5933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
5943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024;
5953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
5963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
5973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo1, bo2;
5983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
5993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
6003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
6013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
6023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo1_mc, bo2_mc;
6033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile unsigned char *bo1_cpu, *bo2_cpu;
6043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop1, loop2;
605a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
6063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
6083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
6093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
6113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
6123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
6143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
6153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
6173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
6203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(2, sizeof(amdgpu_bo_handle));
6213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
6223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop1 = loop2 = 0;
6243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* run 9 circle to test all mapping combination */
625a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou	while(loop1 < 2) {
626a4c832117940880c28eec15bfae8040f2a93a733Jammy Zhou		while(loop2 < 2) {
6273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo1for sDMA use */
6283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			bo1 = gpu_mem_alloc(device_handle,
6293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					sdma_write_length, 4096,
6303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					AMDGPU_GEM_DOMAIN_GTT,
6313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					gtt_flags[loop1], &bo1_mc);
6323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo1, (void **)&bo1_cpu), 0);
6343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_NOT_EQUAL(bo1_cpu, NULL);
6353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* set bo1 */
6373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo1_cpu, 0xaa, sdma_write_length);
6383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo2 for sDMA use */
6403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			bo2 = gpu_mem_alloc(device_handle,
6413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					sdma_write_length, 4096,
6423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					AMDGPU_GEM_DOMAIN_GTT,
6433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					gtt_flags[loop2], &bo2_mc);
6443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo2, (void **)&bo2_cpu), 0);
6463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_NOT_EQUAL(bo2_cpu, NULL);
6473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* clear bo2 */
6493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo2_cpu, 0, sdma_write_length);
6503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[0] = bo1;
6523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[1] = bo2;
6533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* fullfill PM4: test DMA copy linear */
6553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = j = 0;
6563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0);
6573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = sdma_write_length;
6583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0;
6593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo1_mc;
6603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
6613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo2_mc;
6623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
6633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_sdma_test_exec_cs(context_handle, 0,
6663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						i, pm4,
6673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						2, resources,
6683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						ib_info, ibs_request);
6693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* verify if SDMA test result meets with expected */
6713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = 0;
6723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			while(i < sdma_write_length) {
6733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa);
6743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			}
6753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_bo_free(bo1);
6763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_bo_free(bo2);
6773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			loop2++;
6783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
6793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop1++;
6803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
6813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
6823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
6833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
6843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
6853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
6863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
6889c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
6893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
6913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void)
6933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
6943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_write_linear();
6953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_const_fill();
6963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_copy_linear();
6973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
6983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void)
7003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
7013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, j;
7023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4 = NULL;
7033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
7043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	void *ptr = NULL;
7053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int pm4_dw = 256;
7063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int sdma_write_length = 4;
7073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle handle;
7083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
7093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
7103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
7113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_bo_alloc_result res;
7123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(&res, 0, sizeof(res));
7143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
7163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
7173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
7193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
7203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
7223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
7233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
7253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE);
7283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ptr, NULL);
7293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ptr, 0, BUFFER_SIZE);
7303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_create_bo_from_user_mem(device_handle,
7323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					   ptr, BUFFER_SIZE, &res);
7333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo_mc = res.virtual_mc_base_address;
7353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	handle = res.buf_handle;
7363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	j = i = 0;
7383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
7393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			       SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
7403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = 0xffffffff & bo_mc;
7413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
7423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = sdma_write_length;
7433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (j++ < sdma_write_length)
7453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
7463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_sdma_test_exec_cs(context_handle, 0,
7483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 i, pm4,
7493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 1, &handle,
7503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 ib_info, ibs_request);
7513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	i = 0;
7523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (i < sdma_write_length) {
7533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf);
7543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
7553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
7563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
7573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
7583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(res.buf_handle);
7593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ptr);
7613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
7629c2afffedb773da27fd7506b31fc2164f329d3a8Christian König	r = amdgpu_cs_ctx_free(context_handle);
7633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
7643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
765