amdgpu_test.h revision 037b3c26
13f012e29Smrg/*
23f012e29Smrg * Copyright 2014 Advanced Micro Devices, Inc.
33f012e29Smrg *
43f012e29Smrg * Permission is hereby granted, free of charge, to any person obtaining a
53f012e29Smrg * copy of this software and associated documentation files (the "Software"),
63f012e29Smrg * to deal in the Software without restriction, including without limitation
73f012e29Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
83f012e29Smrg * and/or sell copies of the Software, and to permit persons to whom the
93f012e29Smrg * Software is furnished to do so, subject to the following conditions:
103f012e29Smrg *
113f012e29Smrg * The above copyright notice and this permission notice shall be included in
123f012e29Smrg * all copies or substantial portions of the Software.
133f012e29Smrg *
143f012e29Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
153f012e29Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
163f012e29Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
173f012e29Smrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
183f012e29Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
193f012e29Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
203f012e29Smrg * OTHER DEALINGS IN THE SOFTWARE.
213f012e29Smrg *
223f012e29Smrg*/
233f012e29Smrg
243f012e29Smrg#ifndef _AMDGPU_TEST_H_
253f012e29Smrg#define _AMDGPU_TEST_H_
263f012e29Smrg
273f012e29Smrg#include "amdgpu.h"
283f012e29Smrg#include "amdgpu_drm.h"
293f012e29Smrg
303f012e29Smrg/**
313f012e29Smrg * Define max. number of card in system which we are able to handle
323f012e29Smrg */
333f012e29Smrg#define MAX_CARDS_SUPPORTED     4
343f012e29Smrg
353f012e29Smrg/* Forward reference for array to keep "drm" handles */
363f012e29Smrgextern int drm_amdgpu[MAX_CARDS_SUPPORTED];
373f012e29Smrg
38037b3c26Smrg/* Global variables */
39037b3c26Smrgextern int open_render_node;
40037b3c26Smrg
413f012e29Smrg/*************************  Basic test suite ********************************/
423f012e29Smrg
433f012e29Smrg/*
443f012e29Smrg * Define basic test suite to serve as the starting point for future testing
453f012e29Smrg*/
463f012e29Smrg
473f012e29Smrg/**
483f012e29Smrg * Initialize basic test suite
493f012e29Smrg */
503f012e29Smrgint suite_basic_tests_init();
513f012e29Smrg
523f012e29Smrg/**
533f012e29Smrg * Deinitialize basic test suite
543f012e29Smrg */
553f012e29Smrgint suite_basic_tests_clean();
563f012e29Smrg
573f012e29Smrg/**
583f012e29Smrg * Tests in basic test suite
593f012e29Smrg */
603f012e29Smrgextern CU_TestInfo basic_tests[];
613f012e29Smrg
623f012e29Smrg/**
633f012e29Smrg * Initialize bo test suite
643f012e29Smrg */
653f012e29Smrgint suite_bo_tests_init();
663f012e29Smrg
673f012e29Smrg/**
683f012e29Smrg * Deinitialize bo test suite
693f012e29Smrg */
703f012e29Smrgint suite_bo_tests_clean();
713f012e29Smrg
723f012e29Smrg/**
733f012e29Smrg * Tests in bo test suite
743f012e29Smrg */
753f012e29Smrgextern CU_TestInfo bo_tests[];
763f012e29Smrg
773f012e29Smrg/**
783f012e29Smrg * Initialize cs test suite
793f012e29Smrg */
803f012e29Smrgint suite_cs_tests_init();
813f012e29Smrg
823f012e29Smrg/**
833f012e29Smrg * Deinitialize cs test suite
843f012e29Smrg */
853f012e29Smrgint suite_cs_tests_clean();
863f012e29Smrg
873f012e29Smrg/**
883f012e29Smrg * Tests in cs test suite
893f012e29Smrg */
903f012e29Smrgextern CU_TestInfo cs_tests[];
913f012e29Smrg
923f012e29Smrg/**
933f012e29Smrg * Initialize vce test suite
943f012e29Smrg */
953f012e29Smrgint suite_vce_tests_init();
963f012e29Smrg
973f012e29Smrg/**
983f012e29Smrg * Deinitialize vce test suite
993f012e29Smrg */
1003f012e29Smrgint suite_vce_tests_clean();
1013f012e29Smrg
1023f012e29Smrg/**
1033f012e29Smrg * Tests in vce test suite
1043f012e29Smrg */
1053f012e29Smrgextern CU_TestInfo vce_tests[];
1063f012e29Smrg
1073f012e29Smrg/**
1083f012e29Smrg * Helper functions
1093f012e29Smrg */
1103f012e29Smrgstatic inline amdgpu_bo_handle gpu_mem_alloc(
1113f012e29Smrg					amdgpu_device_handle device_handle,
1123f012e29Smrg					uint64_t size,
1133f012e29Smrg					uint64_t alignment,
1143f012e29Smrg					uint32_t type,
1153f012e29Smrg					uint64_t flags,
1163f012e29Smrg					uint64_t *vmc_addr,
1173f012e29Smrg					amdgpu_va_handle *va_handle)
1183f012e29Smrg{
1193f012e29Smrg	struct amdgpu_bo_alloc_request req = {0};
1203f012e29Smrg	amdgpu_bo_handle buf_handle;
1213f012e29Smrg	int r;
1223f012e29Smrg
1233f012e29Smrg	CU_ASSERT_NOT_EQUAL(vmc_addr, NULL);
1243f012e29Smrg
1253f012e29Smrg	req.alloc_size = size;
1263f012e29Smrg	req.phys_alignment = alignment;
1273f012e29Smrg	req.preferred_heap = type;
1283f012e29Smrg	req.flags = flags;
1293f012e29Smrg
1303f012e29Smrg	r = amdgpu_bo_alloc(device_handle, &req, &buf_handle);
1313f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1323f012e29Smrg
1333f012e29Smrg	r = amdgpu_va_range_alloc(device_handle,
1343f012e29Smrg				  amdgpu_gpu_va_range_general,
1353f012e29Smrg				  size, alignment, 0, vmc_addr,
1363f012e29Smrg				  va_handle, 0);
1373f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1383f012e29Smrg
1393f012e29Smrg	r = amdgpu_bo_va_op(buf_handle, 0, size, *vmc_addr, 0, AMDGPU_VA_OP_MAP);
1403f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1413f012e29Smrg
1423f012e29Smrg	return buf_handle;
1433f012e29Smrg}
1443f012e29Smrg
1453f012e29Smrgstatic inline int gpu_mem_free(amdgpu_bo_handle bo,
1463f012e29Smrg			       amdgpu_va_handle va_handle,
1473f012e29Smrg			       uint64_t vmc_addr,
1483f012e29Smrg			       uint64_t size)
1493f012e29Smrg{
1503f012e29Smrg	int r;
1513f012e29Smrg
1523f012e29Smrg	r = amdgpu_bo_va_op(bo, 0, size, vmc_addr, 0, AMDGPU_VA_OP_UNMAP);
1533f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1543f012e29Smrg
1553f012e29Smrg	r = amdgpu_va_range_free(va_handle);
1563f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1573f012e29Smrg
1583f012e29Smrg	r = amdgpu_bo_free(bo);
1593f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1603f012e29Smrg
1613f012e29Smrg	return 0;
1623f012e29Smrg}
1633f012e29Smrg
1643f012e29Smrgstatic inline int
1653f012e29Smrgamdgpu_bo_alloc_and_map(amdgpu_device_handle dev, unsigned size,
1663f012e29Smrg			unsigned alignment, unsigned heap, uint64_t flags,
1673f012e29Smrg			amdgpu_bo_handle *bo, void **cpu, uint64_t *mc_address,
1683f012e29Smrg			amdgpu_va_handle *va_handle)
1693f012e29Smrg{
1703f012e29Smrg	struct amdgpu_bo_alloc_request request = {};
1713f012e29Smrg	amdgpu_bo_handle buf_handle;
1723f012e29Smrg	amdgpu_va_handle handle;
1733f012e29Smrg	uint64_t vmc_addr;
1743f012e29Smrg	int r;
1753f012e29Smrg
1763f012e29Smrg	request.alloc_size = size;
1773f012e29Smrg	request.phys_alignment = alignment;
1783f012e29Smrg	request.preferred_heap = heap;
1793f012e29Smrg	request.flags = flags;
1803f012e29Smrg
1813f012e29Smrg	r = amdgpu_bo_alloc(dev, &request, &buf_handle);
1823f012e29Smrg	if (r)
1833f012e29Smrg		return r;
1843f012e29Smrg
1853f012e29Smrg	r = amdgpu_va_range_alloc(dev,
1863f012e29Smrg				  amdgpu_gpu_va_range_general,
1873f012e29Smrg				  size, alignment, 0, &vmc_addr,
1883f012e29Smrg				  &handle, 0);
1893f012e29Smrg	if (r)
1903f012e29Smrg		goto error_va_alloc;
1913f012e29Smrg
1923f012e29Smrg	r = amdgpu_bo_va_op(buf_handle, 0, size, vmc_addr, 0, AMDGPU_VA_OP_MAP);
1933f012e29Smrg	if (r)
1943f012e29Smrg		goto error_va_map;
1953f012e29Smrg
1963f012e29Smrg	r = amdgpu_bo_cpu_map(buf_handle, cpu);
1973f012e29Smrg	if (r)
1983f012e29Smrg		goto error_cpu_map;
1993f012e29Smrg
2003f012e29Smrg	*bo = buf_handle;
2013f012e29Smrg	*mc_address = vmc_addr;
2023f012e29Smrg	*va_handle = handle;
2033f012e29Smrg
2043f012e29Smrg	return 0;
2053f012e29Smrg
2063f012e29Smrgerror_cpu_map:
2073f012e29Smrg	amdgpu_bo_cpu_unmap(buf_handle);
2083f012e29Smrg
2093f012e29Smrgerror_va_map:
2103f012e29Smrg	amdgpu_bo_va_op(buf_handle, 0, size, vmc_addr, 0, AMDGPU_VA_OP_UNMAP);
2113f012e29Smrg
2123f012e29Smrgerror_va_alloc:
2133f012e29Smrg	amdgpu_bo_free(buf_handle);
2143f012e29Smrg	return r;
2153f012e29Smrg}
2163f012e29Smrg
2173f012e29Smrgstatic inline int
2183f012e29Smrgamdgpu_bo_unmap_and_free(amdgpu_bo_handle bo, amdgpu_va_handle va_handle,
2193f012e29Smrg			 uint64_t mc_addr, uint64_t size)
2203f012e29Smrg{
2213f012e29Smrg	amdgpu_bo_cpu_unmap(bo);
2223f012e29Smrg	amdgpu_bo_va_op(bo, 0, size, mc_addr, 0, AMDGPU_VA_OP_UNMAP);
2233f012e29Smrg	amdgpu_va_range_free(va_handle);
2243f012e29Smrg	amdgpu_bo_free(bo);
2253f012e29Smrg
2263f012e29Smrg	return 0;
2273f012e29Smrg
2283f012e29Smrg}
2293f012e29Smrg
2303f012e29Smrgstatic inline int
2313f012e29Smrgamdgpu_get_bo_list(amdgpu_device_handle dev, amdgpu_bo_handle bo1,
2323f012e29Smrg		   amdgpu_bo_handle bo2, amdgpu_bo_list_handle *list)
2333f012e29Smrg{
2343f012e29Smrg	amdgpu_bo_handle resources[] = {bo1, bo2};
2353f012e29Smrg
2363f012e29Smrg	return amdgpu_bo_list_create(dev, bo2 ? 2 : 1, resources, NULL, list);
2373f012e29Smrg}
2383f012e29Smrg
2393f012e29Smrg#endif  /* #ifdef _AMDGPU_TEST_H_ */
240