xref: /aosp_15_r20/external/igt-gpu-tools/lib/igt_v3d.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2016 Broadcom
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  */
23*d83cc019SAndroid Build Coastguard Worker 
24*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
25*d83cc019SAndroid Build Coastguard Worker #include <string.h>
26*d83cc019SAndroid Build Coastguard Worker #include <signal.h>
27*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
28*d83cc019SAndroid Build Coastguard Worker #include <sys/mman.h>
29*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
30*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
31*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
32*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
33*d83cc019SAndroid Build Coastguard Worker 
34*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
35*d83cc019SAndroid Build Coastguard Worker #include "igt_aux.h"
36*d83cc019SAndroid Build Coastguard Worker #include "igt_core.h"
37*d83cc019SAndroid Build Coastguard Worker #include "igt_v3d.h"
38*d83cc019SAndroid Build Coastguard Worker #include "ioctl_wrappers.h"
39*d83cc019SAndroid Build Coastguard Worker #include "intel_reg.h"
40*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
41*d83cc019SAndroid Build Coastguard Worker #include "v3d_drm.h"
42*d83cc019SAndroid Build Coastguard Worker 
43*d83cc019SAndroid Build Coastguard Worker /**
44*d83cc019SAndroid Build Coastguard Worker  * SECTION:igt_v3d
45*d83cc019SAndroid Build Coastguard Worker  * @short_description: V3D support library
46*d83cc019SAndroid Build Coastguard Worker  * @title: V3D
47*d83cc019SAndroid Build Coastguard Worker  * @include: igt.h
48*d83cc019SAndroid Build Coastguard Worker  *
49*d83cc019SAndroid Build Coastguard Worker  * This library provides various auxiliary helper functions for writing V3D
50*d83cc019SAndroid Build Coastguard Worker  * tests.
51*d83cc019SAndroid Build Coastguard Worker  */
52*d83cc019SAndroid Build Coastguard Worker 
53*d83cc019SAndroid Build Coastguard Worker struct v3d_bo *
igt_v3d_create_bo(int fd,size_t size)54*d83cc019SAndroid Build Coastguard Worker igt_v3d_create_bo(int fd, size_t size)
55*d83cc019SAndroid Build Coastguard Worker {
56*d83cc019SAndroid Build Coastguard Worker 	struct v3d_bo *bo = calloc(1, sizeof(*bo));
57*d83cc019SAndroid Build Coastguard Worker 
58*d83cc019SAndroid Build Coastguard Worker 	struct drm_v3d_create_bo create = {
59*d83cc019SAndroid Build Coastguard Worker 		.size = size,
60*d83cc019SAndroid Build Coastguard Worker 	};
61*d83cc019SAndroid Build Coastguard Worker 
62*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(fd, DRM_IOCTL_V3D_CREATE_BO, &create);
63*d83cc019SAndroid Build Coastguard Worker 
64*d83cc019SAndroid Build Coastguard Worker 	bo->handle = create.handle;
65*d83cc019SAndroid Build Coastguard Worker 	bo->offset = create.offset;
66*d83cc019SAndroid Build Coastguard Worker 	bo->size = size;
67*d83cc019SAndroid Build Coastguard Worker 
68*d83cc019SAndroid Build Coastguard Worker 	return bo;
69*d83cc019SAndroid Build Coastguard Worker }
70*d83cc019SAndroid Build Coastguard Worker 
71*d83cc019SAndroid Build Coastguard Worker void
igt_v3d_free_bo(int fd,struct v3d_bo * bo)72*d83cc019SAndroid Build Coastguard Worker igt_v3d_free_bo(int fd, struct v3d_bo *bo)
73*d83cc019SAndroid Build Coastguard Worker {
74*d83cc019SAndroid Build Coastguard Worker 	if (bo->map)
75*d83cc019SAndroid Build Coastguard Worker 		munmap(bo->map, bo->size);
76*d83cc019SAndroid Build Coastguard Worker 	gem_close(fd, bo->handle);
77*d83cc019SAndroid Build Coastguard Worker 	free(bo);
78*d83cc019SAndroid Build Coastguard Worker }
79*d83cc019SAndroid Build Coastguard Worker 
80*d83cc019SAndroid Build Coastguard Worker uint32_t
igt_v3d_get_bo_offset(int fd,uint32_t handle)81*d83cc019SAndroid Build Coastguard Worker igt_v3d_get_bo_offset(int fd, uint32_t handle)
82*d83cc019SAndroid Build Coastguard Worker {
83*d83cc019SAndroid Build Coastguard Worker 	struct drm_v3d_get_bo_offset get = {
84*d83cc019SAndroid Build Coastguard Worker 		.handle = handle,
85*d83cc019SAndroid Build Coastguard Worker 	};
86*d83cc019SAndroid Build Coastguard Worker 
87*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(fd, DRM_IOCTL_V3D_GET_BO_OFFSET, &get);
88*d83cc019SAndroid Build Coastguard Worker 
89*d83cc019SAndroid Build Coastguard Worker 	return get.offset;
90*d83cc019SAndroid Build Coastguard Worker }
91*d83cc019SAndroid Build Coastguard Worker 
92*d83cc019SAndroid Build Coastguard Worker uint32_t
igt_v3d_get_param(int fd,enum drm_v3d_param param)93*d83cc019SAndroid Build Coastguard Worker igt_v3d_get_param(int fd, enum drm_v3d_param param)
94*d83cc019SAndroid Build Coastguard Worker {
95*d83cc019SAndroid Build Coastguard Worker 	struct drm_v3d_get_param get = {
96*d83cc019SAndroid Build Coastguard Worker 		.param = param,
97*d83cc019SAndroid Build Coastguard Worker 	};
98*d83cc019SAndroid Build Coastguard Worker 
99*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(fd, DRM_IOCTL_V3D_GET_PARAM, &get);
100*d83cc019SAndroid Build Coastguard Worker 
101*d83cc019SAndroid Build Coastguard Worker 	return get.value;
102*d83cc019SAndroid Build Coastguard Worker }
103*d83cc019SAndroid Build Coastguard Worker 
104*d83cc019SAndroid Build Coastguard Worker void *
igt_v3d_mmap_bo(int fd,uint32_t handle,uint32_t size,unsigned prot)105*d83cc019SAndroid Build Coastguard Worker igt_v3d_mmap_bo(int fd, uint32_t handle, uint32_t size, unsigned prot)
106*d83cc019SAndroid Build Coastguard Worker {
107*d83cc019SAndroid Build Coastguard Worker 	struct drm_v3d_mmap_bo mmap_bo = {
108*d83cc019SAndroid Build Coastguard Worker 		.handle = handle,
109*d83cc019SAndroid Build Coastguard Worker 	};
110*d83cc019SAndroid Build Coastguard Worker 	void *ptr;
111*d83cc019SAndroid Build Coastguard Worker 
112*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(fd, DRM_IOCTL_V3D_MMAP_BO, &mmap_bo);
113*d83cc019SAndroid Build Coastguard Worker 
114*d83cc019SAndroid Build Coastguard Worker 	ptr = mmap(0, size, prot, MAP_SHARED, fd, mmap_bo.offset);
115*d83cc019SAndroid Build Coastguard Worker 	if (ptr == MAP_FAILED)
116*d83cc019SAndroid Build Coastguard Worker 		return NULL;
117*d83cc019SAndroid Build Coastguard Worker 	else
118*d83cc019SAndroid Build Coastguard Worker 		return ptr;
119*d83cc019SAndroid Build Coastguard Worker }
120*d83cc019SAndroid Build Coastguard Worker 
igt_v3d_bo_mmap(int fd,struct v3d_bo * bo)121*d83cc019SAndroid Build Coastguard Worker void igt_v3d_bo_mmap(int fd, struct v3d_bo *bo)
122*d83cc019SAndroid Build Coastguard Worker {
123*d83cc019SAndroid Build Coastguard Worker 	bo->map = igt_v3d_mmap_bo(fd, bo->handle, bo->size,
124*d83cc019SAndroid Build Coastguard Worker 				  PROT_READ | PROT_WRITE);
125*d83cc019SAndroid Build Coastguard Worker 	igt_assert(bo->map);
126*d83cc019SAndroid Build Coastguard Worker }
127