OSDN Git Service

intel: Share the implementation of BO unmap between CPU and GTT mappings.
[android-x86/external-libdrm.git] / intel / intel_bufmgr_gem.c
1 /**************************************************************************
2  *
3  * Copyright © 2007 Red Hat Inc.
4  * Copyright © 2007 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 #include "libdrm_lists.h"
58 #include "intel_bufmgr.h"
59 #include "intel_bufmgr_priv.h"
60 #include "intel_chipset.h"
61 #include "string.h"
62
63 #include "i915_drm.h"
64
65 #define DBG(...) do {                                   \
66         if (bufmgr_gem->bufmgr.debug)                   \
67                 fprintf(stderr, __VA_ARGS__);           \
68 } while (0)
69
70 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
71
72 typedef struct _drm_intel_bo_gem drm_intel_bo_gem;
73
74 struct drm_intel_gem_bo_bucket {
75         drmMMListHead head;
76         unsigned long size;
77 };
78
79 typedef struct _drm_intel_bufmgr_gem {
80         drm_intel_bufmgr bufmgr;
81
82         int fd;
83
84         int max_relocs;
85
86         pthread_mutex_t lock;
87
88         struct drm_i915_gem_exec_object *exec_objects;
89         struct drm_i915_gem_exec_object2 *exec2_objects;
90         drm_intel_bo **exec_bos;
91         int exec_size;
92         int exec_count;
93
94         /** Array of lists of cached gem objects of power-of-two sizes */
95         struct drm_intel_gem_bo_bucket cache_bucket[14 * 4];
96         int num_buckets;
97         time_t time;
98
99         drmMMListHead named;
100
101         uint64_t gtt_size;
102         int available_fences;
103         int pci_device;
104         int gen;
105         unsigned int has_bsd : 1;
106         unsigned int has_blt : 1;
107         unsigned int has_relaxed_fencing : 1;
108         unsigned int bo_reuse : 1;
109         bool fenced_relocs;
110 } drm_intel_bufmgr_gem;
111
112 #define DRM_INTEL_RELOC_FENCE (1<<0)
113
114 typedef struct _drm_intel_reloc_target_info {
115         drm_intel_bo *bo;
116         int flags;
117 } drm_intel_reloc_target;
118
119 struct _drm_intel_bo_gem {
120         drm_intel_bo bo;
121
122         atomic_t refcount;
123         uint32_t gem_handle;
124         const char *name;
125
126         /**
127          * Kenel-assigned global name for this object
128          */
129         unsigned int global_name;
130         drmMMListHead name_list;
131
132         /**
133          * Index of the buffer within the validation list while preparing a
134          * batchbuffer execution.
135          */
136         int validate_index;
137
138         /**
139          * Current tiling mode
140          */
141         uint32_t tiling_mode;
142         uint32_t swizzle_mode;
143         unsigned long stride;
144
145         time_t free_time;
146
147         /** Array passed to the DRM containing relocation information. */
148         struct drm_i915_gem_relocation_entry *relocs;
149         /**
150          * Array of info structs corresponding to relocs[i].target_handle etc
151          */
152         drm_intel_reloc_target *reloc_target_info;
153         /** Number of entries in relocs */
154         int reloc_count;
155         /** Mapped address for the buffer, saved across map/unmap cycles */
156         void *mem_virtual;
157         /** GTT virtual address for the buffer, saved across map/unmap cycles */
158         void *gtt_virtual;
159
160         /** BO cache list */
161         drmMMListHead head;
162
163         /**
164          * Boolean of whether this BO and its children have been included in
165          * the current drm_intel_bufmgr_check_aperture_space() total.
166          */
167         bool included_in_check_aperture;
168
169         /**
170          * Boolean of whether this buffer has been used as a relocation
171          * target and had its size accounted for, and thus can't have any
172          * further relocations added to it.
173          */
174         bool used_as_reloc_target;
175
176         /**
177          * Boolean of whether we have encountered an error whilst building the relocation tree.
178          */
179         bool has_error;
180
181         /**
182          * Boolean of whether this buffer can be re-used
183          */
184         bool reusable;
185
186         /**
187          * Size in bytes of this buffer and its relocation descendents.
188          *
189          * Used to avoid costly tree walking in
190          * drm_intel_bufmgr_check_aperture in the common case.
191          */
192         int reloc_tree_size;
193
194         /**
195          * Number of potential fence registers required by this buffer and its
196          * relocations.
197          */
198         int reloc_tree_fences;
199
200         /** Flags that we may need to do the SW_FINSIH ioctl on unmap. */
201         bool mapped_cpu_write;
202 };
203
204 static unsigned int
205 drm_intel_gem_estimate_batch_space(drm_intel_bo ** bo_array, int count);
206
207 static unsigned int
208 drm_intel_gem_compute_batch_space(drm_intel_bo ** bo_array, int count);
209
210 static int
211 drm_intel_gem_bo_get_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
212                             uint32_t * swizzle_mode);
213
214 static int
215 drm_intel_gem_bo_set_tiling_internal(drm_intel_bo *bo,
216                                      uint32_t tiling_mode,
217                                      uint32_t stride);
218
219 static void drm_intel_gem_bo_unreference_locked_timed(drm_intel_bo *bo,
220                                                       time_t time);
221
222 static void drm_intel_gem_bo_unreference(drm_intel_bo *bo);
223
224 static void drm_intel_gem_bo_free(drm_intel_bo *bo);
225
226 static unsigned long
227 drm_intel_gem_bo_tile_size(drm_intel_bufmgr_gem *bufmgr_gem, unsigned long size,
228                            uint32_t *tiling_mode)
229 {
230         unsigned long min_size, max_size;
231         unsigned long i;
232
233         if (*tiling_mode == I915_TILING_NONE)
234                 return size;
235
236         /* 965+ just need multiples of page size for tiling */
237         if (bufmgr_gem->gen >= 4)
238                 return ROUND_UP_TO(size, 4096);
239
240         /* Older chips need powers of two, of at least 512k or 1M */
241         if (bufmgr_gem->gen == 3) {
242                 min_size = 1024*1024;
243                 max_size = 128*1024*1024;
244         } else {
245                 min_size = 512*1024;
246                 max_size = 64*1024*1024;
247         }
248
249         if (size > max_size) {
250                 *tiling_mode = I915_TILING_NONE;
251                 return size;
252         }
253
254         /* Do we need to allocate every page for the fence? */
255         if (bufmgr_gem->has_relaxed_fencing)
256                 return ROUND_UP_TO(size, 4096);
257
258         for (i = min_size; i < size; i <<= 1)
259                 ;
260
261         return i;
262 }
263
264 /*
265  * Round a given pitch up to the minimum required for X tiling on a
266  * given chip.  We use 512 as the minimum to allow for a later tiling
267  * change.
268  */
269 static unsigned long
270 drm_intel_gem_bo_tile_pitch(drm_intel_bufmgr_gem *bufmgr_gem,
271                             unsigned long pitch, uint32_t *tiling_mode)
272 {
273         unsigned long tile_width;
274         unsigned long i;
275
276         /* If untiled, then just align it so that we can do rendering
277          * to it with the 3D engine.
278          */
279         if (*tiling_mode == I915_TILING_NONE)
280                 return ALIGN(pitch, 64);
281
282         if (*tiling_mode == I915_TILING_X
283                         || (IS_915(bufmgr_gem) && *tiling_mode == I915_TILING_Y))
284                 tile_width = 512;
285         else
286                 tile_width = 128;
287
288         /* 965 is flexible */
289         if (bufmgr_gem->gen >= 4)
290                 return ROUND_UP_TO(pitch, tile_width);
291
292         /* The older hardware has a maximum pitch of 8192 with tiled
293          * surfaces, so fallback to untiled if it's too large.
294          */
295         if (pitch > 8192) {
296                 *tiling_mode = I915_TILING_NONE;
297                 return ALIGN(pitch, 64);
298         }
299
300         /* Pre-965 needs power of two tile width */
301         for (i = tile_width; i < pitch; i <<= 1)
302                 ;
303
304         return i;
305 }
306
307 static struct drm_intel_gem_bo_bucket *
308 drm_intel_gem_bo_bucket_for_size(drm_intel_bufmgr_gem *bufmgr_gem,
309                                  unsigned long size)
310 {
311         int i;
312
313         for (i = 0; i < bufmgr_gem->num_buckets; i++) {
314                 struct drm_intel_gem_bo_bucket *bucket =
315                     &bufmgr_gem->cache_bucket[i];
316                 if (bucket->size >= size) {
317                         return bucket;
318                 }
319         }
320
321         return NULL;
322 }
323
324 static void
325 drm_intel_gem_dump_validation_list(drm_intel_bufmgr_gem *bufmgr_gem)
326 {
327         int i, j;
328
329         for (i = 0; i < bufmgr_gem->exec_count; i++) {
330                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
331                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
332
333                 if (bo_gem->relocs == NULL) {
334                         DBG("%2d: %d (%s)\n", i, bo_gem->gem_handle,
335                             bo_gem->name);
336                         continue;
337                 }
338
339                 for (j = 0; j < bo_gem->reloc_count; j++) {
340                         drm_intel_bo *target_bo = bo_gem->reloc_target_info[j].bo;
341                         drm_intel_bo_gem *target_gem =
342                             (drm_intel_bo_gem *) target_bo;
343
344                         DBG("%2d: %d (%s)@0x%08llx -> "
345                             "%d (%s)@0x%08lx + 0x%08x\n",
346                             i,
347                             bo_gem->gem_handle, bo_gem->name,
348                             (unsigned long long)bo_gem->relocs[j].offset,
349                             target_gem->gem_handle,
350                             target_gem->name,
351                             target_bo->offset,
352                             bo_gem->relocs[j].delta);
353                 }
354         }
355 }
356
357 static inline void
358 drm_intel_gem_bo_reference(drm_intel_bo *bo)
359 {
360         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
361
362         atomic_inc(&bo_gem->refcount);
363 }
364
365 /**
366  * Adds the given buffer to the list of buffers to be validated (moved into the
367  * appropriate memory type) with the next batch submission.
368  *
369  * If a buffer is validated multiple times in a batch submission, it ends up
370  * with the intersection of the memory type flags and the union of the
371  * access flags.
372  */
373 static void
374 drm_intel_add_validate_buffer(drm_intel_bo *bo)
375 {
376         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
377         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
378         int index;
379
380         if (bo_gem->validate_index != -1)
381                 return;
382
383         /* Extend the array of validation entries as necessary. */
384         if (bufmgr_gem->exec_count == bufmgr_gem->exec_size) {
385                 int new_size = bufmgr_gem->exec_size * 2;
386
387                 if (new_size == 0)
388                         new_size = 5;
389
390                 bufmgr_gem->exec_objects =
391                     realloc(bufmgr_gem->exec_objects,
392                             sizeof(*bufmgr_gem->exec_objects) * new_size);
393                 bufmgr_gem->exec_bos =
394                     realloc(bufmgr_gem->exec_bos,
395                             sizeof(*bufmgr_gem->exec_bos) * new_size);
396                 bufmgr_gem->exec_size = new_size;
397         }
398
399         index = bufmgr_gem->exec_count;
400         bo_gem->validate_index = index;
401         /* Fill in array entry */
402         bufmgr_gem->exec_objects[index].handle = bo_gem->gem_handle;
403         bufmgr_gem->exec_objects[index].relocation_count = bo_gem->reloc_count;
404         bufmgr_gem->exec_objects[index].relocs_ptr = (uintptr_t) bo_gem->relocs;
405         bufmgr_gem->exec_objects[index].alignment = 0;
406         bufmgr_gem->exec_objects[index].offset = 0;
407         bufmgr_gem->exec_bos[index] = bo;
408         bufmgr_gem->exec_count++;
409 }
410
411 static void
412 drm_intel_add_validate_buffer2(drm_intel_bo *bo, int need_fence)
413 {
414         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
415         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
416         int index;
417
418         if (bo_gem->validate_index != -1) {
419                 if (need_fence)
420                         bufmgr_gem->exec2_objects[bo_gem->validate_index].flags |=
421                                 EXEC_OBJECT_NEEDS_FENCE;
422                 return;
423         }
424
425         /* Extend the array of validation entries as necessary. */
426         if (bufmgr_gem->exec_count == bufmgr_gem->exec_size) {
427                 int new_size = bufmgr_gem->exec_size * 2;
428
429                 if (new_size == 0)
430                         new_size = 5;
431
432                 bufmgr_gem->exec2_objects =
433                         realloc(bufmgr_gem->exec2_objects,
434                                 sizeof(*bufmgr_gem->exec2_objects) * new_size);
435                 bufmgr_gem->exec_bos =
436                         realloc(bufmgr_gem->exec_bos,
437                                 sizeof(*bufmgr_gem->exec_bos) * new_size);
438                 bufmgr_gem->exec_size = new_size;
439         }
440
441         index = bufmgr_gem->exec_count;
442         bo_gem->validate_index = index;
443         /* Fill in array entry */
444         bufmgr_gem->exec2_objects[index].handle = bo_gem->gem_handle;
445         bufmgr_gem->exec2_objects[index].relocation_count = bo_gem->reloc_count;
446         bufmgr_gem->exec2_objects[index].relocs_ptr = (uintptr_t)bo_gem->relocs;
447         bufmgr_gem->exec2_objects[index].alignment = 0;
448         bufmgr_gem->exec2_objects[index].offset = 0;
449         bufmgr_gem->exec_bos[index] = bo;
450         bufmgr_gem->exec2_objects[index].flags = 0;
451         bufmgr_gem->exec2_objects[index].rsvd1 = 0;
452         bufmgr_gem->exec2_objects[index].rsvd2 = 0;
453         if (need_fence) {
454                 bufmgr_gem->exec2_objects[index].flags |=
455                         EXEC_OBJECT_NEEDS_FENCE;
456         }
457         bufmgr_gem->exec_count++;
458 }
459
460 #define RELOC_BUF_SIZE(x) ((I915_RELOC_HEADER + x * I915_RELOC0_STRIDE) * \
461         sizeof(uint32_t))
462
463 static void
464 drm_intel_bo_gem_set_in_aperture_size(drm_intel_bufmgr_gem *bufmgr_gem,
465                                       drm_intel_bo_gem *bo_gem)
466 {
467         int size;
468
469         assert(!bo_gem->used_as_reloc_target);
470
471         /* The older chipsets are far-less flexible in terms of tiling,
472          * and require tiled buffer to be size aligned in the aperture.
473          * This means that in the worst possible case we will need a hole
474          * twice as large as the object in order for it to fit into the
475          * aperture. Optimal packing is for wimps.
476          */
477         size = bo_gem->bo.size;
478         if (bufmgr_gem->gen < 4 && bo_gem->tiling_mode != I915_TILING_NONE) {
479                 int min_size;
480
481                 if (bufmgr_gem->has_relaxed_fencing) {
482                         if (bufmgr_gem->gen == 3)
483                                 min_size = 1024*1024;
484                         else
485                                 min_size = 512*1024;
486
487                         while (min_size < size)
488                                 min_size *= 2;
489                 } else
490                         min_size = size;
491
492                 /* Account for worst-case alignment. */
493                 size = 2 * min_size;
494         }
495
496         bo_gem->reloc_tree_size = size;
497 }
498
499 static int
500 drm_intel_setup_reloc_list(drm_intel_bo *bo)
501 {
502         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
503         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
504         unsigned int max_relocs = bufmgr_gem->max_relocs;
505
506         if (bo->size / 4 < max_relocs)
507                 max_relocs = bo->size / 4;
508
509         bo_gem->relocs = malloc(max_relocs *
510                                 sizeof(struct drm_i915_gem_relocation_entry));
511         bo_gem->reloc_target_info = malloc(max_relocs *
512                                            sizeof(drm_intel_reloc_target));
513         if (bo_gem->relocs == NULL || bo_gem->reloc_target_info == NULL) {
514                 bo_gem->has_error = true;
515
516                 free (bo_gem->relocs);
517                 bo_gem->relocs = NULL;
518
519                 free (bo_gem->reloc_target_info);
520                 bo_gem->reloc_target_info = NULL;
521
522                 return 1;
523         }
524
525         return 0;
526 }
527
528 static int
529 drm_intel_gem_bo_busy(drm_intel_bo *bo)
530 {
531         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
532         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
533         struct drm_i915_gem_busy busy;
534         int ret;
535
536         memset(&busy, 0, sizeof(busy));
537         busy.handle = bo_gem->gem_handle;
538
539         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_BUSY, &busy);
540
541         return (ret == 0 && busy.busy);
542 }
543
544 static int
545 drm_intel_gem_bo_madvise_internal(drm_intel_bufmgr_gem *bufmgr_gem,
546                                   drm_intel_bo_gem *bo_gem, int state)
547 {
548         struct drm_i915_gem_madvise madv;
549
550         madv.handle = bo_gem->gem_handle;
551         madv.madv = state;
552         madv.retained = 1;
553         drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_MADVISE, &madv);
554
555         return madv.retained;
556 }
557
558 static int
559 drm_intel_gem_bo_madvise(drm_intel_bo *bo, int madv)
560 {
561         return drm_intel_gem_bo_madvise_internal
562                 ((drm_intel_bufmgr_gem *) bo->bufmgr,
563                  (drm_intel_bo_gem *) bo,
564                  madv);
565 }
566
567 /* drop the oldest entries that have been purged by the kernel */
568 static void
569 drm_intel_gem_bo_cache_purge_bucket(drm_intel_bufmgr_gem *bufmgr_gem,
570                                     struct drm_intel_gem_bo_bucket *bucket)
571 {
572         while (!DRMLISTEMPTY(&bucket->head)) {
573                 drm_intel_bo_gem *bo_gem;
574
575                 bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
576                                       bucket->head.next, head);
577                 if (drm_intel_gem_bo_madvise_internal
578                     (bufmgr_gem, bo_gem, I915_MADV_DONTNEED))
579                         break;
580
581                 DRMLISTDEL(&bo_gem->head);
582                 drm_intel_gem_bo_free(&bo_gem->bo);
583         }
584 }
585
586 static drm_intel_bo *
587 drm_intel_gem_bo_alloc_internal(drm_intel_bufmgr *bufmgr,
588                                 const char *name,
589                                 unsigned long size,
590                                 unsigned long flags,
591                                 uint32_t tiling_mode,
592                                 unsigned long stride)
593 {
594         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
595         drm_intel_bo_gem *bo_gem;
596         unsigned int page_size = getpagesize();
597         int ret;
598         struct drm_intel_gem_bo_bucket *bucket;
599         bool alloc_from_cache;
600         unsigned long bo_size;
601         bool for_render = false;
602
603         if (flags & BO_ALLOC_FOR_RENDER)
604                 for_render = true;
605
606         /* Round the allocated size up to a power of two number of pages. */
607         bucket = drm_intel_gem_bo_bucket_for_size(bufmgr_gem, size);
608
609         /* If we don't have caching at this size, don't actually round the
610          * allocation up.
611          */
612         if (bucket == NULL) {
613                 bo_size = size;
614                 if (bo_size < page_size)
615                         bo_size = page_size;
616         } else {
617                 bo_size = bucket->size;
618         }
619
620         pthread_mutex_lock(&bufmgr_gem->lock);
621         /* Get a buffer out of the cache if available */
622 retry:
623         alloc_from_cache = false;
624         if (bucket != NULL && !DRMLISTEMPTY(&bucket->head)) {
625                 if (for_render) {
626                         /* Allocate new render-target BOs from the tail (MRU)
627                          * of the list, as it will likely be hot in the GPU
628                          * cache and in the aperture for us.
629                          */
630                         bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
631                                               bucket->head.prev, head);
632                         DRMLISTDEL(&bo_gem->head);
633                         alloc_from_cache = true;
634                 } else {
635                         /* For non-render-target BOs (where we're probably
636                          * going to map it first thing in order to fill it
637                          * with data), check if the last BO in the cache is
638                          * unbusy, and only reuse in that case. Otherwise,
639                          * allocating a new buffer is probably faster than
640                          * waiting for the GPU to finish.
641                          */
642                         bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
643                                               bucket->head.next, head);
644                         if (!drm_intel_gem_bo_busy(&bo_gem->bo)) {
645                                 alloc_from_cache = true;
646                                 DRMLISTDEL(&bo_gem->head);
647                         }
648                 }
649
650                 if (alloc_from_cache) {
651                         if (!drm_intel_gem_bo_madvise_internal
652                             (bufmgr_gem, bo_gem, I915_MADV_WILLNEED)) {
653                                 drm_intel_gem_bo_free(&bo_gem->bo);
654                                 drm_intel_gem_bo_cache_purge_bucket(bufmgr_gem,
655                                                                     bucket);
656                                 goto retry;
657                         }
658
659                         if (drm_intel_gem_bo_set_tiling_internal(&bo_gem->bo,
660                                                                  tiling_mode,
661                                                                  stride)) {
662                                 drm_intel_gem_bo_free(&bo_gem->bo);
663                                 goto retry;
664                         }
665                 }
666         }
667         pthread_mutex_unlock(&bufmgr_gem->lock);
668
669         if (!alloc_from_cache) {
670                 struct drm_i915_gem_create create;
671
672                 bo_gem = calloc(1, sizeof(*bo_gem));
673                 if (!bo_gem)
674                         return NULL;
675
676                 bo_gem->bo.size = bo_size;
677                 memset(&create, 0, sizeof(create));
678                 create.size = bo_size;
679
680                 ret = drmIoctl(bufmgr_gem->fd,
681                                DRM_IOCTL_I915_GEM_CREATE,
682                                &create);
683                 bo_gem->gem_handle = create.handle;
684                 bo_gem->bo.handle = bo_gem->gem_handle;
685                 if (ret != 0) {
686                         free(bo_gem);
687                         return NULL;
688                 }
689                 bo_gem->bo.bufmgr = bufmgr;
690
691                 bo_gem->tiling_mode = I915_TILING_NONE;
692                 bo_gem->swizzle_mode = I915_BIT_6_SWIZZLE_NONE;
693                 bo_gem->stride = 0;
694
695                 if (drm_intel_gem_bo_set_tiling_internal(&bo_gem->bo,
696                                                          tiling_mode,
697                                                          stride)) {
698                     drm_intel_gem_bo_free(&bo_gem->bo);
699                     return NULL;
700                 }
701
702                 DRMINITLISTHEAD(&bo_gem->name_list);
703         }
704
705         bo_gem->name = name;
706         atomic_set(&bo_gem->refcount, 1);
707         bo_gem->validate_index = -1;
708         bo_gem->reloc_tree_fences = 0;
709         bo_gem->used_as_reloc_target = false;
710         bo_gem->has_error = false;
711         bo_gem->reusable = true;
712
713         drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
714
715         DBG("bo_create: buf %d (%s) %ldb\n",
716             bo_gem->gem_handle, bo_gem->name, size);
717
718         return &bo_gem->bo;
719 }
720
721 static drm_intel_bo *
722 drm_intel_gem_bo_alloc_for_render(drm_intel_bufmgr *bufmgr,
723                                   const char *name,
724                                   unsigned long size,
725                                   unsigned int alignment)
726 {
727         return drm_intel_gem_bo_alloc_internal(bufmgr, name, size,
728                                                BO_ALLOC_FOR_RENDER,
729                                                I915_TILING_NONE, 0);
730 }
731
732 static drm_intel_bo *
733 drm_intel_gem_bo_alloc(drm_intel_bufmgr *bufmgr,
734                        const char *name,
735                        unsigned long size,
736                        unsigned int alignment)
737 {
738         return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, 0,
739                                                I915_TILING_NONE, 0);
740 }
741
742 static drm_intel_bo *
743 drm_intel_gem_bo_alloc_tiled(drm_intel_bufmgr *bufmgr, const char *name,
744                              int x, int y, int cpp, uint32_t *tiling_mode,
745                              unsigned long *pitch, unsigned long flags)
746 {
747         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
748         unsigned long size, stride;
749         uint32_t tiling;
750
751         do {
752                 unsigned long aligned_y, height_alignment;
753
754                 tiling = *tiling_mode;
755
756                 /* If we're tiled, our allocations are in 8 or 32-row blocks,
757                  * so failure to align our height means that we won't allocate
758                  * enough pages.
759                  *
760                  * If we're untiled, we still have to align to 2 rows high
761                  * because the data port accesses 2x2 blocks even if the
762                  * bottom row isn't to be rendered, so failure to align means
763                  * we could walk off the end of the GTT and fault.  This is
764                  * documented on 965, and may be the case on older chipsets
765                  * too so we try to be careful.
766                  */
767                 aligned_y = y;
768                 height_alignment = 2;
769
770                 if (IS_GEN2(bufmgr_gem) && tiling != I915_TILING_NONE)
771                         height_alignment = 16;
772                 else if (tiling == I915_TILING_X
773                         || (IS_915(bufmgr_gem) && tiling == I915_TILING_Y))
774                         height_alignment = 8;
775                 else if (tiling == I915_TILING_Y)
776                         height_alignment = 32;
777                 aligned_y = ALIGN(y, height_alignment);
778
779                 stride = x * cpp;
780                 stride = drm_intel_gem_bo_tile_pitch(bufmgr_gem, stride, tiling_mode);
781                 size = stride * aligned_y;
782                 size = drm_intel_gem_bo_tile_size(bufmgr_gem, size, tiling_mode);
783         } while (*tiling_mode != tiling);
784         *pitch = stride;
785
786         if (tiling == I915_TILING_NONE)
787                 stride = 0;
788
789         return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, flags,
790                                                tiling, stride);
791 }
792
793 /**
794  * Returns a drm_intel_bo wrapping the given buffer object handle.
795  *
796  * This can be used when one application needs to pass a buffer object
797  * to another.
798  */
799 drm_intel_bo *
800 drm_intel_bo_gem_create_from_name(drm_intel_bufmgr *bufmgr,
801                                   const char *name,
802                                   unsigned int handle)
803 {
804         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
805         drm_intel_bo_gem *bo_gem;
806         int ret;
807         struct drm_gem_open open_arg;
808         struct drm_i915_gem_get_tiling get_tiling;
809         drmMMListHead *list;
810
811         /* At the moment most applications only have a few named bo.
812          * For instance, in a DRI client only the render buffers passed
813          * between X and the client are named. And since X returns the
814          * alternating names for the front/back buffer a linear search
815          * provides a sufficiently fast match.
816          */
817         for (list = bufmgr_gem->named.next;
818              list != &bufmgr_gem->named;
819              list = list->next) {
820                 bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list);
821                 if (bo_gem->global_name == handle) {
822                         drm_intel_gem_bo_reference(&bo_gem->bo);
823                         return &bo_gem->bo;
824                 }
825         }
826
827         bo_gem = calloc(1, sizeof(*bo_gem));
828         if (!bo_gem)
829                 return NULL;
830
831         memset(&open_arg, 0, sizeof(open_arg));
832         open_arg.name = handle;
833         ret = drmIoctl(bufmgr_gem->fd,
834                        DRM_IOCTL_GEM_OPEN,
835                        &open_arg);
836         if (ret != 0) {
837                 DBG("Couldn't reference %s handle 0x%08x: %s\n",
838                     name, handle, strerror(errno));
839                 free(bo_gem);
840                 return NULL;
841         }
842         bo_gem->bo.size = open_arg.size;
843         bo_gem->bo.offset = 0;
844         bo_gem->bo.virtual = NULL;
845         bo_gem->bo.bufmgr = bufmgr;
846         bo_gem->name = name;
847         atomic_set(&bo_gem->refcount, 1);
848         bo_gem->validate_index = -1;
849         bo_gem->gem_handle = open_arg.handle;
850         bo_gem->bo.handle = open_arg.handle;
851         bo_gem->global_name = handle;
852         bo_gem->reusable = false;
853
854         memset(&get_tiling, 0, sizeof(get_tiling));
855         get_tiling.handle = bo_gem->gem_handle;
856         ret = drmIoctl(bufmgr_gem->fd,
857                        DRM_IOCTL_I915_GEM_GET_TILING,
858                        &get_tiling);
859         if (ret != 0) {
860                 drm_intel_gem_bo_unreference(&bo_gem->bo);
861                 return NULL;
862         }
863         bo_gem->tiling_mode = get_tiling.tiling_mode;
864         bo_gem->swizzle_mode = get_tiling.swizzle_mode;
865         /* XXX stride is unknown */
866         drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
867
868         DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
869         DBG("bo_create_from_handle: %d (%s)\n", handle, bo_gem->name);
870
871         return &bo_gem->bo;
872 }
873
874 static void
875 drm_intel_gem_bo_free(drm_intel_bo *bo)
876 {
877         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
878         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
879         struct drm_gem_close close;
880         int ret;
881
882         if (bo_gem->mem_virtual)
883                 munmap(bo_gem->mem_virtual, bo_gem->bo.size);
884         if (bo_gem->gtt_virtual)
885                 munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
886
887         /* Close this object */
888         memset(&close, 0, sizeof(close));
889         close.handle = bo_gem->gem_handle;
890         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close);
891         if (ret != 0) {
892                 DBG("DRM_IOCTL_GEM_CLOSE %d failed (%s): %s\n",
893                     bo_gem->gem_handle, bo_gem->name, strerror(errno));
894         }
895         free(bo);
896 }
897
898 /** Frees all cached buffers significantly older than @time. */
899 static void
900 drm_intel_gem_cleanup_bo_cache(drm_intel_bufmgr_gem *bufmgr_gem, time_t time)
901 {
902         int i;
903
904         if (bufmgr_gem->time == time)
905                 return;
906
907         for (i = 0; i < bufmgr_gem->num_buckets; i++) {
908                 struct drm_intel_gem_bo_bucket *bucket =
909                     &bufmgr_gem->cache_bucket[i];
910
911                 while (!DRMLISTEMPTY(&bucket->head)) {
912                         drm_intel_bo_gem *bo_gem;
913
914                         bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
915                                               bucket->head.next, head);
916                         if (time - bo_gem->free_time <= 1)
917                                 break;
918
919                         DRMLISTDEL(&bo_gem->head);
920
921                         drm_intel_gem_bo_free(&bo_gem->bo);
922                 }
923         }
924
925         bufmgr_gem->time = time;
926 }
927
928 static void
929 drm_intel_gem_bo_unreference_final(drm_intel_bo *bo, time_t time)
930 {
931         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
932         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
933         struct drm_intel_gem_bo_bucket *bucket;
934         int i;
935
936         /* Unreference all the target buffers */
937         for (i = 0; i < bo_gem->reloc_count; i++) {
938                 if (bo_gem->reloc_target_info[i].bo != bo) {
939                         drm_intel_gem_bo_unreference_locked_timed(bo_gem->
940                                                                   reloc_target_info[i].bo,
941                                                                   time);
942                 }
943         }
944         bo_gem->reloc_count = 0;
945         bo_gem->used_as_reloc_target = false;
946
947         DBG("bo_unreference final: %d (%s)\n",
948             bo_gem->gem_handle, bo_gem->name);
949
950         /* release memory associated with this object */
951         if (bo_gem->reloc_target_info) {
952                 free(bo_gem->reloc_target_info);
953                 bo_gem->reloc_target_info = NULL;
954         }
955         if (bo_gem->relocs) {
956                 free(bo_gem->relocs);
957                 bo_gem->relocs = NULL;
958         }
959
960         DRMLISTDEL(&bo_gem->name_list);
961
962         bucket = drm_intel_gem_bo_bucket_for_size(bufmgr_gem, bo->size);
963         /* Put the buffer into our internal cache for reuse if we can. */
964         if (bufmgr_gem->bo_reuse && bo_gem->reusable && bucket != NULL &&
965             drm_intel_gem_bo_madvise_internal(bufmgr_gem, bo_gem,
966                                               I915_MADV_DONTNEED)) {
967                 bo_gem->free_time = time;
968
969                 bo_gem->name = NULL;
970                 bo_gem->validate_index = -1;
971
972                 DRMLISTADDTAIL(&bo_gem->head, &bucket->head);
973         } else {
974                 drm_intel_gem_bo_free(bo);
975         }
976 }
977
978 static void drm_intel_gem_bo_unreference_locked_timed(drm_intel_bo *bo,
979                                                       time_t time)
980 {
981         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
982
983         assert(atomic_read(&bo_gem->refcount) > 0);
984         if (atomic_dec_and_test(&bo_gem->refcount))
985                 drm_intel_gem_bo_unreference_final(bo, time);
986 }
987
988 static void drm_intel_gem_bo_unreference(drm_intel_bo *bo)
989 {
990         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
991
992         assert(atomic_read(&bo_gem->refcount) > 0);
993         if (atomic_dec_and_test(&bo_gem->refcount)) {
994                 drm_intel_bufmgr_gem *bufmgr_gem =
995                     (drm_intel_bufmgr_gem *) bo->bufmgr;
996                 struct timespec time;
997
998                 clock_gettime(CLOCK_MONOTONIC, &time);
999
1000                 pthread_mutex_lock(&bufmgr_gem->lock);
1001                 drm_intel_gem_bo_unreference_final(bo, time.tv_sec);
1002                 drm_intel_gem_cleanup_bo_cache(bufmgr_gem, time.tv_sec);
1003                 pthread_mutex_unlock(&bufmgr_gem->lock);
1004         }
1005 }
1006
1007 static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
1008 {
1009         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1010         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1011         struct drm_i915_gem_set_domain set_domain;
1012         int ret;
1013
1014         pthread_mutex_lock(&bufmgr_gem->lock);
1015
1016         if (!bo_gem->mem_virtual) {
1017                 struct drm_i915_gem_mmap mmap_arg;
1018
1019                 DBG("bo_map: %d (%s)\n", bo_gem->gem_handle, bo_gem->name);
1020
1021                 memset(&mmap_arg, 0, sizeof(mmap_arg));
1022                 mmap_arg.handle = bo_gem->gem_handle;
1023                 mmap_arg.offset = 0;
1024                 mmap_arg.size = bo->size;
1025                 ret = drmIoctl(bufmgr_gem->fd,
1026                                DRM_IOCTL_I915_GEM_MMAP,
1027                                &mmap_arg);
1028                 if (ret != 0) {
1029                         ret = -errno;
1030                         DBG("%s:%d: Error mapping buffer %d (%s): %s .\n",
1031                             __FILE__, __LINE__, bo_gem->gem_handle,
1032                             bo_gem->name, strerror(errno));
1033                         pthread_mutex_unlock(&bufmgr_gem->lock);
1034                         return ret;
1035                 }
1036                 bo_gem->mem_virtual = (void *)(uintptr_t) mmap_arg.addr_ptr;
1037         }
1038         DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
1039             bo_gem->mem_virtual);
1040         bo->virtual = bo_gem->mem_virtual;
1041
1042         set_domain.handle = bo_gem->gem_handle;
1043         set_domain.read_domains = I915_GEM_DOMAIN_CPU;
1044         if (write_enable)
1045                 set_domain.write_domain = I915_GEM_DOMAIN_CPU;
1046         else
1047                 set_domain.write_domain = 0;
1048         ret = drmIoctl(bufmgr_gem->fd,
1049                        DRM_IOCTL_I915_GEM_SET_DOMAIN,
1050                        &set_domain);
1051         if (ret != 0) {
1052                 DBG("%s:%d: Error setting to CPU domain %d: %s\n",
1053                     __FILE__, __LINE__, bo_gem->gem_handle,
1054                     strerror(errno));
1055         }
1056
1057         if (write_enable)
1058                 bo_gem->mapped_cpu_write = true;
1059
1060         pthread_mutex_unlock(&bufmgr_gem->lock);
1061
1062         return 0;
1063 }
1064
1065 int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
1066 {
1067         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1068         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1069         struct drm_i915_gem_set_domain set_domain;
1070         int ret;
1071
1072         pthread_mutex_lock(&bufmgr_gem->lock);
1073
1074         /* Get a mapping of the buffer if we haven't before. */
1075         if (bo_gem->gtt_virtual == NULL) {
1076                 struct drm_i915_gem_mmap_gtt mmap_arg;
1077
1078                 DBG("bo_map_gtt: mmap %d (%s)\n", bo_gem->gem_handle,
1079                     bo_gem->name);
1080
1081                 memset(&mmap_arg, 0, sizeof(mmap_arg));
1082                 mmap_arg.handle = bo_gem->gem_handle;
1083
1084                 /* Get the fake offset back... */
1085                 ret = drmIoctl(bufmgr_gem->fd,
1086                                DRM_IOCTL_I915_GEM_MMAP_GTT,
1087                                &mmap_arg);
1088                 if (ret != 0) {
1089                         ret = -errno;
1090                         DBG("%s:%d: Error preparing buffer map %d (%s): %s .\n",
1091                             __FILE__, __LINE__,
1092                             bo_gem->gem_handle, bo_gem->name,
1093                             strerror(errno));
1094                         pthread_mutex_unlock(&bufmgr_gem->lock);
1095                         return ret;
1096                 }
1097
1098                 /* and mmap it */
1099                 bo_gem->gtt_virtual = mmap(0, bo->size, PROT_READ | PROT_WRITE,
1100                                            MAP_SHARED, bufmgr_gem->fd,
1101                                            mmap_arg.offset);
1102                 if (bo_gem->gtt_virtual == MAP_FAILED) {
1103                         bo_gem->gtt_virtual = NULL;
1104                         ret = -errno;
1105                         DBG("%s:%d: Error mapping buffer %d (%s): %s .\n",
1106                             __FILE__, __LINE__,
1107                             bo_gem->gem_handle, bo_gem->name,
1108                             strerror(errno));
1109                         pthread_mutex_unlock(&bufmgr_gem->lock);
1110                         return ret;
1111                 }
1112         }
1113
1114         bo->virtual = bo_gem->gtt_virtual;
1115
1116         DBG("bo_map_gtt: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
1117             bo_gem->gtt_virtual);
1118
1119         /* Now move it to the GTT domain so that the CPU caches are flushed */
1120         set_domain.handle = bo_gem->gem_handle;
1121         set_domain.read_domains = I915_GEM_DOMAIN_GTT;
1122         set_domain.write_domain = I915_GEM_DOMAIN_GTT;
1123         ret = drmIoctl(bufmgr_gem->fd,
1124                        DRM_IOCTL_I915_GEM_SET_DOMAIN,
1125                        &set_domain);
1126         if (ret != 0) {
1127                 DBG("%s:%d: Error setting domain %d: %s\n",
1128                     __FILE__, __LINE__, bo_gem->gem_handle,
1129                     strerror(errno));
1130         }
1131
1132         pthread_mutex_unlock(&bufmgr_gem->lock);
1133
1134         return 0;
1135 }
1136
1137 static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
1138 {
1139         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1140         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1141         struct drm_i915_gem_sw_finish sw_finish;
1142         int ret = 0;
1143
1144         if (bo == NULL)
1145                 return 0;
1146
1147         pthread_mutex_lock(&bufmgr_gem->lock);
1148
1149         if (bo_gem->mapped_cpu_write) {
1150                 /* Cause a flush to happen if the buffer's pinned for
1151                  * scanout, so the results show up in a timely manner.
1152                  * Unlike GTT set domains, this only does work if the
1153                  * buffer should be scanout-related.
1154                  */
1155                 sw_finish.handle = bo_gem->gem_handle;
1156                 ret = drmIoctl(bufmgr_gem->fd,
1157                                DRM_IOCTL_I915_GEM_SW_FINISH,
1158                                &sw_finish);
1159                 ret = ret == -1 ? -errno : 0;
1160
1161                 bo_gem->mapped_cpu_write = false;
1162         }
1163
1164         bo->virtual = NULL;
1165         pthread_mutex_unlock(&bufmgr_gem->lock);
1166
1167         return ret;
1168 }
1169
1170 int drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo)
1171 {
1172         return drm_intel_gem_bo_unmap(bo);
1173 }
1174
1175 static int
1176 drm_intel_gem_bo_subdata(drm_intel_bo *bo, unsigned long offset,
1177                          unsigned long size, const void *data)
1178 {
1179         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1180         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1181         struct drm_i915_gem_pwrite pwrite;
1182         int ret;
1183
1184         memset(&pwrite, 0, sizeof(pwrite));
1185         pwrite.handle = bo_gem->gem_handle;
1186         pwrite.offset = offset;
1187         pwrite.size = size;
1188         pwrite.data_ptr = (uint64_t) (uintptr_t) data;
1189         ret = drmIoctl(bufmgr_gem->fd,
1190                        DRM_IOCTL_I915_GEM_PWRITE,
1191                        &pwrite);
1192         if (ret != 0) {
1193                 ret = -errno;
1194                 DBG("%s:%d: Error writing data to buffer %d: (%d %d) %s .\n",
1195                     __FILE__, __LINE__, bo_gem->gem_handle, (int)offset,
1196                     (int)size, strerror(errno));
1197         }
1198
1199         return ret;
1200 }
1201
1202 static int
1203 drm_intel_gem_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, int crtc_id)
1204 {
1205         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1206         struct drm_i915_get_pipe_from_crtc_id get_pipe_from_crtc_id;
1207         int ret;
1208
1209         get_pipe_from_crtc_id.crtc_id = crtc_id;
1210         ret = drmIoctl(bufmgr_gem->fd,
1211                        DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID,
1212                        &get_pipe_from_crtc_id);
1213         if (ret != 0) {
1214                 /* We return -1 here to signal that we don't
1215                  * know which pipe is associated with this crtc.
1216                  * This lets the caller know that this information
1217                  * isn't available; using the wrong pipe for
1218                  * vblank waiting can cause the chipset to lock up
1219                  */
1220                 return -1;
1221         }
1222
1223         return get_pipe_from_crtc_id.pipe;
1224 }
1225
1226 static int
1227 drm_intel_gem_bo_get_subdata(drm_intel_bo *bo, unsigned long offset,
1228                              unsigned long size, void *data)
1229 {
1230         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1231         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1232         struct drm_i915_gem_pread pread;
1233         int ret;
1234
1235         memset(&pread, 0, sizeof(pread));
1236         pread.handle = bo_gem->gem_handle;
1237         pread.offset = offset;
1238         pread.size = size;
1239         pread.data_ptr = (uint64_t) (uintptr_t) data;
1240         ret = drmIoctl(bufmgr_gem->fd,
1241                        DRM_IOCTL_I915_GEM_PREAD,
1242                        &pread);
1243         if (ret != 0) {
1244                 ret = -errno;
1245                 DBG("%s:%d: Error reading data from buffer %d: (%d %d) %s .\n",
1246                     __FILE__, __LINE__, bo_gem->gem_handle, (int)offset,
1247                     (int)size, strerror(errno));
1248         }
1249
1250         return ret;
1251 }
1252
1253 /** Waits for all GPU rendering with the object to have completed. */
1254 static void
1255 drm_intel_gem_bo_wait_rendering(drm_intel_bo *bo)
1256 {
1257         drm_intel_gem_bo_start_gtt_access(bo, 1);
1258 }
1259
1260 /**
1261  * Sets the object to the GTT read and possibly write domain, used by the X
1262  * 2D driver in the absence of kernel support to do drm_intel_gem_bo_map_gtt().
1263  *
1264  * In combination with drm_intel_gem_bo_pin() and manual fence management, we
1265  * can do tiled pixmaps this way.
1266  */
1267 void
1268 drm_intel_gem_bo_start_gtt_access(drm_intel_bo *bo, int write_enable)
1269 {
1270         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1271         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1272         struct drm_i915_gem_set_domain set_domain;
1273         int ret;
1274
1275         set_domain.handle = bo_gem->gem_handle;
1276         set_domain.read_domains = I915_GEM_DOMAIN_GTT;
1277         set_domain.write_domain = write_enable ? I915_GEM_DOMAIN_GTT : 0;
1278         ret = drmIoctl(bufmgr_gem->fd,
1279                        DRM_IOCTL_I915_GEM_SET_DOMAIN,
1280                        &set_domain);
1281         if (ret != 0) {
1282                 DBG("%s:%d: Error setting memory domains %d (%08x %08x): %s .\n",
1283                     __FILE__, __LINE__, bo_gem->gem_handle,
1284                     set_domain.read_domains, set_domain.write_domain,
1285                     strerror(errno));
1286         }
1287 }
1288
1289 static void
1290 drm_intel_bufmgr_gem_destroy(drm_intel_bufmgr *bufmgr)
1291 {
1292         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1293         int i;
1294
1295         free(bufmgr_gem->exec2_objects);
1296         free(bufmgr_gem->exec_objects);
1297         free(bufmgr_gem->exec_bos);
1298
1299         pthread_mutex_destroy(&bufmgr_gem->lock);
1300
1301         /* Free any cached buffer objects we were going to reuse */
1302         for (i = 0; i < bufmgr_gem->num_buckets; i++) {
1303                 struct drm_intel_gem_bo_bucket *bucket =
1304                     &bufmgr_gem->cache_bucket[i];
1305                 drm_intel_bo_gem *bo_gem;
1306
1307                 while (!DRMLISTEMPTY(&bucket->head)) {
1308                         bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
1309                                               bucket->head.next, head);
1310                         DRMLISTDEL(&bo_gem->head);
1311
1312                         drm_intel_gem_bo_free(&bo_gem->bo);
1313                 }
1314         }
1315
1316         free(bufmgr);
1317 }
1318
1319 /**
1320  * Adds the target buffer to the validation list and adds the relocation
1321  * to the reloc_buffer's relocation list.
1322  *
1323  * The relocation entry at the given offset must already contain the
1324  * precomputed relocation value, because the kernel will optimize out
1325  * the relocation entry write when the buffer hasn't moved from the
1326  * last known offset in target_bo.
1327  */
1328 static int
1329 do_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
1330                  drm_intel_bo *target_bo, uint32_t target_offset,
1331                  uint32_t read_domains, uint32_t write_domain,
1332                  bool need_fence)
1333 {
1334         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1335         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1336         drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) target_bo;
1337         bool fenced_command;
1338
1339         if (bo_gem->has_error)
1340                 return -ENOMEM;
1341
1342         if (target_bo_gem->has_error) {
1343                 bo_gem->has_error = true;
1344                 return -ENOMEM;
1345         }
1346
1347         /* We never use HW fences for rendering on 965+ */
1348         if (bufmgr_gem->gen >= 4)
1349                 need_fence = false;
1350
1351         fenced_command = need_fence;
1352         if (target_bo_gem->tiling_mode == I915_TILING_NONE)
1353                 need_fence = false;
1354
1355         /* Create a new relocation list if needed */
1356         if (bo_gem->relocs == NULL && drm_intel_setup_reloc_list(bo))
1357                 return -ENOMEM;
1358
1359         /* Check overflow */
1360         assert(bo_gem->reloc_count < bufmgr_gem->max_relocs);
1361
1362         /* Check args */
1363         assert(offset <= bo->size - 4);
1364         assert((write_domain & (write_domain - 1)) == 0);
1365
1366         /* Make sure that we're not adding a reloc to something whose size has
1367          * already been accounted for.
1368          */
1369         assert(!bo_gem->used_as_reloc_target);
1370         if (target_bo_gem != bo_gem) {
1371                 target_bo_gem->used_as_reloc_target = true;
1372                 bo_gem->reloc_tree_size += target_bo_gem->reloc_tree_size;
1373         }
1374         /* An object needing a fence is a tiled buffer, so it won't have
1375          * relocs to other buffers.
1376          */
1377         if (need_fence)
1378                 target_bo_gem->reloc_tree_fences = 1;
1379         bo_gem->reloc_tree_fences += target_bo_gem->reloc_tree_fences;
1380
1381         bo_gem->relocs[bo_gem->reloc_count].offset = offset;
1382         bo_gem->relocs[bo_gem->reloc_count].delta = target_offset;
1383         bo_gem->relocs[bo_gem->reloc_count].target_handle =
1384             target_bo_gem->gem_handle;
1385         bo_gem->relocs[bo_gem->reloc_count].read_domains = read_domains;
1386         bo_gem->relocs[bo_gem->reloc_count].write_domain = write_domain;
1387         bo_gem->relocs[bo_gem->reloc_count].presumed_offset = target_bo->offset;
1388
1389         bo_gem->reloc_target_info[bo_gem->reloc_count].bo = target_bo;
1390         if (target_bo != bo)
1391                 drm_intel_gem_bo_reference(target_bo);
1392         if (fenced_command)
1393                 bo_gem->reloc_target_info[bo_gem->reloc_count].flags =
1394                         DRM_INTEL_RELOC_FENCE;
1395         else
1396                 bo_gem->reloc_target_info[bo_gem->reloc_count].flags = 0;
1397
1398         bo_gem->reloc_count++;
1399
1400         return 0;
1401 }
1402
1403 static int
1404 drm_intel_gem_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
1405                             drm_intel_bo *target_bo, uint32_t target_offset,
1406                             uint32_t read_domains, uint32_t write_domain)
1407 {
1408         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
1409
1410         return do_bo_emit_reloc(bo, offset, target_bo, target_offset,
1411                                 read_domains, write_domain,
1412                                 !bufmgr_gem->fenced_relocs);
1413 }
1414
1415 static int
1416 drm_intel_gem_bo_emit_reloc_fence(drm_intel_bo *bo, uint32_t offset,
1417                                   drm_intel_bo *target_bo,
1418                                   uint32_t target_offset,
1419                                   uint32_t read_domains, uint32_t write_domain)
1420 {
1421         return do_bo_emit_reloc(bo, offset, target_bo, target_offset,
1422                                 read_domains, write_domain, true);
1423 }
1424
1425 int
1426 drm_intel_gem_bo_get_reloc_count(drm_intel_bo *bo)
1427 {
1428         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1429
1430         return bo_gem->reloc_count;
1431 }
1432
1433 /**
1434  * Removes existing relocation entries in the BO after "start".
1435  *
1436  * This allows a user to avoid a two-step process for state setup with
1437  * counting up all the buffer objects and doing a
1438  * drm_intel_bufmgr_check_aperture_space() before emitting any of the
1439  * relocations for the state setup.  Instead, save the state of the
1440  * batchbuffer including drm_intel_gem_get_reloc_count(), emit all the
1441  * state, and then check if it still fits in the aperture.
1442  *
1443  * Any further drm_intel_bufmgr_check_aperture_space() queries
1444  * involving this buffer in the tree are undefined after this call.
1445  */
1446 void
1447 drm_intel_gem_bo_clear_relocs(drm_intel_bo *bo, int start)
1448 {
1449         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1450         int i;
1451         struct timespec time;
1452
1453         clock_gettime(CLOCK_MONOTONIC, &time);
1454
1455         assert(bo_gem->reloc_count >= start);
1456         /* Unreference the cleared target buffers */
1457         for (i = start; i < bo_gem->reloc_count; i++) {
1458                 if (bo_gem->reloc_target_info[i].bo != bo) {
1459                         drm_intel_gem_bo_unreference_locked_timed(bo_gem->
1460                                                                   reloc_target_info[i].bo,
1461                                                                   time.tv_sec);
1462                 }
1463         }
1464         bo_gem->reloc_count = start;
1465 }
1466
1467 /**
1468  * Walk the tree of relocations rooted at BO and accumulate the list of
1469  * validations to be performed and update the relocation buffers with
1470  * index values into the validation list.
1471  */
1472 static void
1473 drm_intel_gem_bo_process_reloc(drm_intel_bo *bo)
1474 {
1475         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1476         int i;
1477
1478         if (bo_gem->relocs == NULL)
1479                 return;
1480
1481         for (i = 0; i < bo_gem->reloc_count; i++) {
1482                 drm_intel_bo *target_bo = bo_gem->reloc_target_info[i].bo;
1483
1484                 if (target_bo == bo)
1485                         continue;
1486
1487                 /* Continue walking the tree depth-first. */
1488                 drm_intel_gem_bo_process_reloc(target_bo);
1489
1490                 /* Add the target to the validate list */
1491                 drm_intel_add_validate_buffer(target_bo);
1492         }
1493 }
1494
1495 static void
1496 drm_intel_gem_bo_process_reloc2(drm_intel_bo *bo)
1497 {
1498         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
1499         int i;
1500
1501         if (bo_gem->relocs == NULL)
1502                 return;
1503
1504         for (i = 0; i < bo_gem->reloc_count; i++) {
1505                 drm_intel_bo *target_bo = bo_gem->reloc_target_info[i].bo;
1506                 int need_fence;
1507
1508                 if (target_bo == bo)
1509                         continue;
1510
1511                 /* Continue walking the tree depth-first. */
1512                 drm_intel_gem_bo_process_reloc2(target_bo);
1513
1514                 need_fence = (bo_gem->reloc_target_info[i].flags &
1515                               DRM_INTEL_RELOC_FENCE);
1516
1517                 /* Add the target to the validate list */
1518                 drm_intel_add_validate_buffer2(target_bo, need_fence);
1519         }
1520 }
1521
1522
1523 static void
1524 drm_intel_update_buffer_offsets(drm_intel_bufmgr_gem *bufmgr_gem)
1525 {
1526         int i;
1527
1528         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1529                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1530                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1531
1532                 /* Update the buffer offset */
1533                 if (bufmgr_gem->exec_objects[i].offset != bo->offset) {
1534                         DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n",
1535                             bo_gem->gem_handle, bo_gem->name, bo->offset,
1536                             (unsigned long long)bufmgr_gem->exec_objects[i].
1537                             offset);
1538                         bo->offset = bufmgr_gem->exec_objects[i].offset;
1539                 }
1540         }
1541 }
1542
1543 static void
1544 drm_intel_update_buffer_offsets2 (drm_intel_bufmgr_gem *bufmgr_gem)
1545 {
1546         int i;
1547
1548         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1549                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1550                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
1551
1552                 /* Update the buffer offset */
1553                 if (bufmgr_gem->exec2_objects[i].offset != bo->offset) {
1554                         DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n",
1555                             bo_gem->gem_handle, bo_gem->name, bo->offset,
1556                             (unsigned long long)bufmgr_gem->exec2_objects[i].offset);
1557                         bo->offset = bufmgr_gem->exec2_objects[i].offset;
1558                 }
1559         }
1560 }
1561
1562 static int
1563 drm_intel_gem_bo_exec(drm_intel_bo *bo, int used,
1564                       drm_clip_rect_t * cliprects, int num_cliprects, int DR4)
1565 {
1566         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1567         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1568         struct drm_i915_gem_execbuffer execbuf;
1569         int ret, i;
1570
1571         if (bo_gem->has_error)
1572                 return -ENOMEM;
1573
1574         pthread_mutex_lock(&bufmgr_gem->lock);
1575         /* Update indices and set up the validate list. */
1576         drm_intel_gem_bo_process_reloc(bo);
1577
1578         /* Add the batch buffer to the validation list.  There are no
1579          * relocations pointing to it.
1580          */
1581         drm_intel_add_validate_buffer(bo);
1582
1583         execbuf.buffers_ptr = (uintptr_t) bufmgr_gem->exec_objects;
1584         execbuf.buffer_count = bufmgr_gem->exec_count;
1585         execbuf.batch_start_offset = 0;
1586         execbuf.batch_len = used;
1587         execbuf.cliprects_ptr = (uintptr_t) cliprects;
1588         execbuf.num_cliprects = num_cliprects;
1589         execbuf.DR1 = 0;
1590         execbuf.DR4 = DR4;
1591
1592         ret = drmIoctl(bufmgr_gem->fd,
1593                        DRM_IOCTL_I915_GEM_EXECBUFFER,
1594                        &execbuf);
1595         if (ret != 0) {
1596                 ret = -errno;
1597                 if (errno == ENOSPC) {
1598                         DBG("Execbuffer fails to pin. "
1599                             "Estimate: %u. Actual: %u. Available: %u\n",
1600                             drm_intel_gem_estimate_batch_space(bufmgr_gem->exec_bos,
1601                                                                bufmgr_gem->
1602                                                                exec_count),
1603                             drm_intel_gem_compute_batch_space(bufmgr_gem->exec_bos,
1604                                                               bufmgr_gem->
1605                                                               exec_count),
1606                             (unsigned int)bufmgr_gem->gtt_size);
1607                 }
1608         }
1609         drm_intel_update_buffer_offsets(bufmgr_gem);
1610
1611         if (bufmgr_gem->bufmgr.debug)
1612                 drm_intel_gem_dump_validation_list(bufmgr_gem);
1613
1614         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1615                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1616                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1617
1618                 /* Disconnect the buffer from the validate list */
1619                 bo_gem->validate_index = -1;
1620                 bufmgr_gem->exec_bos[i] = NULL;
1621         }
1622         bufmgr_gem->exec_count = 0;
1623         pthread_mutex_unlock(&bufmgr_gem->lock);
1624
1625         return ret;
1626 }
1627
1628 static int
1629 drm_intel_gem_bo_mrb_exec2(drm_intel_bo *bo, int used,
1630                         drm_clip_rect_t *cliprects, int num_cliprects, int DR4,
1631                         unsigned int flags)
1632 {
1633         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
1634         struct drm_i915_gem_execbuffer2 execbuf;
1635         int ret, i;
1636
1637         switch (flags & 0x7) {
1638         default:
1639                 return -EINVAL;
1640         case I915_EXEC_BLT:
1641                 if (!bufmgr_gem->has_blt)
1642                         return -EINVAL;
1643                 break;
1644         case I915_EXEC_BSD:
1645                 if (!bufmgr_gem->has_bsd)
1646                         return -EINVAL;
1647                 break;
1648         case I915_EXEC_RENDER:
1649         case I915_EXEC_DEFAULT:
1650                 break;
1651         }
1652
1653         pthread_mutex_lock(&bufmgr_gem->lock);
1654         /* Update indices and set up the validate list. */
1655         drm_intel_gem_bo_process_reloc2(bo);
1656
1657         /* Add the batch buffer to the validation list.  There are no relocations
1658          * pointing to it.
1659          */
1660         drm_intel_add_validate_buffer2(bo, 0);
1661
1662         execbuf.buffers_ptr = (uintptr_t)bufmgr_gem->exec2_objects;
1663         execbuf.buffer_count = bufmgr_gem->exec_count;
1664         execbuf.batch_start_offset = 0;
1665         execbuf.batch_len = used;
1666         execbuf.cliprects_ptr = (uintptr_t)cliprects;
1667         execbuf.num_cliprects = num_cliprects;
1668         execbuf.DR1 = 0;
1669         execbuf.DR4 = DR4;
1670         execbuf.flags = flags;
1671         execbuf.rsvd1 = 0;
1672         execbuf.rsvd2 = 0;
1673
1674         ret = drmIoctl(bufmgr_gem->fd,
1675                        DRM_IOCTL_I915_GEM_EXECBUFFER2,
1676                        &execbuf);
1677         if (ret != 0) {
1678                 ret = -errno;
1679                 if (ret == -ENOSPC) {
1680                         DBG("Execbuffer fails to pin. "
1681                             "Estimate: %u. Actual: %u. Available: %u\n",
1682                             drm_intel_gem_estimate_batch_space(bufmgr_gem->exec_bos,
1683                                                                bufmgr_gem->exec_count),
1684                             drm_intel_gem_compute_batch_space(bufmgr_gem->exec_bos,
1685                                                               bufmgr_gem->exec_count),
1686                             (unsigned int) bufmgr_gem->gtt_size);
1687                 }
1688         }
1689         drm_intel_update_buffer_offsets2(bufmgr_gem);
1690
1691         if (bufmgr_gem->bufmgr.debug)
1692                 drm_intel_gem_dump_validation_list(bufmgr_gem);
1693
1694         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1695                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1696                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
1697
1698                 /* Disconnect the buffer from the validate list */
1699                 bo_gem->validate_index = -1;
1700                 bufmgr_gem->exec_bos[i] = NULL;
1701         }
1702         bufmgr_gem->exec_count = 0;
1703         pthread_mutex_unlock(&bufmgr_gem->lock);
1704
1705         return ret;
1706 }
1707
1708 static int
1709 drm_intel_gem_bo_exec2(drm_intel_bo *bo, int used,
1710                        drm_clip_rect_t *cliprects, int num_cliprects,
1711                        int DR4)
1712 {
1713         return drm_intel_gem_bo_mrb_exec2(bo, used,
1714                                         cliprects, num_cliprects, DR4,
1715                                         I915_EXEC_RENDER);
1716 }
1717
1718 static int
1719 drm_intel_gem_bo_pin(drm_intel_bo *bo, uint32_t alignment)
1720 {
1721         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1722         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1723         struct drm_i915_gem_pin pin;
1724         int ret;
1725
1726         memset(&pin, 0, sizeof(pin));
1727         pin.handle = bo_gem->gem_handle;
1728         pin.alignment = alignment;
1729
1730         ret = drmIoctl(bufmgr_gem->fd,
1731                        DRM_IOCTL_I915_GEM_PIN,
1732                        &pin);
1733         if (ret != 0)
1734                 return -errno;
1735
1736         bo->offset = pin.offset;
1737         return 0;
1738 }
1739
1740 static int
1741 drm_intel_gem_bo_unpin(drm_intel_bo *bo)
1742 {
1743         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1744         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1745         struct drm_i915_gem_unpin unpin;
1746         int ret;
1747
1748         memset(&unpin, 0, sizeof(unpin));
1749         unpin.handle = bo_gem->gem_handle;
1750
1751         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_UNPIN, &unpin);
1752         if (ret != 0)
1753                 return -errno;
1754
1755         return 0;
1756 }
1757
1758 static int
1759 drm_intel_gem_bo_set_tiling_internal(drm_intel_bo *bo,
1760                                      uint32_t tiling_mode,
1761                                      uint32_t stride)
1762 {
1763         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1764         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1765         struct drm_i915_gem_set_tiling set_tiling;
1766         int ret;
1767
1768         if (bo_gem->global_name == 0 &&
1769             tiling_mode == bo_gem->tiling_mode &&
1770             stride == bo_gem->stride)
1771                 return 0;
1772
1773         memset(&set_tiling, 0, sizeof(set_tiling));
1774         do {
1775                 /* set_tiling is slightly broken and overwrites the
1776                  * input on the error path, so we have to open code
1777                  * rmIoctl.
1778                  */
1779                 set_tiling.handle = bo_gem->gem_handle;
1780                 set_tiling.tiling_mode = tiling_mode;
1781                 set_tiling.stride = stride;
1782
1783                 ret = ioctl(bufmgr_gem->fd,
1784                             DRM_IOCTL_I915_GEM_SET_TILING,
1785                             &set_tiling);
1786         } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
1787         if (ret == -1)
1788                 return -errno;
1789
1790         bo_gem->tiling_mode = set_tiling.tiling_mode;
1791         bo_gem->swizzle_mode = set_tiling.swizzle_mode;
1792         bo_gem->stride = set_tiling.stride;
1793         return 0;
1794 }
1795
1796 static int
1797 drm_intel_gem_bo_set_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
1798                             uint32_t stride)
1799 {
1800         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1801         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1802         int ret;
1803
1804         /* Linear buffers have no stride. By ensuring that we only ever use
1805          * stride 0 with linear buffers, we simplify our code.
1806          */
1807         if (*tiling_mode == I915_TILING_NONE)
1808                 stride = 0;
1809
1810         ret = drm_intel_gem_bo_set_tiling_internal(bo, *tiling_mode, stride);
1811         if (ret == 0)
1812                 drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
1813
1814         *tiling_mode = bo_gem->tiling_mode;
1815         return ret;
1816 }
1817
1818 static int
1819 drm_intel_gem_bo_get_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
1820                             uint32_t * swizzle_mode)
1821 {
1822         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1823
1824         *tiling_mode = bo_gem->tiling_mode;
1825         *swizzle_mode = bo_gem->swizzle_mode;
1826         return 0;
1827 }
1828
1829 static int
1830 drm_intel_gem_bo_flink(drm_intel_bo *bo, uint32_t * name)
1831 {
1832         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1833         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1834         struct drm_gem_flink flink;
1835         int ret;
1836
1837         if (!bo_gem->global_name) {
1838                 memset(&flink, 0, sizeof(flink));
1839                 flink.handle = bo_gem->gem_handle;
1840
1841                 ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink);
1842                 if (ret != 0)
1843                         return -errno;
1844                 bo_gem->global_name = flink.name;
1845                 bo_gem->reusable = false;
1846
1847                 DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
1848         }
1849
1850         *name = bo_gem->global_name;
1851         return 0;
1852 }
1853
1854 /**
1855  * Enables unlimited caching of buffer objects for reuse.
1856  *
1857  * This is potentially very memory expensive, as the cache at each bucket
1858  * size is only bounded by how many buffers of that size we've managed to have
1859  * in flight at once.
1860  */
1861 void
1862 drm_intel_bufmgr_gem_enable_reuse(drm_intel_bufmgr *bufmgr)
1863 {
1864         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1865
1866         bufmgr_gem->bo_reuse = true;
1867 }
1868
1869 /**
1870  * Enable use of fenced reloc type.
1871  *
1872  * New code should enable this to avoid unnecessary fence register
1873  * allocation.  If this option is not enabled, all relocs will have fence
1874  * register allocated.
1875  */
1876 void
1877 drm_intel_bufmgr_gem_enable_fenced_relocs(drm_intel_bufmgr *bufmgr)
1878 {
1879         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
1880
1881         if (bufmgr_gem->bufmgr.bo_exec == drm_intel_gem_bo_exec2)
1882                 bufmgr_gem->fenced_relocs = true;
1883 }
1884
1885 /**
1886  * Return the additional aperture space required by the tree of buffer objects
1887  * rooted at bo.
1888  */
1889 static int
1890 drm_intel_gem_bo_get_aperture_space(drm_intel_bo *bo)
1891 {
1892         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1893         int i;
1894         int total = 0;
1895
1896         if (bo == NULL || bo_gem->included_in_check_aperture)
1897                 return 0;
1898
1899         total += bo->size;
1900         bo_gem->included_in_check_aperture = true;
1901
1902         for (i = 0; i < bo_gem->reloc_count; i++)
1903                 total +=
1904                     drm_intel_gem_bo_get_aperture_space(bo_gem->
1905                                                         reloc_target_info[i].bo);
1906
1907         return total;
1908 }
1909
1910 /**
1911  * Count the number of buffers in this list that need a fence reg
1912  *
1913  * If the count is greater than the number of available regs, we'll have
1914  * to ask the caller to resubmit a batch with fewer tiled buffers.
1915  *
1916  * This function over-counts if the same buffer is used multiple times.
1917  */
1918 static unsigned int
1919 drm_intel_gem_total_fences(drm_intel_bo ** bo_array, int count)
1920 {
1921         int i;
1922         unsigned int total = 0;
1923
1924         for (i = 0; i < count; i++) {
1925                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo_array[i];
1926
1927                 if (bo_gem == NULL)
1928                         continue;
1929
1930                 total += bo_gem->reloc_tree_fences;
1931         }
1932         return total;
1933 }
1934
1935 /**
1936  * Clear the flag set by drm_intel_gem_bo_get_aperture_space() so we're ready
1937  * for the next drm_intel_bufmgr_check_aperture_space() call.
1938  */
1939 static void
1940 drm_intel_gem_bo_clear_aperture_space_flag(drm_intel_bo *bo)
1941 {
1942         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1943         int i;
1944
1945         if (bo == NULL || !bo_gem->included_in_check_aperture)
1946                 return;
1947
1948         bo_gem->included_in_check_aperture = false;
1949
1950         for (i = 0; i < bo_gem->reloc_count; i++)
1951                 drm_intel_gem_bo_clear_aperture_space_flag(bo_gem->
1952                                                            reloc_target_info[i].bo);
1953 }
1954
1955 /**
1956  * Return a conservative estimate for the amount of aperture required
1957  * for a collection of buffers. This may double-count some buffers.
1958  */
1959 static unsigned int
1960 drm_intel_gem_estimate_batch_space(drm_intel_bo **bo_array, int count)
1961 {
1962         int i;
1963         unsigned int total = 0;
1964
1965         for (i = 0; i < count; i++) {
1966                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo_array[i];
1967                 if (bo_gem != NULL)
1968                         total += bo_gem->reloc_tree_size;
1969         }
1970         return total;
1971 }
1972
1973 /**
1974  * Return the amount of aperture needed for a collection of buffers.
1975  * This avoids double counting any buffers, at the cost of looking
1976  * at every buffer in the set.
1977  */
1978 static unsigned int
1979 drm_intel_gem_compute_batch_space(drm_intel_bo **bo_array, int count)
1980 {
1981         int i;
1982         unsigned int total = 0;
1983
1984         for (i = 0; i < count; i++) {
1985                 total += drm_intel_gem_bo_get_aperture_space(bo_array[i]);
1986                 /* For the first buffer object in the array, we get an
1987                  * accurate count back for its reloc_tree size (since nothing
1988                  * had been flagged as being counted yet).  We can save that
1989                  * value out as a more conservative reloc_tree_size that
1990                  * avoids double-counting target buffers.  Since the first
1991                  * buffer happens to usually be the batch buffer in our
1992                  * callers, this can pull us back from doing the tree
1993                  * walk on every new batch emit.
1994                  */
1995                 if (i == 0) {
1996                         drm_intel_bo_gem *bo_gem =
1997                             (drm_intel_bo_gem *) bo_array[i];
1998                         bo_gem->reloc_tree_size = total;
1999                 }
2000         }
2001
2002         for (i = 0; i < count; i++)
2003                 drm_intel_gem_bo_clear_aperture_space_flag(bo_array[i]);
2004         return total;
2005 }
2006
2007 /**
2008  * Return -1 if the batchbuffer should be flushed before attempting to
2009  * emit rendering referencing the buffers pointed to by bo_array.
2010  *
2011  * This is required because if we try to emit a batchbuffer with relocations
2012  * to a tree of buffers that won't simultaneously fit in the aperture,
2013  * the rendering will return an error at a point where the software is not
2014  * prepared to recover from it.
2015  *
2016  * However, we also want to emit the batchbuffer significantly before we reach
2017  * the limit, as a series of batchbuffers each of which references buffers
2018  * covering almost all of the aperture means that at each emit we end up
2019  * waiting to evict a buffer from the last rendering, and we get synchronous
2020  * performance.  By emitting smaller batchbuffers, we eat some CPU overhead to
2021  * get better parallelism.
2022  */
2023 static int
2024 drm_intel_gem_check_aperture_space(drm_intel_bo **bo_array, int count)
2025 {
2026         drm_intel_bufmgr_gem *bufmgr_gem =
2027             (drm_intel_bufmgr_gem *) bo_array[0]->bufmgr;
2028         unsigned int total = 0;
2029         unsigned int threshold = bufmgr_gem->gtt_size * 3 / 4;
2030         int total_fences;
2031
2032         /* Check for fence reg constraints if necessary */
2033         if (bufmgr_gem->available_fences) {
2034                 total_fences = drm_intel_gem_total_fences(bo_array, count);
2035                 if (total_fences > bufmgr_gem->available_fences)
2036                         return -ENOSPC;
2037         }
2038
2039         total = drm_intel_gem_estimate_batch_space(bo_array, count);
2040
2041         if (total > threshold)
2042                 total = drm_intel_gem_compute_batch_space(bo_array, count);
2043
2044         if (total > threshold) {
2045                 DBG("check_space: overflowed available aperture, "
2046                     "%dkb vs %dkb\n",
2047                     total / 1024, (int)bufmgr_gem->gtt_size / 1024);
2048                 return -ENOSPC;
2049         } else {
2050                 DBG("drm_check_space: total %dkb vs bufgr %dkb\n", total / 1024,
2051                     (int)bufmgr_gem->gtt_size / 1024);
2052                 return 0;
2053         }
2054 }
2055
2056 /*
2057  * Disable buffer reuse for objects which are shared with the kernel
2058  * as scanout buffers
2059  */
2060 static int
2061 drm_intel_gem_bo_disable_reuse(drm_intel_bo *bo)
2062 {
2063         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2064
2065         bo_gem->reusable = false;
2066         return 0;
2067 }
2068
2069 static int
2070 drm_intel_gem_bo_is_reusable(drm_intel_bo *bo)
2071 {
2072         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2073
2074         return bo_gem->reusable;
2075 }
2076
2077 static int
2078 _drm_intel_gem_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo)
2079 {
2080         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2081         int i;
2082
2083         for (i = 0; i < bo_gem->reloc_count; i++) {
2084                 if (bo_gem->reloc_target_info[i].bo == target_bo)
2085                         return 1;
2086                 if (bo == bo_gem->reloc_target_info[i].bo)
2087                         continue;
2088                 if (_drm_intel_gem_bo_references(bo_gem->reloc_target_info[i].bo,
2089                                                 target_bo))
2090                         return 1;
2091         }
2092
2093         return 0;
2094 }
2095
2096 /** Return true if target_bo is referenced by bo's relocation tree. */
2097 static int
2098 drm_intel_gem_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo)
2099 {
2100         drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) target_bo;
2101
2102         if (bo == NULL || target_bo == NULL)
2103                 return 0;
2104         if (target_bo_gem->used_as_reloc_target)
2105                 return _drm_intel_gem_bo_references(bo, target_bo);
2106         return 0;
2107 }
2108
2109 static void
2110 add_bucket(drm_intel_bufmgr_gem *bufmgr_gem, int size)
2111 {
2112         unsigned int i = bufmgr_gem->num_buckets;
2113
2114         assert(i < ARRAY_SIZE(bufmgr_gem->cache_bucket));
2115
2116         DRMINITLISTHEAD(&bufmgr_gem->cache_bucket[i].head);
2117         bufmgr_gem->cache_bucket[i].size = size;
2118         bufmgr_gem->num_buckets++;
2119 }
2120
2121 static void
2122 init_cache_buckets(drm_intel_bufmgr_gem *bufmgr_gem)
2123 {
2124         unsigned long size, cache_max_size = 64 * 1024 * 1024;
2125
2126         /* OK, so power of two buckets was too wasteful of memory.
2127          * Give 3 other sizes between each power of two, to hopefully
2128          * cover things accurately enough.  (The alternative is
2129          * probably to just go for exact matching of sizes, and assume
2130          * that for things like composited window resize the tiled
2131          * width/height alignment and rounding of sizes to pages will
2132          * get us useful cache hit rates anyway)
2133          */
2134         add_bucket(bufmgr_gem, 4096);
2135         add_bucket(bufmgr_gem, 4096 * 2);
2136         add_bucket(bufmgr_gem, 4096 * 3);
2137
2138         /* Initialize the linked lists for BO reuse cache. */
2139         for (size = 4 * 4096; size <= cache_max_size; size *= 2) {
2140                 add_bucket(bufmgr_gem, size);
2141
2142                 add_bucket(bufmgr_gem, size + size * 1 / 4);
2143                 add_bucket(bufmgr_gem, size + size * 2 / 4);
2144                 add_bucket(bufmgr_gem, size + size * 3 / 4);
2145         }
2146 }
2147
2148 /**
2149  * Initializes the GEM buffer manager, which uses the kernel to allocate, map,
2150  * and manage map buffer objections.
2151  *
2152  * \param fd File descriptor of the opened DRM device.
2153  */
2154 drm_intel_bufmgr *
2155 drm_intel_bufmgr_gem_init(int fd, int batch_size)
2156 {
2157         drm_intel_bufmgr_gem *bufmgr_gem;
2158         struct drm_i915_gem_get_aperture aperture;
2159         drm_i915_getparam_t gp;
2160         int ret, tmp;
2161         bool exec2 = false;
2162
2163         bufmgr_gem = calloc(1, sizeof(*bufmgr_gem));
2164         if (bufmgr_gem == NULL)
2165                 return NULL;
2166
2167         bufmgr_gem->fd = fd;
2168
2169         if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) {
2170                 free(bufmgr_gem);
2171                 return NULL;
2172         }
2173
2174         ret = drmIoctl(bufmgr_gem->fd,
2175                        DRM_IOCTL_I915_GEM_GET_APERTURE,
2176                        &aperture);
2177
2178         if (ret == 0)
2179                 bufmgr_gem->gtt_size = aperture.aper_available_size;
2180         else {
2181                 fprintf(stderr, "DRM_IOCTL_I915_GEM_APERTURE failed: %s\n",
2182                         strerror(errno));
2183                 bufmgr_gem->gtt_size = 128 * 1024 * 1024;
2184                 fprintf(stderr, "Assuming %dkB available aperture size.\n"
2185                         "May lead to reduced performance or incorrect "
2186                         "rendering.\n",
2187                         (int)bufmgr_gem->gtt_size / 1024);
2188         }
2189
2190         gp.param = I915_PARAM_CHIPSET_ID;
2191         gp.value = &bufmgr_gem->pci_device;
2192         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2193         if (ret) {
2194                 fprintf(stderr, "get chip id failed: %d [%d]\n", ret, errno);
2195                 fprintf(stderr, "param: %d, val: %d\n", gp.param, *gp.value);
2196         }
2197
2198         if (IS_GEN2(bufmgr_gem))
2199                 bufmgr_gem->gen = 2;
2200         else if (IS_GEN3(bufmgr_gem))
2201                 bufmgr_gem->gen = 3;
2202         else if (IS_GEN4(bufmgr_gem))
2203                 bufmgr_gem->gen = 4;
2204         else
2205                 bufmgr_gem->gen = 6;
2206
2207         gp.value = &tmp;
2208
2209         gp.param = I915_PARAM_HAS_EXECBUF2;
2210         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2211         if (!ret)
2212                 exec2 = true;
2213
2214         gp.param = I915_PARAM_HAS_BSD;
2215         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2216         bufmgr_gem->has_bsd = ret == 0;
2217
2218         gp.param = I915_PARAM_HAS_BLT;
2219         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2220         bufmgr_gem->has_blt = ret == 0;
2221
2222         gp.param = I915_PARAM_HAS_RELAXED_FENCING;
2223         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2224         bufmgr_gem->has_relaxed_fencing = ret == 0;
2225
2226         if (bufmgr_gem->gen < 4) {
2227                 gp.param = I915_PARAM_NUM_FENCES_AVAIL;
2228                 gp.value = &bufmgr_gem->available_fences;
2229                 ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2230                 if (ret) {
2231                         fprintf(stderr, "get fences failed: %d [%d]\n", ret,
2232                                 errno);
2233                         fprintf(stderr, "param: %d, val: %d\n", gp.param,
2234                                 *gp.value);
2235                         bufmgr_gem->available_fences = 0;
2236                 } else {
2237                         /* XXX The kernel reports the total number of fences,
2238                          * including any that may be pinned.
2239                          *
2240                          * We presume that there will be at least one pinned
2241                          * fence for the scanout buffer, but there may be more
2242                          * than one scanout and the user may be manually
2243                          * pinning buffers. Let's move to execbuffer2 and
2244                          * thereby forget the insanity of using fences...
2245                          */
2246                         bufmgr_gem->available_fences -= 2;
2247                         if (bufmgr_gem->available_fences < 0)
2248                                 bufmgr_gem->available_fences = 0;
2249                 }
2250         }
2251
2252         /* Let's go with one relocation per every 2 dwords (but round down a bit
2253          * since a power of two will mean an extra page allocation for the reloc
2254          * buffer).
2255          *
2256          * Every 4 was too few for the blender benchmark.
2257          */
2258         bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2;
2259
2260         bufmgr_gem->bufmgr.bo_alloc = drm_intel_gem_bo_alloc;
2261         bufmgr_gem->bufmgr.bo_alloc_for_render =
2262             drm_intel_gem_bo_alloc_for_render;
2263         bufmgr_gem->bufmgr.bo_alloc_tiled = drm_intel_gem_bo_alloc_tiled;
2264         bufmgr_gem->bufmgr.bo_reference = drm_intel_gem_bo_reference;
2265         bufmgr_gem->bufmgr.bo_unreference = drm_intel_gem_bo_unreference;
2266         bufmgr_gem->bufmgr.bo_map = drm_intel_gem_bo_map;
2267         bufmgr_gem->bufmgr.bo_unmap = drm_intel_gem_bo_unmap;
2268         bufmgr_gem->bufmgr.bo_subdata = drm_intel_gem_bo_subdata;
2269         bufmgr_gem->bufmgr.bo_get_subdata = drm_intel_gem_bo_get_subdata;
2270         bufmgr_gem->bufmgr.bo_wait_rendering = drm_intel_gem_bo_wait_rendering;
2271         bufmgr_gem->bufmgr.bo_emit_reloc = drm_intel_gem_bo_emit_reloc;
2272         bufmgr_gem->bufmgr.bo_emit_reloc_fence = drm_intel_gem_bo_emit_reloc_fence;
2273         bufmgr_gem->bufmgr.bo_pin = drm_intel_gem_bo_pin;
2274         bufmgr_gem->bufmgr.bo_unpin = drm_intel_gem_bo_unpin;
2275         bufmgr_gem->bufmgr.bo_get_tiling = drm_intel_gem_bo_get_tiling;
2276         bufmgr_gem->bufmgr.bo_set_tiling = drm_intel_gem_bo_set_tiling;
2277         bufmgr_gem->bufmgr.bo_flink = drm_intel_gem_bo_flink;
2278         /* Use the new one if available */
2279         if (exec2) {
2280                 bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2;
2281                 bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2;
2282         } else
2283                 bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec;
2284         bufmgr_gem->bufmgr.bo_busy = drm_intel_gem_bo_busy;
2285         bufmgr_gem->bufmgr.bo_madvise = drm_intel_gem_bo_madvise;
2286         bufmgr_gem->bufmgr.destroy = drm_intel_bufmgr_gem_destroy;
2287         bufmgr_gem->bufmgr.debug = 0;
2288         bufmgr_gem->bufmgr.check_aperture_space =
2289             drm_intel_gem_check_aperture_space;
2290         bufmgr_gem->bufmgr.bo_disable_reuse = drm_intel_gem_bo_disable_reuse;
2291         bufmgr_gem->bufmgr.bo_is_reusable = drm_intel_gem_bo_is_reusable;
2292         bufmgr_gem->bufmgr.get_pipe_from_crtc_id =
2293             drm_intel_gem_get_pipe_from_crtc_id;
2294         bufmgr_gem->bufmgr.bo_references = drm_intel_gem_bo_references;
2295
2296         DRMINITLISTHEAD(&bufmgr_gem->named);
2297         init_cache_buckets(bufmgr_gem);
2298
2299         return &bufmgr_gem->bufmgr;
2300 }