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