amdgpu_test.h revision 3f012e29
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
383f012e29Smrg/*************************  Basic test suite ********************************/
393f012e29Smrg
403f012e29Smrg/*
413f012e29Smrg * Define basic test suite to serve as the starting point for future testing
423f012e29Smrg*/
433f012e29Smrg
443f012e29Smrg/**
453f012e29Smrg * Initialize basic test suite
463f012e29Smrg */
473f012e29Smrgint suite_basic_tests_init();
483f012e29Smrg
493f012e29Smrg/**
503f012e29Smrg * Deinitialize basic test suite
513f012e29Smrg */
523f012e29Smrgint suite_basic_tests_clean();
533f012e29Smrg
543f012e29Smrg/**
553f012e29Smrg * Tests in basic test suite
563f012e29Smrg */
573f012e29Smrgextern CU_TestInfo basic_tests[];
583f012e29Smrg
593f012e29Smrg/**
603f012e29Smrg * Initialize bo test suite
613f012e29Smrg */
623f012e29Smrgint suite_bo_tests_init();
633f012e29Smrg
643f012e29Smrg/**
653f012e29Smrg * Deinitialize bo test suite
663f012e29Smrg */
673f012e29Smrgint suite_bo_tests_clean();
683f012e29Smrg
693f012e29Smrg/**
703f012e29Smrg * Tests in bo test suite
713f012e29Smrg */
723f012e29Smrgextern CU_TestInfo bo_tests[];
733f012e29Smrg
743f012e29Smrg/**
753f012e29Smrg * Initialize cs test suite
763f012e29Smrg */
773f012e29Smrgint suite_cs_tests_init();
783f012e29Smrg
793f012e29Smrg/**
803f012e29Smrg * Deinitialize cs test suite
813f012e29Smrg */
823f012e29Smrgint suite_cs_tests_clean();
833f012e29Smrg
843f012e29Smrg/**
853f012e29Smrg * Tests in cs test suite
863f012e29Smrg */
873f012e29Smrgextern CU_TestInfo cs_tests[];
883f012e29Smrg
893f012e29Smrg/**
903f012e29Smrg * Initialize vce test suite
913f012e29Smrg */
923f012e29Smrgint suite_vce_tests_init();
933f012e29Smrg
943f012e29Smrg/**
953f012e29Smrg * Deinitialize vce test suite
963f012e29Smrg */
973f012e29Smrgint suite_vce_tests_clean();
983f012e29Smrg
993f012e29Smrg/**
1003f012e29Smrg * Tests in vce test suite
1013f012e29Smrg */
1023f012e29Smrgextern CU_TestInfo vce_tests[];
1033f012e29Smrg
1043f012e29Smrg/**
1053f012e29Smrg * Helper functions
1063f012e29Smrg */
1073f012e29Smrgstatic inline amdgpu_bo_handle gpu_mem_alloc(
1083f012e29Smrg					amdgpu_device_handle device_handle,
1093f012e29Smrg					uint64_t size,
1103f012e29Smrg					uint64_t alignment,
1113f012e29Smrg					uint32_t type,
1123f012e29Smrg					uint64_t flags,
1133f012e29Smrg					uint64_t *vmc_addr,
1143f012e29Smrg					amdgpu_va_handle *va_handle)
1153f012e29Smrg{
1163f012e29Smrg	struct amdgpu_bo_alloc_request req = {0};
1173f012e29Smrg	amdgpu_bo_handle buf_handle;
1183f012e29Smrg	int r;
1193f012e29Smrg
1203f012e29Smrg	CU_ASSERT_NOT_EQUAL(vmc_addr, NULL);
1213f012e29Smrg
1223f012e29Smrg	req.alloc_size = size;
1233f012e29Smrg	req.phys_alignment = alignment;
1243f012e29Smrg	req.preferred_heap = type;
1253f012e29Smrg	req.flags = flags;
1263f012e29Smrg
1273f012e29Smrg	r = amdgpu_bo_alloc(device_handle, &req, &buf_handle);
1283f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1293f012e29Smrg
1303f012e29Smrg	r = amdgpu_va_range_alloc(device_handle,
1313f012e29Smrg				  amdgpu_gpu_va_range_general,
1323f012e29Smrg				  size, alignment, 0, vmc_addr,
1333f012e29Smrg				  va_handle, 0);
1343f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1353f012e29Smrg
1363f012e29Smrg	r = amdgpu_bo_va_op(buf_handle, 0, size, *vmc_addr, 0, AMDGPU_VA_OP_MAP);
1373f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1383f012e29Smrg
1393f012e29Smrg	return buf_handle;
1403f012e29Smrg}
1413f012e29Smrg
1423f012e29Smrgstatic inline int gpu_mem_free(amdgpu_bo_handle bo,
1433f012e29Smrg			       amdgpu_va_handle va_handle,
1443f012e29Smrg			       uint64_t vmc_addr,
1453f012e29Smrg			       uint64_t size)
1463f012e29Smrg{
1473f012e29Smrg	int r;
1483f012e29Smrg
1493f012e29Smrg	r = amdgpu_bo_va_op(bo, 0, size, vmc_addr, 0, AMDGPU_VA_OP_UNMAP);
1503f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1513f012e29Smrg
1523f012e29Smrg	r = amdgpu_va_range_free(va_handle);
1533f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1543f012e29Smrg
1553f012e29Smrg	r = amdgpu_bo_free(bo);
1563f012e29Smrg	CU_ASSERT_EQUAL(r, 0);
1573f012e29Smrg
1583f012e29Smrg	return 0;
1593f012e29Smrg}
1603f012e29Smrg
1613f012e29Smrgstatic inline int
1623f012e29Smrgamdgpu_bo_alloc_and_map(amdgpu_device_handle dev, unsigned size,
1633f012e29Smrg			unsigned alignment, unsigned heap, uint64_t flags,
1643f012e29Smrg			amdgpu_bo_handle *bo, void **cpu, uint64_t *mc_address,
1653f012e29Smrg			amdgpu_va_handle *va_handle)
1663f012e29Smrg{
1673f012e29Smrg	struct amdgpu_bo_alloc_request request = {};
1683f012e29Smrg	amdgpu_bo_handle buf_handle;
1693f012e29Smrg	amdgpu_va_handle handle;
1703f012e29Smrg	uint64_t vmc_addr;
1713f012e29Smrg	int r;
1723f012e29Smrg
1733f012e29Smrg	request.alloc_size = size;
1743f012e29Smrg	request.phys_alignment = alignment;
1753f012e29Smrg	request.preferred_heap = heap;
1763f012e29Smrg	request.flags = flags;
1773f012e29Smrg
1783f012e29Smrg	r = amdgpu_bo_alloc(dev, &request, &buf_handle);
1793f012e29Smrg	if (r)
1803f012e29Smrg		return r;
1813f012e29Smrg
1823f012e29Smrg	r = amdgpu_va_range_alloc(dev,
1833f012e29Smrg				  amdgpu_gpu_va_range_general,
1843f012e29Smrg				  size, alignment, 0, &vmc_addr,
1853f012e29Smrg				  &handle, 0);
1863f012e29Smrg	if (r)
1873f012e29Smrg		goto error_va_alloc;
1883f012e29Smrg
1893f012e29Smrg	r = amdgpu_bo_va_op(buf_handle, 0, size, vmc_addr, 0, AMDGPU_VA_OP_MAP);
1903f012e29Smrg	if (r)
1913f012e29Smrg		goto error_va_map;
1923f012e29Smrg
1933f012e29Smrg	r = amdgpu_bo_cpu_map(buf_handle, cpu);
1943f012e29Smrg	if (r)
1953f012e29Smrg		goto error_cpu_map;
1963f012e29Smrg
1973f012e29Smrg	*bo = buf_handle;
1983f012e29Smrg	*mc_address = vmc_addr;
1993f012e29Smrg	*va_handle = handle;
2003f012e29Smrg
2013f012e29Smrg	return 0;
2023f012e29Smrg
2033f012e29Smrgerror_cpu_map:
2043f012e29Smrg	amdgpu_bo_cpu_unmap(buf_handle);
2053f012e29Smrg
2063f012e29Smrgerror_va_map:
2073f012e29Smrg	amdgpu_bo_va_op(buf_handle, 0, size, vmc_addr, 0, AMDGPU_VA_OP_UNMAP);
2083f012e29Smrg
2093f012e29Smrgerror_va_alloc:
2103f012e29Smrg	amdgpu_bo_free(buf_handle);
2113f012e29Smrg	return r;
2123f012e29Smrg}
2133f012e29Smrg
2143f012e29Smrgstatic inline int
2153f012e29Smrgamdgpu_bo_unmap_and_free(amdgpu_bo_handle bo, amdgpu_va_handle va_handle,
2163f012e29Smrg			 uint64_t mc_addr, uint64_t size)
2173f012e29Smrg{
2183f012e29Smrg	amdgpu_bo_cpu_unmap(bo);
2193f012e29Smrg	amdgpu_bo_va_op(bo, 0, size, mc_addr, 0, AMDGPU_VA_OP_UNMAP);
2203f012e29Smrg	amdgpu_va_range_free(va_handle);
2213f012e29Smrg	amdgpu_bo_free(bo);
2223f012e29Smrg
2233f012e29Smrg	return 0;
2243f012e29Smrg
2253f012e29Smrg}
2263f012e29Smrg
2273f012e29Smrgstatic inline int
2283f012e29Smrgamdgpu_get_bo_list(amdgpu_device_handle dev, amdgpu_bo_handle bo1,
2293f012e29Smrg		   amdgpu_bo_handle bo2, amdgpu_bo_list_handle *list)
2303f012e29Smrg{
2313f012e29Smrg	amdgpu_bo_handle resources[] = {bo1, bo2};
2323f012e29Smrg
2333f012e29Smrg	return amdgpu_bo_list_create(dev, bo2 ? 2 : 1, resources, NULL, list);
2343f012e29Smrg}
2353f012e29Smrg
2363f012e29Smrg#endif  /* #ifdef _AMDGPU_TEST_H_ */
237