1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2007, 2011, 2013, 2014 Intel Corporation
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 * Authors:
24*d83cc019SAndroid Build Coastguard Worker * Eric Anholt <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker * Daniel Vetter <[email protected]>
26*d83cc019SAndroid Build Coastguard Worker *
27*d83cc019SAndroid Build Coastguard Worker */
28*d83cc019SAndroid Build Coastguard Worker
29*d83cc019SAndroid Build Coastguard Worker #ifdef HAVE_LIBGEN_H
30*d83cc019SAndroid Build Coastguard Worker #include <libgen.h>
31*d83cc019SAndroid Build Coastguard Worker #endif
32*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
33*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
34*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
35*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
36*d83cc019SAndroid Build Coastguard Worker #include <string.h>
37*d83cc019SAndroid Build Coastguard Worker #include <sys/mman.h>
38*d83cc019SAndroid Build Coastguard Worker #include <signal.h>
39*d83cc019SAndroid Build Coastguard Worker #include <pciaccess.h>
40*d83cc019SAndroid Build Coastguard Worker #include <getopt.h>
41*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
42*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
43*d83cc019SAndroid Build Coastguard Worker #include <sys/wait.h>
44*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
45*d83cc019SAndroid Build Coastguard Worker #include <sys/syscall.h>
46*d83cc019SAndroid Build Coastguard Worker #include <sys/utsname.h>
47*d83cc019SAndroid Build Coastguard Worker #include <termios.h>
48*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
49*d83cc019SAndroid Build Coastguard Worker
50*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
51*d83cc019SAndroid Build Coastguard Worker #include "i915_drm.h"
52*d83cc019SAndroid Build Coastguard Worker #include "intel_batchbuffer.h"
53*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
54*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
55*d83cc019SAndroid Build Coastguard Worker #include "igt_debugfs.h"
56*d83cc019SAndroid Build Coastguard Worker #include "igt_sysfs.h"
57*d83cc019SAndroid Build Coastguard Worker #include "config.h"
58*d83cc019SAndroid Build Coastguard Worker
59*d83cc019SAndroid Build Coastguard Worker #ifdef HAVE_VALGRIND
60*d83cc019SAndroid Build Coastguard Worker #include <valgrind/valgrind.h>
61*d83cc019SAndroid Build Coastguard Worker #include <valgrind/memcheck.h>
62*d83cc019SAndroid Build Coastguard Worker
63*d83cc019SAndroid Build Coastguard Worker #define VG(x) x
64*d83cc019SAndroid Build Coastguard Worker #else
65*d83cc019SAndroid Build Coastguard Worker #define VG(x) do {} while (0)
66*d83cc019SAndroid Build Coastguard Worker #endif
67*d83cc019SAndroid Build Coastguard Worker
68*d83cc019SAndroid Build Coastguard Worker #include "ioctl_wrappers.h"
69*d83cc019SAndroid Build Coastguard Worker
70*d83cc019SAndroid Build Coastguard Worker /**
71*d83cc019SAndroid Build Coastguard Worker * SECTION:ioctl_wrappers
72*d83cc019SAndroid Build Coastguard Worker * @short_description: ioctl wrappers and related functions
73*d83cc019SAndroid Build Coastguard Worker * @title: ioctl wrappers
74*d83cc019SAndroid Build Coastguard Worker * @include: igt.h
75*d83cc019SAndroid Build Coastguard Worker *
76*d83cc019SAndroid Build Coastguard Worker * This helper library contains simple functions to wrap the raw drm/i915 kernel
77*d83cc019SAndroid Build Coastguard Worker * ioctls. The normal versions never pass any error codes to the caller and use
78*d83cc019SAndroid Build Coastguard Worker * igt_assert() to check for error conditions instead. For some ioctls raw
79*d83cc019SAndroid Build Coastguard Worker * wrappers which do pass on error codes are available. These raw wrappers have
80*d83cc019SAndroid Build Coastguard Worker * a __ prefix.
81*d83cc019SAndroid Build Coastguard Worker *
82*d83cc019SAndroid Build Coastguard Worker * For wrappers which check for feature bits there can also be two versions: The
83*d83cc019SAndroid Build Coastguard Worker * normal one simply returns a boolean to the caller. But when skipping the
84*d83cc019SAndroid Build Coastguard Worker * testcase entirely is the right action then it's better to use igt_skip()
85*d83cc019SAndroid Build Coastguard Worker * directly in the wrapper. Such functions have _require_ in their name to
86*d83cc019SAndroid Build Coastguard Worker * distinguish them.
87*d83cc019SAndroid Build Coastguard Worker */
88*d83cc019SAndroid Build Coastguard Worker
89*d83cc019SAndroid Build Coastguard Worker int (*igt_ioctl)(int fd, unsigned long request, void *arg) = drmIoctl;
90*d83cc019SAndroid Build Coastguard Worker
91*d83cc019SAndroid Build Coastguard Worker
92*d83cc019SAndroid Build Coastguard Worker /**
93*d83cc019SAndroid Build Coastguard Worker * gem_handle_to_libdrm_bo:
94*d83cc019SAndroid Build Coastguard Worker * @bufmgr: libdrm buffer manager instance
95*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
96*d83cc019SAndroid Build Coastguard Worker * @name: buffer name in libdrm
97*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
98*d83cc019SAndroid Build Coastguard Worker *
99*d83cc019SAndroid Build Coastguard Worker * This helper function imports a raw gem buffer handle into the libdrm buffer
100*d83cc019SAndroid Build Coastguard Worker * manager.
101*d83cc019SAndroid Build Coastguard Worker *
102*d83cc019SAndroid Build Coastguard Worker * Returns: The imported libdrm buffer manager object.
103*d83cc019SAndroid Build Coastguard Worker */
104*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *
gem_handle_to_libdrm_bo(drm_intel_bufmgr * bufmgr,int fd,const char * name,uint32_t handle)105*d83cc019SAndroid Build Coastguard Worker gem_handle_to_libdrm_bo(drm_intel_bufmgr *bufmgr, int fd, const char *name, uint32_t handle)
106*d83cc019SAndroid Build Coastguard Worker {
107*d83cc019SAndroid Build Coastguard Worker struct drm_gem_flink flink;
108*d83cc019SAndroid Build Coastguard Worker int ret;
109*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *bo;
110*d83cc019SAndroid Build Coastguard Worker
111*d83cc019SAndroid Build Coastguard Worker memset(&flink, 0, sizeof(handle));
112*d83cc019SAndroid Build Coastguard Worker flink.handle = handle;
113*d83cc019SAndroid Build Coastguard Worker ret = ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink);
114*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0);
115*d83cc019SAndroid Build Coastguard Worker errno = 0;
116*d83cc019SAndroid Build Coastguard Worker
117*d83cc019SAndroid Build Coastguard Worker bo = drm_intel_bo_gem_create_from_name(bufmgr, name, flink.name);
118*d83cc019SAndroid Build Coastguard Worker igt_assert(bo);
119*d83cc019SAndroid Build Coastguard Worker
120*d83cc019SAndroid Build Coastguard Worker return bo;
121*d83cc019SAndroid Build Coastguard Worker }
122*d83cc019SAndroid Build Coastguard Worker
123*d83cc019SAndroid Build Coastguard Worker static int
__gem_get_tiling(int fd,struct drm_i915_gem_get_tiling * arg)124*d83cc019SAndroid Build Coastguard Worker __gem_get_tiling(int fd, struct drm_i915_gem_get_tiling *arg)
125*d83cc019SAndroid Build Coastguard Worker {
126*d83cc019SAndroid Build Coastguard Worker int err;
127*d83cc019SAndroid Build Coastguard Worker
128*d83cc019SAndroid Build Coastguard Worker err = 0;
129*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_GET_TILING, arg))
130*d83cc019SAndroid Build Coastguard Worker err = -errno;
131*d83cc019SAndroid Build Coastguard Worker errno = 0;
132*d83cc019SAndroid Build Coastguard Worker
133*d83cc019SAndroid Build Coastguard Worker return err;
134*d83cc019SAndroid Build Coastguard Worker }
135*d83cc019SAndroid Build Coastguard Worker
136*d83cc019SAndroid Build Coastguard Worker /**
137*d83cc019SAndroid Build Coastguard Worker * gem_get_tiling:
138*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
139*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
140*d83cc019SAndroid Build Coastguard Worker * @tiling: (out) tiling mode of the gem buffer
141*d83cc019SAndroid Build Coastguard Worker * @swizzle: (out) bit 6 swizzle mode
142*d83cc019SAndroid Build Coastguard Worker *
143*d83cc019SAndroid Build Coastguard Worker * This wraps the GET_TILING ioctl.
144*d83cc019SAndroid Build Coastguard Worker *
145*d83cc019SAndroid Build Coastguard Worker * Returns whether the actual physical tiling matches the reported tiling.
146*d83cc019SAndroid Build Coastguard Worker */
147*d83cc019SAndroid Build Coastguard Worker bool
gem_get_tiling(int fd,uint32_t handle,uint32_t * tiling,uint32_t * swizzle)148*d83cc019SAndroid Build Coastguard Worker gem_get_tiling(int fd, uint32_t handle, uint32_t *tiling, uint32_t *swizzle)
149*d83cc019SAndroid Build Coastguard Worker {
150*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_get_tiling get_tiling;
151*d83cc019SAndroid Build Coastguard Worker
152*d83cc019SAndroid Build Coastguard Worker memset(&get_tiling, 0, sizeof(get_tiling));
153*d83cc019SAndroid Build Coastguard Worker get_tiling.handle = handle;
154*d83cc019SAndroid Build Coastguard Worker
155*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_get_tiling(fd, &get_tiling), 0);
156*d83cc019SAndroid Build Coastguard Worker
157*d83cc019SAndroid Build Coastguard Worker *tiling = get_tiling.tiling_mode;
158*d83cc019SAndroid Build Coastguard Worker *swizzle = get_tiling.swizzle_mode;
159*d83cc019SAndroid Build Coastguard Worker
160*d83cc019SAndroid Build Coastguard Worker return get_tiling.phys_swizzle_mode == get_tiling.swizzle_mode;
161*d83cc019SAndroid Build Coastguard Worker }
162*d83cc019SAndroid Build Coastguard Worker
__gem_set_tiling(int fd,uint32_t handle,uint32_t tiling,uint32_t stride)163*d83cc019SAndroid Build Coastguard Worker int __gem_set_tiling(int fd, uint32_t handle, uint32_t tiling, uint32_t stride)
164*d83cc019SAndroid Build Coastguard Worker {
165*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_set_tiling st;
166*d83cc019SAndroid Build Coastguard Worker int ret;
167*d83cc019SAndroid Build Coastguard Worker
168*d83cc019SAndroid Build Coastguard Worker /* The kernel doesn't know about these tiling modes, expects NONE */
169*d83cc019SAndroid Build Coastguard Worker if (tiling == I915_TILING_Yf || tiling == I915_TILING_Ys)
170*d83cc019SAndroid Build Coastguard Worker tiling = I915_TILING_NONE;
171*d83cc019SAndroid Build Coastguard Worker
172*d83cc019SAndroid Build Coastguard Worker memset(&st, 0, sizeof(st));
173*d83cc019SAndroid Build Coastguard Worker do {
174*d83cc019SAndroid Build Coastguard Worker st.handle = handle;
175*d83cc019SAndroid Build Coastguard Worker st.tiling_mode = tiling;
176*d83cc019SAndroid Build Coastguard Worker st.stride = tiling ? stride : 0;
177*d83cc019SAndroid Build Coastguard Worker
178*d83cc019SAndroid Build Coastguard Worker ret = ioctl(fd, DRM_IOCTL_I915_GEM_SET_TILING, &st);
179*d83cc019SAndroid Build Coastguard Worker } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
180*d83cc019SAndroid Build Coastguard Worker if (ret != 0)
181*d83cc019SAndroid Build Coastguard Worker return -errno;
182*d83cc019SAndroid Build Coastguard Worker
183*d83cc019SAndroid Build Coastguard Worker errno = 0;
184*d83cc019SAndroid Build Coastguard Worker igt_assert(st.tiling_mode == tiling);
185*d83cc019SAndroid Build Coastguard Worker return 0;
186*d83cc019SAndroid Build Coastguard Worker }
187*d83cc019SAndroid Build Coastguard Worker
188*d83cc019SAndroid Build Coastguard Worker /**
189*d83cc019SAndroid Build Coastguard Worker * gem_set_tiling:
190*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
191*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
192*d83cc019SAndroid Build Coastguard Worker * @tiling: tiling mode bits
193*d83cc019SAndroid Build Coastguard Worker * @stride: stride of the buffer when using a tiled mode, otherwise must be 0
194*d83cc019SAndroid Build Coastguard Worker *
195*d83cc019SAndroid Build Coastguard Worker * This wraps the SET_TILING ioctl.
196*d83cc019SAndroid Build Coastguard Worker */
gem_set_tiling(int fd,uint32_t handle,uint32_t tiling,uint32_t stride)197*d83cc019SAndroid Build Coastguard Worker void gem_set_tiling(int fd, uint32_t handle, uint32_t tiling, uint32_t stride)
198*d83cc019SAndroid Build Coastguard Worker {
199*d83cc019SAndroid Build Coastguard Worker igt_assert(__gem_set_tiling(fd, handle, tiling, stride) == 0);
200*d83cc019SAndroid Build Coastguard Worker }
201*d83cc019SAndroid Build Coastguard Worker
__gem_set_caching(int fd,uint32_t handle,uint32_t caching)202*d83cc019SAndroid Build Coastguard Worker int __gem_set_caching(int fd, uint32_t handle, uint32_t caching)
203*d83cc019SAndroid Build Coastguard Worker {
204*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_caching arg;
205*d83cc019SAndroid Build Coastguard Worker int err;
206*d83cc019SAndroid Build Coastguard Worker
207*d83cc019SAndroid Build Coastguard Worker memset(&arg, 0, sizeof(arg));
208*d83cc019SAndroid Build Coastguard Worker arg.handle = handle;
209*d83cc019SAndroid Build Coastguard Worker arg.caching = caching;
210*d83cc019SAndroid Build Coastguard Worker
211*d83cc019SAndroid Build Coastguard Worker err = 0;
212*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_SET_CACHING, &arg))
213*d83cc019SAndroid Build Coastguard Worker err = -errno;
214*d83cc019SAndroid Build Coastguard Worker
215*d83cc019SAndroid Build Coastguard Worker errno = 0;
216*d83cc019SAndroid Build Coastguard Worker return err;
217*d83cc019SAndroid Build Coastguard Worker }
218*d83cc019SAndroid Build Coastguard Worker
219*d83cc019SAndroid Build Coastguard Worker /**
220*d83cc019SAndroid Build Coastguard Worker * gem_set_caching:
221*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
222*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
223*d83cc019SAndroid Build Coastguard Worker * @caching: caching mode bits
224*d83cc019SAndroid Build Coastguard Worker *
225*d83cc019SAndroid Build Coastguard Worker * This wraps the SET_CACHING ioctl. Note that this function internally calls
226*d83cc019SAndroid Build Coastguard Worker * igt_require() when SET_CACHING isn't available, hence automatically skips the
227*d83cc019SAndroid Build Coastguard Worker * test. Therefore always extract test logic which uses this into its own
228*d83cc019SAndroid Build Coastguard Worker * subtest.
229*d83cc019SAndroid Build Coastguard Worker */
gem_set_caching(int fd,uint32_t handle,uint32_t caching)230*d83cc019SAndroid Build Coastguard Worker void gem_set_caching(int fd, uint32_t handle, uint32_t caching)
231*d83cc019SAndroid Build Coastguard Worker {
232*d83cc019SAndroid Build Coastguard Worker igt_require(__gem_set_caching(fd, handle, caching) == 0);
233*d83cc019SAndroid Build Coastguard Worker }
234*d83cc019SAndroid Build Coastguard Worker
235*d83cc019SAndroid Build Coastguard Worker /**
236*d83cc019SAndroid Build Coastguard Worker * gem_get_caching:
237*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
238*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
239*d83cc019SAndroid Build Coastguard Worker *
240*d83cc019SAndroid Build Coastguard Worker * This wraps the GET_CACHING ioctl.
241*d83cc019SAndroid Build Coastguard Worker *
242*d83cc019SAndroid Build Coastguard Worker * Returns: The current caching mode bits.
243*d83cc019SAndroid Build Coastguard Worker */
gem_get_caching(int fd,uint32_t handle)244*d83cc019SAndroid Build Coastguard Worker uint32_t gem_get_caching(int fd, uint32_t handle)
245*d83cc019SAndroid Build Coastguard Worker {
246*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_caching arg;
247*d83cc019SAndroid Build Coastguard Worker int ret;
248*d83cc019SAndroid Build Coastguard Worker
249*d83cc019SAndroid Build Coastguard Worker memset(&arg, 0, sizeof(arg));
250*d83cc019SAndroid Build Coastguard Worker arg.handle = handle;
251*d83cc019SAndroid Build Coastguard Worker ret = ioctl(fd, DRM_IOCTL_I915_GEM_GET_CACHING, &arg);
252*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0);
253*d83cc019SAndroid Build Coastguard Worker errno = 0;
254*d83cc019SAndroid Build Coastguard Worker
255*d83cc019SAndroid Build Coastguard Worker return arg.caching;
256*d83cc019SAndroid Build Coastguard Worker }
257*d83cc019SAndroid Build Coastguard Worker
258*d83cc019SAndroid Build Coastguard Worker /**
259*d83cc019SAndroid Build Coastguard Worker * gem_open:
260*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
261*d83cc019SAndroid Build Coastguard Worker * @name: flink buffer name
262*d83cc019SAndroid Build Coastguard Worker *
263*d83cc019SAndroid Build Coastguard Worker * This wraps the GEM_OPEN ioctl, which is used to import an flink name.
264*d83cc019SAndroid Build Coastguard Worker *
265*d83cc019SAndroid Build Coastguard Worker * Returns: gem file-private buffer handle of the open object.
266*d83cc019SAndroid Build Coastguard Worker */
gem_open(int fd,uint32_t name)267*d83cc019SAndroid Build Coastguard Worker uint32_t gem_open(int fd, uint32_t name)
268*d83cc019SAndroid Build Coastguard Worker {
269*d83cc019SAndroid Build Coastguard Worker struct drm_gem_open open_struct;
270*d83cc019SAndroid Build Coastguard Worker int ret;
271*d83cc019SAndroid Build Coastguard Worker
272*d83cc019SAndroid Build Coastguard Worker memset(&open_struct, 0, sizeof(open_struct));
273*d83cc019SAndroid Build Coastguard Worker open_struct.name = name;
274*d83cc019SAndroid Build Coastguard Worker ret = ioctl(fd, DRM_IOCTL_GEM_OPEN, &open_struct);
275*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0);
276*d83cc019SAndroid Build Coastguard Worker igt_assert(open_struct.handle != 0);
277*d83cc019SAndroid Build Coastguard Worker errno = 0;
278*d83cc019SAndroid Build Coastguard Worker
279*d83cc019SAndroid Build Coastguard Worker return open_struct.handle;
280*d83cc019SAndroid Build Coastguard Worker }
281*d83cc019SAndroid Build Coastguard Worker
282*d83cc019SAndroid Build Coastguard Worker /**
283*d83cc019SAndroid Build Coastguard Worker * gem_flink:
284*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
285*d83cc019SAndroid Build Coastguard Worker * @handle: file-private gem buffer object handle
286*d83cc019SAndroid Build Coastguard Worker *
287*d83cc019SAndroid Build Coastguard Worker * This wraps the GEM_FLINK ioctl, which is used to export a gem buffer object
288*d83cc019SAndroid Build Coastguard Worker * into the device-global flink namespace. See gem_open() for opening such a
289*d83cc019SAndroid Build Coastguard Worker * buffer name on a different i915 drm file descriptor.
290*d83cc019SAndroid Build Coastguard Worker *
291*d83cc019SAndroid Build Coastguard Worker * Returns: The created flink buffer name.
292*d83cc019SAndroid Build Coastguard Worker */
gem_flink(int fd,uint32_t handle)293*d83cc019SAndroid Build Coastguard Worker uint32_t gem_flink(int fd, uint32_t handle)
294*d83cc019SAndroid Build Coastguard Worker {
295*d83cc019SAndroid Build Coastguard Worker struct drm_gem_flink flink;
296*d83cc019SAndroid Build Coastguard Worker int ret;
297*d83cc019SAndroid Build Coastguard Worker
298*d83cc019SAndroid Build Coastguard Worker memset(&flink, 0, sizeof(flink));
299*d83cc019SAndroid Build Coastguard Worker flink.handle = handle;
300*d83cc019SAndroid Build Coastguard Worker ret = ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink);
301*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0);
302*d83cc019SAndroid Build Coastguard Worker errno = 0;
303*d83cc019SAndroid Build Coastguard Worker
304*d83cc019SAndroid Build Coastguard Worker return flink.name;
305*d83cc019SAndroid Build Coastguard Worker }
306*d83cc019SAndroid Build Coastguard Worker
307*d83cc019SAndroid Build Coastguard Worker /**
308*d83cc019SAndroid Build Coastguard Worker * gem_close:
309*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
310*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
311*d83cc019SAndroid Build Coastguard Worker *
312*d83cc019SAndroid Build Coastguard Worker * This wraps the GEM_CLOSE ioctl, which to release a file-private gem buffer
313*d83cc019SAndroid Build Coastguard Worker * handle.
314*d83cc019SAndroid Build Coastguard Worker */
gem_close(int fd,uint32_t handle)315*d83cc019SAndroid Build Coastguard Worker void gem_close(int fd, uint32_t handle)
316*d83cc019SAndroid Build Coastguard Worker {
317*d83cc019SAndroid Build Coastguard Worker struct drm_gem_close close_bo;
318*d83cc019SAndroid Build Coastguard Worker
319*d83cc019SAndroid Build Coastguard Worker igt_assert_neq(handle, 0);
320*d83cc019SAndroid Build Coastguard Worker
321*d83cc019SAndroid Build Coastguard Worker memset(&close_bo, 0, sizeof(close_bo));
322*d83cc019SAndroid Build Coastguard Worker close_bo.handle = handle;
323*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, DRM_IOCTL_GEM_CLOSE, &close_bo);
324*d83cc019SAndroid Build Coastguard Worker }
325*d83cc019SAndroid Build Coastguard Worker
__gem_write(int fd,uint32_t handle,uint64_t offset,const void * buf,uint64_t length)326*d83cc019SAndroid Build Coastguard Worker int __gem_write(int fd, uint32_t handle, uint64_t offset, const void *buf, uint64_t length)
327*d83cc019SAndroid Build Coastguard Worker {
328*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_pwrite gem_pwrite;
329*d83cc019SAndroid Build Coastguard Worker int err;
330*d83cc019SAndroid Build Coastguard Worker
331*d83cc019SAndroid Build Coastguard Worker memset(&gem_pwrite, 0, sizeof(gem_pwrite));
332*d83cc019SAndroid Build Coastguard Worker gem_pwrite.handle = handle;
333*d83cc019SAndroid Build Coastguard Worker gem_pwrite.offset = offset;
334*d83cc019SAndroid Build Coastguard Worker gem_pwrite.size = length;
335*d83cc019SAndroid Build Coastguard Worker gem_pwrite.data_ptr = to_user_pointer(buf);
336*d83cc019SAndroid Build Coastguard Worker
337*d83cc019SAndroid Build Coastguard Worker err = 0;
338*d83cc019SAndroid Build Coastguard Worker if (drmIoctl(fd, DRM_IOCTL_I915_GEM_PWRITE, &gem_pwrite))
339*d83cc019SAndroid Build Coastguard Worker err = -errno;
340*d83cc019SAndroid Build Coastguard Worker return err;
341*d83cc019SAndroid Build Coastguard Worker }
342*d83cc019SAndroid Build Coastguard Worker
343*d83cc019SAndroid Build Coastguard Worker /**
344*d83cc019SAndroid Build Coastguard Worker * gem_write:
345*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
346*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
347*d83cc019SAndroid Build Coastguard Worker * @offset: offset within the buffer of the subrange
348*d83cc019SAndroid Build Coastguard Worker * @buf: pointer to the data to write into the buffer
349*d83cc019SAndroid Build Coastguard Worker * @length: size of the subrange
350*d83cc019SAndroid Build Coastguard Worker *
351*d83cc019SAndroid Build Coastguard Worker * This wraps the PWRITE ioctl, which is to upload a linear data to a subrange
352*d83cc019SAndroid Build Coastguard Worker * of a gem buffer object.
353*d83cc019SAndroid Build Coastguard Worker */
gem_write(int fd,uint32_t handle,uint64_t offset,const void * buf,uint64_t length)354*d83cc019SAndroid Build Coastguard Worker void gem_write(int fd, uint32_t handle, uint64_t offset, const void *buf, uint64_t length)
355*d83cc019SAndroid Build Coastguard Worker {
356*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_write(fd, handle, offset, buf, length), 0);
357*d83cc019SAndroid Build Coastguard Worker }
358*d83cc019SAndroid Build Coastguard Worker
__gem_read(int fd,uint32_t handle,uint64_t offset,void * buf,uint64_t length)359*d83cc019SAndroid Build Coastguard Worker static int __gem_read(int fd, uint32_t handle, uint64_t offset, void *buf, uint64_t length)
360*d83cc019SAndroid Build Coastguard Worker {
361*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_pread gem_pread;
362*d83cc019SAndroid Build Coastguard Worker int err;
363*d83cc019SAndroid Build Coastguard Worker
364*d83cc019SAndroid Build Coastguard Worker memset(&gem_pread, 0, sizeof(gem_pread));
365*d83cc019SAndroid Build Coastguard Worker gem_pread.handle = handle;
366*d83cc019SAndroid Build Coastguard Worker gem_pread.offset = offset;
367*d83cc019SAndroid Build Coastguard Worker gem_pread.size = length;
368*d83cc019SAndroid Build Coastguard Worker gem_pread.data_ptr = to_user_pointer(buf);
369*d83cc019SAndroid Build Coastguard Worker
370*d83cc019SAndroid Build Coastguard Worker err = 0;
371*d83cc019SAndroid Build Coastguard Worker if (drmIoctl(fd, DRM_IOCTL_I915_GEM_PREAD, &gem_pread))
372*d83cc019SAndroid Build Coastguard Worker err = -errno;
373*d83cc019SAndroid Build Coastguard Worker return err;
374*d83cc019SAndroid Build Coastguard Worker }
375*d83cc019SAndroid Build Coastguard Worker /**
376*d83cc019SAndroid Build Coastguard Worker * gem_read:
377*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
378*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
379*d83cc019SAndroid Build Coastguard Worker * @offset: offset within the buffer of the subrange
380*d83cc019SAndroid Build Coastguard Worker * @buf: pointer to the data to read into
381*d83cc019SAndroid Build Coastguard Worker * @length: size of the subrange
382*d83cc019SAndroid Build Coastguard Worker *
383*d83cc019SAndroid Build Coastguard Worker * This wraps the PREAD ioctl, which is to download a linear data to a subrange
384*d83cc019SAndroid Build Coastguard Worker * of a gem buffer object.
385*d83cc019SAndroid Build Coastguard Worker */
gem_read(int fd,uint32_t handle,uint64_t offset,void * buf,uint64_t length)386*d83cc019SAndroid Build Coastguard Worker void gem_read(int fd, uint32_t handle, uint64_t offset, void *buf, uint64_t length)
387*d83cc019SAndroid Build Coastguard Worker {
388*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_read(fd, handle, offset, buf, length), 0);
389*d83cc019SAndroid Build Coastguard Worker }
390*d83cc019SAndroid Build Coastguard Worker
__gem_set_domain(int fd,uint32_t handle,uint32_t read,uint32_t write)391*d83cc019SAndroid Build Coastguard Worker int __gem_set_domain(int fd, uint32_t handle, uint32_t read, uint32_t write)
392*d83cc019SAndroid Build Coastguard Worker {
393*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_set_domain set_domain;
394*d83cc019SAndroid Build Coastguard Worker int err;
395*d83cc019SAndroid Build Coastguard Worker
396*d83cc019SAndroid Build Coastguard Worker memset(&set_domain, 0, sizeof(set_domain));
397*d83cc019SAndroid Build Coastguard Worker set_domain.handle = handle;
398*d83cc019SAndroid Build Coastguard Worker set_domain.read_domains = read;
399*d83cc019SAndroid Build Coastguard Worker set_domain.write_domain = write;
400*d83cc019SAndroid Build Coastguard Worker
401*d83cc019SAndroid Build Coastguard Worker err = 0;
402*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain))
403*d83cc019SAndroid Build Coastguard Worker err = -errno;
404*d83cc019SAndroid Build Coastguard Worker
405*d83cc019SAndroid Build Coastguard Worker return err;
406*d83cc019SAndroid Build Coastguard Worker }
407*d83cc019SAndroid Build Coastguard Worker
408*d83cc019SAndroid Build Coastguard Worker /**
409*d83cc019SAndroid Build Coastguard Worker * gem_set_domain:
410*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
411*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
412*d83cc019SAndroid Build Coastguard Worker * @read: gem domain bits for read access
413*d83cc019SAndroid Build Coastguard Worker * @write: gem domain bit for write access
414*d83cc019SAndroid Build Coastguard Worker *
415*d83cc019SAndroid Build Coastguard Worker * This wraps the SET_DOMAIN ioctl, which is used to control the coherency of
416*d83cc019SAndroid Build Coastguard Worker * the gem buffer object between the cpu and gtt mappings. It is also use to
417*d83cc019SAndroid Build Coastguard Worker * synchronize with outstanding rendering in general, but for that use-case
418*d83cc019SAndroid Build Coastguard Worker * please have a look at gem_sync().
419*d83cc019SAndroid Build Coastguard Worker */
gem_set_domain(int fd,uint32_t handle,uint32_t read,uint32_t write)420*d83cc019SAndroid Build Coastguard Worker void gem_set_domain(int fd, uint32_t handle, uint32_t read, uint32_t write)
421*d83cc019SAndroid Build Coastguard Worker {
422*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_set_domain(fd, handle, read, write), 0);
423*d83cc019SAndroid Build Coastguard Worker }
424*d83cc019SAndroid Build Coastguard Worker
425*d83cc019SAndroid Build Coastguard Worker /**
426*d83cc019SAndroid Build Coastguard Worker * __gem_wait:
427*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
428*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
429*d83cc019SAndroid Build Coastguard Worker * @timeout_ns: [in] time to wait, [out] remaining time (in nanoseconds)
430*d83cc019SAndroid Build Coastguard Worker *
431*d83cc019SAndroid Build Coastguard Worker * This functions waits for outstanding rendering to complete, upto
432*d83cc019SAndroid Build Coastguard Worker * the timeout_ns. If no timeout_ns is provided, the wait is indefinite and
433*d83cc019SAndroid Build Coastguard Worker * only returns upon an error or when the rendering is complete.
434*d83cc019SAndroid Build Coastguard Worker */
gem_wait(int fd,uint32_t handle,int64_t * timeout_ns)435*d83cc019SAndroid Build Coastguard Worker int gem_wait(int fd, uint32_t handle, int64_t *timeout_ns)
436*d83cc019SAndroid Build Coastguard Worker {
437*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_wait wait;
438*d83cc019SAndroid Build Coastguard Worker int ret;
439*d83cc019SAndroid Build Coastguard Worker
440*d83cc019SAndroid Build Coastguard Worker memset(&wait, 0, sizeof(wait));
441*d83cc019SAndroid Build Coastguard Worker wait.bo_handle = handle;
442*d83cc019SAndroid Build Coastguard Worker wait.timeout_ns = timeout_ns ? *timeout_ns : -1;
443*d83cc019SAndroid Build Coastguard Worker wait.flags = 0;
444*d83cc019SAndroid Build Coastguard Worker
445*d83cc019SAndroid Build Coastguard Worker ret = 0;
446*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_WAIT, &wait))
447*d83cc019SAndroid Build Coastguard Worker ret = -errno;
448*d83cc019SAndroid Build Coastguard Worker
449*d83cc019SAndroid Build Coastguard Worker if (timeout_ns)
450*d83cc019SAndroid Build Coastguard Worker *timeout_ns = wait.timeout_ns;
451*d83cc019SAndroid Build Coastguard Worker
452*d83cc019SAndroid Build Coastguard Worker return ret;
453*d83cc019SAndroid Build Coastguard Worker }
454*d83cc019SAndroid Build Coastguard Worker
455*d83cc019SAndroid Build Coastguard Worker /**
456*d83cc019SAndroid Build Coastguard Worker * gem_sync:
457*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
458*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
459*d83cc019SAndroid Build Coastguard Worker *
460*d83cc019SAndroid Build Coastguard Worker * This functions waits for outstanding rendering to complete.
461*d83cc019SAndroid Build Coastguard Worker */
gem_sync(int fd,uint32_t handle)462*d83cc019SAndroid Build Coastguard Worker void gem_sync(int fd, uint32_t handle)
463*d83cc019SAndroid Build Coastguard Worker {
464*d83cc019SAndroid Build Coastguard Worker if (gem_wait(fd, handle, NULL))
465*d83cc019SAndroid Build Coastguard Worker gem_set_domain(fd, handle,
466*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_GTT,
467*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_GTT);
468*d83cc019SAndroid Build Coastguard Worker errno = 0;
469*d83cc019SAndroid Build Coastguard Worker }
470*d83cc019SAndroid Build Coastguard Worker
471*d83cc019SAndroid Build Coastguard Worker
gem_create__has_stolen_support(int fd)472*d83cc019SAndroid Build Coastguard Worker bool gem_create__has_stolen_support(int fd)
473*d83cc019SAndroid Build Coastguard Worker {
474*d83cc019SAndroid Build Coastguard Worker static int has_stolen_support = -1;
475*d83cc019SAndroid Build Coastguard Worker struct drm_i915_getparam gp;
476*d83cc019SAndroid Build Coastguard Worker int val = -1;
477*d83cc019SAndroid Build Coastguard Worker
478*d83cc019SAndroid Build Coastguard Worker if (has_stolen_support < 0) {
479*d83cc019SAndroid Build Coastguard Worker memset(&gp, 0, sizeof(gp));
480*d83cc019SAndroid Build Coastguard Worker gp.param = 38; /* CREATE_VERSION */
481*d83cc019SAndroid Build Coastguard Worker gp.value = &val;
482*d83cc019SAndroid Build Coastguard Worker
483*d83cc019SAndroid Build Coastguard Worker /* Do we have the extended gem_create_ioctl? */
484*d83cc019SAndroid Build Coastguard Worker ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
485*d83cc019SAndroid Build Coastguard Worker has_stolen_support = val >= 2;
486*d83cc019SAndroid Build Coastguard Worker }
487*d83cc019SAndroid Build Coastguard Worker
488*d83cc019SAndroid Build Coastguard Worker return has_stolen_support;
489*d83cc019SAndroid Build Coastguard Worker }
490*d83cc019SAndroid Build Coastguard Worker
491*d83cc019SAndroid Build Coastguard Worker struct local_i915_gem_create_v2 {
492*d83cc019SAndroid Build Coastguard Worker uint64_t size;
493*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
494*d83cc019SAndroid Build Coastguard Worker uint32_t pad;
495*d83cc019SAndroid Build Coastguard Worker #define I915_CREATE_PLACEMENT_STOLEN (1<<0)
496*d83cc019SAndroid Build Coastguard Worker uint32_t flags;
497*d83cc019SAndroid Build Coastguard Worker };
498*d83cc019SAndroid Build Coastguard Worker
499*d83cc019SAndroid Build Coastguard Worker #define LOCAL_IOCTL_I915_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE, struct local_i915_gem_create_v2)
__gem_create_stolen(int fd,uint64_t size)500*d83cc019SAndroid Build Coastguard Worker uint32_t __gem_create_stolen(int fd, uint64_t size)
501*d83cc019SAndroid Build Coastguard Worker {
502*d83cc019SAndroid Build Coastguard Worker struct local_i915_gem_create_v2 create;
503*d83cc019SAndroid Build Coastguard Worker int ret;
504*d83cc019SAndroid Build Coastguard Worker
505*d83cc019SAndroid Build Coastguard Worker memset(&create, 0, sizeof(create));
506*d83cc019SAndroid Build Coastguard Worker create.handle = 0;
507*d83cc019SAndroid Build Coastguard Worker create.size = size;
508*d83cc019SAndroid Build Coastguard Worker create.flags = I915_CREATE_PLACEMENT_STOLEN;
509*d83cc019SAndroid Build Coastguard Worker ret = igt_ioctl(fd, LOCAL_IOCTL_I915_GEM_CREATE, &create);
510*d83cc019SAndroid Build Coastguard Worker
511*d83cc019SAndroid Build Coastguard Worker if (ret < 0)
512*d83cc019SAndroid Build Coastguard Worker return 0;
513*d83cc019SAndroid Build Coastguard Worker
514*d83cc019SAndroid Build Coastguard Worker errno = 0;
515*d83cc019SAndroid Build Coastguard Worker return create.handle;
516*d83cc019SAndroid Build Coastguard Worker }
517*d83cc019SAndroid Build Coastguard Worker
518*d83cc019SAndroid Build Coastguard Worker /**
519*d83cc019SAndroid Build Coastguard Worker * gem_create_stolen:
520*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
521*d83cc019SAndroid Build Coastguard Worker * @size: desired size of the buffer
522*d83cc019SAndroid Build Coastguard Worker *
523*d83cc019SAndroid Build Coastguard Worker * This wraps the new GEM_CREATE ioctl, which allocates a new gem buffer
524*d83cc019SAndroid Build Coastguard Worker * object of @size and placement in stolen memory region.
525*d83cc019SAndroid Build Coastguard Worker *
526*d83cc019SAndroid Build Coastguard Worker * Returns: The file-private handle of the created buffer object
527*d83cc019SAndroid Build Coastguard Worker */
528*d83cc019SAndroid Build Coastguard Worker
gem_create_stolen(int fd,uint64_t size)529*d83cc019SAndroid Build Coastguard Worker uint32_t gem_create_stolen(int fd, uint64_t size)
530*d83cc019SAndroid Build Coastguard Worker {
531*d83cc019SAndroid Build Coastguard Worker struct local_i915_gem_create_v2 create;
532*d83cc019SAndroid Build Coastguard Worker
533*d83cc019SAndroid Build Coastguard Worker memset(&create, 0, sizeof(create));
534*d83cc019SAndroid Build Coastguard Worker create.handle = 0;
535*d83cc019SAndroid Build Coastguard Worker create.size = size;
536*d83cc019SAndroid Build Coastguard Worker create.flags = I915_CREATE_PLACEMENT_STOLEN;
537*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, LOCAL_IOCTL_I915_GEM_CREATE, &create);
538*d83cc019SAndroid Build Coastguard Worker igt_assert(create.handle);
539*d83cc019SAndroid Build Coastguard Worker
540*d83cc019SAndroid Build Coastguard Worker return create.handle;
541*d83cc019SAndroid Build Coastguard Worker }
542*d83cc019SAndroid Build Coastguard Worker
__gem_create(int fd,uint64_t size,uint32_t * handle)543*d83cc019SAndroid Build Coastguard Worker int __gem_create(int fd, uint64_t size, uint32_t *handle)
544*d83cc019SAndroid Build Coastguard Worker {
545*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_create create = {
546*d83cc019SAndroid Build Coastguard Worker .size = size,
547*d83cc019SAndroid Build Coastguard Worker };
548*d83cc019SAndroid Build Coastguard Worker int err = 0;
549*d83cc019SAndroid Build Coastguard Worker
550*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, &create) == 0) {
551*d83cc019SAndroid Build Coastguard Worker *handle = create.handle;
552*d83cc019SAndroid Build Coastguard Worker } else {
553*d83cc019SAndroid Build Coastguard Worker err = -errno;
554*d83cc019SAndroid Build Coastguard Worker igt_assume(err != 0);
555*d83cc019SAndroid Build Coastguard Worker }
556*d83cc019SAndroid Build Coastguard Worker
557*d83cc019SAndroid Build Coastguard Worker errno = 0;
558*d83cc019SAndroid Build Coastguard Worker return err;
559*d83cc019SAndroid Build Coastguard Worker }
560*d83cc019SAndroid Build Coastguard Worker
561*d83cc019SAndroid Build Coastguard Worker /**
562*d83cc019SAndroid Build Coastguard Worker * gem_create:
563*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
564*d83cc019SAndroid Build Coastguard Worker * @size: desired size of the buffer
565*d83cc019SAndroid Build Coastguard Worker *
566*d83cc019SAndroid Build Coastguard Worker * This wraps the GEM_CREATE ioctl, which allocates a new gem buffer object of
567*d83cc019SAndroid Build Coastguard Worker * @size.
568*d83cc019SAndroid Build Coastguard Worker *
569*d83cc019SAndroid Build Coastguard Worker * Returns: The file-private handle of the created buffer object
570*d83cc019SAndroid Build Coastguard Worker */
gem_create(int fd,uint64_t size)571*d83cc019SAndroid Build Coastguard Worker uint32_t gem_create(int fd, uint64_t size)
572*d83cc019SAndroid Build Coastguard Worker {
573*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
574*d83cc019SAndroid Build Coastguard Worker
575*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_create(fd, size, &handle), 0);
576*d83cc019SAndroid Build Coastguard Worker
577*d83cc019SAndroid Build Coastguard Worker return handle;
578*d83cc019SAndroid Build Coastguard Worker }
579*d83cc019SAndroid Build Coastguard Worker
580*d83cc019SAndroid Build Coastguard Worker /**
581*d83cc019SAndroid Build Coastguard Worker * __gem_execbuf:
582*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
583*d83cc019SAndroid Build Coastguard Worker * @execbuf: execbuffer data structure
584*d83cc019SAndroid Build Coastguard Worker *
585*d83cc019SAndroid Build Coastguard Worker * This wraps the EXECBUFFER2 ioctl, which submits a batchbuffer for the gpu to
586*d83cc019SAndroid Build Coastguard Worker * run. This is allowed to fail, with -errno returned.
587*d83cc019SAndroid Build Coastguard Worker */
__gem_execbuf(int fd,struct drm_i915_gem_execbuffer2 * execbuf)588*d83cc019SAndroid Build Coastguard Worker int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
589*d83cc019SAndroid Build Coastguard Worker {
590*d83cc019SAndroid Build Coastguard Worker int err = 0;
591*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf)) {
592*d83cc019SAndroid Build Coastguard Worker err = -errno;
593*d83cc019SAndroid Build Coastguard Worker igt_assume(err != 0);
594*d83cc019SAndroid Build Coastguard Worker }
595*d83cc019SAndroid Build Coastguard Worker errno = 0;
596*d83cc019SAndroid Build Coastguard Worker return err;
597*d83cc019SAndroid Build Coastguard Worker }
598*d83cc019SAndroid Build Coastguard Worker
599*d83cc019SAndroid Build Coastguard Worker /**
600*d83cc019SAndroid Build Coastguard Worker * gem_execbuf:
601*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
602*d83cc019SAndroid Build Coastguard Worker * @execbuf: execbuffer data structure
603*d83cc019SAndroid Build Coastguard Worker *
604*d83cc019SAndroid Build Coastguard Worker * This wraps the EXECBUFFER2 ioctl, which submits a batchbuffer for the gpu to
605*d83cc019SAndroid Build Coastguard Worker * run.
606*d83cc019SAndroid Build Coastguard Worker */
gem_execbuf(int fd,struct drm_i915_gem_execbuffer2 * execbuf)607*d83cc019SAndroid Build Coastguard Worker void gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
608*d83cc019SAndroid Build Coastguard Worker {
609*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_execbuf(fd, execbuf), 0);
610*d83cc019SAndroid Build Coastguard Worker }
611*d83cc019SAndroid Build Coastguard Worker
612*d83cc019SAndroid Build Coastguard Worker /**
613*d83cc019SAndroid Build Coastguard Worker * __gem_execbuf_wr:
614*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
615*d83cc019SAndroid Build Coastguard Worker * @execbuf: execbuffer data structure
616*d83cc019SAndroid Build Coastguard Worker *
617*d83cc019SAndroid Build Coastguard Worker * This wraps the EXECBUFFER2_WR ioctl, which submits a batchbuffer for the gpu to
618*d83cc019SAndroid Build Coastguard Worker * run. This is allowed to fail, with -errno returned.
619*d83cc019SAndroid Build Coastguard Worker */
__gem_execbuf_wr(int fd,struct drm_i915_gem_execbuffer2 * execbuf)620*d83cc019SAndroid Build Coastguard Worker int __gem_execbuf_wr(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
621*d83cc019SAndroid Build Coastguard Worker {
622*d83cc019SAndroid Build Coastguard Worker int err = 0;
623*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2_WR, execbuf)) {
624*d83cc019SAndroid Build Coastguard Worker err = -errno;
625*d83cc019SAndroid Build Coastguard Worker igt_assume(err != 0);
626*d83cc019SAndroid Build Coastguard Worker }
627*d83cc019SAndroid Build Coastguard Worker errno = 0;
628*d83cc019SAndroid Build Coastguard Worker return err;
629*d83cc019SAndroid Build Coastguard Worker }
630*d83cc019SAndroid Build Coastguard Worker
631*d83cc019SAndroid Build Coastguard Worker /**
632*d83cc019SAndroid Build Coastguard Worker * gem_execbuf_wr:
633*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
634*d83cc019SAndroid Build Coastguard Worker * @execbuf: execbuffer data structure
635*d83cc019SAndroid Build Coastguard Worker *
636*d83cc019SAndroid Build Coastguard Worker * This wraps the EXECBUFFER2_WR ioctl, which submits a batchbuffer for the gpu to
637*d83cc019SAndroid Build Coastguard Worker * run.
638*d83cc019SAndroid Build Coastguard Worker */
gem_execbuf_wr(int fd,struct drm_i915_gem_execbuffer2 * execbuf)639*d83cc019SAndroid Build Coastguard Worker void gem_execbuf_wr(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
640*d83cc019SAndroid Build Coastguard Worker {
641*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_execbuf_wr(fd, execbuf), 0);
642*d83cc019SAndroid Build Coastguard Worker }
643*d83cc019SAndroid Build Coastguard Worker
644*d83cc019SAndroid Build Coastguard Worker /**
645*d83cc019SAndroid Build Coastguard Worker * gem_madvise:
646*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
647*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
648*d83cc019SAndroid Build Coastguard Worker * @state: desired madvise state
649*d83cc019SAndroid Build Coastguard Worker *
650*d83cc019SAndroid Build Coastguard Worker * This wraps the MADVISE ioctl, which is used in libdrm to implement
651*d83cc019SAndroid Build Coastguard Worker * opportunistic buffer object caching. Objects in the cache are set to DONTNEED
652*d83cc019SAndroid Build Coastguard Worker * (internally in the kernel tracked as purgeable objects). When such a cached
653*d83cc019SAndroid Build Coastguard Worker * object is in need again it must be set back to WILLNEED before first use.
654*d83cc019SAndroid Build Coastguard Worker *
655*d83cc019SAndroid Build Coastguard Worker * Returns: When setting the madvise state to WILLNEED this returns whether the
656*d83cc019SAndroid Build Coastguard Worker * backing storage was still available or not.
657*d83cc019SAndroid Build Coastguard Worker */
gem_madvise(int fd,uint32_t handle,int state)658*d83cc019SAndroid Build Coastguard Worker int gem_madvise(int fd, uint32_t handle, int state)
659*d83cc019SAndroid Build Coastguard Worker {
660*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_madvise madv;
661*d83cc019SAndroid Build Coastguard Worker
662*d83cc019SAndroid Build Coastguard Worker memset(&madv, 0, sizeof(madv));
663*d83cc019SAndroid Build Coastguard Worker madv.handle = handle;
664*d83cc019SAndroid Build Coastguard Worker madv.madv = state;
665*d83cc019SAndroid Build Coastguard Worker madv.retained = 1;
666*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, DRM_IOCTL_I915_GEM_MADVISE, &madv);
667*d83cc019SAndroid Build Coastguard Worker
668*d83cc019SAndroid Build Coastguard Worker return madv.retained;
669*d83cc019SAndroid Build Coastguard Worker }
670*d83cc019SAndroid Build Coastguard Worker
__gem_userptr(int fd,void * ptr,uint64_t size,int read_only,uint32_t flags,uint32_t * handle)671*d83cc019SAndroid Build Coastguard Worker int __gem_userptr(int fd, void *ptr, uint64_t size, int read_only, uint32_t flags, uint32_t *handle)
672*d83cc019SAndroid Build Coastguard Worker {
673*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_userptr userptr;
674*d83cc019SAndroid Build Coastguard Worker
675*d83cc019SAndroid Build Coastguard Worker memset(&userptr, 0, sizeof(userptr));
676*d83cc019SAndroid Build Coastguard Worker userptr.user_ptr = to_user_pointer(ptr);
677*d83cc019SAndroid Build Coastguard Worker userptr.user_size = size;
678*d83cc019SAndroid Build Coastguard Worker userptr.flags = flags;
679*d83cc019SAndroid Build Coastguard Worker if (read_only)
680*d83cc019SAndroid Build Coastguard Worker userptr.flags |= I915_USERPTR_READ_ONLY;
681*d83cc019SAndroid Build Coastguard Worker
682*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr))
683*d83cc019SAndroid Build Coastguard Worker return -errno;
684*d83cc019SAndroid Build Coastguard Worker
685*d83cc019SAndroid Build Coastguard Worker *handle = userptr.handle;
686*d83cc019SAndroid Build Coastguard Worker return 0;
687*d83cc019SAndroid Build Coastguard Worker }
688*d83cc019SAndroid Build Coastguard Worker
689*d83cc019SAndroid Build Coastguard Worker /**
690*d83cc019SAndroid Build Coastguard Worker * gem_userptr:
691*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
692*d83cc019SAndroid Build Coastguard Worker * @ptr: userptr pointer to be passed
693*d83cc019SAndroid Build Coastguard Worker * @size: desired size of the buffer
694*d83cc019SAndroid Build Coastguard Worker * @read_only: specify whether userptr is opened read only
695*d83cc019SAndroid Build Coastguard Worker * @flags: other userptr flags
696*d83cc019SAndroid Build Coastguard Worker * @handle: returned handle for the object
697*d83cc019SAndroid Build Coastguard Worker *
698*d83cc019SAndroid Build Coastguard Worker * Returns userptr handle for the GEM object.
699*d83cc019SAndroid Build Coastguard Worker */
gem_userptr(int fd,void * ptr,uint64_t size,int read_only,uint32_t flags,uint32_t * handle)700*d83cc019SAndroid Build Coastguard Worker void gem_userptr(int fd, void *ptr, uint64_t size, int read_only, uint32_t flags, uint32_t *handle)
701*d83cc019SAndroid Build Coastguard Worker {
702*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_userptr(fd, ptr, size, read_only, flags, handle), 0);
703*d83cc019SAndroid Build Coastguard Worker }
704*d83cc019SAndroid Build Coastguard Worker
705*d83cc019SAndroid Build Coastguard Worker /**
706*d83cc019SAndroid Build Coastguard Worker * gem_sw_finish:
707*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
708*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
709*d83cc019SAndroid Build Coastguard Worker *
710*d83cc019SAndroid Build Coastguard Worker * This wraps the SW_FINISH ioctl, which is used to flush out frontbuffer
711*d83cc019SAndroid Build Coastguard Worker * rendering done through the direct cpu memory mappings. Shipping userspace
712*d83cc019SAndroid Build Coastguard Worker * does _not_ call this after frontbuffer rendering through gtt memory mappings.
713*d83cc019SAndroid Build Coastguard Worker */
gem_sw_finish(int fd,uint32_t handle)714*d83cc019SAndroid Build Coastguard Worker void gem_sw_finish(int fd, uint32_t handle)
715*d83cc019SAndroid Build Coastguard Worker {
716*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_sw_finish finish;
717*d83cc019SAndroid Build Coastguard Worker
718*d83cc019SAndroid Build Coastguard Worker memset(&finish, 0, sizeof(finish));
719*d83cc019SAndroid Build Coastguard Worker finish.handle = handle;
720*d83cc019SAndroid Build Coastguard Worker
721*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, DRM_IOCTL_I915_GEM_SW_FINISH, &finish);
722*d83cc019SAndroid Build Coastguard Worker }
723*d83cc019SAndroid Build Coastguard Worker
724*d83cc019SAndroid Build Coastguard Worker /**
725*d83cc019SAndroid Build Coastguard Worker * gem_bo_busy:
726*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
727*d83cc019SAndroid Build Coastguard Worker * @handle: gem buffer object handle
728*d83cc019SAndroid Build Coastguard Worker *
729*d83cc019SAndroid Build Coastguard Worker * This wraps the BUSY ioctl, which tells whether a buffer object is still
730*d83cc019SAndroid Build Coastguard Worker * actively used by the gpu in a execbuffer.
731*d83cc019SAndroid Build Coastguard Worker *
732*d83cc019SAndroid Build Coastguard Worker * Returns: The busy state of the buffer object.
733*d83cc019SAndroid Build Coastguard Worker */
gem_bo_busy(int fd,uint32_t handle)734*d83cc019SAndroid Build Coastguard Worker bool gem_bo_busy(int fd, uint32_t handle)
735*d83cc019SAndroid Build Coastguard Worker {
736*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_busy busy;
737*d83cc019SAndroid Build Coastguard Worker
738*d83cc019SAndroid Build Coastguard Worker memset(&busy, 0, sizeof(busy));
739*d83cc019SAndroid Build Coastguard Worker busy.handle = handle;
740*d83cc019SAndroid Build Coastguard Worker
741*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, DRM_IOCTL_I915_GEM_BUSY, &busy);
742*d83cc019SAndroid Build Coastguard Worker
743*d83cc019SAndroid Build Coastguard Worker return !!busy.busy;
744*d83cc019SAndroid Build Coastguard Worker }
745*d83cc019SAndroid Build Coastguard Worker
746*d83cc019SAndroid Build Coastguard Worker
747*d83cc019SAndroid Build Coastguard Worker /* feature test helpers */
748*d83cc019SAndroid Build Coastguard Worker
749*d83cc019SAndroid Build Coastguard Worker /**
750*d83cc019SAndroid Build Coastguard Worker * gem_gtt_type:
751*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
752*d83cc019SAndroid Build Coastguard Worker *
753*d83cc019SAndroid Build Coastguard Worker * Feature test macro to check what type of gtt is being used by the kernel:
754*d83cc019SAndroid Build Coastguard Worker * 0 - global gtt
755*d83cc019SAndroid Build Coastguard Worker * 1 - aliasing ppgtt
756*d83cc019SAndroid Build Coastguard Worker * 2 - full ppgtt
757*d83cc019SAndroid Build Coastguard Worker *
758*d83cc019SAndroid Build Coastguard Worker * Returns: Type of gtt being used.
759*d83cc019SAndroid Build Coastguard Worker */
gem_gtt_type(int fd)760*d83cc019SAndroid Build Coastguard Worker static int gem_gtt_type(int fd)
761*d83cc019SAndroid Build Coastguard Worker {
762*d83cc019SAndroid Build Coastguard Worker struct drm_i915_getparam gp;
763*d83cc019SAndroid Build Coastguard Worker int val = 0;
764*d83cc019SAndroid Build Coastguard Worker
765*d83cc019SAndroid Build Coastguard Worker memset(&gp, 0, sizeof(gp));
766*d83cc019SAndroid Build Coastguard Worker gp.param = I915_PARAM_HAS_ALIASING_PPGTT;
767*d83cc019SAndroid Build Coastguard Worker gp.value = &val;
768*d83cc019SAndroid Build Coastguard Worker
769*d83cc019SAndroid Build Coastguard Worker if (ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp)))
770*d83cc019SAndroid Build Coastguard Worker return 0;
771*d83cc019SAndroid Build Coastguard Worker
772*d83cc019SAndroid Build Coastguard Worker errno = 0;
773*d83cc019SAndroid Build Coastguard Worker return val;
774*d83cc019SAndroid Build Coastguard Worker }
775*d83cc019SAndroid Build Coastguard Worker
776*d83cc019SAndroid Build Coastguard Worker /**
777*d83cc019SAndroid Build Coastguard Worker * gem_uses_ppgtt:
778*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
779*d83cc019SAndroid Build Coastguard Worker *
780*d83cc019SAndroid Build Coastguard Worker * Feature test macro to check whether the kernel internally uses ppgtt to
781*d83cc019SAndroid Build Coastguard Worker * execute batches. Note that this is also true when we're using full ppgtt.
782*d83cc019SAndroid Build Coastguard Worker *
783*d83cc019SAndroid Build Coastguard Worker * Returns: Whether batches are run through ppgtt.
784*d83cc019SAndroid Build Coastguard Worker */
gem_uses_ppgtt(int fd)785*d83cc019SAndroid Build Coastguard Worker bool gem_uses_ppgtt(int fd)
786*d83cc019SAndroid Build Coastguard Worker {
787*d83cc019SAndroid Build Coastguard Worker return gem_gtt_type(fd) > 0;
788*d83cc019SAndroid Build Coastguard Worker }
789*d83cc019SAndroid Build Coastguard Worker
790*d83cc019SAndroid Build Coastguard Worker /**
791*d83cc019SAndroid Build Coastguard Worker * gem_uses_full_ppgtt:
792*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
793*d83cc019SAndroid Build Coastguard Worker *
794*d83cc019SAndroid Build Coastguard Worker * Feature test macro to check whether the kernel internally uses full
795*d83cc019SAndroid Build Coastguard Worker * per-process gtt to execute batches. Note that this is also true when we're
796*d83cc019SAndroid Build Coastguard Worker * using full 64b ppgtt.
797*d83cc019SAndroid Build Coastguard Worker *
798*d83cc019SAndroid Build Coastguard Worker * Returns: Whether batches are run through full ppgtt.
799*d83cc019SAndroid Build Coastguard Worker */
gem_uses_full_ppgtt(int fd)800*d83cc019SAndroid Build Coastguard Worker bool gem_uses_full_ppgtt(int fd)
801*d83cc019SAndroid Build Coastguard Worker {
802*d83cc019SAndroid Build Coastguard Worker return gem_gtt_type(fd) > 1;
803*d83cc019SAndroid Build Coastguard Worker }
804*d83cc019SAndroid Build Coastguard Worker
805*d83cc019SAndroid Build Coastguard Worker /**
806*d83cc019SAndroid Build Coastguard Worker * gem_gpu_reset_type:
807*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
808*d83cc019SAndroid Build Coastguard Worker *
809*d83cc019SAndroid Build Coastguard Worker * Query whether reset-engine (2), global-reset (1) or reset-disable (0)
810*d83cc019SAndroid Build Coastguard Worker * is available.
811*d83cc019SAndroid Build Coastguard Worker *
812*d83cc019SAndroid Build Coastguard Worker * Returns: GPU reset type available
813*d83cc019SAndroid Build Coastguard Worker */
gem_gpu_reset_type(int fd)814*d83cc019SAndroid Build Coastguard Worker int gem_gpu_reset_type(int fd)
815*d83cc019SAndroid Build Coastguard Worker {
816*d83cc019SAndroid Build Coastguard Worker struct drm_i915_getparam gp;
817*d83cc019SAndroid Build Coastguard Worker int gpu_reset_type = -1;
818*d83cc019SAndroid Build Coastguard Worker
819*d83cc019SAndroid Build Coastguard Worker memset(&gp, 0, sizeof(gp));
820*d83cc019SAndroid Build Coastguard Worker gp.param = I915_PARAM_HAS_GPU_RESET;
821*d83cc019SAndroid Build Coastguard Worker gp.value = &gpu_reset_type;
822*d83cc019SAndroid Build Coastguard Worker drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
823*d83cc019SAndroid Build Coastguard Worker
824*d83cc019SAndroid Build Coastguard Worker return gpu_reset_type;
825*d83cc019SAndroid Build Coastguard Worker }
826*d83cc019SAndroid Build Coastguard Worker
827*d83cc019SAndroid Build Coastguard Worker /**
828*d83cc019SAndroid Build Coastguard Worker * gem_gpu_reset_enabled:
829*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
830*d83cc019SAndroid Build Coastguard Worker *
831*d83cc019SAndroid Build Coastguard Worker * Feature test macro to check whether the kernel internally uses hangchecks
832*d83cc019SAndroid Build Coastguard Worker * and can reset the GPU upon hang detection. Note that this is also true when
833*d83cc019SAndroid Build Coastguard Worker * reset-engine (the lightweight, single engine reset) is available.
834*d83cc019SAndroid Build Coastguard Worker *
835*d83cc019SAndroid Build Coastguard Worker * Returns: Whether the driver will detect hangs and perform a reset.
836*d83cc019SAndroid Build Coastguard Worker */
gem_gpu_reset_enabled(int fd)837*d83cc019SAndroid Build Coastguard Worker bool gem_gpu_reset_enabled(int fd)
838*d83cc019SAndroid Build Coastguard Worker {
839*d83cc019SAndroid Build Coastguard Worker return gem_gpu_reset_type(fd) > 0;
840*d83cc019SAndroid Build Coastguard Worker }
841*d83cc019SAndroid Build Coastguard Worker
842*d83cc019SAndroid Build Coastguard Worker /**
843*d83cc019SAndroid Build Coastguard Worker * gem_engine_reset_enabled:
844*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
845*d83cc019SAndroid Build Coastguard Worker *
846*d83cc019SAndroid Build Coastguard Worker * Feature test macro to check whether the kernel internally uses hangchecks
847*d83cc019SAndroid Build Coastguard Worker * and can reset individual engines upon hang detection.
848*d83cc019SAndroid Build Coastguard Worker *
849*d83cc019SAndroid Build Coastguard Worker * Returns: Whether the driver will detect hangs and perform an engine reset.
850*d83cc019SAndroid Build Coastguard Worker */
gem_engine_reset_enabled(int fd)851*d83cc019SAndroid Build Coastguard Worker bool gem_engine_reset_enabled(int fd)
852*d83cc019SAndroid Build Coastguard Worker {
853*d83cc019SAndroid Build Coastguard Worker return gem_gpu_reset_type(fd) > 1;
854*d83cc019SAndroid Build Coastguard Worker }
855*d83cc019SAndroid Build Coastguard Worker
856*d83cc019SAndroid Build Coastguard Worker /**
857*d83cc019SAndroid Build Coastguard Worker * gem_available_fences:
858*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
859*d83cc019SAndroid Build Coastguard Worker *
860*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query the kernel for the number of available fences
861*d83cc019SAndroid Build Coastguard Worker * usable in a batchbuffer. Only relevant for pre-gen4.
862*d83cc019SAndroid Build Coastguard Worker *
863*d83cc019SAndroid Build Coastguard Worker * Returns: The number of available fences.
864*d83cc019SAndroid Build Coastguard Worker */
gem_available_fences(int fd)865*d83cc019SAndroid Build Coastguard Worker int gem_available_fences(int fd)
866*d83cc019SAndroid Build Coastguard Worker {
867*d83cc019SAndroid Build Coastguard Worker static int num_fences = -1;
868*d83cc019SAndroid Build Coastguard Worker
869*d83cc019SAndroid Build Coastguard Worker if (num_fences < 0) {
870*d83cc019SAndroid Build Coastguard Worker struct drm_i915_getparam gp;
871*d83cc019SAndroid Build Coastguard Worker
872*d83cc019SAndroid Build Coastguard Worker memset(&gp, 0, sizeof(gp));
873*d83cc019SAndroid Build Coastguard Worker gp.param = I915_PARAM_NUM_FENCES_AVAIL;
874*d83cc019SAndroid Build Coastguard Worker gp.value = &num_fences;
875*d83cc019SAndroid Build Coastguard Worker
876*d83cc019SAndroid Build Coastguard Worker num_fences = 0;
877*d83cc019SAndroid Build Coastguard Worker ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp));
878*d83cc019SAndroid Build Coastguard Worker errno = 0;
879*d83cc019SAndroid Build Coastguard Worker }
880*d83cc019SAndroid Build Coastguard Worker
881*d83cc019SAndroid Build Coastguard Worker return num_fences;
882*d83cc019SAndroid Build Coastguard Worker }
883*d83cc019SAndroid Build Coastguard Worker
gem_has_llc(int fd)884*d83cc019SAndroid Build Coastguard Worker bool gem_has_llc(int fd)
885*d83cc019SAndroid Build Coastguard Worker {
886*d83cc019SAndroid Build Coastguard Worker static int has_llc = -1;
887*d83cc019SAndroid Build Coastguard Worker
888*d83cc019SAndroid Build Coastguard Worker if (has_llc < 0) {
889*d83cc019SAndroid Build Coastguard Worker struct drm_i915_getparam gp;
890*d83cc019SAndroid Build Coastguard Worker
891*d83cc019SAndroid Build Coastguard Worker memset(&gp, 0, sizeof(gp));
892*d83cc019SAndroid Build Coastguard Worker gp.param = I915_PARAM_HAS_LLC;
893*d83cc019SAndroid Build Coastguard Worker gp.value = &has_llc;
894*d83cc019SAndroid Build Coastguard Worker
895*d83cc019SAndroid Build Coastguard Worker has_llc = 0;
896*d83cc019SAndroid Build Coastguard Worker ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp));
897*d83cc019SAndroid Build Coastguard Worker errno = 0;
898*d83cc019SAndroid Build Coastguard Worker }
899*d83cc019SAndroid Build Coastguard Worker
900*d83cc019SAndroid Build Coastguard Worker return has_llc;
901*d83cc019SAndroid Build Coastguard Worker }
902*d83cc019SAndroid Build Coastguard Worker
has_param(int fd,int param)903*d83cc019SAndroid Build Coastguard Worker static bool has_param(int fd, int param)
904*d83cc019SAndroid Build Coastguard Worker {
905*d83cc019SAndroid Build Coastguard Worker drm_i915_getparam_t gp;
906*d83cc019SAndroid Build Coastguard Worker int tmp = 0;
907*d83cc019SAndroid Build Coastguard Worker
908*d83cc019SAndroid Build Coastguard Worker memset(&gp, 0, sizeof(gp));
909*d83cc019SAndroid Build Coastguard Worker gp.value = &tmp;
910*d83cc019SAndroid Build Coastguard Worker gp.param = param;
911*d83cc019SAndroid Build Coastguard Worker
912*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp))
913*d83cc019SAndroid Build Coastguard Worker return false;
914*d83cc019SAndroid Build Coastguard Worker
915*d83cc019SAndroid Build Coastguard Worker errno = 0;
916*d83cc019SAndroid Build Coastguard Worker return tmp > 0;
917*d83cc019SAndroid Build Coastguard Worker }
918*d83cc019SAndroid Build Coastguard Worker
919*d83cc019SAndroid Build Coastguard Worker /**
920*d83cc019SAndroid Build Coastguard Worker * gem_has_bsd:
921*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
922*d83cc019SAndroid Build Coastguard Worker *
923*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether the BSD ring is available.
924*d83cc019SAndroid Build Coastguard Worker *
925*d83cc019SAndroid Build Coastguard Worker * Note that recent Bspec calls this the VCS ring for Video Command Submission.
926*d83cc019SAndroid Build Coastguard Worker *
927*d83cc019SAndroid Build Coastguard Worker * Returns: Whether the BSD ring is available or not.
928*d83cc019SAndroid Build Coastguard Worker */
gem_has_bsd(int fd)929*d83cc019SAndroid Build Coastguard Worker bool gem_has_bsd(int fd)
930*d83cc019SAndroid Build Coastguard Worker {
931*d83cc019SAndroid Build Coastguard Worker static int has_bsd = -1;
932*d83cc019SAndroid Build Coastguard Worker if (has_bsd < 0)
933*d83cc019SAndroid Build Coastguard Worker has_bsd = has_param(fd, I915_PARAM_HAS_BSD);
934*d83cc019SAndroid Build Coastguard Worker return has_bsd;
935*d83cc019SAndroid Build Coastguard Worker }
936*d83cc019SAndroid Build Coastguard Worker
937*d83cc019SAndroid Build Coastguard Worker /**
938*d83cc019SAndroid Build Coastguard Worker * gem_has_blt:
939*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
940*d83cc019SAndroid Build Coastguard Worker *
941*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether the blitter ring is available.
942*d83cc019SAndroid Build Coastguard Worker *
943*d83cc019SAndroid Build Coastguard Worker * Note that recent Bspec calls this the BCS ring for Blitter Command Submission.
944*d83cc019SAndroid Build Coastguard Worker *
945*d83cc019SAndroid Build Coastguard Worker * Returns: Whether the blitter ring is available or not.
946*d83cc019SAndroid Build Coastguard Worker */
gem_has_blt(int fd)947*d83cc019SAndroid Build Coastguard Worker bool gem_has_blt(int fd)
948*d83cc019SAndroid Build Coastguard Worker {
949*d83cc019SAndroid Build Coastguard Worker static int has_blt = -1;
950*d83cc019SAndroid Build Coastguard Worker if (has_blt < 0)
951*d83cc019SAndroid Build Coastguard Worker has_blt = has_param(fd, I915_PARAM_HAS_BLT);
952*d83cc019SAndroid Build Coastguard Worker return has_blt;
953*d83cc019SAndroid Build Coastguard Worker }
954*d83cc019SAndroid Build Coastguard Worker
955*d83cc019SAndroid Build Coastguard Worker /**
956*d83cc019SAndroid Build Coastguard Worker * gem_has_vebox:
957*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
958*d83cc019SAndroid Build Coastguard Worker *
959*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether the vebox ring is available.
960*d83cc019SAndroid Build Coastguard Worker *
961*d83cc019SAndroid Build Coastguard Worker * Note that recent Bspec calls this the VECS ring for Video Enhancement Command
962*d83cc019SAndroid Build Coastguard Worker * Submission.
963*d83cc019SAndroid Build Coastguard Worker *
964*d83cc019SAndroid Build Coastguard Worker * Returns: Whether the vebox ring is available or not.
965*d83cc019SAndroid Build Coastguard Worker */
gem_has_vebox(int fd)966*d83cc019SAndroid Build Coastguard Worker bool gem_has_vebox(int fd)
967*d83cc019SAndroid Build Coastguard Worker {
968*d83cc019SAndroid Build Coastguard Worker static int has_vebox = -1;
969*d83cc019SAndroid Build Coastguard Worker if (has_vebox < 0)
970*d83cc019SAndroid Build Coastguard Worker has_vebox = has_param(fd, I915_PARAM_HAS_VEBOX);
971*d83cc019SAndroid Build Coastguard Worker return has_vebox;
972*d83cc019SAndroid Build Coastguard Worker }
973*d83cc019SAndroid Build Coastguard Worker
974*d83cc019SAndroid Build Coastguard Worker #define I915_PARAM_HAS_BSD2 31
975*d83cc019SAndroid Build Coastguard Worker /**
976*d83cc019SAndroid Build Coastguard Worker * gem_has_bsd2:
977*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
978*d83cc019SAndroid Build Coastguard Worker *
979*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether the BSD2 ring is available.
980*d83cc019SAndroid Build Coastguard Worker *
981*d83cc019SAndroid Build Coastguard Worker * Note that recent Bspec calls this the VCS ring for Video Command Submission.
982*d83cc019SAndroid Build Coastguard Worker *
983*d83cc019SAndroid Build Coastguard Worker * Returns: Whether the BSD ring is avaible or not.
984*d83cc019SAndroid Build Coastguard Worker */
gem_has_bsd2(int fd)985*d83cc019SAndroid Build Coastguard Worker bool gem_has_bsd2(int fd)
986*d83cc019SAndroid Build Coastguard Worker {
987*d83cc019SAndroid Build Coastguard Worker static int has_bsd2 = -1;
988*d83cc019SAndroid Build Coastguard Worker if (has_bsd2 < 0)
989*d83cc019SAndroid Build Coastguard Worker has_bsd2 = has_param(fd, I915_PARAM_HAS_BSD2);
990*d83cc019SAndroid Build Coastguard Worker return has_bsd2;
991*d83cc019SAndroid Build Coastguard Worker }
992*d83cc019SAndroid Build Coastguard Worker
993*d83cc019SAndroid Build Coastguard Worker struct local_i915_gem_get_aperture {
994*d83cc019SAndroid Build Coastguard Worker __u64 aper_size;
995*d83cc019SAndroid Build Coastguard Worker __u64 aper_available_size;
996*d83cc019SAndroid Build Coastguard Worker __u64 version;
997*d83cc019SAndroid Build Coastguard Worker __u64 map_total_size;
998*d83cc019SAndroid Build Coastguard Worker __u64 stolen_total_size;
999*d83cc019SAndroid Build Coastguard Worker };
1000*d83cc019SAndroid Build Coastguard Worker #define DRM_I915_GEM_GET_APERTURE 0x23
1001*d83cc019SAndroid Build Coastguard Worker #define LOCAL_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct local_i915_gem_get_aperture)
1002*d83cc019SAndroid Build Coastguard Worker /**
1003*d83cc019SAndroid Build Coastguard Worker * gem_total_mappable_size:
1004*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1005*d83cc019SAndroid Build Coastguard Worker *
1006*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query the kernel for the total mappable size.
1007*d83cc019SAndroid Build Coastguard Worker *
1008*d83cc019SAndroid Build Coastguard Worker * Returns: Total mappable address space size.
1009*d83cc019SAndroid Build Coastguard Worker */
gem_total_mappable_size(int fd)1010*d83cc019SAndroid Build Coastguard Worker uint64_t gem_total_mappable_size(int fd)
1011*d83cc019SAndroid Build Coastguard Worker {
1012*d83cc019SAndroid Build Coastguard Worker struct local_i915_gem_get_aperture aperture;
1013*d83cc019SAndroid Build Coastguard Worker
1014*d83cc019SAndroid Build Coastguard Worker memset(&aperture, 0, sizeof(aperture));
1015*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, LOCAL_IOCTL_I915_GEM_GET_APERTURE, &aperture);
1016*d83cc019SAndroid Build Coastguard Worker
1017*d83cc019SAndroid Build Coastguard Worker return aperture.map_total_size;
1018*d83cc019SAndroid Build Coastguard Worker }
1019*d83cc019SAndroid Build Coastguard Worker
1020*d83cc019SAndroid Build Coastguard Worker /**
1021*d83cc019SAndroid Build Coastguard Worker * gem_total_stolen_size:
1022*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1023*d83cc019SAndroid Build Coastguard Worker *
1024*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query the kernel for the total stolen size.
1025*d83cc019SAndroid Build Coastguard Worker *
1026*d83cc019SAndroid Build Coastguard Worker * Returns: Total stolen memory.
1027*d83cc019SAndroid Build Coastguard Worker */
gem_total_stolen_size(int fd)1028*d83cc019SAndroid Build Coastguard Worker uint64_t gem_total_stolen_size(int fd)
1029*d83cc019SAndroid Build Coastguard Worker {
1030*d83cc019SAndroid Build Coastguard Worker struct local_i915_gem_get_aperture aperture;
1031*d83cc019SAndroid Build Coastguard Worker
1032*d83cc019SAndroid Build Coastguard Worker memset(&aperture, 0, sizeof(aperture));
1033*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, LOCAL_IOCTL_I915_GEM_GET_APERTURE, &aperture);
1034*d83cc019SAndroid Build Coastguard Worker
1035*d83cc019SAndroid Build Coastguard Worker return aperture.stolen_total_size;
1036*d83cc019SAndroid Build Coastguard Worker }
1037*d83cc019SAndroid Build Coastguard Worker
1038*d83cc019SAndroid Build Coastguard Worker /**
1039*d83cc019SAndroid Build Coastguard Worker * gem_available_aperture_size:
1040*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1041*d83cc019SAndroid Build Coastguard Worker *
1042*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query the kernel for the available gpu aperture size
1043*d83cc019SAndroid Build Coastguard Worker * usable in a batchbuffer.
1044*d83cc019SAndroid Build Coastguard Worker *
1045*d83cc019SAndroid Build Coastguard Worker * Returns: The available gtt address space size.
1046*d83cc019SAndroid Build Coastguard Worker */
gem_available_aperture_size(int fd)1047*d83cc019SAndroid Build Coastguard Worker uint64_t gem_available_aperture_size(int fd)
1048*d83cc019SAndroid Build Coastguard Worker {
1049*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_get_aperture aperture;
1050*d83cc019SAndroid Build Coastguard Worker
1051*d83cc019SAndroid Build Coastguard Worker memset(&aperture, 0, sizeof(aperture));
1052*d83cc019SAndroid Build Coastguard Worker aperture.aper_size = 256*1024*1024;
1053*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
1054*d83cc019SAndroid Build Coastguard Worker
1055*d83cc019SAndroid Build Coastguard Worker return aperture.aper_available_size;
1056*d83cc019SAndroid Build Coastguard Worker }
1057*d83cc019SAndroid Build Coastguard Worker
1058*d83cc019SAndroid Build Coastguard Worker /**
1059*d83cc019SAndroid Build Coastguard Worker * gem_aperture_size:
1060*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1061*d83cc019SAndroid Build Coastguard Worker *
1062*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query the kernel for the total gpu aperture size.
1063*d83cc019SAndroid Build Coastguard Worker *
1064*d83cc019SAndroid Build Coastguard Worker * Returns: The total gtt address space size.
1065*d83cc019SAndroid Build Coastguard Worker */
gem_aperture_size(int fd)1066*d83cc019SAndroid Build Coastguard Worker uint64_t gem_aperture_size(int fd)
1067*d83cc019SAndroid Build Coastguard Worker {
1068*d83cc019SAndroid Build Coastguard Worker static uint64_t aperture_size = 0;
1069*d83cc019SAndroid Build Coastguard Worker
1070*d83cc019SAndroid Build Coastguard Worker if (aperture_size == 0) {
1071*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_context_param p;
1072*d83cc019SAndroid Build Coastguard Worker
1073*d83cc019SAndroid Build Coastguard Worker memset(&p, 0, sizeof(p));
1074*d83cc019SAndroid Build Coastguard Worker p.param = 0x3;
1075*d83cc019SAndroid Build Coastguard Worker if (__gem_context_get_param(fd, &p) == 0) {
1076*d83cc019SAndroid Build Coastguard Worker aperture_size = p.value;
1077*d83cc019SAndroid Build Coastguard Worker } else {
1078*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_get_aperture aperture;
1079*d83cc019SAndroid Build Coastguard Worker
1080*d83cc019SAndroid Build Coastguard Worker memset(&aperture, 0, sizeof(aperture));
1081*d83cc019SAndroid Build Coastguard Worker aperture.aper_size = 256*1024*1024;
1082*d83cc019SAndroid Build Coastguard Worker
1083*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
1084*d83cc019SAndroid Build Coastguard Worker aperture_size = aperture.aper_size;
1085*d83cc019SAndroid Build Coastguard Worker }
1086*d83cc019SAndroid Build Coastguard Worker }
1087*d83cc019SAndroid Build Coastguard Worker
1088*d83cc019SAndroid Build Coastguard Worker return aperture_size;
1089*d83cc019SAndroid Build Coastguard Worker }
1090*d83cc019SAndroid Build Coastguard Worker
1091*d83cc019SAndroid Build Coastguard Worker /**
1092*d83cc019SAndroid Build Coastguard Worker * gem_mappable_aperture_size:
1093*d83cc019SAndroid Build Coastguard Worker *
1094*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query the kernel for the mappable gpu aperture size.
1095*d83cc019SAndroid Build Coastguard Worker * This is the area available for GTT memory mappings.
1096*d83cc019SAndroid Build Coastguard Worker *
1097*d83cc019SAndroid Build Coastguard Worker * Returns: The mappable gtt address space size.
1098*d83cc019SAndroid Build Coastguard Worker */
gem_mappable_aperture_size(void)1099*d83cc019SAndroid Build Coastguard Worker uint64_t gem_mappable_aperture_size(void)
1100*d83cc019SAndroid Build Coastguard Worker {
1101*d83cc019SAndroid Build Coastguard Worker #if defined(USE_INTEL)
1102*d83cc019SAndroid Build Coastguard Worker struct pci_device *pci_dev = intel_get_pci_device();
1103*d83cc019SAndroid Build Coastguard Worker int bar;
1104*d83cc019SAndroid Build Coastguard Worker
1105*d83cc019SAndroid Build Coastguard Worker if (intel_gen(pci_dev->device_id) < 3)
1106*d83cc019SAndroid Build Coastguard Worker bar = 0;
1107*d83cc019SAndroid Build Coastguard Worker else
1108*d83cc019SAndroid Build Coastguard Worker bar = 2;
1109*d83cc019SAndroid Build Coastguard Worker
1110*d83cc019SAndroid Build Coastguard Worker return pci_dev->regions[bar].size;
1111*d83cc019SAndroid Build Coastguard Worker #else
1112*d83cc019SAndroid Build Coastguard Worker return 0;
1113*d83cc019SAndroid Build Coastguard Worker #endif
1114*d83cc019SAndroid Build Coastguard Worker }
1115*d83cc019SAndroid Build Coastguard Worker
1116*d83cc019SAndroid Build Coastguard Worker /**
1117*d83cc019SAndroid Build Coastguard Worker * gem_global_aperture_size:
1118*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1119*d83cc019SAndroid Build Coastguard Worker *
1120*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query the kernel for the global gpu aperture size.
1121*d83cc019SAndroid Build Coastguard Worker * This is the area available for the kernel to perform address translations.
1122*d83cc019SAndroid Build Coastguard Worker *
1123*d83cc019SAndroid Build Coastguard Worker * Returns: The mappable gtt address space size.
1124*d83cc019SAndroid Build Coastguard Worker */
gem_global_aperture_size(int fd)1125*d83cc019SAndroid Build Coastguard Worker uint64_t gem_global_aperture_size(int fd)
1126*d83cc019SAndroid Build Coastguard Worker {
1127*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_get_aperture aperture;
1128*d83cc019SAndroid Build Coastguard Worker
1129*d83cc019SAndroid Build Coastguard Worker memset(&aperture, 0, sizeof(aperture));
1130*d83cc019SAndroid Build Coastguard Worker aperture.aper_size = 256*1024*1024;
1131*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
1132*d83cc019SAndroid Build Coastguard Worker
1133*d83cc019SAndroid Build Coastguard Worker return aperture.aper_size;
1134*d83cc019SAndroid Build Coastguard Worker }
1135*d83cc019SAndroid Build Coastguard Worker
1136*d83cc019SAndroid Build Coastguard Worker /**
1137*d83cc019SAndroid Build Coastguard Worker * gem_has_softpin:
1138*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1139*d83cc019SAndroid Build Coastguard Worker *
1140*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether the softpinning functionality is
1141*d83cc019SAndroid Build Coastguard Worker * supported.
1142*d83cc019SAndroid Build Coastguard Worker *
1143*d83cc019SAndroid Build Coastguard Worker * Returns: Whether softpin support is available
1144*d83cc019SAndroid Build Coastguard Worker */
gem_has_softpin(int fd)1145*d83cc019SAndroid Build Coastguard Worker bool gem_has_softpin(int fd)
1146*d83cc019SAndroid Build Coastguard Worker {
1147*d83cc019SAndroid Build Coastguard Worker static int has_softpin = -1;
1148*d83cc019SAndroid Build Coastguard Worker
1149*d83cc019SAndroid Build Coastguard Worker if (has_softpin < 0) {
1150*d83cc019SAndroid Build Coastguard Worker struct drm_i915_getparam gp;
1151*d83cc019SAndroid Build Coastguard Worker
1152*d83cc019SAndroid Build Coastguard Worker memset(&gp, 0, sizeof(gp));
1153*d83cc019SAndroid Build Coastguard Worker gp.param = I915_PARAM_HAS_EXEC_SOFTPIN;
1154*d83cc019SAndroid Build Coastguard Worker gp.value = &has_softpin;
1155*d83cc019SAndroid Build Coastguard Worker
1156*d83cc019SAndroid Build Coastguard Worker has_softpin = 0;
1157*d83cc019SAndroid Build Coastguard Worker ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp));
1158*d83cc019SAndroid Build Coastguard Worker errno = 0;
1159*d83cc019SAndroid Build Coastguard Worker }
1160*d83cc019SAndroid Build Coastguard Worker
1161*d83cc019SAndroid Build Coastguard Worker return has_softpin;
1162*d83cc019SAndroid Build Coastguard Worker }
1163*d83cc019SAndroid Build Coastguard Worker
1164*d83cc019SAndroid Build Coastguard Worker /**
1165*d83cc019SAndroid Build Coastguard Worker * gem_has_exec_fence:
1166*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1167*d83cc019SAndroid Build Coastguard Worker *
1168*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether in/out fence support in execbuffer is
1169*d83cc019SAndroid Build Coastguard Worker * available.
1170*d83cc019SAndroid Build Coastguard Worker *
1171*d83cc019SAndroid Build Coastguard Worker * Returns: Whether fence support is available
1172*d83cc019SAndroid Build Coastguard Worker */
gem_has_exec_fence(int fd)1173*d83cc019SAndroid Build Coastguard Worker bool gem_has_exec_fence(int fd)
1174*d83cc019SAndroid Build Coastguard Worker {
1175*d83cc019SAndroid Build Coastguard Worker static int has_exec_fence = -1;
1176*d83cc019SAndroid Build Coastguard Worker
1177*d83cc019SAndroid Build Coastguard Worker if (has_exec_fence < 0) {
1178*d83cc019SAndroid Build Coastguard Worker struct drm_i915_getparam gp;
1179*d83cc019SAndroid Build Coastguard Worker
1180*d83cc019SAndroid Build Coastguard Worker memset(&gp, 0, sizeof(gp));
1181*d83cc019SAndroid Build Coastguard Worker gp.param = I915_PARAM_HAS_EXEC_FENCE;
1182*d83cc019SAndroid Build Coastguard Worker gp.value = &has_exec_fence;
1183*d83cc019SAndroid Build Coastguard Worker
1184*d83cc019SAndroid Build Coastguard Worker has_exec_fence = 0;
1185*d83cc019SAndroid Build Coastguard Worker ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp));
1186*d83cc019SAndroid Build Coastguard Worker errno = 0;
1187*d83cc019SAndroid Build Coastguard Worker }
1188*d83cc019SAndroid Build Coastguard Worker
1189*d83cc019SAndroid Build Coastguard Worker return has_exec_fence;
1190*d83cc019SAndroid Build Coastguard Worker }
1191*d83cc019SAndroid Build Coastguard Worker
1192*d83cc019SAndroid Build Coastguard Worker /**
1193*d83cc019SAndroid Build Coastguard Worker * gem_require_caching:
1194*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1195*d83cc019SAndroid Build Coastguard Worker *
1196*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether buffer object caching control is
1197*d83cc019SAndroid Build Coastguard Worker * available. Automatically skips through igt_require() if not.
1198*d83cc019SAndroid Build Coastguard Worker */
gem_require_caching(int fd)1199*d83cc019SAndroid Build Coastguard Worker void gem_require_caching(int fd)
1200*d83cc019SAndroid Build Coastguard Worker {
1201*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
1202*d83cc019SAndroid Build Coastguard Worker
1203*d83cc019SAndroid Build Coastguard Worker handle = gem_create(fd, 4096);
1204*d83cc019SAndroid Build Coastguard Worker gem_set_caching(fd, handle, 0);
1205*d83cc019SAndroid Build Coastguard Worker gem_close(fd, handle);
1206*d83cc019SAndroid Build Coastguard Worker
1207*d83cc019SAndroid Build Coastguard Worker errno = 0;
1208*d83cc019SAndroid Build Coastguard Worker }
1209*d83cc019SAndroid Build Coastguard Worker
reset_device(int fd)1210*d83cc019SAndroid Build Coastguard Worker static void reset_device(int fd)
1211*d83cc019SAndroid Build Coastguard Worker {
1212*d83cc019SAndroid Build Coastguard Worker int dir;
1213*d83cc019SAndroid Build Coastguard Worker
1214*d83cc019SAndroid Build Coastguard Worker dir = igt_debugfs_dir(fd);
1215*d83cc019SAndroid Build Coastguard Worker igt_require(dir >= 0);
1216*d83cc019SAndroid Build Coastguard Worker
1217*d83cc019SAndroid Build Coastguard Worker if (ioctl(fd, DRM_IOCTL_I915_GEM_THROTTLE)) {
1218*d83cc019SAndroid Build Coastguard Worker igt_info("Found wedged device, trying to reset and continue\n");
1219*d83cc019SAndroid Build Coastguard Worker igt_sysfs_set(dir, "i915_wedged", "-1");
1220*d83cc019SAndroid Build Coastguard Worker }
1221*d83cc019SAndroid Build Coastguard Worker igt_sysfs_set(dir, "i915_next_seqno", "1");
1222*d83cc019SAndroid Build Coastguard Worker
1223*d83cc019SAndroid Build Coastguard Worker close(dir);
1224*d83cc019SAndroid Build Coastguard Worker }
1225*d83cc019SAndroid Build Coastguard Worker
igt_require_gem(int fd)1226*d83cc019SAndroid Build Coastguard Worker void igt_require_gem(int fd)
1227*d83cc019SAndroid Build Coastguard Worker {
1228*d83cc019SAndroid Build Coastguard Worker char path[256];
1229*d83cc019SAndroid Build Coastguard Worker int err;
1230*d83cc019SAndroid Build Coastguard Worker
1231*d83cc019SAndroid Build Coastguard Worker igt_require_intel(fd);
1232*d83cc019SAndroid Build Coastguard Worker
1233*d83cc019SAndroid Build Coastguard Worker /*
1234*d83cc019SAndroid Build Coastguard Worker * We only want to use the throttle-ioctl for its -EIO reporting
1235*d83cc019SAndroid Build Coastguard Worker * of a wedged device, not for actually waiting on outstanding
1236*d83cc019SAndroid Build Coastguard Worker * requests! So create a new drm_file for the device that is clean.
1237*d83cc019SAndroid Build Coastguard Worker */
1238*d83cc019SAndroid Build Coastguard Worker snprintf(path, sizeof(path), "/proc/self/fd/%d", fd);
1239*d83cc019SAndroid Build Coastguard Worker fd = open(path, O_RDWR);
1240*d83cc019SAndroid Build Coastguard Worker igt_assert_lte(0, fd);
1241*d83cc019SAndroid Build Coastguard Worker
1242*d83cc019SAndroid Build Coastguard Worker /*
1243*d83cc019SAndroid Build Coastguard Worker * Reset the global seqno at the start of each test. This ensures that
1244*d83cc019SAndroid Build Coastguard Worker * the test will not wrap unless it explicitly sets up seqno wrapping
1245*d83cc019SAndroid Build Coastguard Worker * itself, which avoids accidentally hanging when setting up long
1246*d83cc019SAndroid Build Coastguard Worker * sequences of batches.
1247*d83cc019SAndroid Build Coastguard Worker */
1248*d83cc019SAndroid Build Coastguard Worker reset_device(fd);
1249*d83cc019SAndroid Build Coastguard Worker
1250*d83cc019SAndroid Build Coastguard Worker err = 0;
1251*d83cc019SAndroid Build Coastguard Worker if (ioctl(fd, DRM_IOCTL_I915_GEM_THROTTLE))
1252*d83cc019SAndroid Build Coastguard Worker err = -errno;
1253*d83cc019SAndroid Build Coastguard Worker
1254*d83cc019SAndroid Build Coastguard Worker close(fd);
1255*d83cc019SAndroid Build Coastguard Worker
1256*d83cc019SAndroid Build Coastguard Worker igt_require_f(err == 0, "Unresponsive i915/GEM device\n");
1257*d83cc019SAndroid Build Coastguard Worker }
1258*d83cc019SAndroid Build Coastguard Worker
1259*d83cc019SAndroid Build Coastguard Worker /**
1260*d83cc019SAndroid Build Coastguard Worker * gem_require_ring:
1261*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1262*d83cc019SAndroid Build Coastguard Worker * @ring: ring flag bit as used in gem_execbuf()
1263*d83cc019SAndroid Build Coastguard Worker *
1264*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether a specific ring is available.
1265*d83cc019SAndroid Build Coastguard Worker * This automagically skips if the ring isn't available by
1266*d83cc019SAndroid Build Coastguard Worker * calling igt_require().
1267*d83cc019SAndroid Build Coastguard Worker */
gem_require_ring(int fd,unsigned ring)1268*d83cc019SAndroid Build Coastguard Worker void gem_require_ring(int fd, unsigned ring)
1269*d83cc019SAndroid Build Coastguard Worker {
1270*d83cc019SAndroid Build Coastguard Worker igt_require(gem_has_ring(fd, ring));
1271*d83cc019SAndroid Build Coastguard Worker }
1272*d83cc019SAndroid Build Coastguard Worker
1273*d83cc019SAndroid Build Coastguard Worker /**
1274*d83cc019SAndroid Build Coastguard Worker * gem_has_mocs_registers:
1275*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1276*d83cc019SAndroid Build Coastguard Worker *
1277*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether the device has MOCS registers.
1278*d83cc019SAndroid Build Coastguard Worker * These exist gen 9+.
1279*d83cc019SAndroid Build Coastguard Worker */
gem_has_mocs_registers(int fd)1280*d83cc019SAndroid Build Coastguard Worker bool gem_has_mocs_registers(int fd)
1281*d83cc019SAndroid Build Coastguard Worker {
1282*d83cc019SAndroid Build Coastguard Worker return intel_gen(intel_get_drm_devid(fd)) >= 9;
1283*d83cc019SAndroid Build Coastguard Worker }
1284*d83cc019SAndroid Build Coastguard Worker
1285*d83cc019SAndroid Build Coastguard Worker /**
1286*d83cc019SAndroid Build Coastguard Worker * gem_require_mocs_registers:
1287*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1288*d83cc019SAndroid Build Coastguard Worker *
1289*d83cc019SAndroid Build Coastguard Worker * Feature test macro to query whether the device has MOCS registers.
1290*d83cc019SAndroid Build Coastguard Worker * These exist gen 9+.
1291*d83cc019SAndroid Build Coastguard Worker */
gem_require_mocs_registers(int fd)1292*d83cc019SAndroid Build Coastguard Worker void gem_require_mocs_registers(int fd)
1293*d83cc019SAndroid Build Coastguard Worker {
1294*d83cc019SAndroid Build Coastguard Worker igt_require(gem_has_mocs_registers(fd));
1295*d83cc019SAndroid Build Coastguard Worker }
1296*d83cc019SAndroid Build Coastguard Worker
1297*d83cc019SAndroid Build Coastguard Worker /* prime */
1298*d83cc019SAndroid Build Coastguard Worker
1299*d83cc019SAndroid Build Coastguard Worker /**
1300*d83cc019SAndroid Build Coastguard Worker * prime_handle_to_fd:
1301*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1302*d83cc019SAndroid Build Coastguard Worker * @handle: file-private gem buffer object handle
1303*d83cc019SAndroid Build Coastguard Worker *
1304*d83cc019SAndroid Build Coastguard Worker * This wraps the PRIME_HANDLE_TO_FD ioctl, which is used to export a gem buffer
1305*d83cc019SAndroid Build Coastguard Worker * object into a global (i.e. potentially cross-device) dma-buf file-descriptor
1306*d83cc019SAndroid Build Coastguard Worker * handle.
1307*d83cc019SAndroid Build Coastguard Worker *
1308*d83cc019SAndroid Build Coastguard Worker * Returns: The created dma-buf fd handle.
1309*d83cc019SAndroid Build Coastguard Worker */
prime_handle_to_fd(int fd,uint32_t handle)1310*d83cc019SAndroid Build Coastguard Worker int prime_handle_to_fd(int fd, uint32_t handle)
1311*d83cc019SAndroid Build Coastguard Worker {
1312*d83cc019SAndroid Build Coastguard Worker struct drm_prime_handle args;
1313*d83cc019SAndroid Build Coastguard Worker
1314*d83cc019SAndroid Build Coastguard Worker memset(&args, 0, sizeof(args));
1315*d83cc019SAndroid Build Coastguard Worker args.handle = handle;
1316*d83cc019SAndroid Build Coastguard Worker args.flags = DRM_CLOEXEC;
1317*d83cc019SAndroid Build Coastguard Worker args.fd = -1;
1318*d83cc019SAndroid Build Coastguard Worker
1319*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
1320*d83cc019SAndroid Build Coastguard Worker
1321*d83cc019SAndroid Build Coastguard Worker return args.fd;
1322*d83cc019SAndroid Build Coastguard Worker }
1323*d83cc019SAndroid Build Coastguard Worker
1324*d83cc019SAndroid Build Coastguard Worker /**
1325*d83cc019SAndroid Build Coastguard Worker * prime_handle_to_fd_for_mmap:
1326*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1327*d83cc019SAndroid Build Coastguard Worker * @handle: file-private gem buffer object handle
1328*d83cc019SAndroid Build Coastguard Worker *
1329*d83cc019SAndroid Build Coastguard Worker * Same as prime_handle_to_fd above but with DRM_RDWR capabilities, which can
1330*d83cc019SAndroid Build Coastguard Worker * be useful for writing into the mmap'ed dma-buf file-descriptor.
1331*d83cc019SAndroid Build Coastguard Worker *
1332*d83cc019SAndroid Build Coastguard Worker * Returns: The created dma-buf fd handle or -1 if the ioctl fails.
1333*d83cc019SAndroid Build Coastguard Worker */
prime_handle_to_fd_for_mmap(int fd,uint32_t handle)1334*d83cc019SAndroid Build Coastguard Worker int prime_handle_to_fd_for_mmap(int fd, uint32_t handle)
1335*d83cc019SAndroid Build Coastguard Worker {
1336*d83cc019SAndroid Build Coastguard Worker struct drm_prime_handle args;
1337*d83cc019SAndroid Build Coastguard Worker
1338*d83cc019SAndroid Build Coastguard Worker memset(&args, 0, sizeof(args));
1339*d83cc019SAndroid Build Coastguard Worker args.handle = handle;
1340*d83cc019SAndroid Build Coastguard Worker args.flags = DRM_CLOEXEC | DRM_RDWR;
1341*d83cc019SAndroid Build Coastguard Worker args.fd = -1;
1342*d83cc019SAndroid Build Coastguard Worker
1343*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args) != 0)
1344*d83cc019SAndroid Build Coastguard Worker return -1;
1345*d83cc019SAndroid Build Coastguard Worker
1346*d83cc019SAndroid Build Coastguard Worker return args.fd;
1347*d83cc019SAndroid Build Coastguard Worker }
1348*d83cc019SAndroid Build Coastguard Worker
1349*d83cc019SAndroid Build Coastguard Worker /**
1350*d83cc019SAndroid Build Coastguard Worker * prime_fd_to_handle:
1351*d83cc019SAndroid Build Coastguard Worker * @fd: open i915 drm file descriptor
1352*d83cc019SAndroid Build Coastguard Worker * @dma_buf_fd: dma-buf fd handle
1353*d83cc019SAndroid Build Coastguard Worker *
1354*d83cc019SAndroid Build Coastguard Worker * This wraps the PRIME_FD_TO_HANDLE ioctl, which is used to import a dma-buf
1355*d83cc019SAndroid Build Coastguard Worker * file-descriptor into a gem buffer object.
1356*d83cc019SAndroid Build Coastguard Worker *
1357*d83cc019SAndroid Build Coastguard Worker * Returns: The created gem buffer object handle.
1358*d83cc019SAndroid Build Coastguard Worker */
prime_fd_to_handle(int fd,int dma_buf_fd)1359*d83cc019SAndroid Build Coastguard Worker uint32_t prime_fd_to_handle(int fd, int dma_buf_fd)
1360*d83cc019SAndroid Build Coastguard Worker {
1361*d83cc019SAndroid Build Coastguard Worker struct drm_prime_handle args;
1362*d83cc019SAndroid Build Coastguard Worker
1363*d83cc019SAndroid Build Coastguard Worker memset(&args, 0, sizeof(args));
1364*d83cc019SAndroid Build Coastguard Worker args.fd = dma_buf_fd;
1365*d83cc019SAndroid Build Coastguard Worker args.flags = 0;
1366*d83cc019SAndroid Build Coastguard Worker args.handle = 0;
1367*d83cc019SAndroid Build Coastguard Worker
1368*d83cc019SAndroid Build Coastguard Worker do_ioctl(fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &args);
1369*d83cc019SAndroid Build Coastguard Worker
1370*d83cc019SAndroid Build Coastguard Worker return args.handle;
1371*d83cc019SAndroid Build Coastguard Worker }
1372*d83cc019SAndroid Build Coastguard Worker
1373*d83cc019SAndroid Build Coastguard Worker /**
1374*d83cc019SAndroid Build Coastguard Worker * prime_get_size:
1375*d83cc019SAndroid Build Coastguard Worker * @dma_buf_fd: dma-buf fd handle
1376*d83cc019SAndroid Build Coastguard Worker *
1377*d83cc019SAndroid Build Coastguard Worker * This wraps the lseek() protocol used to query the invariant size of a
1378*d83cc019SAndroid Build Coastguard Worker * dma-buf. Not all kernels support this, which is check with igt_require() and
1379*d83cc019SAndroid Build Coastguard Worker * so will result in automagic test skipping.
1380*d83cc019SAndroid Build Coastguard Worker *
1381*d83cc019SAndroid Build Coastguard Worker * Returns: The lifetime-invariant size of the dma-buf object.
1382*d83cc019SAndroid Build Coastguard Worker */
prime_get_size(int dma_buf_fd)1383*d83cc019SAndroid Build Coastguard Worker off_t prime_get_size(int dma_buf_fd)
1384*d83cc019SAndroid Build Coastguard Worker {
1385*d83cc019SAndroid Build Coastguard Worker off_t ret;
1386*d83cc019SAndroid Build Coastguard Worker
1387*d83cc019SAndroid Build Coastguard Worker ret = lseek(dma_buf_fd, 0, SEEK_END);
1388*d83cc019SAndroid Build Coastguard Worker igt_assert(ret >= 0 || errno == ESPIPE);
1389*d83cc019SAndroid Build Coastguard Worker igt_require(ret >= 0);
1390*d83cc019SAndroid Build Coastguard Worker errno = 0;
1391*d83cc019SAndroid Build Coastguard Worker
1392*d83cc019SAndroid Build Coastguard Worker return ret;
1393*d83cc019SAndroid Build Coastguard Worker }
1394*d83cc019SAndroid Build Coastguard Worker
1395*d83cc019SAndroid Build Coastguard Worker /**
1396*d83cc019SAndroid Build Coastguard Worker * prime_sync_start
1397*d83cc019SAndroid Build Coastguard Worker * @dma_buf_fd: dma-buf fd handle
1398*d83cc019SAndroid Build Coastguard Worker * @write: read/write or read-only access
1399*d83cc019SAndroid Build Coastguard Worker *
1400*d83cc019SAndroid Build Coastguard Worker * Must be called before starting CPU mmap access to a dma-buf.
1401*d83cc019SAndroid Build Coastguard Worker */
prime_sync_start(int dma_buf_fd,bool write)1402*d83cc019SAndroid Build Coastguard Worker void prime_sync_start(int dma_buf_fd, bool write)
1403*d83cc019SAndroid Build Coastguard Worker {
1404*d83cc019SAndroid Build Coastguard Worker struct local_dma_buf_sync sync_start;
1405*d83cc019SAndroid Build Coastguard Worker
1406*d83cc019SAndroid Build Coastguard Worker memset(&sync_start, 0, sizeof(sync_start));
1407*d83cc019SAndroid Build Coastguard Worker sync_start.flags = LOCAL_DMA_BUF_SYNC_START;
1408*d83cc019SAndroid Build Coastguard Worker sync_start.flags |= LOCAL_DMA_BUF_SYNC_READ;
1409*d83cc019SAndroid Build Coastguard Worker if (write)
1410*d83cc019SAndroid Build Coastguard Worker sync_start.flags |= LOCAL_DMA_BUF_SYNC_WRITE;
1411*d83cc019SAndroid Build Coastguard Worker do_ioctl(dma_buf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_start);
1412*d83cc019SAndroid Build Coastguard Worker }
1413*d83cc019SAndroid Build Coastguard Worker
1414*d83cc019SAndroid Build Coastguard Worker /**
1415*d83cc019SAndroid Build Coastguard Worker * prime_sync_end
1416*d83cc019SAndroid Build Coastguard Worker * @dma_buf_fd: dma-buf fd handle
1417*d83cc019SAndroid Build Coastguard Worker * @write: read/write or read-only access
1418*d83cc019SAndroid Build Coastguard Worker *
1419*d83cc019SAndroid Build Coastguard Worker * Must be called after finishing CPU mmap access to a dma-buf.
1420*d83cc019SAndroid Build Coastguard Worker */
prime_sync_end(int dma_buf_fd,bool write)1421*d83cc019SAndroid Build Coastguard Worker void prime_sync_end(int dma_buf_fd, bool write)
1422*d83cc019SAndroid Build Coastguard Worker {
1423*d83cc019SAndroid Build Coastguard Worker struct local_dma_buf_sync sync_end;
1424*d83cc019SAndroid Build Coastguard Worker
1425*d83cc019SAndroid Build Coastguard Worker memset(&sync_end, 0, sizeof(sync_end));
1426*d83cc019SAndroid Build Coastguard Worker sync_end.flags = LOCAL_DMA_BUF_SYNC_END;
1427*d83cc019SAndroid Build Coastguard Worker sync_end.flags |= LOCAL_DMA_BUF_SYNC_READ;
1428*d83cc019SAndroid Build Coastguard Worker if (write)
1429*d83cc019SAndroid Build Coastguard Worker sync_end.flags |= LOCAL_DMA_BUF_SYNC_WRITE;
1430*d83cc019SAndroid Build Coastguard Worker do_ioctl(dma_buf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_end);
1431*d83cc019SAndroid Build Coastguard Worker }
1432*d83cc019SAndroid Build Coastguard Worker
igt_has_fb_modifiers(int fd)1433*d83cc019SAndroid Build Coastguard Worker bool igt_has_fb_modifiers(int fd)
1434*d83cc019SAndroid Build Coastguard Worker {
1435*d83cc019SAndroid Build Coastguard Worker static bool has_modifiers, cap_modifiers_tested;
1436*d83cc019SAndroid Build Coastguard Worker
1437*d83cc019SAndroid Build Coastguard Worker if (!cap_modifiers_tested) {
1438*d83cc019SAndroid Build Coastguard Worker uint64_t cap_modifiers;
1439*d83cc019SAndroid Build Coastguard Worker int ret;
1440*d83cc019SAndroid Build Coastguard Worker
1441*d83cc019SAndroid Build Coastguard Worker ret = drmGetCap(fd, DRM_CAP_ADDFB2_MODIFIERS, &cap_modifiers);
1442*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0 || errno == EINVAL || errno == EOPNOTSUPP);
1443*d83cc019SAndroid Build Coastguard Worker has_modifiers = ret == 0 && cap_modifiers == 1;
1444*d83cc019SAndroid Build Coastguard Worker cap_modifiers_tested = true;
1445*d83cc019SAndroid Build Coastguard Worker }
1446*d83cc019SAndroid Build Coastguard Worker
1447*d83cc019SAndroid Build Coastguard Worker return has_modifiers;
1448*d83cc019SAndroid Build Coastguard Worker }
1449*d83cc019SAndroid Build Coastguard Worker
1450*d83cc019SAndroid Build Coastguard Worker /**
1451*d83cc019SAndroid Build Coastguard Worker * igt_require_fb_modifiers:
1452*d83cc019SAndroid Build Coastguard Worker * @fd: Open DRM file descriptor.
1453*d83cc019SAndroid Build Coastguard Worker *
1454*d83cc019SAndroid Build Coastguard Worker * Requires presence of DRM_CAP_ADDFB2_MODIFIERS.
1455*d83cc019SAndroid Build Coastguard Worker */
igt_require_fb_modifiers(int fd)1456*d83cc019SAndroid Build Coastguard Worker void igt_require_fb_modifiers(int fd)
1457*d83cc019SAndroid Build Coastguard Worker {
1458*d83cc019SAndroid Build Coastguard Worker igt_require(igt_has_fb_modifiers(fd));
1459*d83cc019SAndroid Build Coastguard Worker }
1460*d83cc019SAndroid Build Coastguard Worker
__kms_addfb(int fd,uint32_t handle,uint32_t width,uint32_t height,uint32_t pixel_format,uint64_t modifier,uint32_t strides[4],uint32_t offsets[4],int num_planes,uint32_t flags,uint32_t * buf_id)1461*d83cc019SAndroid Build Coastguard Worker int __kms_addfb(int fd, uint32_t handle,
1462*d83cc019SAndroid Build Coastguard Worker uint32_t width, uint32_t height,
1463*d83cc019SAndroid Build Coastguard Worker uint32_t pixel_format, uint64_t modifier,
1464*d83cc019SAndroid Build Coastguard Worker uint32_t strides[4], uint32_t offsets[4],
1465*d83cc019SAndroid Build Coastguard Worker int num_planes, uint32_t flags, uint32_t *buf_id)
1466*d83cc019SAndroid Build Coastguard Worker {
1467*d83cc019SAndroid Build Coastguard Worker struct drm_mode_fb_cmd2 f;
1468*d83cc019SAndroid Build Coastguard Worker int ret, i;
1469*d83cc019SAndroid Build Coastguard Worker
1470*d83cc019SAndroid Build Coastguard Worker if (flags & DRM_MODE_FB_MODIFIERS)
1471*d83cc019SAndroid Build Coastguard Worker igt_require_fb_modifiers(fd);
1472*d83cc019SAndroid Build Coastguard Worker
1473*d83cc019SAndroid Build Coastguard Worker memset(&f, 0, sizeof(f));
1474*d83cc019SAndroid Build Coastguard Worker
1475*d83cc019SAndroid Build Coastguard Worker f.width = width;
1476*d83cc019SAndroid Build Coastguard Worker f.height = height;
1477*d83cc019SAndroid Build Coastguard Worker f.pixel_format = pixel_format;
1478*d83cc019SAndroid Build Coastguard Worker f.flags = flags;
1479*d83cc019SAndroid Build Coastguard Worker
1480*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_planes; i++) {
1481*d83cc019SAndroid Build Coastguard Worker f.handles[i] = handle;
1482*d83cc019SAndroid Build Coastguard Worker f.modifier[i] = modifier;
1483*d83cc019SAndroid Build Coastguard Worker f.pitches[i] = strides[i];
1484*d83cc019SAndroid Build Coastguard Worker f.offsets[i] = offsets[i];
1485*d83cc019SAndroid Build Coastguard Worker }
1486*d83cc019SAndroid Build Coastguard Worker
1487*d83cc019SAndroid Build Coastguard Worker ret = igt_ioctl(fd, DRM_IOCTL_MODE_ADDFB2, &f);
1488*d83cc019SAndroid Build Coastguard Worker
1489*d83cc019SAndroid Build Coastguard Worker *buf_id = f.fb_id;
1490*d83cc019SAndroid Build Coastguard Worker
1491*d83cc019SAndroid Build Coastguard Worker return ret < 0 ? -errno : ret;
1492*d83cc019SAndroid Build Coastguard Worker }
1493