xref: /aosp_15_r20/external/igt-gpu-tools/lib/igt_dummyload.h (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2016 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  */
24*d83cc019SAndroid Build Coastguard Worker 
25*d83cc019SAndroid Build Coastguard Worker #ifndef __IGT_DUMMYLOAD_H__
26*d83cc019SAndroid Build Coastguard Worker #define __IGT_DUMMYLOAD_H__
27*d83cc019SAndroid Build Coastguard Worker 
28*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
29*d83cc019SAndroid Build Coastguard Worker #include <time.h>
30*d83cc019SAndroid Build Coastguard Worker 
31*d83cc019SAndroid Build Coastguard Worker #include "igt_core.h"
32*d83cc019SAndroid Build Coastguard Worker #include "igt_list.h"
33*d83cc019SAndroid Build Coastguard Worker #include "i915_drm.h"
34*d83cc019SAndroid Build Coastguard Worker 
35*d83cc019SAndroid Build Coastguard Worker typedef struct igt_spin {
36*d83cc019SAndroid Build Coastguard Worker 	unsigned int handle;
37*d83cc019SAndroid Build Coastguard Worker 	timer_t timer;
38*d83cc019SAndroid Build Coastguard Worker 	struct igt_list link;
39*d83cc019SAndroid Build Coastguard Worker 
40*d83cc019SAndroid Build Coastguard Worker 	uint32_t *condition;
41*d83cc019SAndroid Build Coastguard Worker 	uint32_t cmd_precondition;
42*d83cc019SAndroid Build Coastguard Worker 
43*d83cc019SAndroid Build Coastguard Worker 	int out_fence;
44*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_exec_object2 obj[2];
45*d83cc019SAndroid Build Coastguard Worker #define IGT_SPIN_BATCH   1
46*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_execbuffer2 execbuf;
47*d83cc019SAndroid Build Coastguard Worker 	uint32_t poll_handle;
48*d83cc019SAndroid Build Coastguard Worker 	uint32_t *poll;
49*d83cc019SAndroid Build Coastguard Worker #define SPIN_POLL_START_IDX 0
50*d83cc019SAndroid Build Coastguard Worker } igt_spin_t;
51*d83cc019SAndroid Build Coastguard Worker 
52*d83cc019SAndroid Build Coastguard Worker struct igt_spin_factory {
53*d83cc019SAndroid Build Coastguard Worker 	uint32_t ctx;
54*d83cc019SAndroid Build Coastguard Worker 	uint32_t dependency;
55*d83cc019SAndroid Build Coastguard Worker 	unsigned int engine;
56*d83cc019SAndroid Build Coastguard Worker 	unsigned int flags;
57*d83cc019SAndroid Build Coastguard Worker };
58*d83cc019SAndroid Build Coastguard Worker 
59*d83cc019SAndroid Build Coastguard Worker #define IGT_SPIN_FENCE_OUT     (1 << 0)
60*d83cc019SAndroid Build Coastguard Worker #define IGT_SPIN_POLL_RUN      (1 << 1)
61*d83cc019SAndroid Build Coastguard Worker #define IGT_SPIN_FAST          (1 << 2)
62*d83cc019SAndroid Build Coastguard Worker #define IGT_SPIN_NO_PREEMPTION (1 << 3)
63*d83cc019SAndroid Build Coastguard Worker 
64*d83cc019SAndroid Build Coastguard Worker igt_spin_t *
65*d83cc019SAndroid Build Coastguard Worker __igt_spin_factory(int fd, const struct igt_spin_factory *opts);
66*d83cc019SAndroid Build Coastguard Worker igt_spin_t *
67*d83cc019SAndroid Build Coastguard Worker igt_spin_factory(int fd, const struct igt_spin_factory *opts);
68*d83cc019SAndroid Build Coastguard Worker 
69*d83cc019SAndroid Build Coastguard Worker #define __igt_spin_new(fd, ...) \
70*d83cc019SAndroid Build Coastguard Worker 	__igt_spin_factory(fd, &((struct igt_spin_factory){__VA_ARGS__}))
71*d83cc019SAndroid Build Coastguard Worker #define igt_spin_new(fd, ...) \
72*d83cc019SAndroid Build Coastguard Worker 	igt_spin_factory(fd, &((struct igt_spin_factory){__VA_ARGS__}))
73*d83cc019SAndroid Build Coastguard Worker 
74*d83cc019SAndroid Build Coastguard Worker void igt_spin_set_timeout(igt_spin_t *spin, int64_t ns);
75*d83cc019SAndroid Build Coastguard Worker void igt_spin_reset(igt_spin_t *spin);
76*d83cc019SAndroid Build Coastguard Worker void igt_spin_end(igt_spin_t *spin);
77*d83cc019SAndroid Build Coastguard Worker void igt_spin_free(int fd, igt_spin_t *spin);
78*d83cc019SAndroid Build Coastguard Worker 
igt_spin_has_poll(const igt_spin_t * spin)79*d83cc019SAndroid Build Coastguard Worker static inline bool igt_spin_has_poll(const igt_spin_t *spin)
80*d83cc019SAndroid Build Coastguard Worker {
81*d83cc019SAndroid Build Coastguard Worker 	return spin->poll;
82*d83cc019SAndroid Build Coastguard Worker }
83*d83cc019SAndroid Build Coastguard Worker 
igt_spin_has_started(igt_spin_t * spin)84*d83cc019SAndroid Build Coastguard Worker static inline bool igt_spin_has_started(igt_spin_t *spin)
85*d83cc019SAndroid Build Coastguard Worker {
86*d83cc019SAndroid Build Coastguard Worker 	return READ_ONCE(spin->poll[SPIN_POLL_START_IDX]);
87*d83cc019SAndroid Build Coastguard Worker }
88*d83cc019SAndroid Build Coastguard Worker 
igt_spin_busywait_until_started(igt_spin_t * spin)89*d83cc019SAndroid Build Coastguard Worker static inline void igt_spin_busywait_until_started(igt_spin_t *spin)
90*d83cc019SAndroid Build Coastguard Worker {
91*d83cc019SAndroid Build Coastguard Worker 	while (!igt_spin_has_started(spin))
92*d83cc019SAndroid Build Coastguard Worker 		;
93*d83cc019SAndroid Build Coastguard Worker }
94*d83cc019SAndroid Build Coastguard Worker 
95*d83cc019SAndroid Build Coastguard Worker void igt_terminate_spins(void);
96*d83cc019SAndroid Build Coastguard Worker void igt_unshare_spins(void);
97*d83cc019SAndroid Build Coastguard Worker 
98*d83cc019SAndroid Build Coastguard Worker enum igt_cork_type {
99*d83cc019SAndroid Build Coastguard Worker 	CORK_SYNC_FD = 1,
100*d83cc019SAndroid Build Coastguard Worker 	CORK_VGEM_HANDLE
101*d83cc019SAndroid Build Coastguard Worker };
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker struct igt_cork_vgem {
104*d83cc019SAndroid Build Coastguard Worker 	int device;
105*d83cc019SAndroid Build Coastguard Worker 	uint32_t fence;
106*d83cc019SAndroid Build Coastguard Worker };
107*d83cc019SAndroid Build Coastguard Worker 
108*d83cc019SAndroid Build Coastguard Worker struct igt_cork_sw_sync {
109*d83cc019SAndroid Build Coastguard Worker 	int timeline;
110*d83cc019SAndroid Build Coastguard Worker };
111*d83cc019SAndroid Build Coastguard Worker 
112*d83cc019SAndroid Build Coastguard Worker struct igt_cork {
113*d83cc019SAndroid Build Coastguard Worker 	enum igt_cork_type type;
114*d83cc019SAndroid Build Coastguard Worker 
115*d83cc019SAndroid Build Coastguard Worker 	union {
116*d83cc019SAndroid Build Coastguard Worker 		int fd;
117*d83cc019SAndroid Build Coastguard Worker 
118*d83cc019SAndroid Build Coastguard Worker 		struct igt_cork_vgem vgem;
119*d83cc019SAndroid Build Coastguard Worker 		struct igt_cork_sw_sync sw_sync;
120*d83cc019SAndroid Build Coastguard Worker 	};
121*d83cc019SAndroid Build Coastguard Worker };
122*d83cc019SAndroid Build Coastguard Worker 
123*d83cc019SAndroid Build Coastguard Worker #define IGT_CORK(name, cork_type) struct igt_cork name = { .type = cork_type, .fd = -1}
124*d83cc019SAndroid Build Coastguard Worker #define IGT_CORK_HANDLE(name) IGT_CORK(name, CORK_VGEM_HANDLE)
125*d83cc019SAndroid Build Coastguard Worker #define IGT_CORK_FENCE(name) IGT_CORK(name, CORK_SYNC_FD)
126*d83cc019SAndroid Build Coastguard Worker 
127*d83cc019SAndroid Build Coastguard Worker uint32_t igt_cork_plug(struct igt_cork *cork, int fd);
128*d83cc019SAndroid Build Coastguard Worker void igt_cork_unplug(struct igt_cork *cork);
129*d83cc019SAndroid Build Coastguard Worker 
130*d83cc019SAndroid Build Coastguard Worker #endif /* __IGT_DUMMYLOAD_H__ */
131