intel: Track whether a buffer is idle to avoid trips to the kernel.
[platform/upstream/libdrm.git] / intel / intel_bufmgr_gem.c
1 /**************************************************************************
2  *
3  * Copyright © 2007 Red Hat Inc.
4  * Copyright © 2007-2012 Intel Corporation
5  * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
6  * All Rights Reserved.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the
10  * "Software"), to deal in the Software without restriction, including
11  * without limitation the rights to use, copy, modify, merge, publish,
12  * distribute, sub license, and/or sell copies of the Software, and to
13  * permit persons to whom the Software is furnished to do so, subject to
14  * the following conditions:
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 NON-INFRINGEMENT. IN NO EVENT SHALL
19  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22  * USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * The above copyright notice and this permission notice (including the
25  * next paragraph) shall be included in all copies or substantial portions
26  * of the Software.
27  *
28  *
29  **************************************************************************/
30 /*
31  * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
32  *          Keith Whitwell <keithw-at-tungstengraphics-dot-com>
33  *          Eric Anholt <eric@anholt.net>
34  *          Dave Airlie <airlied@linux.ie>
35  */
36
37 #ifdef HAVE_CONFIG_H
38 #include "config.h"
39 #endif
40
41 #include <xf86drm.h>
42 #include <xf86atomic.h>
43 #include <fcntl.h>
44 #include <stdio.h>
45 #include <stdlib.h>
46 #include <string.h>
47 #include <unistd.h>
48 #include <assert.h>
49 #include <pthread.h>
50 #include <sys/ioctl.h>
51 #include <sys/mman.h>
52 #include <sys/stat.h>
53 #include <sys/types.h>
54 #include <stdbool.h>
55
56 #include "errno.h"
57 #ifndef ETIME
58 #define ETIME ETIMEDOUT
59 #endif
60 #include "libdrm_lists.h"
61 #include "intel_bufmgr.h"
62 #include "intel_bufmgr_priv.h"
63 #include "intel_chipset.h"
64 #include "intel_aub.h"
65 #include "string.h"
66
67 #include "i915_drm.h"
68
69 #ifdef HAVE_VALGRIND
70 #include <valgrind.h>
71 #include <memcheck.h>
72 #define VG(x) x
73 #else
74 #define VG(x)
75 #endif
76
77 #define VG_CLEAR(s) VG(memset(&s, 0, sizeof(s)))
78
79 #define DBG(...) do {                                   \
80         if (bufmgr_gem->bufmgr.debug)                   \
81                 fprintf(stderr, __VA_ARGS__);           \
82 } while (0)
83
84 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
85
86 typedef struct _drm_intel_bo_gem drm_intel_bo_gem;
87
88 struct drm_intel_gem_bo_bucket {
89         drmMMListHead head;
90         unsigned long size;
91 };
92
93 typedef struct _drm_intel_bufmgr_gem {
94         drm_intel_bufmgr bufmgr;
95
96         int fd;
97
98         int max_relocs;
99
100         pthread_mutex_t lock;
101
102         struct drm_i915_gem_exec_object *exec_objects;
103         struct drm_i915_gem_exec_object2 *exec2_objects;
104         drm_intel_bo **exec_bos;
105         int exec_size;
106         int exec_count;
107
108         /** Array of lists of cached gem objects of power-of-two sizes */
109         struct drm_intel_gem_bo_bucket cache_bucket[14 * 4];
110         int num_buckets;
111         time_t time;
112
113         drmMMListHead named;
114         drmMMListHead vma_cache;
115         int vma_count, vma_open, vma_max;
116
117         uint64_t gtt_size;
118         int available_fences;
119         int pci_device;
120         int gen;
121         unsigned int has_bsd : 1;
122         unsigned int has_blt : 1;
123         unsigned int has_relaxed_fencing : 1;
124         unsigned int has_llc : 1;
125         unsigned int has_wait_timeout : 1;
126         unsigned int bo_reuse : 1;
127         unsigned int no_exec : 1;
128         unsigned int has_vebox : 1;
129         bool fenced_relocs;
130
131         char *aub_filename;
132         FILE *aub_file;
133         uint32_t aub_offset;
134 } drm_intel_bufmgr_gem;
135
136 #define DRM_INTEL_RELOC_FENCE (1<<0)
137
138 typedef struct _drm_intel_reloc_target_info {
139         drm_intel_bo *bo;
140         int flags;
141 } drm_intel_reloc_target;
142
143 struct _drm_intel_bo_gem {
144         drm_intel_bo bo;
145
146         atomic_t refcount;
147         uint32_t gem_handle;
148         const char *name;
149
150         /**
151          * Kenel-assigned global name for this object
152          *
153          * List contains both flink named and prime fd'd objects
154          */
155         unsigned int global_name;
156         drmMMListHead name_list;
157
158         /**
159          * Index of the buffer within the validation list while preparing a
160          * batchbuffer execution.
161          */
162         int validate_index;
163
164         /**
165          * Current tiling mode
166          */
167         uint32_t tiling_mode;
168         uint32_t swizzle_mode;
169         unsigned long stride;
170
171         time_t free_time;
172
173         /** Array passed to the DRM containing relocation information. */
174         struct drm_i915_gem_relocation_entry *relocs;
175         /**
176          * Array of info structs corresponding to relocs[i].target_handle etc
177          */
178         drm_intel_reloc_target *reloc_target_info;
179         /** Number of entries in relocs */
180         int reloc_count;
181         /** Mapped address for the buffer, saved across map/unmap cycles */
182         void *mem_virtual;
183         /** GTT virtual address for the buffer, saved across map/unmap cycles */
184         void *gtt_virtual;
185         int map_count;
186         drmMMListHead vma_list;
187
188         /** BO cache list */
189         drmMMListHead head;
190
191         /**
192          * Boolean of whether this BO and its children have been included in
193          * the current drm_intel_bufmgr_check_aperture_space() total.
194          */
195         bool included_in_check_aperture;
196
197         /**
198          * Boolean of whether this buffer has been used as a relocation
199          * target and had its size accounted for, and thus can't have any
200          * further relocations added to it.
201          */
202         bool used_as_reloc_target;
203
204         /**
205          * Boolean of whether we have encountered an error whilst building the relocation tree.
206          */
207         bool has_error;
208
209         /**
210          * Boolean of whether this buffer can be re-used
211          */
212         bool reusable;
213
214         /**
215          * Boolean of whether the GPU is definitely not accessing the buffer.
216          *
217          * This is only valid when reusable, since non-reusable
218          * buffers are those that have been shared wth other
219          * processes, so we don't know their state.
220          */
221         bool idle;
222
223         /**
224          * Size in bytes of this buffer and its relocation descendents.
225          *
226          * Used to avoid costly tree walking in
227          * drm_intel_bufmgr_check_aperture in the common case.
228          */
229         int reloc_tree_size;
230
231         /**
232          * Number of potential fence registers required by this buffer and its
233          * relocations.
234          */
235         int reloc_tree_fences;
236
237         /** Flags that we may need to do the SW_FINSIH ioctl on unmap. */
238         bool mapped_cpu_write;
239
240         uint32_t aub_offset;
241
242         drm_intel_aub_annotation *aub_annotations;
243         unsigned aub_annotation_count;
244 };
245
246 static unsigned int
247 drm_intel_gem_estimate_batch_space(drm_intel_bo ** bo_array, int count);
248
249 static unsigned int
250 drm_intel_gem_compute_batch_space(drm_intel_bo ** bo_array, int count);
251
252 static int
253 drm_intel_gem_bo_get_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
254                             uint32_t * swizzle_mode);
255
256 static int
257 drm_intel_gem_bo_set_tiling_internal(drm_intel_bo *bo,
258                                      uint32_t tiling_mode,
259                                      uint32_t stride);
260
261 static void drm_intel_gem_bo_unreference_locked_timed(drm_intel_bo *bo,
262                                                       time_t time);
263
264 static void drm_intel_gem_bo_unreference(drm_intel_bo *bo);
265
266 static void drm_intel_gem_bo_free(drm_intel_bo *bo);
267
268 static unsigned long
269 drm_intel_gem_bo_tile_size(drm_intel_bufmgr_gem *bufmgr_gem, unsigned long size,
270                            uint32_t *tiling_mode)
271 {
272         unsigned long min_size, max_size;
273         unsigned long i;
274
275         if (*tiling_mode == I915_TILING_NONE)
276                 return size;
277
278         /* 965+ just need multiples of page size for tiling */
279         if (bufmgr_gem->gen >= 4)
280                 return ROUND_UP_TO(size, 4096);
281
282         /* Older chips need powers of two, of at least 512k or 1M */
283         if (bufmgr_gem->gen == 3) {
284                 min_size = 1024*1024;
285                 max_size = 128*1024*1024;
286         } else {
287                 min_size = 512*1024;
288                 max_size = 64*1024*1024;
289         }
290
291         if (size > max_size) {
292                 *tiling_mode = I915_TILING_NONE;
293                 return size;
294         }
295
296         /* Do we need to allocate every page for the fence? */
297         if (bufmgr_gem->has_relaxed_fencing)
298                 return ROUND_UP_TO(size, 4096);
299
300         for (i = min_size; i < size; i <<= 1)
301                 ;
302
303         return i;
304 }
305
306 /*
307  * Round a given pitch up to the minimum required for X tiling on a
308  * given chip.  We use 512 as the minimum to allow for a later tiling
309  * change.
310  */
311 static unsigned long
312 drm_intel_gem_bo_tile_pitch(drm_intel_bufmgr_gem *bufmgr_gem,
313                             unsigned long pitch, uint32_t *tiling_mode)
314 {
315         unsigned long tile_width;
316         unsigned long i;
317
318         /* If untiled, then just align it so that we can do rendering
319          * to it with the 3D engine.
320          */
321         if (*tiling_mode == I915_TILING_NONE)
322                 return ALIGN(pitch, 64);
323
324         if (*tiling_mode == I915_TILING_X
325                         || (IS_915(bufmgr_gem->pci_device)
326                             && *tiling_mode == I915_TILING_Y))
327                 tile_width = 512;
328         else
329                 tile_width = 128;
330
331         /* 965 is flexible */
332         if (bufmgr_gem->gen >= 4)
333                 return ROUND_UP_TO(pitch, tile_width);
334
335         /* The older hardware has a maximum pitch of 8192 with tiled
336          * surfaces, so fallback to untiled if it's too large.
337          */
338         if (pitch > 8192) {
339                 *tiling_mode = I915_TILING_NONE;
340                 return ALIGN(pitch, 64);
341         }
342
343         /* Pre-965 needs power of two tile width */
344         for (i = tile_width; i < pitch; i <<= 1)
345                 ;
346
347         return i;
348 }
349
350 static struct drm_intel_gem_bo_bucket *
351 drm_intel_gem_bo_bucket_for_size(drm_intel_bufmgr_gem *bufmgr_gem,
352                                  unsigned long size)
353 {
354         int i;
355
356         for (i = 0; i < bufmgr_gem->num_buckets; i++) {
357                 struct drm_intel_gem_bo_bucket *bucket =
358                     &bufmgr_gem->cache_bucket[i];
359                 if (bucket->size >= size) {
360                         return bucket;
361                 }
362         }
363
364         return NULL;
365 }
366
367 static void
368 drm_intel_gem_dump_validation_list(drm_intel_bufmgr_gem *bufmgr_gem)
369 {
370         int i, j;
371
372         for (i = 0; i < bufmgr_gem->exec_count; i++) {
373                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
374                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
375
376                 if (bo_gem->relocs == NULL) {
377                         DBG("%2d: %d (%s)\n", i, bo_gem->gem_handle,
378                             bo_gem->name);
379                         continue;
380                 }
381
382                 for (j = 0; j < bo_gem->reloc_count; j++) {
383                         drm_intel_bo *target_bo = bo_gem->reloc_target_info[j].bo;
384                         drm_intel_bo_gem *target_gem =
385                             (drm_intel_bo_gem *) target_bo;
386
387                         DBG("%2d: %d (%s)@0x%08llx -> "
388                             "%d (%s)@0x%08lx + 0x%08x\n",
389                             i,
390                             bo_gem->gem_handle, bo_gem->name,
391                             (unsigned long long)bo_gem->relocs[j].offset,
392                             target_gem->gem_handle,
393                             target_gem->name,
394                             target_bo->offset,
395                             bo_gem->relocs[j].delta);
396                 }
397         }
398 }
399
400 static inline void
401 drm_intel_gem_bo_reference(drm_intel_bo *bo)
402 {
403         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
404
405         atomic_inc(&bo_gem->refcount);
406 }
407
408 /**
409  * Adds the given buffer to the list of buffers to be validated (moved into the
410  * appropriate memory type) with the next batch submission.
411  *
412  * If a buffer is validated multiple times in a batch submission, it ends up
413  * with the intersection of the memory type flags and the union of the
414  * access flags.
415  */
416 static void
417 drm_intel_add_validate_buffer(drm_intel_bo *bo)
418 {
419         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
420         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
421         int index;
422
423         if (bo_gem->validate_index != -1)
424                 return;
425
426         /* Extend the array of validation entries as necessary. */
427         if (bufmgr_gem->exec_count == bufmgr_gem->exec_size) {
428                 int new_size = bufmgr_gem->exec_size * 2;
429
430                 if (new_size == 0)
431                         new_size = 5;
432
433                 bufmgr_gem->exec_objects =
434                     realloc(bufmgr_gem->exec_objects,
435                             sizeof(*bufmgr_gem->exec_objects) * new_size);
436                 bufmgr_gem->exec_bos =
437                     realloc(bufmgr_gem->exec_bos,
438                             sizeof(*bufmgr_gem->exec_bos) * new_size);
439                 bufmgr_gem->exec_size = new_size;
440         }
441
442         index = bufmgr_gem->exec_count;
443         bo_gem->validate_index = index;
444         /* Fill in array entry */
445         bufmgr_gem->exec_objects[index].handle = bo_gem->gem_handle;
446         bufmgr_gem->exec_objects[index].relocation_count = bo_gem->reloc_count;
447         bufmgr_gem->exec_objects[index].relocs_ptr = (uintptr_t) bo_gem->relocs;
448         bufmgr_gem->exec_objects[index].alignment = 0;
449         bufmgr_gem->exec_objects[index].offset = 0;
450         bufmgr_gem->exec_bos[index] = bo;
451         bufmgr_gem->exec_count++;
452 }
453
454 static void
455 drm_intel_add_validate_buffer2(drm_intel_bo *bo, int need_fence)
456 {
457         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
458         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
459         int index;
460
461         if (bo_gem->validate_index != -1) {
462                 if (need_fence)
463                         bufmgr_gem->exec2_objects[bo_gem->validate_index].flags |=
464                                 EXEC_OBJECT_NEEDS_FENCE;
465                 return;
466         }
467
468         /* Extend the array of validation entries as necessary. */
469         if (bufmgr_gem->exec_count == bufmgr_gem->exec_size) {
470                 int new_size = bufmgr_gem->exec_size * 2;
471
472                 if (new_size == 0)
473                         new_size = 5;
474
475                 bufmgr_gem->exec2_objects =
476                         realloc(bufmgr_gem->exec2_objects,
477                                 sizeof(*bufmgr_gem->exec2_objects) * new_size);
478                 bufmgr_gem->exec_bos =
479                         realloc(bufmgr_gem->exec_bos,
480                                 sizeof(*bufmgr_gem->exec_bos) * new_size);
481                 bufmgr_gem->exec_size = new_size;
482         }
483
484         index = bufmgr_gem->exec_count;
485         bo_gem->validate_index = index;
486         /* Fill in array entry */
487         bufmgr_gem->exec2_objects[index].handle = bo_gem->gem_handle;
488         bufmgr_gem->exec2_objects[index].relocation_count = bo_gem->reloc_count;
489         bufmgr_gem->exec2_objects[index].relocs_ptr = (uintptr_t)bo_gem->relocs;
490         bufmgr_gem->exec2_objects[index].alignment = 0;
491         bufmgr_gem->exec2_objects[index].offset = 0;
492         bufmgr_gem->exec_bos[index] = bo;
493         bufmgr_gem->exec2_objects[index].flags = 0;
494         bufmgr_gem->exec2_objects[index].rsvd1 = 0;
495         bufmgr_gem->exec2_objects[index].rsvd2 = 0;
496         if (need_fence) {
497                 bufmgr_gem->exec2_objects[index].flags |=
498                         EXEC_OBJECT_NEEDS_FENCE;
499         }
500         bufmgr_gem->exec_count++;
501 }
502
503 #define RELOC_BUF_SIZE(x) ((I915_RELOC_HEADER + x * I915_RELOC0_STRIDE) * \
504         sizeof(uint32_t))
505
506 static void
507 drm_intel_bo_gem_set_in_aperture_size(drm_intel_bufmgr_gem *bufmgr_gem,
508                                       drm_intel_bo_gem *bo_gem)
509 {
510         int size;
511
512         assert(!bo_gem->used_as_reloc_target);
513
514         /* The older chipsets are far-less flexible in terms of tiling,
515          * and require tiled buffer to be size aligned in the aperture.
516          * This means that in the worst possible case we will need a hole
517          * twice as large as the object in order for it to fit into the
518          * aperture. Optimal packing is for wimps.
519          */
520         size = bo_gem->bo.size;
521         if (bufmgr_gem->gen < 4 && bo_gem->tiling_mode != I915_TILING_NONE) {
522                 int min_size;
523
524                 if (bufmgr_gem->has_relaxed_fencing) {
525                         if (bufmgr_gem->gen == 3)
526                                 min_size = 1024*1024;
527                         else
528                                 min_size = 512*1024;
529
530                         while (min_size < size)
531                                 min_size *= 2;
532                 } else
533                         min_size = size;
534
535                 /* Account for worst-case alignment. */
536                 size = 2 * min_size;
537         }
538
539         bo_gem->reloc_tree_size = size;
540 }
541
542 static int
543 drm_intel_setup_reloc_list(drm_intel_bo *bo)
544 {
545         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
546         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
547         unsigned int max_relocs = bufmgr_gem->max_relocs;
548
549         if (bo->size / 4 < max_relocs)
550                 max_relocs = bo->size / 4;
551
552         bo_gem->relocs = malloc(max_relocs *
553                                 sizeof(struct drm_i915_gem_relocation_entry));
554         bo_gem->reloc_target_info = malloc(max_relocs *
555                                            sizeof(drm_intel_reloc_target));
556         if (bo_gem->relocs == NULL || bo_gem->reloc_target_info == NULL) {
557                 bo_gem->has_error = true;
558
559                 free (bo_gem->relocs);
560                 bo_gem->relocs = NULL;
561
562                 free (bo_gem->reloc_target_info);
563                 bo_gem->reloc_target_info = NULL;
564
565                 return 1;
566         }
567
568         return 0;
569 }
570
571 static int
572 drm_intel_gem_bo_busy(drm_intel_bo *bo)
573 {
574         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
575         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
576         struct drm_i915_gem_busy busy;
577         int ret;
578
579         if (bo_gem->reusable && bo_gem->idle)
580                 return false;
581
582         VG_CLEAR(busy);
583         busy.handle = bo_gem->gem_handle;
584
585         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_BUSY, &busy);
586         if (ret == 0) {
587                 bo_gem->idle = !busy.busy;
588                 return busy.busy;
589         } else {
590                 return false;
591         }
592         return (ret == 0 && busy.busy);
593 }
594
595 static int
596 drm_intel_gem_bo_madvise_internal(drm_intel_bufmgr_gem *bufmgr_gem,
597                                   drm_intel_bo_gem *bo_gem, int state)
598 {
599         struct drm_i915_gem_madvise madv;
600
601         VG_CLEAR(madv);
602         madv.handle = bo_gem->gem_handle;
603         madv.madv = state;
604         madv.retained = 1;
605         drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_MADVISE, &madv);
606
607         return madv.retained;
608 }
609
610 static int
611 drm_intel_gem_bo_madvise(drm_intel_bo *bo, int madv)
612 {
613         return drm_intel_gem_bo_madvise_internal
614                 ((drm_intel_bufmgr_gem *) bo->bufmgr,
615                  (drm_intel_bo_gem *) bo,
616                  madv);
617 }
618
619 /* drop the oldest entries that have been purged by the kernel */
620 static void
621 drm_intel_gem_bo_cache_purge_bucket(drm_intel_bufmgr_gem *bufmgr_gem,
622                                     struct drm_intel_gem_bo_bucket *bucket)
623 {
624         while (!DRMLISTEMPTY(&bucket->head)) {
625                 drm_intel_bo_gem *bo_gem;
626
627                 bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
628                                       bucket->head.next, head);
629                 if (drm_intel_gem_bo_madvise_internal
630                     (bufmgr_gem, bo_gem, I915_MADV_DONTNEED))
631                         break;
632
633                 DRMLISTDEL(&bo_gem->head);
634                 drm_intel_gem_bo_free(&bo_gem->bo);
635         }
636 }
637
638 static drm_intel_bo *
639 drm_intel_gem_bo_alloc_internal(drm_intel_bufmgr *bufmgr,
640                                 const char *name,
641                                 unsigned long size,
642                                 unsigned long flags,
643                                 uint32_t tiling_mode,
644                                 unsigned long stride)
645 {
646         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
647         drm_intel_bo_gem *bo_gem;
648         unsigned int page_size = getpagesize();
649         int ret;
650         struct drm_intel_gem_bo_bucket *bucket;
651         bool alloc_from_cache;
652         unsigned long bo_size;
653         bool for_render = false;
654
655         if (flags & BO_ALLOC_FOR_RENDER)
656                 for_render = true;
657
658         /* Round the allocated size up to a power of two number of pages. */
659         bucket = drm_intel_gem_bo_bucket_for_size(bufmgr_gem, size);
660
661         /* If we don't have caching at this size, don't actually round the
662          * allocation up.
663          */
664         if (bucket == NULL) {
665                 bo_size = size;
666                 if (bo_size < page_size)
667                         bo_size = page_size;
668         } else {
669                 bo_size = bucket->size;
670         }
671
672         pthread_mutex_lock(&bufmgr_gem->lock);
673         /* Get a buffer out of the cache if available */
674 retry:
675         alloc_from_cache = false;
676         if (bucket != NULL && !DRMLISTEMPTY(&bucket->head)) {
677                 if (for_render) {
678                         /* Allocate new render-target BOs from the tail (MRU)
679                          * of the list, as it will likely be hot in the GPU
680                          * cache and in the aperture for us.
681                          */
682                         bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
683                                               bucket->head.prev, head);
684                         DRMLISTDEL(&bo_gem->head);
685                         alloc_from_cache = true;
686                 } else {
687                         /* For non-render-target BOs (where we're probably
688                          * going to map it first thing in order to fill it
689                          * with data), check if the last BO in the cache is
690                          * unbusy, and only reuse in that case. Otherwise,
691                          * allocating a new buffer is probably faster than
692                          * waiting for the GPU to finish.
693                          */
694                         bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
695                                               bucket->head.next, head);
696                         if (!drm_intel_gem_bo_busy(&bo_gem->bo)) {
697                                 alloc_from_cache = true;
698                                 DRMLISTDEL(&bo_gem->head);
699                         }
700                 }
701
702                 if (alloc_from_cache) {
703                         if (!drm_intel_gem_bo_madvise_internal
704                             (bufmgr_gem, bo_gem, I915_MADV_WILLNEED)) {
705                                 drm_intel_gem_bo_free(&bo_gem->bo);
706                                 drm_intel_gem_bo_cache_purge_bucket(bufmgr_gem,
707                                                                     bucket);
708                                 goto retry;
709                         }
710
711                         if (drm_intel_gem_bo_set_tiling_internal(&bo_gem->bo,
712                                                                  tiling_mode,
713                                                                  stride)) {
714                                 drm_intel_gem_bo_free(&bo_gem->bo);
715                                 goto retry;
716                         }
717                 }
718         }
719         pthread_mutex_unlock(&bufmgr_gem->lock);
720
721         if (!alloc_from_cache) {
722                 struct drm_i915_gem_create create;
723
724                 bo_gem = calloc(1, sizeof(*bo_gem));
725                 if (!bo_gem)
726                         return NULL;
727
728                 bo_gem->bo.size = bo_size;
729
730                 VG_CLEAR(create);
731                 create.size = bo_size;
732
733                 ret = drmIoctl(bufmgr_gem->fd,
734                                DRM_IOCTL_I915_GEM_CREATE,
735                                &create);
736                 bo_gem->gem_handle = create.handle;
737                 bo_gem->bo.handle = bo_gem->gem_handle;
738                 if (ret != 0) {
739                         free(bo_gem);
740                         return NULL;
741                 }
742                 bo_gem->bo.bufmgr = bufmgr;
743
744                 bo_gem->tiling_mode = I915_TILING_NONE;
745                 bo_gem->swizzle_mode = I915_BIT_6_SWIZZLE_NONE;
746                 bo_gem->stride = 0;
747
748                 if (drm_intel_gem_bo_set_tiling_internal(&bo_gem->bo,
749                                                          tiling_mode,
750                                                          stride)) {
751                     drm_intel_gem_bo_free(&bo_gem->bo);
752                     return NULL;
753                 }
754
755                 DRMINITLISTHEAD(&bo_gem->name_list);
756                 DRMINITLISTHEAD(&bo_gem->vma_list);
757         }
758
759         bo_gem->name = name;
760         atomic_set(&bo_gem->refcount, 1);
761         bo_gem->validate_index = -1;
762         bo_gem->reloc_tree_fences = 0;
763         bo_gem->used_as_reloc_target = false;
764         bo_gem->has_error = false;
765         bo_gem->reusable = true;
766         bo_gem->aub_annotations = NULL;
767         bo_gem->aub_annotation_count = 0;
768
769         drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
770
771         DBG("bo_create: buf %d (%s) %ldb\n",
772             bo_gem->gem_handle, bo_gem->name, size);
773
774         return &bo_gem->bo;
775 }
776
777 static drm_intel_bo *
778 drm_intel_gem_bo_alloc_for_render(drm_intel_bufmgr *bufmgr,
779                                   const char *name,
780                                   unsigned long size,
781                                   unsigned int alignment)
782 {
783         return drm_intel_gem_bo_alloc_internal(bufmgr, name, size,
784                                                BO_ALLOC_FOR_RENDER,
785                                                I915_TILING_NONE, 0);
786 }
787
788 static drm_intel_bo *
789 drm_intel_gem_bo_alloc(drm_intel_bufmgr *bufmgr,
790                        const char *name,
791                        unsigned long size,
792                        unsigned int alignment)
793 {
794         return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, 0,
795                                                I915_TILING_NONE, 0);
796 }
797
798 static drm_intel_bo *
799 drm_intel_gem_bo_alloc_tiled(drm_intel_bufmgr *bufmgr, const char *name,
800                              int x, int y, int cpp, uint32_t *tiling_mode,
801                              unsigned long *pitch, unsigned long flags)
802 {
803         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
804         unsigned long size, stride;
805         uint32_t tiling;
806
807         do {
808                 unsigned long aligned_y, height_alignment;
809
810                 tiling = *tiling_mode;
811
812                 /* If we're tiled, our allocations are in 8 or 32-row blocks,
813                  * so failure to align our height means that we won't allocate
814                  * enough pages.
815                  *
816                  * If we're untiled, we still have to align to 2 rows high
817                  * because the data port accesses 2x2 blocks even if the
818                  * bottom row isn't to be rendered, so failure to align means
819                  * we could walk off the end of the GTT and fault.  This is
820                  * documented on 965, and may be the case on older chipsets
821                  * too so we try to be careful.
822                  */
823                 aligned_y = y;
824                 height_alignment = 2;
825
826                 if ((bufmgr_gem->gen == 2) && tiling != I915_TILING_NONE)
827                         height_alignment = 16;
828                 else if (tiling == I915_TILING_X
829                         || (IS_915(bufmgr_gem->pci_device)
830                             && tiling == I915_TILING_Y))
831                         height_alignment = 8;
832                 else if (tiling == I915_TILING_Y)
833                         height_alignment = 32;
834                 aligned_y = ALIGN(y, height_alignment);
835
836                 stride = x * cpp;
837                 stride = drm_intel_gem_bo_tile_pitch(bufmgr_gem, stride, tiling_mode);
838                 size = stride * aligned_y;
839                 size = drm_intel_gem_bo_tile_size(bufmgr_gem, size, tiling_mode);
840         } while (*tiling_mode != tiling);
841         *pitch = stride;
842
843         if (tiling == I915_TILING_NONE)
844                 stride = 0;
845
846         return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, flags,
847                                                tiling, stride);
848 }
849
850 /**
851  * Returns a drm_intel_bo wrapping the given buffer object handle.
852  *
853  * This can be used when one application needs to pass a buffer object
854  * to another.
855  */
856 drm_intel_bo *
857 drm_intel_bo_gem_create_from_name(drm_intel_bufmgr *bufmgr,
858                                   const char *name,
859                                   unsigned int handle)
860 {
861         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
862         drm_intel_bo_gem *bo_gem;
863         int ret;
864         struct drm_gem_open open_arg;
865         struct drm_i915_gem_get_tiling get_tiling;
866         drmMMListHead *list;
867
868         /* At the moment most applications only have a few named bo.
869          * For instance, in a DRI client only the render buffers passed
870          * between X and the client are named. And since X returns the
871          * alternating names for the front/back buffer a linear search
872          * provides a sufficiently fast match.
873          */
874         for (list = bufmgr_gem->named.next;
875              list != &bufmgr_gem->named;
876              list = list->next) {
877                 bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list);
878                 if (bo_gem->global_name == handle) {
879                         drm_intel_gem_bo_reference(&bo_gem->bo);
880                         return &bo_gem->bo;
881                 }
882         }
883
884         VG_CLEAR(open_arg);
885         open_arg.name = handle;
886         ret = drmIoctl(bufmgr_gem->fd,
887                        DRM_IOCTL_GEM_OPEN,
888                        &open_arg);
889         if (ret != 0) {
890                 DBG("Couldn't reference %s handle 0x%08x: %s\n",
891                     name, handle, strerror(errno));
892                 return NULL;
893         }
894         /* Now see if someone has used a prime handle to get this
895          * object from the kernel before by looking through the list
896          * again for a matching gem_handle
897          */
898         for (list = bufmgr_gem->named.next;
899              list != &bufmgr_gem->named;
900              list = list->next) {
901                 bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list);
902                 if (bo_gem->gem_handle == open_arg.handle) {
903                         drm_intel_gem_bo_reference(&bo_gem->bo);
904                         return &bo_gem->bo;
905                 }
906         }
907
908         bo_gem = calloc(1, sizeof(*bo_gem));
909         if (!bo_gem)
910                 return NULL;
911
912         bo_gem->bo.size = open_arg.size;
913         bo_gem->bo.offset = 0;
914         bo_gem->bo.virtual = NULL;
915         bo_gem->bo.bufmgr = bufmgr;
916         bo_gem->name = name;
917         atomic_set(&bo_gem->refcount, 1);
918         bo_gem->validate_index = -1;
919         bo_gem->gem_handle = open_arg.handle;
920         bo_gem->bo.handle = open_arg.handle;
921         bo_gem->global_name = handle;
922         bo_gem->reusable = false;
923
924         VG_CLEAR(get_tiling);
925         get_tiling.handle = bo_gem->gem_handle;
926         ret = drmIoctl(bufmgr_gem->fd,
927                        DRM_IOCTL_I915_GEM_GET_TILING,
928                        &get_tiling);
929         if (ret != 0) {
930                 drm_intel_gem_bo_unreference(&bo_gem->bo);
931                 return NULL;
932         }
933         bo_gem->tiling_mode = get_tiling.tiling_mode;
934         bo_gem->swizzle_mode = get_tiling.swizzle_mode;
935         /* XXX stride is unknown */
936         drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
937
938         DRMINITLISTHEAD(&bo_gem->vma_list);
939         DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
940         DBG("bo_create_from_handle: %d (%s)\n", handle, bo_gem->name);
941
942         return &bo_gem->bo;
943 }
944
945 static void
946 drm_intel_gem_bo_free(drm_intel_bo *bo)
947 {
948         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
949         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
950         struct drm_gem_close close;
951         int ret;
952
953         DRMLISTDEL(&bo_gem->vma_list);
954         if (bo_gem->mem_virtual) {
955                 VG(VALGRIND_FREELIKE_BLOCK(bo_gem->mem_virtual, 0));
956                 munmap(bo_gem->mem_virtual, bo_gem->bo.size);
957                 bufmgr_gem->vma_count--;
958         }
959         if (bo_gem->gtt_virtual) {
960                 munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
961                 bufmgr_gem->vma_count--;
962         }
963
964         /* Close this object */
965         VG_CLEAR(close);
966         close.handle = bo_gem->gem_handle;
967         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close);
968         if (ret != 0) {
969                 DBG("DRM_IOCTL_GEM_CLOSE %d failed (%s): %s\n",
970                     bo_gem->gem_handle, bo_gem->name, strerror(errno));
971         }
972         free(bo_gem->aub_annotations);
973         free(bo);
974 }
975
976 static void
977 drm_intel_gem_bo_mark_mmaps_incoherent(drm_intel_bo *bo)
978 {
979 #if HAVE_VALGRIND
980         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
981
982         if (bo_gem->mem_virtual)
983                 VALGRIND_MAKE_MEM_NOACCESS(bo_gem->mem_virtual, bo->size);
984
985         if (bo_gem->gtt_virtual)
986                 VALGRIND_MAKE_MEM_NOACCESS(bo_gem->gtt_virtual, bo->size);
987 #endif
988 }
989
990 /** Frees all cached buffers significantly older than @time. */
991 static void
992 drm_intel_gem_cleanup_bo_cache(drm_intel_bufmgr_gem *bufmgr_gem, time_t time)
993 {
994         int i;
995
996         if (bufmgr_gem->time == time)
997                 return;
998
999         for (i = 0; i < bufmgr_gem->num_buckets; i++) {
1000                 struct drm_intel_gem_bo_bucket *bucket =
1001                     &bufmgr_gem->cache_bucket[i];
1002
1003                 while (!DRMLISTEMPTY(&bucket->head)) {
1004                         drm_intel_bo_gem *bo_gem;
1005
1006                         bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
1007                                               bucket->head.next, head);
1008                         if (time - bo_gem->free_time <= 1)
1009                                 break;
1010
1011                         DRMLISTDEL(&bo_gem->head);
1012
1013                         drm_intel_gem_bo_free(&bo_gem->bo);
1014                 }
1015         }
1016
1017         bufmgr_gem->time = time;
1018 }
1019
1020 static void drm_intel_gem_bo_purge_vma_cache(drm_intel_bufmgr_gem *bufmgr_gem)
1021 {
1022         int limit;
1023
1024         DBG("%s: cached=%d, open=%d, limit=%d\n", __FUNCTION__,
1025             bufmgr_gem->vma_count, bufmgr_gem->vma_open, bufmgr_gem->vma_max);
1026
1027         if (bufmgr_gem->vma_max < 0)
1028                 return;
1029
1030         /* We may need to evict a few entries in order to create new mmaps */
1031         limit = bufmgr_gem->vma_max - 2*bufmgr_gem->vma_open;
1032         if (limit < 0)
1033                 limit = 0;
1034
1035         while (bufmgr_gem->vma_count > limit) {
1036                 drm_intel_bo_gem *bo_gem;
1037
1038                 bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
1039                                       bufmgr_gem->vma_cache.next,
1040                                       vma_list);
1041                 assert(bo_gem->map_count == 0);
1042                 DRMLISTDELINIT(&bo_gem->vma_list);
1043
1044                 if (bo_gem->mem_virtual) {
1045                         munmap(bo_gem->mem_virtual, bo_gem->bo.size);
1046                         bo_gem->mem_virtual = NULL;
1047                         bufmgr_gem->vma_count--;
1048                 }
1049                 if (bo_gem->gtt_virtual) {
1050                         munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
1051                         bo_gem->gtt_virtual = NULL;
1052                         bufmgr_gem->vma_count--;
1053                 }
1054         }
1055 }
1056
1057 static void drm_intel_gem_bo_close_vma(drm_intel_bufmgr_gem *bufmgr_gem,
1058                                        drm_intel_bo_gem *bo_gem)
1059 {
1060         bufmgr_gem->vma_open--;
1061         DRMLISTADDTAIL(&bo_gem->vma_list, &bufmgr_gem->vma_cache);
1062         if (bo_gem->mem_virtual)
1063                 bufmgr_gem->vma_count++;
1064         if (bo_gem->gtt_virtual)
1065                 bufmgr_gem->vma_count++;
1066         drm_intel_gem_bo_purge_vma_cache(bufmgr_gem);
1067 }
1068
1069 static void drm_intel_gem_bo_open_vma(drm_intel_bufmgr_gem *bufmgr_gem,
1070                                       drm_intel_bo_gem *bo_gem)
1071 {
1072         bufmgr_gem->vma_open++;
1073         DRMLISTDEL(&bo_gem->vma_list);
1074         if (bo_gem->mem_virtual)
1075                 bufmgr_gem->vma_count--;
1076         if (bo_gem->gtt_virtual)
1077                 bufmgr_gem->vma_count--;
1078         drm_intel_gem_bo_purge_vma_cache(bufmgr_gem);
1079 }
1080
1081 static void
1082 drm_intel_gem_bo_unreference_final(drm_intel_bo *bo, time_t time)
1083 {
1084         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1085         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1086         struct drm_intel_gem_bo_bucket *bucket;
1087         int i;
1088
1089         /* Unreference all the target buffers */
1090         for (i = 0; i < bo_gem->reloc_count; i++) {
1091                 if (bo_gem->reloc_target_info[i].bo != bo) {
1092                         drm_intel_gem_bo_unreference_locked_timed(bo_gem->
1093                                                                   reloc_target_info[i].bo,
1094                                                                   time);
1095                 }
1096         }
1097         bo_gem->reloc_count = 0;
1098         bo_gem->used_as_reloc_target = false;
1099
1100         DBG("bo_unreference final: %d (%s)\n",
1101             bo_gem->gem_handle, bo_gem->name);
1102
1103         /* release memory associated with this object */
1104         if (bo_gem->reloc_target_info) {
1105                 free(bo_gem->reloc_target_info);
1106                 bo_gem->reloc_target_info = NULL;
1107         }
1108         if (bo_gem->relocs) {
1109                 free(bo_gem->relocs);
1110                 bo_gem->relocs = NULL;
1111         }
1112
1113         /* Clear any left-over mappings */
1114         if (bo_gem->map_count) {
1115                 DBG("bo freed with non-zero map-count %d\n", bo_gem->map_count);
1116                 bo_gem->map_count = 0;
1117                 drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1118                 drm_intel_gem_bo_mark_mmaps_incoherent(bo);
1119         }
1120
1121         DRMLISTDEL(&bo_gem->name_list);
1122
1123         bucket = drm_intel_gem_bo_bucket_for_size(bufmgr_gem, bo->size);
1124         /* Put the buffer into our internal cache for reuse if we can. */
1125         if (bufmgr_gem->bo_reuse && bo_gem->reusable && bucket != NULL &&
1126             drm_intel_gem_bo_madvise_internal(bufmgr_gem, bo_gem,
1127                                               I915_MADV_DONTNEED)) {
1128                 bo_gem->free_time = time;
1129
1130                 bo_gem->name = NULL;
1131                 bo_gem->validate_index = -1;
1132
1133                 DRMLISTADDTAIL(&bo_gem->head, &bucket->head);
1134         } else {
1135                 drm_intel_gem_bo_free(bo);
1136         }
1137 }
1138
1139 static void drm_intel_gem_bo_unreference_locked_timed(drm_intel_bo *bo,
1140                                                       time_t time)
1141 {
1142         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1143
1144         assert(atomic_read(&bo_gem->refcount) > 0);
1145         if (atomic_dec_and_test(&bo_gem->refcount))
1146                 drm_intel_gem_bo_unreference_final(bo, time);
1147 }
1148
1149 static void drm_intel_gem_bo_unreference(drm_intel_bo *bo)
1150 {
1151         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1152
1153         assert(atomic_read(&bo_gem->refcount) > 0);
1154         if (atomic_dec_and_test(&bo_gem->refcount)) {
1155                 drm_intel_bufmgr_gem *bufmgr_gem =
1156                     (drm_intel_bufmgr_gem *) bo->bufmgr;
1157                 struct timespec time;
1158
1159                 clock_gettime(CLOCK_MONOTONIC, &time);
1160
1161                 pthread_mutex_lock(&bufmgr_gem->lock);
1162                 drm_intel_gem_bo_unreference_final(bo, time.tv_sec);
1163                 drm_intel_gem_cleanup_bo_cache(bufmgr_gem, time.tv_sec);
1164                 pthread_mutex_unlock(&bufmgr_gem->lock);
1165         }
1166 }
1167
1168 static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
1169 {
1170         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1171         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1172         struct drm_i915_gem_set_domain set_domain;
1173         int ret;
1174
1175         pthread_mutex_lock(&bufmgr_gem->lock);
1176
1177         if (bo_gem->map_count++ == 0)
1178                 drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem);
1179
1180         if (!bo_gem->mem_virtual) {
1181                 struct drm_i915_gem_mmap mmap_arg;
1182
1183                 DBG("bo_map: %d (%s), map_count=%d\n",
1184                     bo_gem->gem_handle, bo_gem->name, bo_gem->map_count);
1185
1186                 VG_CLEAR(mmap_arg);
1187                 mmap_arg.handle = bo_gem->gem_handle;
1188                 mmap_arg.offset = 0;
1189                 mmap_arg.size = bo->size;
1190                 ret = drmIoctl(bufmgr_gem->fd,
1191                                DRM_IOCTL_I915_GEM_MMAP,
1192                                &mmap_arg);
1193                 if (ret != 0) {
1194                         ret = -errno;
1195                         DBG("%s:%d: Error mapping buffer %d (%s): %s .\n",
1196                             __FILE__, __LINE__, bo_gem->gem_handle,
1197                             bo_gem->name, strerror(errno));
1198                         if (--bo_gem->map_count == 0)
1199                                 drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1200                         pthread_mutex_unlock(&bufmgr_gem->lock);
1201                         return ret;
1202                 }
1203                 VG(VALGRIND_MALLOCLIKE_BLOCK(mmap_arg.addr_ptr, mmap_arg.size, 0, 1));
1204                 bo_gem->mem_virtual = (void *)(uintptr_t) mmap_arg.addr_ptr;
1205         }
1206         DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
1207             bo_gem->mem_virtual);
1208         bo->virtual = bo_gem->mem_virtual;
1209
1210         VG_CLEAR(set_domain);
1211         set_domain.handle = bo_gem->gem_handle;
1212         set_domain.read_domains = I915_GEM_DOMAIN_CPU;
1213         if (write_enable)
1214                 set_domain.write_domain = I915_GEM_DOMAIN_CPU;
1215         else
1216                 set_domain.write_domain = 0;
1217         ret = drmIoctl(bufmgr_gem->fd,
1218                        DRM_IOCTL_I915_GEM_SET_DOMAIN,
1219                        &set_domain);
1220         if (ret != 0) {
1221                 DBG("%s:%d: Error setting to CPU domain %d: %s\n",
1222                     __FILE__, __LINE__, bo_gem->gem_handle,
1223                     strerror(errno));
1224         }
1225
1226         if (write_enable)
1227                 bo_gem->mapped_cpu_write = true;
1228
1229         drm_intel_gem_bo_mark_mmaps_incoherent(bo);
1230         VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->mem_virtual, bo->size));
1231         pthread_mutex_unlock(&bufmgr_gem->lock);
1232
1233         return 0;
1234 }
1235
1236 static int
1237 map_gtt(drm_intel_bo *bo)
1238 {
1239         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1240         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1241         int ret;
1242
1243         if (bo_gem->map_count++ == 0)
1244                 drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem);
1245
1246         /* Get a mapping of the buffer if we haven't before. */
1247         if (bo_gem->gtt_virtual == NULL) {
1248                 struct drm_i915_gem_mmap_gtt mmap_arg;
1249
1250                 DBG("bo_map_gtt: mmap %d (%s), map_count=%d\n",
1251                     bo_gem->gem_handle, bo_gem->name, bo_gem->map_count);
1252
1253                 VG_CLEAR(mmap_arg);
1254                 mmap_arg.handle = bo_gem->gem_handle;
1255
1256                 /* Get the fake offset back... */
1257                 ret = drmIoctl(bufmgr_gem->fd,
1258                                DRM_IOCTL_I915_GEM_MMAP_GTT,
1259                                &mmap_arg);
1260                 if (ret != 0) {
1261                         ret = -errno;
1262                         DBG("%s:%d: Error preparing buffer map %d (%s): %s .\n",
1263                             __FILE__, __LINE__,
1264                             bo_gem->gem_handle, bo_gem->name,
1265                             strerror(errno));
1266                         if (--bo_gem->map_count == 0)
1267                                 drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1268                         return ret;
1269                 }
1270
1271                 /* and mmap it */
1272                 bo_gem->gtt_virtual = mmap(0, bo->size, PROT_READ | PROT_WRITE,
1273                                            MAP_SHARED, bufmgr_gem->fd,
1274                                            mmap_arg.offset);
1275                 if (bo_gem->gtt_virtual == MAP_FAILED) {
1276                         bo_gem->gtt_virtual = NULL;
1277                         ret = -errno;
1278                         DBG("%s:%d: Error mapping buffer %d (%s): %s .\n",
1279                             __FILE__, __LINE__,
1280                             bo_gem->gem_handle, bo_gem->name,
1281                             strerror(errno));
1282                         if (--bo_gem->map_count == 0)
1283                                 drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1284                         return ret;
1285                 }
1286         }
1287
1288         bo->virtual = bo_gem->gtt_virtual;
1289
1290         DBG("bo_map_gtt: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
1291             bo_gem->gtt_virtual);
1292
1293         return 0;
1294 }
1295
1296 int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
1297 {
1298         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1299         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1300         struct drm_i915_gem_set_domain set_domain;
1301         int ret;
1302
1303         pthread_mutex_lock(&bufmgr_gem->lock);
1304
1305         ret = map_gtt(bo);
1306         if (ret) {
1307                 pthread_mutex_unlock(&bufmgr_gem->lock);
1308                 return ret;
1309         }
1310
1311         /* Now move it to the GTT domain so that the GPU and CPU
1312          * caches are flushed and the GPU isn't actively using the
1313          * buffer.
1314          *
1315          * The pagefault handler does this domain change for us when
1316          * it has unbound the BO from the GTT, but it's up to us to
1317          * tell it when we're about to use things if we had done
1318          * rendering and it still happens to be bound to the GTT.
1319          */
1320         VG_CLEAR(set_domain);
1321         set_domain.handle = bo_gem->gem_handle;
1322         set_domain.read_domains = I915_GEM_DOMAIN_GTT;
1323         set_domain.write_domain = I915_GEM_DOMAIN_GTT;
1324         ret = drmIoctl(bufmgr_gem->fd,
1325                        DRM_IOCTL_I915_GEM_SET_DOMAIN,
1326                        &set_domain);
1327         if (ret != 0) {
1328                 DBG("%s:%d: Error setting domain %d: %s\n",
1329                     __FILE__, __LINE__, bo_gem->gem_handle,
1330                     strerror(errno));
1331         }
1332
1333         drm_intel_gem_bo_mark_mmaps_incoherent(bo);
1334         VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->gtt_virtual, bo->size));
1335         pthread_mutex_unlock(&bufmgr_gem->lock);
1336
1337         return 0;
1338 }
1339
1340 /**
1341  * Performs a mapping of the buffer object like the normal GTT
1342  * mapping, but avoids waiting for the GPU to be done reading from or
1343  * rendering to the buffer.
1344  *
1345  * This is used in the implementation of GL_ARB_map_buffer_range: The
1346  * user asks to create a buffer, then does a mapping, fills some
1347  * space, runs a drawing command, then asks to map it again without
1348  * synchronizing because it guarantees that it won't write over the
1349  * data that the GPU is busy using (or, more specifically, that if it
1350  * does write over the data, it acknowledges that rendering is
1351  * undefined).
1352  */
1353
1354 int drm_intel_gem_bo_map_unsynchronized(drm_intel_bo *bo)
1355 {
1356         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1357 #ifdef HAVE_VALGRIND
1358         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1359 #endif
1360         int ret;
1361
1362         /* If the CPU cache isn't coherent with the GTT, then use a
1363          * regular synchronized mapping.  The problem is that we don't
1364          * track where the buffer was last used on the CPU side in
1365          * terms of drm_intel_bo_map vs drm_intel_gem_bo_map_gtt, so
1366          * we would potentially corrupt the buffer even when the user
1367          * does reasonable things.
1368          */
1369         if (!bufmgr_gem->has_llc)
1370                 return drm_intel_gem_bo_map_gtt(bo);
1371
1372         pthread_mutex_lock(&bufmgr_gem->lock);
1373
1374         ret = map_gtt(bo);
1375         if (ret == 0) {
1376                 drm_intel_gem_bo_mark_mmaps_incoherent(bo);
1377                 VG(VALGRIND_MAKE_MEM_DEFINED(bo_gem->gtt_virtual, bo->size));
1378         }
1379
1380         pthread_mutex_unlock(&bufmgr_gem->lock);
1381
1382         return ret;
1383 }
1384
1385 static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
1386 {
1387         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1388         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1389         int ret = 0;
1390
1391         if (bo == NULL)
1392                 return 0;
1393
1394         pthread_mutex_lock(&bufmgr_gem->lock);
1395
1396         if (bo_gem->map_count <= 0) {
1397                 DBG("attempted to unmap an unmapped bo\n");
1398                 pthread_mutex_unlock(&bufmgr_gem->lock);
1399                 /* Preserve the old behaviour of just treating this as a
1400                  * no-op rather than reporting the error.
1401                  */
1402                 return 0;
1403         }
1404
1405         if (bo_gem->mapped_cpu_write) {
1406                 struct drm_i915_gem_sw_finish sw_finish;
1407
1408                 /* Cause a flush to happen if the buffer's pinned for
1409                  * scanout, so the results show up in a timely manner.
1410                  * Unlike GTT set domains, this only does work if the
1411                  * buffer should be scanout-related.
1412                  */
1413                 VG_CLEAR(sw_finish);
1414                 sw_finish.handle = bo_gem->gem_handle;
1415                 ret = drmIoctl(bufmgr_gem->fd,
1416                                DRM_IOCTL_I915_GEM_SW_FINISH,
1417                                &sw_finish);
1418                 ret = ret == -1 ? -errno : 0;
1419
1420                 bo_gem->mapped_cpu_write = false;
1421         }
1422
1423         /* We need to unmap after every innovation as we cannot track
1424          * an open vma for every bo as that will exhaasut the system
1425          * limits and cause later failures.
1426          */
1427         if (--bo_gem->map_count == 0) {
1428                 drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1429                 drm_intel_gem_bo_mark_mmaps_incoherent(bo);
1430                 bo->virtual = NULL;
1431         }
1432         pthread_mutex_unlock(&bufmgr_gem->lock);
1433
1434         return ret;
1435 }
1436
1437 int drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo)
1438 {
1439         return drm_intel_gem_bo_unmap(bo);
1440 }
1441
1442 static int
1443 drm_intel_gem_bo_subdata(drm_intel_bo *bo, unsigned long offset,
1444                          unsigned long size, const void *data)
1445 {
1446         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1447         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1448         struct drm_i915_gem_pwrite pwrite;
1449         int ret;
1450
1451         VG_CLEAR(pwrite);
1452         pwrite.handle = bo_gem->gem_handle;
1453         pwrite.offset = offset;
1454         pwrite.size = size;
1455         pwrite.data_ptr = (uint64_t) (uintptr_t) data;
1456         ret = drmIoctl(bufmgr_gem->fd,
1457                        DRM_IOCTL_I915_GEM_PWRITE,
1458                        &pwrite);
1459         if (ret != 0) {
1460                 ret = -errno;
1461                 DBG("%s:%d: Error writing data to buffer %d: (%d %d) %s .\n",
1462                     __FILE__, __LINE__, bo_gem->gem_handle, (int)offset,
1463                     (int)size, strerror(errno));
1464         }
1465
1466         return ret;
1467 }
1468
1469 static int
1470 drm_intel_gem_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, int crtc_id)
1471 {
1472         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1473         struct drm_i915_get_pipe_from_crtc_id get_pipe_from_crtc_id;
1474         int ret;
1475
1476         VG_CLEAR(get_pipe_from_crtc_id);
1477         get_pipe_from_crtc_id.crtc_id = crtc_id;
1478         ret = drmIoctl(bufmgr_gem->fd,
1479                        DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID,
1480                        &get_pipe_from_crtc_id);
1481         if (ret != 0) {
1482                 /* We return -1 here to signal that we don't
1483                  * know which pipe is associated with this crtc.
1484                  * This lets the caller know that this information
1485                  * isn't available; using the wrong pipe for
1486                  * vblank waiting can cause the chipset to lock up
1487                  */
1488                 return -1;
1489         }
1490
1491         return get_pipe_from_crtc_id.pipe;
1492 }
1493
1494 static int
1495 drm_intel_gem_bo_get_subdata(drm_intel_bo *bo, unsigned long offset,
1496                              unsigned long size, void *data)
1497 {
1498         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1499         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1500         struct drm_i915_gem_pread pread;
1501         int ret;
1502
1503         VG_CLEAR(pread);
1504         pread.handle = bo_gem->gem_handle;
1505         pread.offset = offset;
1506         pread.size = size;
1507         pread.data_ptr = (uint64_t) (uintptr_t) data;
1508         ret = drmIoctl(bufmgr_gem->fd,
1509                        DRM_IOCTL_I915_GEM_PREAD,
1510                        &pread);
1511         if (ret != 0) {
1512                 ret = -errno;
1513                 DBG("%s:%d: Error reading data from buffer %d: (%d %d) %s .\n",
1514                     __FILE__, __LINE__, bo_gem->gem_handle, (int)offset,
1515                     (int)size, strerror(errno));
1516         }
1517
1518         return ret;
1519 }
1520
1521 /** Waits for all GPU rendering with the object to have completed. */
1522 static void
1523 drm_intel_gem_bo_wait_rendering(drm_intel_bo *bo)
1524 {
1525         drm_intel_gem_bo_start_gtt_access(bo, 1);
1526 }
1527
1528 /**
1529  * Waits on a BO for the given amount of time.
1530  *
1531  * @bo: buffer object to wait for
1532  * @timeout_ns: amount of time to wait in nanoseconds.
1533  *   If value is less than 0, an infinite wait will occur.
1534  *
1535  * Returns 0 if the wait was successful ie. the last batch referencing the
1536  * object has completed within the allotted time. Otherwise some negative return
1537  * value describes the error. Of particular interest is -ETIME when the wait has
1538  * failed to yield the desired result.
1539  *
1540  * Similar to drm_intel_gem_bo_wait_rendering except a timeout parameter allows
1541  * the operation to give up after a certain amount of time. Another subtle
1542  * difference is the internal locking semantics are different (this variant does
1543  * not hold the lock for the duration of the wait). This makes the wait subject
1544  * to a larger userspace race window.
1545  *
1546  * The implementation shall wait until the object is no longer actively
1547  * referenced within a batch buffer at the time of the call. The wait will
1548  * not guarantee that the buffer is re-issued via another thread, or an flinked
1549  * handle. Userspace must make sure this race does not occur if such precision
1550  * is important.
1551  */
1552 int drm_intel_gem_bo_wait(drm_intel_bo *bo, int64_t timeout_ns)
1553 {
1554         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1555         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1556         struct drm_i915_gem_wait wait;
1557         int ret;
1558
1559         if (!bufmgr_gem->has_wait_timeout) {
1560                 DBG("%s:%d: Timed wait is not supported. Falling back to "
1561                     "infinite wait\n", __FILE__, __LINE__);
1562                 if (timeout_ns) {
1563                         drm_intel_gem_bo_wait_rendering(bo);
1564                         return 0;
1565                 } else {
1566                         return drm_intel_gem_bo_busy(bo) ? -ETIME : 0;
1567                 }
1568         }
1569
1570         wait.bo_handle = bo_gem->gem_handle;
1571         wait.timeout_ns = timeout_ns;
1572         wait.flags = 0;
1573         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_WAIT, &wait);
1574         if (ret == -1)
1575                 return -errno;
1576
1577         return ret;
1578 }
1579
1580 /**
1581  * Sets the object to the GTT read and possibly write domain, used by the X
1582  * 2D driver in the absence of kernel support to do drm_intel_gem_bo_map_gtt().
1583  *
1584  * In combination with drm_intel_gem_bo_pin() and manual fence management, we
1585  * can do tiled pixmaps this way.
1586  */
1587 void
1588 drm_intel_gem_bo_start_gtt_access(drm_intel_bo *bo, int write_enable)
1589 {
1590         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1591         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1592         struct drm_i915_gem_set_domain set_domain;
1593         int ret;
1594
1595         VG_CLEAR(set_domain);
1596         set_domain.handle = bo_gem->gem_handle;
1597         set_domain.read_domains = I915_GEM_DOMAIN_GTT;
1598         set_domain.write_domain = write_enable ? I915_GEM_DOMAIN_GTT : 0;
1599         ret = drmIoctl(bufmgr_gem->fd,
1600                        DRM_IOCTL_I915_GEM_SET_DOMAIN,
1601                        &set_domain);
1602         if (ret != 0) {
1603                 DBG("%s:%d: Error setting memory domains %d (%08x %08x): %s .\n",
1604                     __FILE__, __LINE__, bo_gem->gem_handle,
1605                     set_domain.read_domains, set_domain.write_domain,
1606                     strerror(errno));
1607         }
1608 }
1609
1610 static void
1611 drm_intel_bufmgr_gem_destroy(drm_intel_bufmgr *bufmgr)
1612 {
1613         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1614         int i;
1615
1616         free(bufmgr_gem->exec2_objects);
1617         free(bufmgr_gem->exec_objects);
1618         free(bufmgr_gem->exec_bos);
1619         free(bufmgr_gem->aub_filename);
1620
1621         pthread_mutex_destroy(&bufmgr_gem->lock);
1622
1623         /* Free any cached buffer objects we were going to reuse */
1624         for (i = 0; i < bufmgr_gem->num_buckets; i++) {
1625                 struct drm_intel_gem_bo_bucket *bucket =
1626                     &bufmgr_gem->cache_bucket[i];
1627                 drm_intel_bo_gem *bo_gem;
1628
1629                 while (!DRMLISTEMPTY(&bucket->head)) {
1630                         bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
1631                                               bucket->head.next, head);
1632                         DRMLISTDEL(&bo_gem->head);
1633
1634                         drm_intel_gem_bo_free(&bo_gem->bo);
1635                 }
1636         }
1637
1638         free(bufmgr);
1639 }
1640
1641 /**
1642  * Adds the target buffer to the validation list and adds the relocation
1643  * to the reloc_buffer's relocation list.
1644  *
1645  * The relocation entry at the given offset must already contain the
1646  * precomputed relocation value, because the kernel will optimize out
1647  * the relocation entry write when the buffer hasn't moved from the
1648  * last known offset in target_bo.
1649  */
1650 static int
1651 do_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
1652                  drm_intel_bo *target_bo, uint32_t target_offset,
1653                  uint32_t read_domains, uint32_t write_domain,
1654                  bool need_fence)
1655 {
1656         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1657         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1658         drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) target_bo;
1659         bool fenced_command;
1660
1661         if (bo_gem->has_error)
1662                 return -ENOMEM;
1663
1664         if (target_bo_gem->has_error) {
1665                 bo_gem->has_error = true;
1666                 return -ENOMEM;
1667         }
1668
1669         /* We never use HW fences for rendering on 965+ */
1670         if (bufmgr_gem->gen >= 4)
1671                 need_fence = false;
1672
1673         fenced_command = need_fence;
1674         if (target_bo_gem->tiling_mode == I915_TILING_NONE)
1675                 need_fence = false;
1676
1677         /* Create a new relocation list if needed */
1678         if (bo_gem->relocs == NULL && drm_intel_setup_reloc_list(bo))
1679                 return -ENOMEM;
1680
1681         /* Check overflow */
1682         assert(bo_gem->reloc_count < bufmgr_gem->max_relocs);
1683
1684         /* Check args */
1685         assert(offset <= bo->size - 4);
1686         assert((write_domain & (write_domain - 1)) == 0);
1687
1688         /* Make sure that we're not adding a reloc to something whose size has
1689          * already been accounted for.
1690          */
1691         assert(!bo_gem->used_as_reloc_target);
1692         if (target_bo_gem != bo_gem) {
1693                 target_bo_gem->used_as_reloc_target = true;
1694                 bo_gem->reloc_tree_size += target_bo_gem->reloc_tree_size;
1695         }
1696         /* An object needing a fence is a tiled buffer, so it won't have
1697          * relocs to other buffers.
1698          */
1699         if (need_fence)
1700                 target_bo_gem->reloc_tree_fences = 1;
1701         bo_gem->reloc_tree_fences += target_bo_gem->reloc_tree_fences;
1702
1703         bo_gem->relocs[bo_gem->reloc_count].offset = offset;
1704         bo_gem->relocs[bo_gem->reloc_count].delta = target_offset;
1705         bo_gem->relocs[bo_gem->reloc_count].target_handle =
1706             target_bo_gem->gem_handle;
1707         bo_gem->relocs[bo_gem->reloc_count].read_domains = read_domains;
1708         bo_gem->relocs[bo_gem->reloc_count].write_domain = write_domain;
1709         bo_gem->relocs[bo_gem->reloc_count].presumed_offset = target_bo->offset;
1710
1711         bo_gem->reloc_target_info[bo_gem->reloc_count].bo = target_bo;
1712         if (target_bo != bo)
1713                 drm_intel_gem_bo_reference(target_bo);
1714         if (fenced_command)
1715                 bo_gem->reloc_target_info[bo_gem->reloc_count].flags =
1716                         DRM_INTEL_RELOC_FENCE;
1717         else
1718                 bo_gem->reloc_target_info[bo_gem->reloc_count].flags = 0;
1719
1720         bo_gem->reloc_count++;
1721
1722         return 0;
1723 }
1724
1725 static int
1726 drm_intel_gem_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
1727                             drm_intel_bo *target_bo, uint32_t target_offset,
1728                             uint32_t read_domains, uint32_t write_domain)
1729 {
1730         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
1731
1732         return do_bo_emit_reloc(bo, offset, target_bo, target_offset,
1733                                 read_domains, write_domain,
1734                                 !bufmgr_gem->fenced_relocs);
1735 }
1736
1737 static int
1738 drm_intel_gem_bo_emit_reloc_fence(drm_intel_bo *bo, uint32_t offset,
1739                                   drm_intel_bo *target_bo,
1740                                   uint32_t target_offset,
1741                                   uint32_t read_domains, uint32_t write_domain)
1742 {
1743         return do_bo_emit_reloc(bo, offset, target_bo, target_offset,
1744                                 read_domains, write_domain, true);
1745 }
1746
1747 int
1748 drm_intel_gem_bo_get_reloc_count(drm_intel_bo *bo)
1749 {
1750         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1751
1752         return bo_gem->reloc_count;
1753 }
1754
1755 /**
1756  * Removes existing relocation entries in the BO after "start".
1757  *
1758  * This allows a user to avoid a two-step process for state setup with
1759  * counting up all the buffer objects and doing a
1760  * drm_intel_bufmgr_check_aperture_space() before emitting any of the
1761  * relocations for the state setup.  Instead, save the state of the
1762  * batchbuffer including drm_intel_gem_get_reloc_count(), emit all the
1763  * state, and then check if it still fits in the aperture.
1764  *
1765  * Any further drm_intel_bufmgr_check_aperture_space() queries
1766  * involving this buffer in the tree are undefined after this call.
1767  */
1768 void
1769 drm_intel_gem_bo_clear_relocs(drm_intel_bo *bo, int start)
1770 {
1771         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1772         int i;
1773         struct timespec time;
1774
1775         clock_gettime(CLOCK_MONOTONIC, &time);
1776
1777         assert(bo_gem->reloc_count >= start);
1778         /* Unreference the cleared target buffers */
1779         for (i = start; i < bo_gem->reloc_count; i++) {
1780                 drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->reloc_target_info[i].bo;
1781                 if (&target_bo_gem->bo != bo) {
1782                         bo_gem->reloc_tree_fences -= target_bo_gem->reloc_tree_fences;
1783                         drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo,
1784                                                                   time.tv_sec);
1785                 }
1786         }
1787         bo_gem->reloc_count = start;
1788 }
1789
1790 /**
1791  * Walk the tree of relocations rooted at BO and accumulate the list of
1792  * validations to be performed and update the relocation buffers with
1793  * index values into the validation list.
1794  */
1795 static void
1796 drm_intel_gem_bo_process_reloc(drm_intel_bo *bo)
1797 {
1798         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1799         int i;
1800
1801         if (bo_gem->relocs == NULL)
1802                 return;
1803
1804         for (i = 0; i < bo_gem->reloc_count; i++) {
1805                 drm_intel_bo *target_bo = bo_gem->reloc_target_info[i].bo;
1806
1807                 if (target_bo == bo)
1808                         continue;
1809
1810                 drm_intel_gem_bo_mark_mmaps_incoherent(bo);
1811
1812                 /* Continue walking the tree depth-first. */
1813                 drm_intel_gem_bo_process_reloc(target_bo);
1814
1815                 /* Add the target to the validate list */
1816                 drm_intel_add_validate_buffer(target_bo);
1817         }
1818 }
1819
1820 static void
1821 drm_intel_gem_bo_process_reloc2(drm_intel_bo *bo)
1822 {
1823         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
1824         int i;
1825
1826         if (bo_gem->relocs == NULL)
1827                 return;
1828
1829         for (i = 0; i < bo_gem->reloc_count; i++) {
1830                 drm_intel_bo *target_bo = bo_gem->reloc_target_info[i].bo;
1831                 int need_fence;
1832
1833                 if (target_bo == bo)
1834                         continue;
1835
1836                 drm_intel_gem_bo_mark_mmaps_incoherent(bo);
1837
1838                 /* Continue walking the tree depth-first. */
1839                 drm_intel_gem_bo_process_reloc2(target_bo);
1840
1841                 need_fence = (bo_gem->reloc_target_info[i].flags &
1842                               DRM_INTEL_RELOC_FENCE);
1843
1844                 /* Add the target to the validate list */
1845                 drm_intel_add_validate_buffer2(target_bo, need_fence);
1846         }
1847 }
1848
1849
1850 static void
1851 drm_intel_update_buffer_offsets(drm_intel_bufmgr_gem *bufmgr_gem)
1852 {
1853         int i;
1854
1855         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1856                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1857                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1858
1859                 /* Update the buffer offset */
1860                 if (bufmgr_gem->exec_objects[i].offset != bo->offset) {
1861                         DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n",
1862                             bo_gem->gem_handle, bo_gem->name, bo->offset,
1863                             (unsigned long long)bufmgr_gem->exec_objects[i].
1864                             offset);
1865                         bo->offset = bufmgr_gem->exec_objects[i].offset;
1866                 }
1867         }
1868 }
1869
1870 static void
1871 drm_intel_update_buffer_offsets2 (drm_intel_bufmgr_gem *bufmgr_gem)
1872 {
1873         int i;
1874
1875         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1876                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1877                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
1878
1879                 /* Update the buffer offset */
1880                 if (bufmgr_gem->exec2_objects[i].offset != bo->offset) {
1881                         DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n",
1882                             bo_gem->gem_handle, bo_gem->name, bo->offset,
1883                             (unsigned long long)bufmgr_gem->exec2_objects[i].offset);
1884                         bo->offset = bufmgr_gem->exec2_objects[i].offset;
1885                 }
1886         }
1887 }
1888
1889 static void
1890 aub_out(drm_intel_bufmgr_gem *bufmgr_gem, uint32_t data)
1891 {
1892         fwrite(&data, 1, 4, bufmgr_gem->aub_file);
1893 }
1894
1895 static void
1896 aub_out_data(drm_intel_bufmgr_gem *bufmgr_gem, void *data, size_t size)
1897 {
1898         fwrite(data, 1, size, bufmgr_gem->aub_file);
1899 }
1900
1901 static void
1902 aub_write_bo_data(drm_intel_bo *bo, uint32_t offset, uint32_t size)
1903 {
1904         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1905         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1906         uint32_t *data;
1907         unsigned int i;
1908
1909         data = malloc(bo->size);
1910         drm_intel_bo_get_subdata(bo, offset, size, data);
1911
1912         /* Easy mode: write out bo with no relocations */
1913         if (!bo_gem->reloc_count) {
1914                 aub_out_data(bufmgr_gem, data, size);
1915                 free(data);
1916                 return;
1917         }
1918
1919         /* Otherwise, handle the relocations while writing. */
1920         for (i = 0; i < size / 4; i++) {
1921                 int r;
1922                 for (r = 0; r < bo_gem->reloc_count; r++) {
1923                         struct drm_i915_gem_relocation_entry *reloc;
1924                         drm_intel_reloc_target *info;
1925
1926                         reloc = &bo_gem->relocs[r];
1927                         info = &bo_gem->reloc_target_info[r];
1928
1929                         if (reloc->offset == offset + i * 4) {
1930                                 drm_intel_bo_gem *target_gem;
1931                                 uint32_t val;
1932
1933                                 target_gem = (drm_intel_bo_gem *)info->bo;
1934
1935                                 val = reloc->delta;
1936                                 val += target_gem->aub_offset;
1937
1938                                 aub_out(bufmgr_gem, val);
1939                                 data[i] = val;
1940                                 break;
1941                         }
1942                 }
1943                 if (r == bo_gem->reloc_count) {
1944                         /* no relocation, just the data */
1945                         aub_out(bufmgr_gem, data[i]);
1946                 }
1947         }
1948
1949         free(data);
1950 }
1951
1952 static void
1953 aub_bo_get_address(drm_intel_bo *bo)
1954 {
1955         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1956         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1957
1958         /* Give the object a graphics address in the AUB file.  We
1959          * don't just use the GEM object address because we do AUB
1960          * dumping before execution -- we want to successfully log
1961          * when the hardware might hang, and we might even want to aub
1962          * capture for a driver trying to execute on a different
1963          * generation of hardware by disabling the actual kernel exec
1964          * call.
1965          */
1966         bo_gem->aub_offset = bufmgr_gem->aub_offset;
1967         bufmgr_gem->aub_offset += bo->size;
1968         /* XXX: Handle aperture overflow. */
1969         assert(bufmgr_gem->aub_offset < 256 * 1024 * 1024);
1970 }
1971
1972 static void
1973 aub_write_trace_block(drm_intel_bo *bo, uint32_t type, uint32_t subtype,
1974                       uint32_t offset, uint32_t size)
1975 {
1976         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1977         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1978
1979         aub_out(bufmgr_gem,
1980                 CMD_AUB_TRACE_HEADER_BLOCK |
1981                 ((bufmgr_gem->gen >= 8 ? 6 : 5) - 2));
1982         aub_out(bufmgr_gem,
1983                 AUB_TRACE_MEMTYPE_GTT | type | AUB_TRACE_OP_DATA_WRITE);
1984         aub_out(bufmgr_gem, subtype);
1985         aub_out(bufmgr_gem, bo_gem->aub_offset + offset);
1986         aub_out(bufmgr_gem, size);
1987         if (bufmgr_gem->gen >= 8)
1988                 aub_out(bufmgr_gem, 0);
1989         aub_write_bo_data(bo, offset, size);
1990 }
1991
1992 /**
1993  * Break up large objects into multiple writes.  Otherwise a 128kb VBO
1994  * would overflow the 16 bits of size field in the packet header and
1995  * everything goes badly after that.
1996  */
1997 static void
1998 aub_write_large_trace_block(drm_intel_bo *bo, uint32_t type, uint32_t subtype,
1999                             uint32_t offset, uint32_t size)
2000 {
2001         uint32_t block_size;
2002         uint32_t sub_offset;
2003
2004         for (sub_offset = 0; sub_offset < size; sub_offset += block_size) {
2005                 block_size = size - sub_offset;
2006
2007                 if (block_size > 8 * 4096)
2008                         block_size = 8 * 4096;
2009
2010                 aub_write_trace_block(bo, type, subtype, offset + sub_offset,
2011                                       block_size);
2012         }
2013 }
2014
2015 static void
2016 aub_write_bo(drm_intel_bo *bo)
2017 {
2018         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2019         uint32_t offset = 0;
2020         unsigned i;
2021
2022         aub_bo_get_address(bo);
2023
2024         /* Write out each annotated section separately. */
2025         for (i = 0; i < bo_gem->aub_annotation_count; ++i) {
2026                 drm_intel_aub_annotation *annotation =
2027                         &bo_gem->aub_annotations[i];
2028                 uint32_t ending_offset = annotation->ending_offset;
2029                 if (ending_offset > bo->size)
2030                         ending_offset = bo->size;
2031                 if (ending_offset > offset) {
2032                         aub_write_large_trace_block(bo, annotation->type,
2033                                                     annotation->subtype,
2034                                                     offset,
2035                                                     ending_offset - offset);
2036                         offset = ending_offset;
2037                 }
2038         }
2039
2040         /* Write out any remaining unannotated data */
2041         if (offset < bo->size) {
2042                 aub_write_large_trace_block(bo, AUB_TRACE_TYPE_NOTYPE, 0,
2043                                             offset, bo->size - offset);
2044         }
2045 }
2046
2047 /*
2048  * Make a ringbuffer on fly and dump it
2049  */
2050 static void
2051 aub_build_dump_ringbuffer(drm_intel_bufmgr_gem *bufmgr_gem,
2052                           uint32_t batch_buffer, int ring_flag)
2053 {
2054         uint32_t ringbuffer[4096];
2055         int ring = AUB_TRACE_TYPE_RING_PRB0; /* The default ring */
2056         int ring_count = 0;
2057
2058         if (ring_flag == I915_EXEC_BSD)
2059                 ring = AUB_TRACE_TYPE_RING_PRB1;
2060         else if (ring_flag == I915_EXEC_BLT)
2061                 ring = AUB_TRACE_TYPE_RING_PRB2;
2062
2063         /* Make a ring buffer to execute our batchbuffer. */
2064         memset(ringbuffer, 0, sizeof(ringbuffer));
2065         if (bufmgr_gem->gen >= 8) {
2066                 ringbuffer[ring_count++] = AUB_MI_BATCH_BUFFER_START | (3 - 2);
2067                 ringbuffer[ring_count++] = batch_buffer;
2068                 ringbuffer[ring_count++] = 0;
2069         } else {
2070                 ringbuffer[ring_count++] = AUB_MI_BATCH_BUFFER_START;
2071                 ringbuffer[ring_count++] = batch_buffer;
2072         }
2073
2074         /* Write out the ring.  This appears to trigger execution of
2075          * the ring in the simulator.
2076          */
2077         aub_out(bufmgr_gem,
2078                 CMD_AUB_TRACE_HEADER_BLOCK |
2079                 ((bufmgr_gem->gen >= 8 ? 6 : 5) - 2));
2080         aub_out(bufmgr_gem,
2081                 AUB_TRACE_MEMTYPE_GTT | ring | AUB_TRACE_OP_COMMAND_WRITE);
2082         aub_out(bufmgr_gem, 0); /* general/surface subtype */
2083         aub_out(bufmgr_gem, bufmgr_gem->aub_offset);
2084         aub_out(bufmgr_gem, ring_count * 4);
2085         if (bufmgr_gem->gen >= 8)
2086                 aub_out(bufmgr_gem, 0);
2087
2088         /* FIXME: Need some flush operations here? */
2089         aub_out_data(bufmgr_gem, ringbuffer, ring_count * 4);
2090
2091         /* Update offset pointer */
2092         bufmgr_gem->aub_offset += 4096;
2093 }
2094
2095 void
2096 drm_intel_gem_bo_aub_dump_bmp(drm_intel_bo *bo,
2097                               int x1, int y1, int width, int height,
2098                               enum aub_dump_bmp_format format,
2099                               int pitch, int offset)
2100 {
2101         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2102         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
2103         uint32_t cpp;
2104
2105         switch (format) {
2106         case AUB_DUMP_BMP_FORMAT_8BIT:
2107                 cpp = 1;
2108                 break;
2109         case AUB_DUMP_BMP_FORMAT_ARGB_4444:
2110                 cpp = 2;
2111                 break;
2112         case AUB_DUMP_BMP_FORMAT_ARGB_0888:
2113         case AUB_DUMP_BMP_FORMAT_ARGB_8888:
2114                 cpp = 4;
2115                 break;
2116         default:
2117                 printf("Unknown AUB dump format %d\n", format);
2118                 return;
2119         }
2120
2121         if (!bufmgr_gem->aub_file)
2122                 return;
2123
2124         aub_out(bufmgr_gem, CMD_AUB_DUMP_BMP | 4);
2125         aub_out(bufmgr_gem, (y1 << 16) | x1);
2126         aub_out(bufmgr_gem,
2127                 (format << 24) |
2128                 (cpp << 19) |
2129                 pitch / 4);
2130         aub_out(bufmgr_gem, (height << 16) | width);
2131         aub_out(bufmgr_gem, bo_gem->aub_offset + offset);
2132         aub_out(bufmgr_gem,
2133                 ((bo_gem->tiling_mode != I915_TILING_NONE) ? (1 << 2) : 0) |
2134                 ((bo_gem->tiling_mode == I915_TILING_Y) ? (1 << 3) : 0));
2135 }
2136
2137 static void
2138 aub_exec(drm_intel_bo *bo, int ring_flag, int used)
2139 {
2140         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2141         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2142         int i;
2143         bool batch_buffer_needs_annotations;
2144
2145         if (!bufmgr_gem->aub_file)
2146                 return;
2147
2148         /* If batch buffer is not annotated, annotate it the best we
2149          * can.
2150          */
2151         batch_buffer_needs_annotations = bo_gem->aub_annotation_count == 0;
2152         if (batch_buffer_needs_annotations) {
2153                 drm_intel_aub_annotation annotations[2] = {
2154                         { AUB_TRACE_TYPE_BATCH, 0, used },
2155                         { AUB_TRACE_TYPE_NOTYPE, 0, bo->size }
2156                 };
2157                 drm_intel_bufmgr_gem_set_aub_annotations(bo, annotations, 2);
2158         }
2159
2160         /* Write out all buffers to AUB memory */
2161         for (i = 0; i < bufmgr_gem->exec_count; i++) {
2162                 aub_write_bo(bufmgr_gem->exec_bos[i]);
2163         }
2164
2165         /* Remove any annotations we added */
2166         if (batch_buffer_needs_annotations)
2167                 drm_intel_bufmgr_gem_set_aub_annotations(bo, NULL, 0);
2168
2169         /* Dump ring buffer */
2170         aub_build_dump_ringbuffer(bufmgr_gem, bo_gem->aub_offset, ring_flag);
2171
2172         fflush(bufmgr_gem->aub_file);
2173
2174         /*
2175          * One frame has been dumped. So reset the aub_offset for the next frame.
2176          *
2177          * FIXME: Can we do this?
2178          */
2179         bufmgr_gem->aub_offset = 0x10000;
2180 }
2181
2182 static int
2183 drm_intel_gem_bo_exec(drm_intel_bo *bo, int used,
2184                       drm_clip_rect_t * cliprects, int num_cliprects, int DR4)
2185 {
2186         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2187         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2188         struct drm_i915_gem_execbuffer execbuf;
2189         int ret, i;
2190
2191         if (bo_gem->has_error)
2192                 return -ENOMEM;
2193
2194         pthread_mutex_lock(&bufmgr_gem->lock);
2195         /* Update indices and set up the validate list. */
2196         drm_intel_gem_bo_process_reloc(bo);
2197
2198         /* Add the batch buffer to the validation list.  There are no
2199          * relocations pointing to it.
2200          */
2201         drm_intel_add_validate_buffer(bo);
2202
2203         VG_CLEAR(execbuf);
2204         execbuf.buffers_ptr = (uintptr_t) bufmgr_gem->exec_objects;
2205         execbuf.buffer_count = bufmgr_gem->exec_count;
2206         execbuf.batch_start_offset = 0;
2207         execbuf.batch_len = used;
2208         execbuf.cliprects_ptr = (uintptr_t) cliprects;
2209         execbuf.num_cliprects = num_cliprects;
2210         execbuf.DR1 = 0;
2211         execbuf.DR4 = DR4;
2212
2213         ret = drmIoctl(bufmgr_gem->fd,
2214                        DRM_IOCTL_I915_GEM_EXECBUFFER,
2215                        &execbuf);
2216         if (ret != 0) {
2217                 ret = -errno;
2218                 if (errno == ENOSPC) {
2219                         DBG("Execbuffer fails to pin. "
2220                             "Estimate: %u. Actual: %u. Available: %u\n",
2221                             drm_intel_gem_estimate_batch_space(bufmgr_gem->exec_bos,
2222                                                                bufmgr_gem->
2223                                                                exec_count),
2224                             drm_intel_gem_compute_batch_space(bufmgr_gem->exec_bos,
2225                                                               bufmgr_gem->
2226                                                               exec_count),
2227                             (unsigned int)bufmgr_gem->gtt_size);
2228                 }
2229         }
2230         drm_intel_update_buffer_offsets(bufmgr_gem);
2231
2232         if (bufmgr_gem->bufmgr.debug)
2233                 drm_intel_gem_dump_validation_list(bufmgr_gem);
2234
2235         for (i = 0; i < bufmgr_gem->exec_count; i++) {
2236                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
2237                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2238
2239                 bo_gem->idle = false;
2240
2241                 /* Disconnect the buffer from the validate list */
2242                 bo_gem->validate_index = -1;
2243                 bufmgr_gem->exec_bos[i] = NULL;
2244         }
2245         bufmgr_gem->exec_count = 0;
2246         pthread_mutex_unlock(&bufmgr_gem->lock);
2247
2248         return ret;
2249 }
2250
2251 static int
2252 do_exec2(drm_intel_bo *bo, int used, drm_intel_context *ctx,
2253          drm_clip_rect_t *cliprects, int num_cliprects, int DR4,
2254          unsigned int flags)
2255 {
2256         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
2257         struct drm_i915_gem_execbuffer2 execbuf;
2258         int ret = 0;
2259         int i;
2260
2261         switch (flags & 0x7) {
2262         default:
2263                 return -EINVAL;
2264         case I915_EXEC_BLT:
2265                 if (!bufmgr_gem->has_blt)
2266                         return -EINVAL;
2267                 break;
2268         case I915_EXEC_BSD:
2269                 if (!bufmgr_gem->has_bsd)
2270                         return -EINVAL;
2271                 break;
2272         case I915_EXEC_VEBOX:
2273                 if (!bufmgr_gem->has_vebox)
2274                         return -EINVAL;
2275                 break;
2276         case I915_EXEC_RENDER:
2277         case I915_EXEC_DEFAULT:
2278                 break;
2279         }
2280
2281         pthread_mutex_lock(&bufmgr_gem->lock);
2282         /* Update indices and set up the validate list. */
2283         drm_intel_gem_bo_process_reloc2(bo);
2284
2285         /* Add the batch buffer to the validation list.  There are no relocations
2286          * pointing to it.
2287          */
2288         drm_intel_add_validate_buffer2(bo, 0);
2289
2290         VG_CLEAR(execbuf);
2291         execbuf.buffers_ptr = (uintptr_t)bufmgr_gem->exec2_objects;
2292         execbuf.buffer_count = bufmgr_gem->exec_count;
2293         execbuf.batch_start_offset = 0;
2294         execbuf.batch_len = used;
2295         execbuf.cliprects_ptr = (uintptr_t)cliprects;
2296         execbuf.num_cliprects = num_cliprects;
2297         execbuf.DR1 = 0;
2298         execbuf.DR4 = DR4;
2299         execbuf.flags = flags;
2300         if (ctx == NULL)
2301                 i915_execbuffer2_set_context_id(execbuf, 0);
2302         else
2303                 i915_execbuffer2_set_context_id(execbuf, ctx->ctx_id);
2304         execbuf.rsvd2 = 0;
2305
2306         aub_exec(bo, flags, used);
2307
2308         if (bufmgr_gem->no_exec)
2309                 goto skip_execution;
2310
2311         ret = drmIoctl(bufmgr_gem->fd,
2312                        DRM_IOCTL_I915_GEM_EXECBUFFER2,
2313                        &execbuf);
2314         if (ret != 0) {
2315                 ret = -errno;
2316                 if (ret == -ENOSPC) {
2317                         DBG("Execbuffer fails to pin. "
2318                             "Estimate: %u. Actual: %u. Available: %u\n",
2319                             drm_intel_gem_estimate_batch_space(bufmgr_gem->exec_bos,
2320                                                                bufmgr_gem->exec_count),
2321                             drm_intel_gem_compute_batch_space(bufmgr_gem->exec_bos,
2322                                                               bufmgr_gem->exec_count),
2323                             (unsigned int) bufmgr_gem->gtt_size);
2324                 }
2325         }
2326         drm_intel_update_buffer_offsets2(bufmgr_gem);
2327
2328 skip_execution:
2329         if (bufmgr_gem->bufmgr.debug)
2330                 drm_intel_gem_dump_validation_list(bufmgr_gem);
2331
2332         for (i = 0; i < bufmgr_gem->exec_count; i++) {
2333                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
2334                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
2335
2336                 bo_gem->idle = false;
2337
2338                 /* Disconnect the buffer from the validate list */
2339                 bo_gem->validate_index = -1;
2340                 bufmgr_gem->exec_bos[i] = NULL;
2341         }
2342         bufmgr_gem->exec_count = 0;
2343         pthread_mutex_unlock(&bufmgr_gem->lock);
2344
2345         return ret;
2346 }
2347
2348 static int
2349 drm_intel_gem_bo_exec2(drm_intel_bo *bo, int used,
2350                        drm_clip_rect_t *cliprects, int num_cliprects,
2351                        int DR4)
2352 {
2353         return do_exec2(bo, used, NULL, cliprects, num_cliprects, DR4,
2354                         I915_EXEC_RENDER);
2355 }
2356
2357 static int
2358 drm_intel_gem_bo_mrb_exec2(drm_intel_bo *bo, int used,
2359                         drm_clip_rect_t *cliprects, int num_cliprects, int DR4,
2360                         unsigned int flags)
2361 {
2362         return do_exec2(bo, used, NULL, cliprects, num_cliprects, DR4,
2363                         flags);
2364 }
2365
2366 int
2367 drm_intel_gem_bo_context_exec(drm_intel_bo *bo, drm_intel_context *ctx,
2368                               int used, unsigned int flags)
2369 {
2370         return do_exec2(bo, used, ctx, NULL, 0, 0, flags);
2371 }
2372
2373 static int
2374 drm_intel_gem_bo_pin(drm_intel_bo *bo, uint32_t alignment)
2375 {
2376         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2377         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2378         struct drm_i915_gem_pin pin;
2379         int ret;
2380
2381         VG_CLEAR(pin);
2382         pin.handle = bo_gem->gem_handle;
2383         pin.alignment = alignment;
2384
2385         ret = drmIoctl(bufmgr_gem->fd,
2386                        DRM_IOCTL_I915_GEM_PIN,
2387                        &pin);
2388         if (ret != 0)
2389                 return -errno;
2390
2391         bo->offset = pin.offset;
2392         return 0;
2393 }
2394
2395 static int
2396 drm_intel_gem_bo_unpin(drm_intel_bo *bo)
2397 {
2398         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2399         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2400         struct drm_i915_gem_unpin unpin;
2401         int ret;
2402
2403         VG_CLEAR(unpin);
2404         unpin.handle = bo_gem->gem_handle;
2405
2406         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_UNPIN, &unpin);
2407         if (ret != 0)
2408                 return -errno;
2409
2410         return 0;
2411 }
2412
2413 static int
2414 drm_intel_gem_bo_set_tiling_internal(drm_intel_bo *bo,
2415                                      uint32_t tiling_mode,
2416                                      uint32_t stride)
2417 {
2418         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2419         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2420         struct drm_i915_gem_set_tiling set_tiling;
2421         int ret;
2422
2423         if (bo_gem->global_name == 0 &&
2424             tiling_mode == bo_gem->tiling_mode &&
2425             stride == bo_gem->stride)
2426                 return 0;
2427
2428         memset(&set_tiling, 0, sizeof(set_tiling));
2429         do {
2430                 /* set_tiling is slightly broken and overwrites the
2431                  * input on the error path, so we have to open code
2432                  * rmIoctl.
2433                  */
2434                 set_tiling.handle = bo_gem->gem_handle;
2435                 set_tiling.tiling_mode = tiling_mode;
2436                 set_tiling.stride = stride;
2437
2438                 ret = ioctl(bufmgr_gem->fd,
2439                             DRM_IOCTL_I915_GEM_SET_TILING,
2440                             &set_tiling);
2441         } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
2442         if (ret == -1)
2443                 return -errno;
2444
2445         bo_gem->tiling_mode = set_tiling.tiling_mode;
2446         bo_gem->swizzle_mode = set_tiling.swizzle_mode;
2447         bo_gem->stride = set_tiling.stride;
2448         return 0;
2449 }
2450
2451 static int
2452 drm_intel_gem_bo_set_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
2453                             uint32_t stride)
2454 {
2455         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2456         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2457         int ret;
2458
2459         /* Linear buffers have no stride. By ensuring that we only ever use
2460          * stride 0 with linear buffers, we simplify our code.
2461          */
2462         if (*tiling_mode == I915_TILING_NONE)
2463                 stride = 0;
2464
2465         ret = drm_intel_gem_bo_set_tiling_internal(bo, *tiling_mode, stride);
2466         if (ret == 0)
2467                 drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
2468
2469         *tiling_mode = bo_gem->tiling_mode;
2470         return ret;
2471 }
2472
2473 static int
2474 drm_intel_gem_bo_get_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
2475                             uint32_t * swizzle_mode)
2476 {
2477         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2478
2479         *tiling_mode = bo_gem->tiling_mode;
2480         *swizzle_mode = bo_gem->swizzle_mode;
2481         return 0;
2482 }
2483
2484 drm_intel_bo *
2485 drm_intel_bo_gem_create_from_prime(drm_intel_bufmgr *bufmgr, int prime_fd, int size)
2486 {
2487         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
2488         int ret;
2489         uint32_t handle;
2490         drm_intel_bo_gem *bo_gem;
2491         struct drm_i915_gem_get_tiling get_tiling;
2492         drmMMListHead *list;
2493
2494         ret = drmPrimeFDToHandle(bufmgr_gem->fd, prime_fd, &handle);
2495
2496         /*
2497          * See if the kernel has already returned this buffer to us. Just as
2498          * for named buffers, we must not create two bo's pointing at the same
2499          * kernel object
2500          */
2501         for (list = bufmgr_gem->named.next;
2502              list != &bufmgr_gem->named;
2503              list = list->next) {
2504                 bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list);
2505                 if (bo_gem->gem_handle == handle) {
2506                         drm_intel_gem_bo_reference(&bo_gem->bo);
2507                         return &bo_gem->bo;
2508                 }
2509         }
2510
2511         if (ret) {
2512           fprintf(stderr,"ret is %d %d\n", ret, errno);
2513                 return NULL;
2514         }
2515
2516         bo_gem = calloc(1, sizeof(*bo_gem));
2517         if (!bo_gem)
2518                 return NULL;
2519
2520         /* Determine size of bo.  The fd-to-handle ioctl really should
2521          * return the size, but it doesn't.  If we have kernel 3.12 or
2522          * later, we can lseek on the prime fd to get the size.  Older
2523          * kernels will just fail, in which case we fall back to the
2524          * provided (estimated or guess size). */
2525         ret = lseek(prime_fd, 0, SEEK_END);
2526         if (ret != -1)
2527                 bo_gem->bo.size = ret;
2528         else
2529                 bo_gem->bo.size = size;
2530
2531         bo_gem->bo.handle = handle;
2532         bo_gem->bo.bufmgr = bufmgr;
2533
2534         bo_gem->gem_handle = handle;
2535
2536         atomic_set(&bo_gem->refcount, 1);
2537
2538         bo_gem->name = "prime";
2539         bo_gem->validate_index = -1;
2540         bo_gem->reloc_tree_fences = 0;
2541         bo_gem->used_as_reloc_target = false;
2542         bo_gem->has_error = false;
2543         bo_gem->reusable = false;
2544
2545         DRMINITLISTHEAD(&bo_gem->vma_list);
2546         DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
2547
2548         VG_CLEAR(get_tiling);
2549         get_tiling.handle = bo_gem->gem_handle;
2550         ret = drmIoctl(bufmgr_gem->fd,
2551                        DRM_IOCTL_I915_GEM_GET_TILING,
2552                        &get_tiling);
2553         if (ret != 0) {
2554                 drm_intel_gem_bo_unreference(&bo_gem->bo);
2555                 return NULL;
2556         }
2557         bo_gem->tiling_mode = get_tiling.tiling_mode;
2558         bo_gem->swizzle_mode = get_tiling.swizzle_mode;
2559         /* XXX stride is unknown */
2560         drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
2561
2562         return &bo_gem->bo;
2563 }
2564
2565 int
2566 drm_intel_bo_gem_export_to_prime(drm_intel_bo *bo, int *prime_fd)
2567 {
2568         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2569         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2570
2571         if (DRMLISTEMPTY(&bo_gem->name_list))
2572                 DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
2573
2574         if (drmPrimeHandleToFD(bufmgr_gem->fd, bo_gem->gem_handle,
2575                                DRM_CLOEXEC, prime_fd) != 0)
2576                 return -errno;
2577
2578         bo_gem->reusable = false;
2579
2580         return 0;
2581 }
2582
2583 static int
2584 drm_intel_gem_bo_flink(drm_intel_bo *bo, uint32_t * name)
2585 {
2586         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2587         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2588         int ret;
2589
2590         if (!bo_gem->global_name) {
2591                 struct drm_gem_flink flink;
2592
2593                 VG_CLEAR(flink);
2594                 flink.handle = bo_gem->gem_handle;
2595
2596                 ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink);
2597                 if (ret != 0)
2598                         return -errno;
2599
2600                 bo_gem->global_name = flink.name;
2601                 bo_gem->reusable = false;
2602
2603                 if (DRMLISTEMPTY(&bo_gem->name_list))
2604                         DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
2605         }
2606
2607         *name = bo_gem->global_name;
2608         return 0;
2609 }
2610
2611 /**
2612  * Enables unlimited caching of buffer objects for reuse.
2613  *
2614  * This is potentially very memory expensive, as the cache at each bucket
2615  * size is only bounded by how many buffers of that size we've managed to have
2616  * in flight at once.
2617  */
2618 void
2619 drm_intel_bufmgr_gem_enable_reuse(drm_intel_bufmgr *bufmgr)
2620 {
2621         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
2622
2623         bufmgr_gem->bo_reuse = true;
2624 }
2625
2626 /**
2627  * Enable use of fenced reloc type.
2628  *
2629  * New code should enable this to avoid unnecessary fence register
2630  * allocation.  If this option is not enabled, all relocs will have fence
2631  * register allocated.
2632  */
2633 void
2634 drm_intel_bufmgr_gem_enable_fenced_relocs(drm_intel_bufmgr *bufmgr)
2635 {
2636         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
2637
2638         if (bufmgr_gem->bufmgr.bo_exec == drm_intel_gem_bo_exec2)
2639                 bufmgr_gem->fenced_relocs = true;
2640 }
2641
2642 /**
2643  * Return the additional aperture space required by the tree of buffer objects
2644  * rooted at bo.
2645  */
2646 static int
2647 drm_intel_gem_bo_get_aperture_space(drm_intel_bo *bo)
2648 {
2649         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2650         int i;
2651         int total = 0;
2652
2653         if (bo == NULL || bo_gem->included_in_check_aperture)
2654                 return 0;
2655
2656         total += bo->size;
2657         bo_gem->included_in_check_aperture = true;
2658
2659         for (i = 0; i < bo_gem->reloc_count; i++)
2660                 total +=
2661                     drm_intel_gem_bo_get_aperture_space(bo_gem->
2662                                                         reloc_target_info[i].bo);
2663
2664         return total;
2665 }
2666
2667 /**
2668  * Count the number of buffers in this list that need a fence reg
2669  *
2670  * If the count is greater than the number of available regs, we'll have
2671  * to ask the caller to resubmit a batch with fewer tiled buffers.
2672  *
2673  * This function over-counts if the same buffer is used multiple times.
2674  */
2675 static unsigned int
2676 drm_intel_gem_total_fences(drm_intel_bo ** bo_array, int count)
2677 {
2678         int i;
2679         unsigned int total = 0;
2680
2681         for (i = 0; i < count; i++) {
2682                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo_array[i];
2683
2684                 if (bo_gem == NULL)
2685                         continue;
2686
2687                 total += bo_gem->reloc_tree_fences;
2688         }
2689         return total;
2690 }
2691
2692 /**
2693  * Clear the flag set by drm_intel_gem_bo_get_aperture_space() so we're ready
2694  * for the next drm_intel_bufmgr_check_aperture_space() call.
2695  */
2696 static void
2697 drm_intel_gem_bo_clear_aperture_space_flag(drm_intel_bo *bo)
2698 {
2699         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2700         int i;
2701
2702         if (bo == NULL || !bo_gem->included_in_check_aperture)
2703                 return;
2704
2705         bo_gem->included_in_check_aperture = false;
2706
2707         for (i = 0; i < bo_gem->reloc_count; i++)
2708                 drm_intel_gem_bo_clear_aperture_space_flag(bo_gem->
2709                                                            reloc_target_info[i].bo);
2710 }
2711
2712 /**
2713  * Return a conservative estimate for the amount of aperture required
2714  * for a collection of buffers. This may double-count some buffers.
2715  */
2716 static unsigned int
2717 drm_intel_gem_estimate_batch_space(drm_intel_bo **bo_array, int count)
2718 {
2719         int i;
2720         unsigned int total = 0;
2721
2722         for (i = 0; i < count; i++) {
2723                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo_array[i];
2724                 if (bo_gem != NULL)
2725                         total += bo_gem->reloc_tree_size;
2726         }
2727         return total;
2728 }
2729
2730 /**
2731  * Return the amount of aperture needed for a collection of buffers.
2732  * This avoids double counting any buffers, at the cost of looking
2733  * at every buffer in the set.
2734  */
2735 static unsigned int
2736 drm_intel_gem_compute_batch_space(drm_intel_bo **bo_array, int count)
2737 {
2738         int i;
2739         unsigned int total = 0;
2740
2741         for (i = 0; i < count; i++) {
2742                 total += drm_intel_gem_bo_get_aperture_space(bo_array[i]);
2743                 /* For the first buffer object in the array, we get an
2744                  * accurate count back for its reloc_tree size (since nothing
2745                  * had been flagged as being counted yet).  We can save that
2746                  * value out as a more conservative reloc_tree_size that
2747                  * avoids double-counting target buffers.  Since the first
2748                  * buffer happens to usually be the batch buffer in our
2749                  * callers, this can pull us back from doing the tree
2750                  * walk on every new batch emit.
2751                  */
2752                 if (i == 0) {
2753                         drm_intel_bo_gem *bo_gem =
2754                             (drm_intel_bo_gem *) bo_array[i];
2755                         bo_gem->reloc_tree_size = total;
2756                 }
2757         }
2758
2759         for (i = 0; i < count; i++)
2760                 drm_intel_gem_bo_clear_aperture_space_flag(bo_array[i]);
2761         return total;
2762 }
2763
2764 /**
2765  * Return -1 if the batchbuffer should be flushed before attempting to
2766  * emit rendering referencing the buffers pointed to by bo_array.
2767  *
2768  * This is required because if we try to emit a batchbuffer with relocations
2769  * to a tree of buffers that won't simultaneously fit in the aperture,
2770  * the rendering will return an error at a point where the software is not
2771  * prepared to recover from it.
2772  *
2773  * However, we also want to emit the batchbuffer significantly before we reach
2774  * the limit, as a series of batchbuffers each of which references buffers
2775  * covering almost all of the aperture means that at each emit we end up
2776  * waiting to evict a buffer from the last rendering, and we get synchronous
2777  * performance.  By emitting smaller batchbuffers, we eat some CPU overhead to
2778  * get better parallelism.
2779  */
2780 static int
2781 drm_intel_gem_check_aperture_space(drm_intel_bo **bo_array, int count)
2782 {
2783         drm_intel_bufmgr_gem *bufmgr_gem =
2784             (drm_intel_bufmgr_gem *) bo_array[0]->bufmgr;
2785         unsigned int total = 0;
2786         unsigned int threshold = bufmgr_gem->gtt_size * 3 / 4;
2787         int total_fences;
2788
2789         /* Check for fence reg constraints if necessary */
2790         if (bufmgr_gem->available_fences) {
2791                 total_fences = drm_intel_gem_total_fences(bo_array, count);
2792                 if (total_fences > bufmgr_gem->available_fences)
2793                         return -ENOSPC;
2794         }
2795
2796         total = drm_intel_gem_estimate_batch_space(bo_array, count);
2797
2798         if (total > threshold)
2799                 total = drm_intel_gem_compute_batch_space(bo_array, count);
2800
2801         if (total > threshold) {
2802                 DBG("check_space: overflowed available aperture, "
2803                     "%dkb vs %dkb\n",
2804                     total / 1024, (int)bufmgr_gem->gtt_size / 1024);
2805                 return -ENOSPC;
2806         } else {
2807                 DBG("drm_check_space: total %dkb vs bufgr %dkb\n", total / 1024,
2808                     (int)bufmgr_gem->gtt_size / 1024);
2809                 return 0;
2810         }
2811 }
2812
2813 /*
2814  * Disable buffer reuse for objects which are shared with the kernel
2815  * as scanout buffers
2816  */
2817 static int
2818 drm_intel_gem_bo_disable_reuse(drm_intel_bo *bo)
2819 {
2820         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2821
2822         bo_gem->reusable = false;
2823         return 0;
2824 }
2825
2826 static int
2827 drm_intel_gem_bo_is_reusable(drm_intel_bo *bo)
2828 {
2829         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2830
2831         return bo_gem->reusable;
2832 }
2833
2834 static int
2835 _drm_intel_gem_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo)
2836 {
2837         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2838         int i;
2839
2840         for (i = 0; i < bo_gem->reloc_count; i++) {
2841                 if (bo_gem->reloc_target_info[i].bo == target_bo)
2842                         return 1;
2843                 if (bo == bo_gem->reloc_target_info[i].bo)
2844                         continue;
2845                 if (_drm_intel_gem_bo_references(bo_gem->reloc_target_info[i].bo,
2846                                                 target_bo))
2847                         return 1;
2848         }
2849
2850         return 0;
2851 }
2852
2853 /** Return true if target_bo is referenced by bo's relocation tree. */
2854 static int
2855 drm_intel_gem_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo)
2856 {
2857         drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) target_bo;
2858
2859         if (bo == NULL || target_bo == NULL)
2860                 return 0;
2861         if (target_bo_gem->used_as_reloc_target)
2862                 return _drm_intel_gem_bo_references(bo, target_bo);
2863         return 0;
2864 }
2865
2866 static void
2867 add_bucket(drm_intel_bufmgr_gem *bufmgr_gem, int size)
2868 {
2869         unsigned int i = bufmgr_gem->num_buckets;
2870
2871         assert(i < ARRAY_SIZE(bufmgr_gem->cache_bucket));
2872
2873         DRMINITLISTHEAD(&bufmgr_gem->cache_bucket[i].head);
2874         bufmgr_gem->cache_bucket[i].size = size;
2875         bufmgr_gem->num_buckets++;
2876 }
2877
2878 static void
2879 init_cache_buckets(drm_intel_bufmgr_gem *bufmgr_gem)
2880 {
2881         unsigned long size, cache_max_size = 64 * 1024 * 1024;
2882
2883         /* OK, so power of two buckets was too wasteful of memory.
2884          * Give 3 other sizes between each power of two, to hopefully
2885          * cover things accurately enough.  (The alternative is
2886          * probably to just go for exact matching of sizes, and assume
2887          * that for things like composited window resize the tiled
2888          * width/height alignment and rounding of sizes to pages will
2889          * get us useful cache hit rates anyway)
2890          */
2891         add_bucket(bufmgr_gem, 4096);
2892         add_bucket(bufmgr_gem, 4096 * 2);
2893         add_bucket(bufmgr_gem, 4096 * 3);
2894
2895         /* Initialize the linked lists for BO reuse cache. */
2896         for (size = 4 * 4096; size <= cache_max_size; size *= 2) {
2897                 add_bucket(bufmgr_gem, size);
2898
2899                 add_bucket(bufmgr_gem, size + size * 1 / 4);
2900                 add_bucket(bufmgr_gem, size + size * 2 / 4);
2901                 add_bucket(bufmgr_gem, size + size * 3 / 4);
2902         }
2903 }
2904
2905 void
2906 drm_intel_bufmgr_gem_set_vma_cache_size(drm_intel_bufmgr *bufmgr, int limit)
2907 {
2908         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
2909
2910         bufmgr_gem->vma_max = limit;
2911
2912         drm_intel_gem_bo_purge_vma_cache(bufmgr_gem);
2913 }
2914
2915 /**
2916  * Get the PCI ID for the device.  This can be overridden by setting the
2917  * INTEL_DEVID_OVERRIDE environment variable to the desired ID.
2918  */
2919 static int
2920 get_pci_device_id(drm_intel_bufmgr_gem *bufmgr_gem)
2921 {
2922         char *devid_override;
2923         int devid;
2924         int ret;
2925         drm_i915_getparam_t gp;
2926
2927         if (geteuid() == getuid()) {
2928                 devid_override = getenv("INTEL_DEVID_OVERRIDE");
2929                 if (devid_override) {
2930                         bufmgr_gem->no_exec = true;
2931                         return strtod(devid_override, NULL);
2932                 }
2933         }
2934
2935         VG_CLEAR(devid);
2936         VG_CLEAR(gp);
2937         gp.param = I915_PARAM_CHIPSET_ID;
2938         gp.value = &devid;
2939         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2940         if (ret) {
2941                 fprintf(stderr, "get chip id failed: %d [%d]\n", ret, errno);
2942                 fprintf(stderr, "param: %d, val: %d\n", gp.param, *gp.value);
2943         }
2944         return devid;
2945 }
2946
2947 int
2948 drm_intel_bufmgr_gem_get_devid(drm_intel_bufmgr *bufmgr)
2949 {
2950         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
2951
2952         return bufmgr_gem->pci_device;
2953 }
2954
2955 /**
2956  * Sets the AUB filename.
2957  *
2958  * This function has to be called before drm_intel_bufmgr_gem_set_aub_dump()
2959  * for it to have any effect.
2960  */
2961 void
2962 drm_intel_bufmgr_gem_set_aub_filename(drm_intel_bufmgr *bufmgr,
2963                                       const char *filename)
2964 {
2965         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
2966
2967         free(bufmgr_gem->aub_filename);
2968         if (filename)
2969                 bufmgr_gem->aub_filename = strdup(filename);
2970 }
2971
2972 /**
2973  * Sets up AUB dumping.
2974  *
2975  * This is a trace file format that can be used with the simulator.
2976  * Packets are emitted in a format somewhat like GPU command packets.
2977  * You can set up a GTT and upload your objects into the referenced
2978  * space, then send off batchbuffers and get BMPs out the other end.
2979  */
2980 void
2981 drm_intel_bufmgr_gem_set_aub_dump(drm_intel_bufmgr *bufmgr, int enable)
2982 {
2983         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
2984         int entry = 0x200003;
2985         int i;
2986         int gtt_size = 0x10000;
2987         const char *filename;
2988
2989         if (!enable) {
2990                 if (bufmgr_gem->aub_file) {
2991                         fclose(bufmgr_gem->aub_file);
2992                         bufmgr_gem->aub_file = NULL;
2993                 }
2994                 return;
2995         }
2996
2997         if (geteuid() != getuid())
2998                 return;
2999
3000         if (bufmgr_gem->aub_filename)
3001                 filename = bufmgr_gem->aub_filename;
3002         else
3003                 filename = "intel.aub";
3004         bufmgr_gem->aub_file = fopen(filename, "w+");
3005         if (!bufmgr_gem->aub_file)
3006                 return;
3007
3008         /* Start allocating objects from just after the GTT. */
3009         bufmgr_gem->aub_offset = gtt_size;
3010
3011         /* Start with a (required) version packet. */
3012         aub_out(bufmgr_gem, CMD_AUB_HEADER | (13 - 2));
3013         aub_out(bufmgr_gem,
3014                 (4 << AUB_HEADER_MAJOR_SHIFT) |
3015                 (0 << AUB_HEADER_MINOR_SHIFT));
3016         for (i = 0; i < 8; i++) {
3017                 aub_out(bufmgr_gem, 0); /* app name */
3018         }
3019         aub_out(bufmgr_gem, 0); /* timestamp */
3020         aub_out(bufmgr_gem, 0); /* timestamp */
3021         aub_out(bufmgr_gem, 0); /* comment len */
3022
3023         /* Set up the GTT. The max we can handle is 256M */
3024         aub_out(bufmgr_gem, CMD_AUB_TRACE_HEADER_BLOCK | ((bufmgr_gem->gen >= 8 ? 6 : 5) - 2));
3025         aub_out(bufmgr_gem, AUB_TRACE_MEMTYPE_NONLOCAL | 0 | AUB_TRACE_OP_DATA_WRITE);
3026         aub_out(bufmgr_gem, 0); /* subtype */
3027         aub_out(bufmgr_gem, 0); /* offset */
3028         aub_out(bufmgr_gem, gtt_size); /* size */
3029         if (bufmgr_gem->gen >= 8)
3030                 aub_out(bufmgr_gem, 0);
3031         for (i = 0x000; i < gtt_size; i += 4, entry += 0x1000) {
3032                 aub_out(bufmgr_gem, entry);
3033         }
3034 }
3035
3036 drm_intel_context *
3037 drm_intel_gem_context_create(drm_intel_bufmgr *bufmgr)
3038 {
3039         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
3040         struct drm_i915_gem_context_create create;
3041         drm_intel_context *context = NULL;
3042         int ret;
3043
3044         context = calloc(1, sizeof(*context));
3045         if (!context)
3046                 return NULL;
3047
3048         VG_CLEAR(create);
3049         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create);
3050         if (ret != 0) {
3051                 DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE failed: %s\n",
3052                     strerror(errno));
3053                 free(context);
3054                 return NULL;
3055         }
3056
3057         context->ctx_id = create.ctx_id;
3058         context->bufmgr = bufmgr;
3059
3060         return context;
3061 }
3062
3063 void
3064 drm_intel_gem_context_destroy(drm_intel_context *ctx)
3065 {
3066         drm_intel_bufmgr_gem *bufmgr_gem;
3067         struct drm_i915_gem_context_destroy destroy;
3068         int ret;
3069
3070         if (ctx == NULL)
3071                 return;
3072
3073         VG_CLEAR(destroy);
3074
3075         bufmgr_gem = (drm_intel_bufmgr_gem *)ctx->bufmgr;
3076         destroy.ctx_id = ctx->ctx_id;
3077         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_CONTEXT_DESTROY,
3078                        &destroy);
3079         if (ret != 0)
3080                 fprintf(stderr, "DRM_IOCTL_I915_GEM_CONTEXT_DESTROY failed: %s\n",
3081                         strerror(errno));
3082
3083         free(ctx);
3084 }
3085
3086 int
3087 drm_intel_get_reset_stats(drm_intel_context *ctx,
3088                           uint32_t *reset_count,
3089                           uint32_t *active,
3090                           uint32_t *pending)
3091 {
3092         drm_intel_bufmgr_gem *bufmgr_gem;
3093         struct drm_i915_reset_stats stats;
3094         int ret;
3095
3096         if (ctx == NULL)
3097                 return -EINVAL;
3098
3099         memset(&stats, 0, sizeof(stats));
3100
3101         bufmgr_gem = (drm_intel_bufmgr_gem *)ctx->bufmgr;
3102         stats.ctx_id = ctx->ctx_id;
3103         ret = drmIoctl(bufmgr_gem->fd,
3104                        DRM_IOCTL_I915_GET_RESET_STATS,
3105                        &stats);
3106         if (ret == 0) {
3107                 if (reset_count != NULL)
3108                         *reset_count = stats.reset_count;
3109
3110                 if (active != NULL)
3111                         *active = stats.batch_active;
3112
3113                 if (pending != NULL)
3114                         *pending = stats.batch_pending;
3115         }
3116
3117         return ret;
3118 }
3119
3120 int
3121 drm_intel_reg_read(drm_intel_bufmgr *bufmgr,
3122                    uint32_t offset,
3123                    uint64_t *result)
3124 {
3125         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
3126         struct drm_i915_reg_read reg_read;
3127         int ret;
3128
3129         VG_CLEAR(reg_read);
3130         reg_read.offset = offset;
3131
3132         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_REG_READ, &reg_read);
3133
3134         *result = reg_read.val;
3135         return ret;
3136 }
3137
3138
3139 /**
3140  * Annotate the given bo for use in aub dumping.
3141  *
3142  * \param annotations is an array of drm_intel_aub_annotation objects
3143  * describing the type of data in various sections of the bo.  Each
3144  * element of the array specifies the type and subtype of a section of
3145  * the bo, and the past-the-end offset of that section.  The elements
3146  * of \c annotations must be sorted so that ending_offset is
3147  * increasing.
3148  *
3149  * \param count is the number of elements in the \c annotations array.
3150  * If \c count is zero, then \c annotations will not be dereferenced.
3151  *
3152  * Annotations are copied into a private data structure, so caller may
3153  * re-use the memory pointed to by \c annotations after the call
3154  * returns.
3155  *
3156  * Annotations are stored for the lifetime of the bo; to reset to the
3157  * default state (no annotations), call this function with a \c count
3158  * of zero.
3159  */
3160 void
3161 drm_intel_bufmgr_gem_set_aub_annotations(drm_intel_bo *bo,
3162                                          drm_intel_aub_annotation *annotations,
3163                                          unsigned count)
3164 {
3165         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
3166         unsigned size = sizeof(*annotations) * count;
3167         drm_intel_aub_annotation *new_annotations =
3168                 count > 0 ? realloc(bo_gem->aub_annotations, size) : NULL;
3169         if (new_annotations == NULL) {
3170                 free(bo_gem->aub_annotations);
3171                 bo_gem->aub_annotations = NULL;
3172                 bo_gem->aub_annotation_count = 0;
3173                 return;
3174         }
3175         memcpy(new_annotations, annotations, size);
3176         bo_gem->aub_annotations = new_annotations;
3177         bo_gem->aub_annotation_count = count;
3178 }
3179
3180 /**
3181  * Initializes the GEM buffer manager, which uses the kernel to allocate, map,
3182  * and manage map buffer objections.
3183  *
3184  * \param fd File descriptor of the opened DRM device.
3185  */
3186 drm_intel_bufmgr *
3187 drm_intel_bufmgr_gem_init(int fd, int batch_size)
3188 {
3189         drm_intel_bufmgr_gem *bufmgr_gem;
3190         struct drm_i915_gem_get_aperture aperture;
3191         drm_i915_getparam_t gp;
3192         int ret, tmp;
3193         bool exec2 = false;
3194
3195         bufmgr_gem = calloc(1, sizeof(*bufmgr_gem));
3196         if (bufmgr_gem == NULL)
3197                 return NULL;
3198
3199         bufmgr_gem->fd = fd;
3200
3201         if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) {
3202                 free(bufmgr_gem);
3203                 return NULL;
3204         }
3205
3206         ret = drmIoctl(bufmgr_gem->fd,
3207                        DRM_IOCTL_I915_GEM_GET_APERTURE,
3208                        &aperture);
3209
3210         if (ret == 0)
3211                 bufmgr_gem->gtt_size = aperture.aper_available_size;
3212         else {
3213                 fprintf(stderr, "DRM_IOCTL_I915_GEM_APERTURE failed: %s\n",
3214                         strerror(errno));
3215                 bufmgr_gem->gtt_size = 128 * 1024 * 1024;
3216                 fprintf(stderr, "Assuming %dkB available aperture size.\n"
3217                         "May lead to reduced performance or incorrect "
3218                         "rendering.\n",
3219                         (int)bufmgr_gem->gtt_size / 1024);
3220         }
3221
3222         bufmgr_gem->pci_device = get_pci_device_id(bufmgr_gem);
3223
3224         if (IS_GEN2(bufmgr_gem->pci_device))
3225                 bufmgr_gem->gen = 2;
3226         else if (IS_GEN3(bufmgr_gem->pci_device))
3227                 bufmgr_gem->gen = 3;
3228         else if (IS_GEN4(bufmgr_gem->pci_device))
3229                 bufmgr_gem->gen = 4;
3230         else if (IS_GEN5(bufmgr_gem->pci_device))
3231                 bufmgr_gem->gen = 5;
3232         else if (IS_GEN6(bufmgr_gem->pci_device))
3233                 bufmgr_gem->gen = 6;
3234         else if (IS_GEN7(bufmgr_gem->pci_device))
3235                 bufmgr_gem->gen = 7;
3236         else if (IS_GEN8(bufmgr_gem->pci_device))
3237                 bufmgr_gem->gen = 8;
3238         else {
3239                 free(bufmgr_gem);
3240                 return NULL;
3241         }
3242
3243         if (IS_GEN3(bufmgr_gem->pci_device) &&
3244             bufmgr_gem->gtt_size > 256*1024*1024) {
3245                 /* The unmappable part of gtt on gen 3 (i.e. above 256MB) can't
3246                  * be used for tiled blits. To simplify the accounting, just
3247                  * substract the unmappable part (fixed to 256MB on all known
3248                  * gen3 devices) if the kernel advertises it. */
3249                 bufmgr_gem->gtt_size -= 256*1024*1024;
3250         }
3251
3252         VG_CLEAR(gp);
3253         gp.value = &tmp;
3254
3255         gp.param = I915_PARAM_HAS_EXECBUF2;
3256         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3257         if (!ret)
3258                 exec2 = true;
3259
3260         gp.param = I915_PARAM_HAS_BSD;
3261         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3262         bufmgr_gem->has_bsd = ret == 0;
3263
3264         gp.param = I915_PARAM_HAS_BLT;
3265         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3266         bufmgr_gem->has_blt = ret == 0;
3267
3268         gp.param = I915_PARAM_HAS_RELAXED_FENCING;
3269         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3270         bufmgr_gem->has_relaxed_fencing = ret == 0;
3271
3272         gp.param = I915_PARAM_HAS_WAIT_TIMEOUT;
3273         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3274         bufmgr_gem->has_wait_timeout = ret == 0;
3275
3276         gp.param = I915_PARAM_HAS_LLC;
3277         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3278         if (ret != 0) {
3279                 /* Kernel does not supports HAS_LLC query, fallback to GPU
3280                  * generation detection and assume that we have LLC on GEN6/7
3281                  */
3282                 bufmgr_gem->has_llc = (IS_GEN6(bufmgr_gem->pci_device) |
3283                                 IS_GEN7(bufmgr_gem->pci_device));
3284         } else
3285                 bufmgr_gem->has_llc = *gp.value;
3286
3287         gp.param = I915_PARAM_HAS_VEBOX;
3288         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3289         bufmgr_gem->has_vebox = (ret == 0) & (*gp.value > 0);
3290
3291         if (bufmgr_gem->gen < 4) {
3292                 gp.param = I915_PARAM_NUM_FENCES_AVAIL;
3293                 gp.value = &bufmgr_gem->available_fences;
3294                 ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3295                 if (ret) {
3296                         fprintf(stderr, "get fences failed: %d [%d]\n", ret,
3297                                 errno);
3298                         fprintf(stderr, "param: %d, val: %d\n", gp.param,
3299                                 *gp.value);
3300                         bufmgr_gem->available_fences = 0;
3301                 } else {
3302                         /* XXX The kernel reports the total number of fences,
3303                          * including any that may be pinned.
3304                          *
3305                          * We presume that there will be at least one pinned
3306                          * fence for the scanout buffer, but there may be more
3307                          * than one scanout and the user may be manually
3308                          * pinning buffers. Let's move to execbuffer2 and
3309                          * thereby forget the insanity of using fences...
3310                          */
3311                         bufmgr_gem->available_fences -= 2;
3312                         if (bufmgr_gem->available_fences < 0)
3313                                 bufmgr_gem->available_fences = 0;
3314                 }
3315         }
3316
3317         /* Let's go with one relocation per every 2 dwords (but round down a bit
3318          * since a power of two will mean an extra page allocation for the reloc
3319          * buffer).
3320          *
3321          * Every 4 was too few for the blender benchmark.
3322          */
3323         bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2;
3324
3325         bufmgr_gem->bufmgr.bo_alloc = drm_intel_gem_bo_alloc;
3326         bufmgr_gem->bufmgr.bo_alloc_for_render =
3327             drm_intel_gem_bo_alloc_for_render;
3328         bufmgr_gem->bufmgr.bo_alloc_tiled = drm_intel_gem_bo_alloc_tiled;
3329         bufmgr_gem->bufmgr.bo_reference = drm_intel_gem_bo_reference;
3330         bufmgr_gem->bufmgr.bo_unreference = drm_intel_gem_bo_unreference;
3331         bufmgr_gem->bufmgr.bo_map = drm_intel_gem_bo_map;
3332         bufmgr_gem->bufmgr.bo_unmap = drm_intel_gem_bo_unmap;
3333         bufmgr_gem->bufmgr.bo_subdata = drm_intel_gem_bo_subdata;
3334         bufmgr_gem->bufmgr.bo_get_subdata = drm_intel_gem_bo_get_subdata;
3335         bufmgr_gem->bufmgr.bo_wait_rendering = drm_intel_gem_bo_wait_rendering;
3336         bufmgr_gem->bufmgr.bo_emit_reloc = drm_intel_gem_bo_emit_reloc;
3337         bufmgr_gem->bufmgr.bo_emit_reloc_fence = drm_intel_gem_bo_emit_reloc_fence;
3338         bufmgr_gem->bufmgr.bo_pin = drm_intel_gem_bo_pin;
3339         bufmgr_gem->bufmgr.bo_unpin = drm_intel_gem_bo_unpin;
3340         bufmgr_gem->bufmgr.bo_get_tiling = drm_intel_gem_bo_get_tiling;
3341         bufmgr_gem->bufmgr.bo_set_tiling = drm_intel_gem_bo_set_tiling;
3342         bufmgr_gem->bufmgr.bo_flink = drm_intel_gem_bo_flink;
3343         /* Use the new one if available */
3344         if (exec2) {
3345                 bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2;
3346                 bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2;
3347         } else
3348                 bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec;
3349         bufmgr_gem->bufmgr.bo_busy = drm_intel_gem_bo_busy;
3350         bufmgr_gem->bufmgr.bo_madvise = drm_intel_gem_bo_madvise;
3351         bufmgr_gem->bufmgr.destroy = drm_intel_bufmgr_gem_destroy;
3352         bufmgr_gem->bufmgr.debug = 0;
3353         bufmgr_gem->bufmgr.check_aperture_space =
3354             drm_intel_gem_check_aperture_space;
3355         bufmgr_gem->bufmgr.bo_disable_reuse = drm_intel_gem_bo_disable_reuse;
3356         bufmgr_gem->bufmgr.bo_is_reusable = drm_intel_gem_bo_is_reusable;
3357         bufmgr_gem->bufmgr.get_pipe_from_crtc_id =
3358             drm_intel_gem_get_pipe_from_crtc_id;
3359         bufmgr_gem->bufmgr.bo_references = drm_intel_gem_bo_references;
3360
3361         DRMINITLISTHEAD(&bufmgr_gem->named);
3362         init_cache_buckets(bufmgr_gem);
3363
3364         DRMINITLISTHEAD(&bufmgr_gem->vma_cache);
3365         bufmgr_gem->vma_max = -1; /* unlimited by default */
3366
3367         return &bufmgr_gem->bufmgr;
3368 }