basic_tests.c revision 3c5fe78801dbadc82cc25f4a63a983fea15d938b
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,
1493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			AMDGPU_GEM_CREATE_CPU_GTT_WC,
1503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			&bo_mc);
1513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(bo);
1533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
1553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_gfx(void)
1573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
1583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
1593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_alloc_result ib_result = {0};
1603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_alloc_result ib_result_ce = {0};
1613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request = {0};
1623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info[2];
1633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_query_fence fence_status = {0};
1643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
1653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
1663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r;
1673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
1693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_alloc_ib(device_handle, context_handle,
1723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			       amdgpu_cs_ib_size_4K, &ib_result);
1733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_alloc_ib(device_handle, context_handle,
1763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			       amdgpu_cs_ib_size_4K, &ib_result_ce);
1773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
1783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
1803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_SET_CE_DE_COUNTERS */
1823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr = ib_result_ce.cpu;
1833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008900;
1843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0;
1853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[2] = 0xc0008400;
1863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[3] = 1;
1873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[0].ib_handle = ib_result_ce.handle;
1883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[0].size = 4;
1893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[0].flags = AMDGPU_CS_GFX_IB_CE;
1903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* IT_WAIT_ON_CE_COUNTER */
1923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr = ib_result.cpu;
1933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[0] = 0xc0008600;
1943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ptr[1] = 0x00000001;
1953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[1].ib_handle = ib_result.handle;
1963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info[1].size = 2;
1973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
1983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
1993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.number_of_ibs = 2;
2003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request.ibs = ib_info;
2013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_submit(device_handle, context_handle, 0,
2033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			     &ibs_request, 1, &fence_status.fence);
2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
2073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE;
2083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_GFX;
2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_query_fence_status(device_handle, &fence_status, &expired);
2113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_free(device_handle, context_handle);
2143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_compute(void)
2183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
2193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
2203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_alloc_result ib_result;
2213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request ibs_request;
2223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info ib_info;
2233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_query_fence fence_status;
2243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ptr;
2253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
2263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, instance;
2273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
2293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	for (instance = 0; instance < 8; instance++) {
2323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ib_result, 0, sizeof(struct amdgpu_cs_ib_alloc_result));
2333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		r = amdgpu_cs_alloc_ib(device_handle, context_handle,
2343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				       amdgpu_cs_ib_size_4K, &ib_result);
2353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
2363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ptr = ib_result.cpu;
2383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		for (i = 0; i < 16; ++i)
2393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			ptr[i] = 0xffff1000;
2403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
2423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ib_info.ib_handle = ib_result.handle;
2433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ib_info.size = 16;
2443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
2463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE;
2473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ring = instance;
2483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.number_of_ibs = 1;
2493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		ibs_request.ibs = &ib_info;
2503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset(&fence_status, 0, sizeof(struct amdgpu_cs_query_fence));
2523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		r = amdgpu_cs_submit(device_handle, context_handle, 0,
2533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				     &ibs_request, 1, &fence_status.fence);
2543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
2553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.context = context_handle;
2573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE;
2583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ip_type = AMDGPU_HW_IP_COMPUTE;
2593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		fence_status.ring = instance;
2603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		r = amdgpu_cs_query_fence_status(device_handle, &fence_status, &expired);
2623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(r, 0);
2633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
2643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_free(device_handle, context_handle);
2663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
2683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/*
2703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * caller need create/release:
2713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * pm4_src, resources, ib_info, and ibs_request
2723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * submit command stream described in ibs_request and wait for this IB accomplished
2733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */
2743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_sdma_test_exec_cs(amdgpu_context_handle context_handle,
2753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int instance, int pm4_dw, uint32_t *pm4_src,
2763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 int res_cnt, amdgpu_bo_handle *resources,
2773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_ib_info *ib_info,
2783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 struct amdgpu_cs_request *ibs_request)
2793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
2803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int r, i, j;
2813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t expired;
2823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *ring_ptr;
2833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_alloc_result ib_result = {0};
2843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_query_fence fence_status = {0};
2853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare CS */
2873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4_src, NULL);
2883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
2893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
2903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
2913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_TRUE(pm4_dw <= 1024);
2923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* allocate IB */
2943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_alloc_ib(device_handle, context_handle,
2953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			   amdgpu_cs_ib_size_4K, &ib_result);
2963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
2973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
2983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* copy PM4 packet to ring from caller */
2993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ring_ptr = ib_result.cpu;
3003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src));
3013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info->ib_handle = ib_result.handle;
3033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info->size = pm4_dw;
3043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ip_type = AMDGPU_HW_IP_DMA;
3063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ring = instance;
3073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->number_of_ibs = 1;
3083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->ibs = ib_info;
3093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->number_of_resources = res_cnt;
3103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request->resources = resources;
3113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
3143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* submit CS */
3163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_submit(device_handle, context_handle, 0,
3173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			 ibs_request, 1, &fence_status.fence);
3183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ip_type = AMDGPU_HW_IP_DMA;
3213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.ring = ibs_request->ring;
3223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.context = context_handle;
3233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	fence_status.timeout_ns = AMDGPU_TIMEOUT_INFINITE;
3243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* wait for IB accomplished */
3263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_query_fence_status(device_handle, &fence_status,
3273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					&expired);
3283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(expired, true);
3303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
3313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_write_linear(void)
3333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
3343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 128;
3353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
3363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
3373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
3383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
3393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
3403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
3413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
3423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
3433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
3443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
3453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t gtt_flags[3] = {0, AMDGPU_GEM_CREATE_CPU_GTT_UC,
3463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				AMDGPU_GEM_CREATE_CPU_GTT_WC};
3473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
3493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
3503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
3523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
3533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
3553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
3563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
3583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
3593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
3613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
3623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
3633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
3653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while(loop < 3) {
3663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
3673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		bo = gpu_mem_alloc(device_handle,
3683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				sdma_write_length * sizeof(uint32_t),
3693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				4096, AMDGPU_GEM_DOMAIN_GTT,
3703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				gtt_flags[loop], &bo_mc);
3713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0);
3733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_NOT_EQUAL(bo_cpu, NULL);
3743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
3763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t));
3773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
3803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA write-linear */
3823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
3833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
3843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
3853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
3863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
3873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
3883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(j++ < sdma_write_length)
3893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xdeadbeaf;
3903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
3923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
3933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
3943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
3953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
3963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
3973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
3983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < sdma_write_length) {
3993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
4003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
4013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_bo_free(bo);
4023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
4033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
4043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
4053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
4063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
4073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
4083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
4093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
4113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_free(device_handle, context_handle);
4123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
4143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_const_fill(void)
4163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
4173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024 * 1024;
4183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
4193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
4203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo;
4213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
4223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
4233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
4243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
4253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
4263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile uint32_t *bo_cpu;
4273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop;
4283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t gtt_flags[3] = {0, AMDGPU_GEM_CREATE_CPU_GTT_UC,
4293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				AMDGPU_GEM_CREATE_CPU_GTT_WC};
4303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
4323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
4333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
4353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
4363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
4383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
4393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
4413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
4443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(1, sizeof(amdgpu_bo_handle));
4453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
4463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop = 0;
4483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while(loop < 3) {
4493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* allocate UC bo for sDMA use */
4503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		bo = gpu_mem_alloc(device_handle,
4513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				sdma_write_length, 4096,
4523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				AMDGPU_GEM_DOMAIN_GTT,
4533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				gtt_flags[loop], &bo_mc);
4543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo, (void **)&bo_cpu), 0);
4563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_NOT_EQUAL(bo_cpu, NULL);
4573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* clear bo */
4593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		memset((void*)bo_cpu, 0, sdma_write_length);
4603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		resources[0] = bo;
4623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* fullfill PM4: test DMA const fill */
4643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = j = 0;
4653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0,
4663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				   SDMA_CONSTANT_FILL_EXTRA_SIZE(2));
4673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xffffffff & bo_mc;
4683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
4693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
4703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = sdma_write_length;
4713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_sdma_test_exec_cs(context_handle, 0,
4733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					i, pm4,
4743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					1, resources,
4753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					ib_info, ibs_request);
4763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		/* verify if SDMA test result meets with expected */
4783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		i = 0;
4793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(i < (sdma_write_length / 4)) {
4803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
4813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
4823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		amdgpu_bo_free(bo);
4833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop++;
4843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
4853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
4863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
4873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
4883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
4893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
4903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
4923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_free(device_handle, context_handle);
4933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
4943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
4953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
4963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma_copy_linear(void)
4973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
4983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int sdma_write_length = 1024;
4993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	const int pm4_dw = 256;
5003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
5013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle bo1, bo2;
5023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle *resources;
5033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4;
5043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
5053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
5063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo1_mc, bo2_mc;
5073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	volatile unsigned char *bo1_cpu, *bo2_cpu;
5083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, j, r, loop1, loop2;
5093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t gtt_flags[3] = {0, AMDGPU_GEM_CREATE_CPU_GTT_UC,
5103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				AMDGPU_GEM_CREATE_CPU_GTT_WC};
5113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
5133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
5143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
5163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
5173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
5193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
5203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
5223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* prepare resource */
5253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	resources = calloc(2, sizeof(amdgpu_bo_handle));
5263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(resources, NULL);
5273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	loop1 = loop2 = 0;
5293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* run 9 circle to test all mapping combination */
5303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while(loop1 < 3) {
5313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		while(loop2 < 3) {
5323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo1for sDMA use */
5333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			bo1 = gpu_mem_alloc(device_handle,
5343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					sdma_write_length, 4096,
5353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					AMDGPU_GEM_DOMAIN_GTT,
5363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					gtt_flags[loop1], &bo1_mc);
5373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo1, (void **)&bo1_cpu), 0);
5393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_NOT_EQUAL(bo1_cpu, NULL);
5403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* set bo1 */
5423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo1_cpu, 0xaa, sdma_write_length);
5433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* allocate UC bo2 for sDMA use */
5453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			bo2 = gpu_mem_alloc(device_handle,
5463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					sdma_write_length, 4096,
5473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					AMDGPU_GEM_DOMAIN_GTT,
5483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					gtt_flags[loop2], &bo2_mc);
5493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_EQUAL(amdgpu_bo_cpu_map(bo2, (void **)&bo2_cpu), 0);
5513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			CU_ASSERT_NOT_EQUAL(bo2_cpu, NULL);
5523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* clear bo2 */
5543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			memset((void*)bo2_cpu, 0, sdma_write_length);
5553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[0] = bo1;
5573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			resources[1] = bo2;
5583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* fullfill PM4: test DMA copy linear */
5603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = j = 0;
5613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0);
5623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = sdma_write_length;
5633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0;
5643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo1_mc;
5653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
5663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = 0xffffffff & bo2_mc;
5673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
5683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_sdma_test_exec_cs(context_handle, 0,
5713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						i, pm4,
5723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						2, resources,
5733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher						ib_info, ibs_request);
5743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			/* verify if SDMA test result meets with expected */
5763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			i = 0;
5773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			while(i < sdma_write_length) {
5783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa);
5793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			}
5803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_bo_free(bo1);
5813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			amdgpu_bo_free(bo2);
5823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			loop2++;
5833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		}
5843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		loop1++;
5853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
5863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* clean resources */
5873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(resources);
5883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
5893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
5903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
5913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	/* end of test */
5933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_free(device_handle, context_handle);
5943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
5953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
5963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
5973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_command_submission_sdma(void)
5983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
5993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_write_linear();
6003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_const_fill();
6013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_command_submission_sdma_copy_linear();
6023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
6033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void amdgpu_userptr_test(void)
6053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{
6063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int i, r, j;
6073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint32_t *pm4 = NULL;
6083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	uint64_t bo_mc;
6093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	void *ptr = NULL;
6103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int pm4_dw = 256;
6113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	int sdma_write_length = 4;
6123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_bo_handle handle;
6133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_context_handle context_handle;
6143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_ib_info *ib_info;
6153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_cs_request *ibs_request;
6163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	struct amdgpu_bo_alloc_result res;
6173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(&res, 0, sizeof(res));
6193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4 = calloc(pm4_dw, sizeof(*pm4));
6213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(pm4, NULL);
6223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ib_info = calloc(1, sizeof(*ib_info));
6243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ib_info, NULL);
6253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	ibs_request = calloc(1, sizeof(*ibs_request));
6273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
6283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
6303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE);
6333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_NOT_EQUAL(ptr, NULL);
6343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	memset(ptr, 0, BUFFER_SIZE);
6353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_create_bo_from_user_mem(device_handle,
6373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher					   ptr, BUFFER_SIZE, &res);
6383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	bo_mc = res.virtual_mc_base_address;
6403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	handle = res.buf_handle;
6413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	j = i = 0;
6433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
6443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher			       SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
6453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = 0xffffffff & bo_mc;
6463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
6473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	pm4[i++] = sdma_write_length;
6483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (j++ < sdma_write_length)
6503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		pm4[i++] = 0xdeadbeaf;
6513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	amdgpu_sdma_test_exec_cs(context_handle, 0,
6533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 i, pm4,
6543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 1, &handle,
6553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher				 ib_info, ibs_request);
6563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	i = 0;
6573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	while (i < sdma_write_length) {
6583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher		CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf);
6593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	}
6603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ibs_request);
6613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ib_info);
6623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(pm4);
6633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_bo_free(res.buf_handle);
6643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	free(ptr);
6663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher
6673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	r = amdgpu_cs_ctx_free(device_handle, context_handle);
6683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher	CU_ASSERT_EQUAL(r, 0);
6693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}
670