1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2020 Intel Corporation
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
12*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
13*61046927SAndroid Build Coastguard Worker *
14*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20*61046927SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE.
21*61046927SAndroid Build Coastguard Worker */
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Worker #include "intel_gem.h"
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker #include "i915/intel_engine.h"
26*61046927SAndroid Build Coastguard Worker #include "i915/intel_gem.h"
27*61046927SAndroid Build Coastguard Worker #include "xe/intel_gem.h"
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker #include "util/os_time.h"
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker bool
intel_gem_supports_syncobj_wait(int fd)32*61046927SAndroid Build Coastguard Worker intel_gem_supports_syncobj_wait(int fd)
33*61046927SAndroid Build Coastguard Worker {
34*61046927SAndroid Build Coastguard Worker int ret;
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker struct drm_syncobj_create create = {
37*61046927SAndroid Build Coastguard Worker .flags = 0,
38*61046927SAndroid Build Coastguard Worker };
39*61046927SAndroid Build Coastguard Worker ret = intel_ioctl(fd, DRM_IOCTL_SYNCOBJ_CREATE, &create);
40*61046927SAndroid Build Coastguard Worker if (ret)
41*61046927SAndroid Build Coastguard Worker return false;
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker uint32_t syncobj = create.handle;
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker struct drm_syncobj_wait wait = {
46*61046927SAndroid Build Coastguard Worker .handles = (uint64_t)(uintptr_t)&create,
47*61046927SAndroid Build Coastguard Worker .count_handles = 1,
48*61046927SAndroid Build Coastguard Worker .timeout_nsec = 0,
49*61046927SAndroid Build Coastguard Worker .flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT,
50*61046927SAndroid Build Coastguard Worker };
51*61046927SAndroid Build Coastguard Worker ret = intel_ioctl(fd, DRM_IOCTL_SYNCOBJ_WAIT, &wait);
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker struct drm_syncobj_destroy destroy = {
54*61046927SAndroid Build Coastguard Worker .handle = syncobj,
55*61046927SAndroid Build Coastguard Worker };
56*61046927SAndroid Build Coastguard Worker intel_ioctl(fd, DRM_IOCTL_SYNCOBJ_DESTROY, &destroy);
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker /* If it timed out, then we have the ioctl and it supports the
59*61046927SAndroid Build Coastguard Worker * DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT flag.
60*61046927SAndroid Build Coastguard Worker */
61*61046927SAndroid Build Coastguard Worker return ret == -1 && errno == ETIME;
62*61046927SAndroid Build Coastguard Worker }
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker bool
intel_gem_create_context(int fd,uint32_t * context_id)65*61046927SAndroid Build Coastguard Worker intel_gem_create_context(int fd, uint32_t *context_id)
66*61046927SAndroid Build Coastguard Worker {
67*61046927SAndroid Build Coastguard Worker return i915_gem_create_context(fd, context_id);
68*61046927SAndroid Build Coastguard Worker }
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker bool
intel_gem_destroy_context(int fd,uint32_t context_id)71*61046927SAndroid Build Coastguard Worker intel_gem_destroy_context(int fd, uint32_t context_id)
72*61046927SAndroid Build Coastguard Worker {
73*61046927SAndroid Build Coastguard Worker return i915_gem_destroy_context(fd, context_id);
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker bool
intel_gem_create_context_engines(int fd,enum intel_gem_create_context_flags flags,const struct intel_query_engine_info * info,int num_engines,enum intel_engine_class * engine_classes,uint32_t vm_id,uint32_t * context_id)77*61046927SAndroid Build Coastguard Worker intel_gem_create_context_engines(int fd,
78*61046927SAndroid Build Coastguard Worker enum intel_gem_create_context_flags flags,
79*61046927SAndroid Build Coastguard Worker const struct intel_query_engine_info *info,
80*61046927SAndroid Build Coastguard Worker int num_engines, enum intel_engine_class *engine_classes,
81*61046927SAndroid Build Coastguard Worker uint32_t vm_id,
82*61046927SAndroid Build Coastguard Worker uint32_t *context_id)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker return i915_gem_create_context_engines(fd, flags, info, num_engines,
85*61046927SAndroid Build Coastguard Worker engine_classes, vm_id, context_id);
86*61046927SAndroid Build Coastguard Worker }
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker bool
intel_gem_set_context_param(int fd,uint32_t context,uint32_t param,uint64_t value)89*61046927SAndroid Build Coastguard Worker intel_gem_set_context_param(int fd, uint32_t context, uint32_t param,
90*61046927SAndroid Build Coastguard Worker uint64_t value)
91*61046927SAndroid Build Coastguard Worker {
92*61046927SAndroid Build Coastguard Worker return i915_gem_set_context_param(fd, context, param, value);
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker bool
intel_gem_get_context_param(int fd,uint32_t context,uint32_t param,uint64_t * value)96*61046927SAndroid Build Coastguard Worker intel_gem_get_context_param(int fd, uint32_t context, uint32_t param,
97*61046927SAndroid Build Coastguard Worker uint64_t *value)
98*61046927SAndroid Build Coastguard Worker {
99*61046927SAndroid Build Coastguard Worker return i915_gem_get_context_param(fd, context, param, value);
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker bool
intel_gem_read_render_timestamp(int fd,enum intel_kmd_type kmd_type,uint64_t * value)103*61046927SAndroid Build Coastguard Worker intel_gem_read_render_timestamp(int fd,
104*61046927SAndroid Build Coastguard Worker enum intel_kmd_type kmd_type,
105*61046927SAndroid Build Coastguard Worker uint64_t *value)
106*61046927SAndroid Build Coastguard Worker {
107*61046927SAndroid Build Coastguard Worker switch (kmd_type) {
108*61046927SAndroid Build Coastguard Worker case INTEL_KMD_TYPE_I915:
109*61046927SAndroid Build Coastguard Worker return i915_gem_read_render_timestamp(fd, value);
110*61046927SAndroid Build Coastguard Worker case INTEL_KMD_TYPE_XE:
111*61046927SAndroid Build Coastguard Worker return xe_gem_read_render_timestamp(fd, value);
112*61046927SAndroid Build Coastguard Worker default:
113*61046927SAndroid Build Coastguard Worker unreachable("Missing");
114*61046927SAndroid Build Coastguard Worker return false;
115*61046927SAndroid Build Coastguard Worker }
116*61046927SAndroid Build Coastguard Worker }
117*61046927SAndroid Build Coastguard Worker
118*61046927SAndroid Build Coastguard Worker bool
intel_gem_read_correlate_cpu_gpu_timestamp(int fd,enum intel_kmd_type kmd_type,enum intel_engine_class engine_class,uint16_t engine_instance,clockid_t cpu_clock_id,uint64_t * cpu_timestamp,uint64_t * gpu_timestamp,uint64_t * cpu_delta)119*61046927SAndroid Build Coastguard Worker intel_gem_read_correlate_cpu_gpu_timestamp(int fd,
120*61046927SAndroid Build Coastguard Worker enum intel_kmd_type kmd_type,
121*61046927SAndroid Build Coastguard Worker enum intel_engine_class engine_class,
122*61046927SAndroid Build Coastguard Worker uint16_t engine_instance,
123*61046927SAndroid Build Coastguard Worker clockid_t cpu_clock_id,
124*61046927SAndroid Build Coastguard Worker uint64_t *cpu_timestamp,
125*61046927SAndroid Build Coastguard Worker uint64_t *gpu_timestamp,
126*61046927SAndroid Build Coastguard Worker uint64_t *cpu_delta)
127*61046927SAndroid Build Coastguard Worker {
128*61046927SAndroid Build Coastguard Worker switch (kmd_type) {
129*61046927SAndroid Build Coastguard Worker case INTEL_KMD_TYPE_I915:
130*61046927SAndroid Build Coastguard Worker return false;
131*61046927SAndroid Build Coastguard Worker case INTEL_KMD_TYPE_XE:
132*61046927SAndroid Build Coastguard Worker return xe_gem_read_correlate_cpu_gpu_timestamp(fd, engine_class,
133*61046927SAndroid Build Coastguard Worker engine_instance,
134*61046927SAndroid Build Coastguard Worker cpu_clock_id,
135*61046927SAndroid Build Coastguard Worker cpu_timestamp,
136*61046927SAndroid Build Coastguard Worker gpu_timestamp,
137*61046927SAndroid Build Coastguard Worker cpu_delta);
138*61046927SAndroid Build Coastguard Worker default:
139*61046927SAndroid Build Coastguard Worker unreachable("Missing");
140*61046927SAndroid Build Coastguard Worker return false;
141*61046927SAndroid Build Coastguard Worker }
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker bool
intel_gem_create_context_ext(int fd,enum intel_gem_create_context_flags flags,uint32_t * ctx_id)145*61046927SAndroid Build Coastguard Worker intel_gem_create_context_ext(int fd, enum intel_gem_create_context_flags flags,
146*61046927SAndroid Build Coastguard Worker uint32_t *ctx_id)
147*61046927SAndroid Build Coastguard Worker {
148*61046927SAndroid Build Coastguard Worker return i915_gem_create_context_ext(fd, flags, ctx_id);
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker
151*61046927SAndroid Build Coastguard Worker bool
intel_gem_supports_protected_context(int fd,enum intel_kmd_type kmd_type)152*61046927SAndroid Build Coastguard Worker intel_gem_supports_protected_context(int fd, enum intel_kmd_type kmd_type)
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker switch (kmd_type) {
155*61046927SAndroid Build Coastguard Worker case INTEL_KMD_TYPE_I915:
156*61046927SAndroid Build Coastguard Worker return i915_gem_supports_protected_context(fd);
157*61046927SAndroid Build Coastguard Worker case INTEL_KMD_TYPE_XE:
158*61046927SAndroid Build Coastguard Worker /* TODO: so far Xe don't have support for protected contexts/engines */
159*61046927SAndroid Build Coastguard Worker return false;
160*61046927SAndroid Build Coastguard Worker default:
161*61046927SAndroid Build Coastguard Worker unreachable("Missing");
162*61046927SAndroid Build Coastguard Worker return false;
163*61046927SAndroid Build Coastguard Worker }
164*61046927SAndroid Build Coastguard Worker }
165*61046927SAndroid Build Coastguard Worker
166*61046927SAndroid Build Coastguard Worker bool
intel_gem_wait_on_get_param(int fd,uint32_t param,int target_val,uint32_t timeout_ms)167*61046927SAndroid Build Coastguard Worker intel_gem_wait_on_get_param(int fd, uint32_t param, int target_val,
168*61046927SAndroid Build Coastguard Worker uint32_t timeout_ms)
169*61046927SAndroid Build Coastguard Worker {
170*61046927SAndroid Build Coastguard Worker int64_t start_time = os_time_get();
171*61046927SAndroid Build Coastguard Worker int64_t end_time = start_time + (timeout_ms * 1000);
172*61046927SAndroid Build Coastguard Worker int val = -1;
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker errno = 0;
175*61046927SAndroid Build Coastguard Worker do {
176*61046927SAndroid Build Coastguard Worker if (!intel_gem_get_param(fd, param, &val))
177*61046927SAndroid Build Coastguard Worker break;
178*61046927SAndroid Build Coastguard Worker } while (val != target_val && !os_time_timeout(start_time, end_time, os_time_get()));
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker if (errno || val != target_val)
181*61046927SAndroid Build Coastguard Worker return false;
182*61046927SAndroid Build Coastguard Worker
183*61046927SAndroid Build Coastguard Worker return true;
184*61046927SAndroid Build Coastguard Worker }
185*61046927SAndroid Build Coastguard Worker
186*61046927SAndroid Build Coastguard Worker bool
intel_gem_get_param(int fd,uint32_t param,int * value)187*61046927SAndroid Build Coastguard Worker intel_gem_get_param(int fd, uint32_t param, int *value)
188*61046927SAndroid Build Coastguard Worker {
189*61046927SAndroid Build Coastguard Worker return i915_gem_get_param(fd, param, value);
190*61046927SAndroid Build Coastguard Worker }
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Worker bool
intel_gem_can_render_on_fd(int fd,enum intel_kmd_type kmd_type)193*61046927SAndroid Build Coastguard Worker intel_gem_can_render_on_fd(int fd, enum intel_kmd_type kmd_type)
194*61046927SAndroid Build Coastguard Worker {
195*61046927SAndroid Build Coastguard Worker switch (kmd_type) {
196*61046927SAndroid Build Coastguard Worker case INTEL_KMD_TYPE_I915:
197*61046927SAndroid Build Coastguard Worker return i915_gem_can_render_on_fd(fd);
198*61046927SAndroid Build Coastguard Worker case INTEL_KMD_TYPE_XE:
199*61046927SAndroid Build Coastguard Worker return xe_gem_can_render_on_fd(fd);
200*61046927SAndroid Build Coastguard Worker default:
201*61046927SAndroid Build Coastguard Worker unreachable("Missing");
202*61046927SAndroid Build Coastguard Worker return false;
203*61046927SAndroid Build Coastguard Worker }
204*61046927SAndroid Build Coastguard Worker }
205