blob: 597182ca2b9fae92b4880a026a818553613b6c69 [file] [log] [blame]
Chia-I Wu6464ff22014-08-05 11:59:54 +08001/*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 2012-2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
26 */
27
28#include <string.h>
Courtney Goeltzenleuchter8d651042014-09-25 18:15:33 -060029#include <stdlib.h>
Chia-I Wu770b3092014-08-05 14:22:03 +080030#include <limits.h>
Chia-I Wu6464ff22014-08-05 11:59:54 +080031#include <errno.h>
32#ifndef ETIME
33#define ETIME ETIMEDOUT
34#endif
Chia-I Wu770b3092014-08-05 14:22:03 +080035#include <assert.h>
Chia-I Wu6464ff22014-08-05 11:59:54 +080036
37#include <xf86drm.h>
38#include <i915_drm.h>
39#include <intel_bufmgr.h>
40
Chia-I Wu900364b2015-01-03 13:55:22 +080041#include "icd-alloc.h"
Chia-I Wu08cd6e92015-02-11 13:44:50 -070042#include "icd-utils.h"
Chia-I Wu770b3092014-08-05 14:22:03 +080043#include "winsys.h"
Chia-I Wu6464ff22014-08-05 11:59:54 +080044
Chia-I Wu6464ff22014-08-05 11:59:54 +080045struct intel_winsys {
46 int fd;
47 drm_intel_bufmgr *bufmgr;
48 struct intel_winsys_info info;
49
Chia-I Wu770b3092014-08-05 14:22:03 +080050 drm_intel_context *ctx;
Chia-I Wu6464ff22014-08-05 11:59:54 +080051};
52
53static drm_intel_bo *
54gem_bo(const struct intel_bo *bo)
55{
56 return (drm_intel_bo *) bo;
57}
58
59static bool
60get_param(struct intel_winsys *winsys, int param, int *value)
61{
62 struct drm_i915_getparam gp;
63 int err;
64
65 *value = 0;
66
67 memset(&gp, 0, sizeof(gp));
68 gp.param = param;
69 gp.value = value;
70
71 err = drmCommandWriteRead(winsys->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
72 if (err) {
73 *value = 0;
74 return false;
75 }
76
77 return true;
78}
79
80static bool
81test_address_swizzling(struct intel_winsys *winsys)
82{
83 drm_intel_bo *bo;
84 uint32_t tiling = I915_TILING_X, swizzle;
85 unsigned long pitch;
86
87 bo = drm_intel_bo_alloc_tiled(winsys->bufmgr,
88 "address swizzling test", 64, 64, 4, &tiling, &pitch, 0);
89 if (bo) {
90 drm_intel_bo_get_tiling(bo, &tiling, &swizzle);
91 drm_intel_bo_unreference(bo);
92 }
93 else {
94 swizzle = I915_BIT_6_SWIZZLE_NONE;
95 }
96
97 return (swizzle != I915_BIT_6_SWIZZLE_NONE);
98}
99
100static bool
101test_reg_read(struct intel_winsys *winsys, uint32_t reg)
102{
103 uint64_t dummy;
104
105 return !drm_intel_reg_read(winsys->bufmgr, reg, &dummy);
106}
107
108static bool
109probe_winsys(struct intel_winsys *winsys)
110{
111 struct intel_winsys_info *info = &winsys->info;
112 int val;
113
114 /*
115 * When we need the Nth vertex from a user vertex buffer, and the vertex is
116 * uploaded to, say, the beginning of a bo, we want the first vertex in the
117 * bo to be fetched. One way to do this is to set the base address of the
118 * vertex buffer to
119 *
120 * bo->offset64 + (vb->buffer_offset - vb->stride * N).
121 *
122 * The second term may be negative, and we need kernel support to do that.
123 *
124 * This check is taken from the classic driver. u_vbuf_upload_buffers()
125 * guarantees the term is never negative, but it is good to require a
126 * recent kernel.
127 */
128 get_param(winsys, I915_PARAM_HAS_RELAXED_DELTA, &val);
129 if (!val) {
Chia-I Wu6464ff22014-08-05 11:59:54 +0800130 return false;
131 }
132
133 info->devid = drm_intel_bufmgr_gem_get_devid(winsys->bufmgr);
134
Chia-I Wubbedc592015-02-11 11:10:14 -0700135 if (drm_intel_get_aperture_sizes(winsys->fd,
136 &info->aperture_mappable, &info->aperture_total)) {
137 return false;
138 }
139
Chia-I Wu6464ff22014-08-05 11:59:54 +0800140 get_param(winsys, I915_PARAM_HAS_LLC, &val);
141 info->has_llc = val;
142 info->has_address_swizzling = test_address_swizzling(winsys);
143
Chia-I Wu770b3092014-08-05 14:22:03 +0800144 winsys->ctx = drm_intel_gem_context_create(winsys->bufmgr);
145 if (!winsys->ctx)
146 return false;
147
148 info->has_logical_context = (winsys->ctx != NULL);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800149
150 get_param(winsys, I915_PARAM_HAS_ALIASING_PPGTT, &val);
151 info->has_ppgtt = val;
152
153 /* test TIMESTAMP read */
154 info->has_timestamp = test_reg_read(winsys, 0x2358);
155
156 get_param(winsys, I915_PARAM_HAS_GEN7_SOL_RESET, &val);
157 info->has_gen7_sol_reset = val;
158
159 return true;
160}
161
162struct intel_winsys *
163intel_winsys_create_for_fd(int fd)
164{
Mike Stroyan9fca7122015-02-09 13:08:26 -0700165 /* so that we can have enough relocs per bo */
166 const int batch_size = sizeof(uint32_t) * 150 * 1024;
Chia-I Wu6464ff22014-08-05 11:59:54 +0800167 struct intel_winsys *winsys;
168
Chia-I Wu770b3092014-08-05 14:22:03 +0800169 winsys = icd_alloc(sizeof(*winsys), 0, XGL_SYSTEM_ALLOC_INTERNAL);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800170 if (!winsys)
171 return NULL;
172
Chia-I Wu770b3092014-08-05 14:22:03 +0800173 memset(winsys, 0, sizeof(*winsys));
174
Chia-I Wu6464ff22014-08-05 11:59:54 +0800175 winsys->fd = fd;
176
Chia-I Wu32a22462014-08-26 14:13:46 +0800177 winsys->bufmgr = drm_intel_bufmgr_gem_init(winsys->fd, batch_size);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800178 if (!winsys->bufmgr) {
Chia-I Wu770b3092014-08-05 14:22:03 +0800179 icd_free(winsys);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800180 return NULL;
181 }
182
Chia-I Wu6464ff22014-08-05 11:59:54 +0800183 if (!probe_winsys(winsys)) {
Chia-I Wu6464ff22014-08-05 11:59:54 +0800184 drm_intel_bufmgr_destroy(winsys->bufmgr);
Chia-I Wu770b3092014-08-05 14:22:03 +0800185 icd_free(winsys);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800186 return NULL;
187 }
188
189 /*
190 * No need to implicitly set up a fence register for each non-linear reloc
Chia-I Wu32a22462014-08-26 14:13:46 +0800191 * entry. INTEL_RELOC_FENCE will be set on reloc entries that need them.
Chia-I Wu6464ff22014-08-05 11:59:54 +0800192 */
193 drm_intel_bufmgr_gem_enable_fenced_relocs(winsys->bufmgr);
194
195 drm_intel_bufmgr_gem_enable_reuse(winsys->bufmgr);
Chia-I Wuf5359fa2014-12-02 00:23:55 +0800196 drm_intel_bufmgr_gem_set_vma_cache_size(winsys->bufmgr, 1024);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800197
198 return winsys;
199}
200
201void
202intel_winsys_destroy(struct intel_winsys *winsys)
203{
Chia-I Wu770b3092014-08-05 14:22:03 +0800204 drm_intel_gem_context_destroy(winsys->ctx);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800205 drm_intel_bufmgr_destroy(winsys->bufmgr);
Chia-I Wu770b3092014-08-05 14:22:03 +0800206 icd_free(winsys);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800207}
208
209const struct intel_winsys_info *
210intel_winsys_get_info(const struct intel_winsys *winsys)
211{
212 return &winsys->info;
213}
214
Chia-I Wu6464ff22014-08-05 11:59:54 +0800215int
216intel_winsys_read_reg(struct intel_winsys *winsys,
217 uint32_t reg, uint64_t *val)
218{
219 return drm_intel_reg_read(winsys->bufmgr, reg, val);
220}
221
222struct intel_bo *
223intel_winsys_alloc_bo(struct intel_winsys *winsys,
224 const char *name,
225 enum intel_tiling_mode tiling,
226 unsigned long pitch,
227 unsigned long height,
Chia-I Wu32a22462014-08-26 14:13:46 +0800228 bool cpu_init)
Chia-I Wu6464ff22014-08-05 11:59:54 +0800229{
Chia-I Wu6464ff22014-08-05 11:59:54 +0800230 const unsigned int alignment = 4096; /* always page-aligned */
231 unsigned long size;
232 drm_intel_bo *bo;
233
234 switch (tiling) {
235 case INTEL_TILING_X:
236 if (pitch % 512)
237 return NULL;
238 break;
239 case INTEL_TILING_Y:
240 if (pitch % 128)
241 return NULL;
242 break;
243 default:
244 break;
245 }
246
247 if (pitch > ULONG_MAX / height)
248 return NULL;
249
250 size = pitch * height;
251
Chia-I Wu32a22462014-08-26 14:13:46 +0800252 if (cpu_init) {
253 bo = drm_intel_bo_alloc(winsys->bufmgr, name, size, alignment);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800254 }
255 else {
Chia-I Wu32a22462014-08-26 14:13:46 +0800256 bo = drm_intel_bo_alloc_for_render(winsys->bufmgr,
257 name, size, alignment);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800258 }
259
260 if (bo && tiling != INTEL_TILING_NONE) {
261 uint32_t real_tiling = tiling;
262 int err;
263
264 err = drm_intel_bo_set_tiling(bo, &real_tiling, pitch);
265 if (err || real_tiling != tiling) {
266 assert(!"tiling mismatch");
267 drm_intel_bo_unreference(bo);
268 return NULL;
269 }
270 }
271
272 return (struct intel_bo *) bo;
273}
274
275struct intel_bo *
276intel_winsys_import_handle(struct intel_winsys *winsys,
277 const char *name,
Chia-I Wu770b3092014-08-05 14:22:03 +0800278 const struct intel_winsys_handle *handle,
Chia-I Wu6464ff22014-08-05 11:59:54 +0800279 unsigned long height,
280 enum intel_tiling_mode *tiling,
281 unsigned long *pitch)
282{
283 uint32_t real_tiling, swizzle;
284 drm_intel_bo *bo;
285 int err;
286
287 switch (handle->type) {
Chia-I Wu770b3092014-08-05 14:22:03 +0800288 case INTEL_WINSYS_HANDLE_SHARED:
Chia-I Wu6464ff22014-08-05 11:59:54 +0800289 {
290 const uint32_t gem_name = handle->handle;
291 bo = drm_intel_bo_gem_create_from_name(winsys->bufmgr,
292 name, gem_name);
293 }
294 break;
Chia-I Wu770b3092014-08-05 14:22:03 +0800295 case INTEL_WINSYS_HANDLE_FD:
Chia-I Wu6464ff22014-08-05 11:59:54 +0800296 {
297 const int fd = (int) handle->handle;
298 bo = drm_intel_bo_gem_create_from_prime(winsys->bufmgr,
299 fd, height * handle->stride);
300 }
301 break;
302 default:
303 bo = NULL;
304 break;
305 }
306
307 if (!bo)
308 return NULL;
309
310 err = drm_intel_bo_get_tiling(bo, &real_tiling, &swizzle);
311 if (err) {
312 drm_intel_bo_unreference(bo);
313 return NULL;
314 }
315
316 *tiling = real_tiling;
317 *pitch = handle->stride;
318
319 return (struct intel_bo *) bo;
320}
321
322int
323intel_winsys_export_handle(struct intel_winsys *winsys,
324 struct intel_bo *bo,
325 enum intel_tiling_mode tiling,
326 unsigned long pitch,
327 unsigned long height,
Chia-I Wu770b3092014-08-05 14:22:03 +0800328 struct intel_winsys_handle *handle)
Chia-I Wu6464ff22014-08-05 11:59:54 +0800329{
330 int err = 0;
331
332 switch (handle->type) {
Chia-I Wu770b3092014-08-05 14:22:03 +0800333 case INTEL_WINSYS_HANDLE_SHARED:
Chia-I Wu6464ff22014-08-05 11:59:54 +0800334 {
335 uint32_t name;
336
337 err = drm_intel_bo_flink(gem_bo(bo), &name);
338 if (!err)
339 handle->handle = name;
340 }
341 break;
Chia-I Wu770b3092014-08-05 14:22:03 +0800342 case INTEL_WINSYS_HANDLE_KMS:
Chia-I Wu6464ff22014-08-05 11:59:54 +0800343 handle->handle = gem_bo(bo)->handle;
344 break;
Chia-I Wu770b3092014-08-05 14:22:03 +0800345 case INTEL_WINSYS_HANDLE_FD:
Chia-I Wu6464ff22014-08-05 11:59:54 +0800346 {
Chia-I Wuaaebcc52014-09-18 16:11:36 +0800347 uint32_t real_tiling = tiling;
Chia-I Wu6464ff22014-08-05 11:59:54 +0800348 int fd;
349
Chia-I Wuaaebcc52014-09-18 16:11:36 +0800350 err = drm_intel_bo_set_tiling(gem_bo(bo), &real_tiling, pitch);
351 if (!err)
352 err = drm_intel_bo_gem_export_to_prime(gem_bo(bo), &fd);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800353 if (!err)
354 handle->handle = fd;
355 }
356 break;
357 default:
358 err = -EINVAL;
359 break;
360 }
361
362 if (err)
363 return err;
364
365 handle->stride = pitch;
366
367 return 0;
368}
369
370bool
371intel_winsys_can_submit_bo(struct intel_winsys *winsys,
372 struct intel_bo **bo_array,
373 int count)
374{
375 return !drm_intel_bufmgr_check_aperture_space((drm_intel_bo **) bo_array,
376 count);
377}
378
379int
380intel_winsys_submit_bo(struct intel_winsys *winsys,
381 enum intel_ring_type ring,
382 struct intel_bo *bo, int used,
Chia-I Wu6464ff22014-08-05 11:59:54 +0800383 unsigned long flags)
384{
385 const unsigned long exec_flags = (unsigned long) ring | flags;
Chia-I Wu770b3092014-08-05 14:22:03 +0800386 drm_intel_context *ctx;
Chia-I Wu6464ff22014-08-05 11:59:54 +0800387
388 /* logical contexts are only available for the render ring */
Chia-I Wu770b3092014-08-05 14:22:03 +0800389 ctx = (ring == INTEL_RING_RENDER) ? winsys->ctx : NULL;
Chia-I Wu6464ff22014-08-05 11:59:54 +0800390
391 if (ctx) {
392 return drm_intel_gem_bo_context_exec(gem_bo(bo),
Chia-I Wu770b3092014-08-05 14:22:03 +0800393 ctx, used, exec_flags);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800394 }
395 else {
396 return drm_intel_bo_mrb_exec(gem_bo(bo),
397 used, NULL, 0, 0, exec_flags);
398 }
399}
400
401void
402intel_winsys_decode_bo(struct intel_winsys *winsys,
403 struct intel_bo *bo, int used)
404{
Chia-I Wu770b3092014-08-05 14:22:03 +0800405 struct drm_intel_decode *decode;
Chia-I Wu6464ff22014-08-05 11:59:54 +0800406 void *ptr;
407
408 ptr = intel_bo_map(bo, false);
409 if (!ptr) {
Chia-I Wu6464ff22014-08-05 11:59:54 +0800410 return;
411 }
412
Chia-I Wu770b3092014-08-05 14:22:03 +0800413 decode = drm_intel_decode_context_alloc(winsys->info.devid);
414 if (!decode) {
415 intel_bo_unmap(bo);
416 return;
Chia-I Wu6464ff22014-08-05 11:59:54 +0800417 }
418
Chia-I Wu770b3092014-08-05 14:22:03 +0800419 drm_intel_decode_set_output_file(decode, stderr);
420
Chia-I Wu6464ff22014-08-05 11:59:54 +0800421 /* in dwords */
422 used /= 4;
423
Chia-I Wu770b3092014-08-05 14:22:03 +0800424 drm_intel_decode_set_batch_pointer(decode,
Chia-I Wu6464ff22014-08-05 11:59:54 +0800425 ptr, gem_bo(bo)->offset64, used);
426
Chia-I Wu770b3092014-08-05 14:22:03 +0800427 drm_intel_decode(decode);
Courtney Goeltzenleuchter8d651042014-09-25 18:15:33 -0600428 free(decode);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800429 intel_bo_unmap(bo);
430}
431
Chia-I Wu242b35a2015-02-11 11:26:44 -0700432int
433intel_winsys_read_reset_stats(struct intel_winsys *winsys,
434 uint32_t *active, uint32_t *pending)
435{
436 return drm_intel_get_reset_stats(winsys->ctx, NULL, active, pending);
437}
438
Chia-I Wu6464ff22014-08-05 11:59:54 +0800439void
440intel_bo_reference(struct intel_bo *bo)
441{
442 drm_intel_bo_reference(gem_bo(bo));
443}
444
445void
446intel_bo_unreference(struct intel_bo *bo)
447{
448 drm_intel_bo_unreference(gem_bo(bo));
449}
450
451void *
452intel_bo_map(struct intel_bo *bo, bool write_enable)
453{
454 int err;
455
456 err = drm_intel_bo_map(gem_bo(bo), write_enable);
457 if (err) {
Chia-I Wu6464ff22014-08-05 11:59:54 +0800458 return NULL;
459 }
460
461 return gem_bo(bo)->virtual;
462}
463
464void *
Chia-I Wu6702e972015-02-25 09:47:10 -0700465intel_bo_map_async(struct intel_bo *bo)
466{
467 int err;
468
469 err = drm_intel_gem_bo_map_unsynchronized_non_gtt(gem_bo(bo));
470 if (err) {
471 return NULL;
472 }
473
474 return gem_bo(bo)->virtual;
475}
476
477void *
Chia-I Wu6464ff22014-08-05 11:59:54 +0800478intel_bo_map_gtt(struct intel_bo *bo)
479{
480 int err;
481
482 err = drm_intel_gem_bo_map_gtt(gem_bo(bo));
483 if (err) {
Chia-I Wu6464ff22014-08-05 11:59:54 +0800484 return NULL;
485 }
486
487 return gem_bo(bo)->virtual;
488}
489
490void *
Chia-I Wu32a22462014-08-26 14:13:46 +0800491intel_bo_map_gtt_async(struct intel_bo *bo)
Chia-I Wu6464ff22014-08-05 11:59:54 +0800492{
493 int err;
494
495 err = drm_intel_gem_bo_map_unsynchronized(gem_bo(bo));
496 if (err) {
Chia-I Wu6464ff22014-08-05 11:59:54 +0800497 return NULL;
498 }
499
500 return gem_bo(bo)->virtual;
501}
502
503void
504intel_bo_unmap(struct intel_bo *bo)
505{
Chia-I Wu08cd6e92015-02-11 13:44:50 -0700506 int err U_ASSERT_ONLY;
Chia-I Wu6464ff22014-08-05 11:59:54 +0800507
508 err = drm_intel_bo_unmap(gem_bo(bo));
509 assert(!err);
510}
511
512int
513intel_bo_pwrite(struct intel_bo *bo, unsigned long offset,
514 unsigned long size, const void *data)
515{
516 return drm_intel_bo_subdata(gem_bo(bo), offset, size, data);
517}
518
519int
520intel_bo_pread(struct intel_bo *bo, unsigned long offset,
521 unsigned long size, void *data)
522{
523 return drm_intel_bo_get_subdata(gem_bo(bo), offset, size, data);
524}
525
526int
527intel_bo_add_reloc(struct intel_bo *bo, uint32_t offset,
528 struct intel_bo *target_bo, uint32_t target_offset,
Chia-I Wu32a22462014-08-26 14:13:46 +0800529 uint32_t flags, uint64_t *presumed_offset)
Chia-I Wu6464ff22014-08-05 11:59:54 +0800530{
Chia-I Wu32a22462014-08-26 14:13:46 +0800531 uint32_t read_domains, write_domain;
Chia-I Wu6464ff22014-08-05 11:59:54 +0800532 int err;
533
Chia-I Wu32a22462014-08-26 14:13:46 +0800534 if (flags & INTEL_RELOC_WRITE) {
535 /*
536 * Because of the translation to domains, INTEL_RELOC_GGTT should only
537 * be set on GEN6 when the bo is written by MI_* or PIPE_CONTROL. The
538 * kernel will translate it back to INTEL_RELOC_GGTT.
539 */
540 write_domain = (flags & INTEL_RELOC_GGTT) ?
541 I915_GEM_DOMAIN_INSTRUCTION : I915_GEM_DOMAIN_RENDER;
542 read_domains = write_domain;
543 } else {
544 write_domain = 0;
545 read_domains = I915_GEM_DOMAIN_RENDER |
546 I915_GEM_DOMAIN_SAMPLER |
547 I915_GEM_DOMAIN_INSTRUCTION |
548 I915_GEM_DOMAIN_VERTEX;
549 }
550
551 if (flags & INTEL_RELOC_FENCE) {
552 err = drm_intel_bo_emit_reloc_fence(gem_bo(bo), offset,
553 gem_bo(target_bo), target_offset,
554 read_domains, write_domain);
555 } else {
556 err = drm_intel_bo_emit_reloc(gem_bo(bo), offset,
557 gem_bo(target_bo), target_offset,
558 read_domains, write_domain);
559 }
Chia-I Wu6464ff22014-08-05 11:59:54 +0800560
561 *presumed_offset = gem_bo(target_bo)->offset64 + target_offset;
562
563 return err;
564}
565
566int
567intel_bo_get_reloc_count(struct intel_bo *bo)
568{
569 return drm_intel_gem_bo_get_reloc_count(gem_bo(bo));
570}
571
572void
573intel_bo_truncate_relocs(struct intel_bo *bo, int start)
574{
575 drm_intel_gem_bo_clear_relocs(gem_bo(bo), start);
576}
577
578bool
579intel_bo_has_reloc(struct intel_bo *bo, struct intel_bo *target_bo)
580{
581 return drm_intel_bo_references(gem_bo(bo), gem_bo(target_bo));
582}
583
584int
585intel_bo_wait(struct intel_bo *bo, int64_t timeout)
586{
Chia-I Wu05a45f82014-10-13 13:20:11 +0800587 int err = 0;
Chia-I Wu6464ff22014-08-05 11:59:54 +0800588
Chia-I Wu05a45f82014-10-13 13:20:11 +0800589 if (timeout >= 0)
590 err = drm_intel_gem_bo_wait(gem_bo(bo), timeout);
591 else
592 drm_intel_bo_wait_rendering(gem_bo(bo));
593
Chia-I Wu6464ff22014-08-05 11:59:54 +0800594 /* consider the bo idle on errors */
595 if (err && err != -ETIME)
596 err = 0;
597
598 return err;
599}