OSDN Git Service

intel: Don't call the SW_FINISH ioctl unless a CPU-mapped write was done.
[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 int drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo)
1138 {
1139         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1140         int ret = 0;
1141
1142         if (bo == NULL)
1143                 return 0;
1144
1145         pthread_mutex_lock(&bufmgr_gem->lock);
1146         bo->virtual = NULL;
1147         pthread_mutex_unlock(&bufmgr_gem->lock);
1148
1149         return ret;
1150 }
1151
1152 static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
1153 {
1154         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1155         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1156         struct drm_i915_gem_sw_finish sw_finish;
1157         int ret = 0;
1158
1159         if (bo == NULL)
1160                 return 0;
1161
1162         pthread_mutex_lock(&bufmgr_gem->lock);
1163
1164         if (bo_gem->mapped_cpu_write) {
1165                 /* Cause a flush to happen if the buffer's pinned for
1166                  * scanout, so the results show up in a timely manner.
1167                  * Unlike GTT set domains, this only does work if the
1168                  * buffer should be scanout-related.
1169                  */
1170                 sw_finish.handle = bo_gem->gem_handle;
1171                 ret = drmIoctl(bufmgr_gem->fd,
1172                                DRM_IOCTL_I915_GEM_SW_FINISH,
1173                                &sw_finish);
1174                 ret = ret == -1 ? -errno : 0;
1175
1176                 bo_gem->mapped_cpu_write = false;
1177         }
1178
1179         bo->virtual = NULL;
1180         pthread_mutex_unlock(&bufmgr_gem->lock);
1181
1182         return ret;
1183 }
1184
1185 static int
1186 drm_intel_gem_bo_subdata(drm_intel_bo *bo, unsigned long offset,
1187                          unsigned long size, const void *data)
1188 {
1189         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1190         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1191         struct drm_i915_gem_pwrite pwrite;
1192         int ret;
1193
1194         memset(&pwrite, 0, sizeof(pwrite));
1195         pwrite.handle = bo_gem->gem_handle;
1196         pwrite.offset = offset;
1197         pwrite.size = size;
1198         pwrite.data_ptr = (uint64_t) (uintptr_t) data;
1199         ret = drmIoctl(bufmgr_gem->fd,
1200                        DRM_IOCTL_I915_GEM_PWRITE,
1201                        &pwrite);
1202         if (ret != 0) {
1203                 ret = -errno;
1204                 DBG("%s:%d: Error writing data to buffer %d: (%d %d) %s .\n",
1205                     __FILE__, __LINE__, bo_gem->gem_handle, (int)offset,
1206                     (int)size, strerror(errno));
1207         }
1208
1209         return ret;
1210 }
1211
1212 static int
1213 drm_intel_gem_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, int crtc_id)
1214 {
1215         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1216         struct drm_i915_get_pipe_from_crtc_id get_pipe_from_crtc_id;
1217         int ret;
1218
1219         get_pipe_from_crtc_id.crtc_id = crtc_id;
1220         ret = drmIoctl(bufmgr_gem->fd,
1221                        DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID,
1222                        &get_pipe_from_crtc_id);
1223         if (ret != 0) {
1224                 /* We return -1 here to signal that we don't
1225                  * know which pipe is associated with this crtc.
1226                  * This lets the caller know that this information
1227                  * isn't available; using the wrong pipe for
1228                  * vblank waiting can cause the chipset to lock up
1229                  */
1230                 return -1;
1231         }
1232
1233         return get_pipe_from_crtc_id.pipe;
1234 }
1235
1236 static int
1237 drm_intel_gem_bo_get_subdata(drm_intel_bo *bo, unsigned long offset,
1238                              unsigned long size, void *data)
1239 {
1240         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1241         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1242         struct drm_i915_gem_pread pread;
1243         int ret;
1244
1245         memset(&pread, 0, sizeof(pread));
1246         pread.handle = bo_gem->gem_handle;
1247         pread.offset = offset;
1248         pread.size = size;
1249         pread.data_ptr = (uint64_t) (uintptr_t) data;
1250         ret = drmIoctl(bufmgr_gem->fd,
1251                        DRM_IOCTL_I915_GEM_PREAD,
1252                        &pread);
1253         if (ret != 0) {
1254                 ret = -errno;
1255                 DBG("%s:%d: Error reading data from buffer %d: (%d %d) %s .\n",
1256                     __FILE__, __LINE__, bo_gem->gem_handle, (int)offset,
1257                     (int)size, strerror(errno));
1258         }
1259
1260         return ret;
1261 }
1262
1263 /** Waits for all GPU rendering with the object to have completed. */
1264 static void
1265 drm_intel_gem_bo_wait_rendering(drm_intel_bo *bo)
1266 {
1267         drm_intel_gem_bo_start_gtt_access(bo, 1);
1268 }
1269
1270 /**
1271  * Sets the object to the GTT read and possibly write domain, used by the X
1272  * 2D driver in the absence of kernel support to do drm_intel_gem_bo_map_gtt().
1273  *
1274  * In combination with drm_intel_gem_bo_pin() and manual fence management, we
1275  * can do tiled pixmaps this way.
1276  */
1277 void
1278 drm_intel_gem_bo_start_gtt_access(drm_intel_bo *bo, int write_enable)
1279 {
1280         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1281         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1282         struct drm_i915_gem_set_domain set_domain;
1283         int ret;
1284
1285         set_domain.handle = bo_gem->gem_handle;
1286         set_domain.read_domains = I915_GEM_DOMAIN_GTT;
1287         set_domain.write_domain = write_enable ? I915_GEM_DOMAIN_GTT : 0;
1288         ret = drmIoctl(bufmgr_gem->fd,
1289                        DRM_IOCTL_I915_GEM_SET_DOMAIN,
1290                        &set_domain);
1291         if (ret != 0) {
1292                 DBG("%s:%d: Error setting memory domains %d (%08x %08x): %s .\n",
1293                     __FILE__, __LINE__, bo_gem->gem_handle,
1294                     set_domain.read_domains, set_domain.write_domain,
1295                     strerror(errno));
1296         }
1297 }
1298
1299 static void
1300 drm_intel_bufmgr_gem_destroy(drm_intel_bufmgr *bufmgr)
1301 {
1302         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1303         int i;
1304
1305         free(bufmgr_gem->exec2_objects);
1306         free(bufmgr_gem->exec_objects);
1307         free(bufmgr_gem->exec_bos);
1308
1309         pthread_mutex_destroy(&bufmgr_gem->lock);
1310
1311         /* Free any cached buffer objects we were going to reuse */
1312         for (i = 0; i < bufmgr_gem->num_buckets; i++) {
1313                 struct drm_intel_gem_bo_bucket *bucket =
1314                     &bufmgr_gem->cache_bucket[i];
1315                 drm_intel_bo_gem *bo_gem;
1316
1317                 while (!DRMLISTEMPTY(&bucket->head)) {
1318                         bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
1319                                               bucket->head.next, head);
1320                         DRMLISTDEL(&bo_gem->head);
1321
1322                         drm_intel_gem_bo_free(&bo_gem->bo);
1323                 }
1324         }
1325
1326         free(bufmgr);
1327 }
1328
1329 /**
1330  * Adds the target buffer to the validation list and adds the relocation
1331  * to the reloc_buffer's relocation list.
1332  *
1333  * The relocation entry at the given offset must already contain the
1334  * precomputed relocation value, because the kernel will optimize out
1335  * the relocation entry write when the buffer hasn't moved from the
1336  * last known offset in target_bo.
1337  */
1338 static int
1339 do_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
1340                  drm_intel_bo *target_bo, uint32_t target_offset,
1341                  uint32_t read_domains, uint32_t write_domain,
1342                  bool need_fence)
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         drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) target_bo;
1347         bool fenced_command;
1348
1349         if (bo_gem->has_error)
1350                 return -ENOMEM;
1351
1352         if (target_bo_gem->has_error) {
1353                 bo_gem->has_error = true;
1354                 return -ENOMEM;
1355         }
1356
1357         /* We never use HW fences for rendering on 965+ */
1358         if (bufmgr_gem->gen >= 4)
1359                 need_fence = false;
1360
1361         fenced_command = need_fence;
1362         if (target_bo_gem->tiling_mode == I915_TILING_NONE)
1363                 need_fence = false;
1364
1365         /* Create a new relocation list if needed */
1366         if (bo_gem->relocs == NULL && drm_intel_setup_reloc_list(bo))
1367                 return -ENOMEM;
1368
1369         /* Check overflow */
1370         assert(bo_gem->reloc_count < bufmgr_gem->max_relocs);
1371
1372         /* Check args */
1373         assert(offset <= bo->size - 4);
1374         assert((write_domain & (write_domain - 1)) == 0);
1375
1376         /* Make sure that we're not adding a reloc to something whose size has
1377          * already been accounted for.
1378          */
1379         assert(!bo_gem->used_as_reloc_target);
1380         if (target_bo_gem != bo_gem) {
1381                 target_bo_gem->used_as_reloc_target = true;
1382                 bo_gem->reloc_tree_size += target_bo_gem->reloc_tree_size;
1383         }
1384         /* An object needing a fence is a tiled buffer, so it won't have
1385          * relocs to other buffers.
1386          */
1387         if (need_fence)
1388                 target_bo_gem->reloc_tree_fences = 1;
1389         bo_gem->reloc_tree_fences += target_bo_gem->reloc_tree_fences;
1390
1391         bo_gem->relocs[bo_gem->reloc_count].offset = offset;
1392         bo_gem->relocs[bo_gem->reloc_count].delta = target_offset;
1393         bo_gem->relocs[bo_gem->reloc_count].target_handle =
1394             target_bo_gem->gem_handle;
1395         bo_gem->relocs[bo_gem->reloc_count].read_domains = read_domains;
1396         bo_gem->relocs[bo_gem->reloc_count].write_domain = write_domain;
1397         bo_gem->relocs[bo_gem->reloc_count].presumed_offset = target_bo->offset;
1398
1399         bo_gem->reloc_target_info[bo_gem->reloc_count].bo = target_bo;
1400         if (target_bo != bo)
1401                 drm_intel_gem_bo_reference(target_bo);
1402         if (fenced_command)
1403                 bo_gem->reloc_target_info[bo_gem->reloc_count].flags =
1404                         DRM_INTEL_RELOC_FENCE;
1405         else
1406                 bo_gem->reloc_target_info[bo_gem->reloc_count].flags = 0;
1407
1408         bo_gem->reloc_count++;
1409
1410         return 0;
1411 }
1412
1413 static int
1414 drm_intel_gem_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
1415                             drm_intel_bo *target_bo, uint32_t target_offset,
1416                             uint32_t read_domains, uint32_t write_domain)
1417 {
1418         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
1419
1420         return do_bo_emit_reloc(bo, offset, target_bo, target_offset,
1421                                 read_domains, write_domain,
1422                                 !bufmgr_gem->fenced_relocs);
1423 }
1424
1425 static int
1426 drm_intel_gem_bo_emit_reloc_fence(drm_intel_bo *bo, uint32_t offset,
1427                                   drm_intel_bo *target_bo,
1428                                   uint32_t target_offset,
1429                                   uint32_t read_domains, uint32_t write_domain)
1430 {
1431         return do_bo_emit_reloc(bo, offset, target_bo, target_offset,
1432                                 read_domains, write_domain, true);
1433 }
1434
1435 int
1436 drm_intel_gem_bo_get_reloc_count(drm_intel_bo *bo)
1437 {
1438         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1439
1440         return bo_gem->reloc_count;
1441 }
1442
1443 /**
1444  * Removes existing relocation entries in the BO after "start".
1445  *
1446  * This allows a user to avoid a two-step process for state setup with
1447  * counting up all the buffer objects and doing a
1448  * drm_intel_bufmgr_check_aperture_space() before emitting any of the
1449  * relocations for the state setup.  Instead, save the state of the
1450  * batchbuffer including drm_intel_gem_get_reloc_count(), emit all the
1451  * state, and then check if it still fits in the aperture.
1452  *
1453  * Any further drm_intel_bufmgr_check_aperture_space() queries
1454  * involving this buffer in the tree are undefined after this call.
1455  */
1456 void
1457 drm_intel_gem_bo_clear_relocs(drm_intel_bo *bo, int start)
1458 {
1459         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1460         int i;
1461         struct timespec time;
1462
1463         clock_gettime(CLOCK_MONOTONIC, &time);
1464
1465         assert(bo_gem->reloc_count >= start);
1466         /* Unreference the cleared target buffers */
1467         for (i = start; i < bo_gem->reloc_count; i++) {
1468                 if (bo_gem->reloc_target_info[i].bo != bo) {
1469                         drm_intel_gem_bo_unreference_locked_timed(bo_gem->
1470                                                                   reloc_target_info[i].bo,
1471                                                                   time.tv_sec);
1472                 }
1473         }
1474         bo_gem->reloc_count = start;
1475 }
1476
1477 /**
1478  * Walk the tree of relocations rooted at BO and accumulate the list of
1479  * validations to be performed and update the relocation buffers with
1480  * index values into the validation list.
1481  */
1482 static void
1483 drm_intel_gem_bo_process_reloc(drm_intel_bo *bo)
1484 {
1485         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1486         int i;
1487
1488         if (bo_gem->relocs == NULL)
1489                 return;
1490
1491         for (i = 0; i < bo_gem->reloc_count; i++) {
1492                 drm_intel_bo *target_bo = bo_gem->reloc_target_info[i].bo;
1493
1494                 if (target_bo == bo)
1495                         continue;
1496
1497                 /* Continue walking the tree depth-first. */
1498                 drm_intel_gem_bo_process_reloc(target_bo);
1499
1500                 /* Add the target to the validate list */
1501                 drm_intel_add_validate_buffer(target_bo);
1502         }
1503 }
1504
1505 static void
1506 drm_intel_gem_bo_process_reloc2(drm_intel_bo *bo)
1507 {
1508         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
1509         int i;
1510
1511         if (bo_gem->relocs == NULL)
1512                 return;
1513
1514         for (i = 0; i < bo_gem->reloc_count; i++) {
1515                 drm_intel_bo *target_bo = bo_gem->reloc_target_info[i].bo;
1516                 int need_fence;
1517
1518                 if (target_bo == bo)
1519                         continue;
1520
1521                 /* Continue walking the tree depth-first. */
1522                 drm_intel_gem_bo_process_reloc2(target_bo);
1523
1524                 need_fence = (bo_gem->reloc_target_info[i].flags &
1525                               DRM_INTEL_RELOC_FENCE);
1526
1527                 /* Add the target to the validate list */
1528                 drm_intel_add_validate_buffer2(target_bo, need_fence);
1529         }
1530 }
1531
1532
1533 static void
1534 drm_intel_update_buffer_offsets(drm_intel_bufmgr_gem *bufmgr_gem)
1535 {
1536         int i;
1537
1538         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1539                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1540                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1541
1542                 /* Update the buffer offset */
1543                 if (bufmgr_gem->exec_objects[i].offset != bo->offset) {
1544                         DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n",
1545                             bo_gem->gem_handle, bo_gem->name, bo->offset,
1546                             (unsigned long long)bufmgr_gem->exec_objects[i].
1547                             offset);
1548                         bo->offset = bufmgr_gem->exec_objects[i].offset;
1549                 }
1550         }
1551 }
1552
1553 static void
1554 drm_intel_update_buffer_offsets2 (drm_intel_bufmgr_gem *bufmgr_gem)
1555 {
1556         int i;
1557
1558         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1559                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1560                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
1561
1562                 /* Update the buffer offset */
1563                 if (bufmgr_gem->exec2_objects[i].offset != bo->offset) {
1564                         DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n",
1565                             bo_gem->gem_handle, bo_gem->name, bo->offset,
1566                             (unsigned long long)bufmgr_gem->exec2_objects[i].offset);
1567                         bo->offset = bufmgr_gem->exec2_objects[i].offset;
1568                 }
1569         }
1570 }
1571
1572 static int
1573 drm_intel_gem_bo_exec(drm_intel_bo *bo, int used,
1574                       drm_clip_rect_t * cliprects, int num_cliprects, int DR4)
1575 {
1576         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1577         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1578         struct drm_i915_gem_execbuffer execbuf;
1579         int ret, i;
1580
1581         if (bo_gem->has_error)
1582                 return -ENOMEM;
1583
1584         pthread_mutex_lock(&bufmgr_gem->lock);
1585         /* Update indices and set up the validate list. */
1586         drm_intel_gem_bo_process_reloc(bo);
1587
1588         /* Add the batch buffer to the validation list.  There are no
1589          * relocations pointing to it.
1590          */
1591         drm_intel_add_validate_buffer(bo);
1592
1593         execbuf.buffers_ptr = (uintptr_t) bufmgr_gem->exec_objects;
1594         execbuf.buffer_count = bufmgr_gem->exec_count;
1595         execbuf.batch_start_offset = 0;
1596         execbuf.batch_len = used;
1597         execbuf.cliprects_ptr = (uintptr_t) cliprects;
1598         execbuf.num_cliprects = num_cliprects;
1599         execbuf.DR1 = 0;
1600         execbuf.DR4 = DR4;
1601
1602         ret = drmIoctl(bufmgr_gem->fd,
1603                        DRM_IOCTL_I915_GEM_EXECBUFFER,
1604                        &execbuf);
1605         if (ret != 0) {
1606                 ret = -errno;
1607                 if (errno == ENOSPC) {
1608                         DBG("Execbuffer fails to pin. "
1609                             "Estimate: %u. Actual: %u. Available: %u\n",
1610                             drm_intel_gem_estimate_batch_space(bufmgr_gem->exec_bos,
1611                                                                bufmgr_gem->
1612                                                                exec_count),
1613                             drm_intel_gem_compute_batch_space(bufmgr_gem->exec_bos,
1614                                                               bufmgr_gem->
1615                                                               exec_count),
1616                             (unsigned int)bufmgr_gem->gtt_size);
1617                 }
1618         }
1619         drm_intel_update_buffer_offsets(bufmgr_gem);
1620
1621         if (bufmgr_gem->bufmgr.debug)
1622                 drm_intel_gem_dump_validation_list(bufmgr_gem);
1623
1624         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1625                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1626                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1627
1628                 /* Disconnect the buffer from the validate list */
1629                 bo_gem->validate_index = -1;
1630                 bufmgr_gem->exec_bos[i] = NULL;
1631         }
1632         bufmgr_gem->exec_count = 0;
1633         pthread_mutex_unlock(&bufmgr_gem->lock);
1634
1635         return ret;
1636 }
1637
1638 static int
1639 drm_intel_gem_bo_mrb_exec2(drm_intel_bo *bo, int used,
1640                         drm_clip_rect_t *cliprects, int num_cliprects, int DR4,
1641                         unsigned int flags)
1642 {
1643         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
1644         struct drm_i915_gem_execbuffer2 execbuf;
1645         int ret, i;
1646
1647         switch (flags & 0x7) {
1648         default:
1649                 return -EINVAL;
1650         case I915_EXEC_BLT:
1651                 if (!bufmgr_gem->has_blt)
1652                         return -EINVAL;
1653                 break;
1654         case I915_EXEC_BSD:
1655                 if (!bufmgr_gem->has_bsd)
1656                         return -EINVAL;
1657                 break;
1658         case I915_EXEC_RENDER:
1659         case I915_EXEC_DEFAULT:
1660                 break;
1661         }
1662
1663         pthread_mutex_lock(&bufmgr_gem->lock);
1664         /* Update indices and set up the validate list. */
1665         drm_intel_gem_bo_process_reloc2(bo);
1666
1667         /* Add the batch buffer to the validation list.  There are no relocations
1668          * pointing to it.
1669          */
1670         drm_intel_add_validate_buffer2(bo, 0);
1671
1672         execbuf.buffers_ptr = (uintptr_t)bufmgr_gem->exec2_objects;
1673         execbuf.buffer_count = bufmgr_gem->exec_count;
1674         execbuf.batch_start_offset = 0;
1675         execbuf.batch_len = used;
1676         execbuf.cliprects_ptr = (uintptr_t)cliprects;
1677         execbuf.num_cliprects = num_cliprects;
1678         execbuf.DR1 = 0;
1679         execbuf.DR4 = DR4;
1680         execbuf.flags = flags;
1681         execbuf.rsvd1 = 0;
1682         execbuf.rsvd2 = 0;
1683
1684         ret = drmIoctl(bufmgr_gem->fd,
1685                        DRM_IOCTL_I915_GEM_EXECBUFFER2,
1686                        &execbuf);
1687         if (ret != 0) {
1688                 ret = -errno;
1689                 if (ret == -ENOSPC) {
1690                         DBG("Execbuffer fails to pin. "
1691                             "Estimate: %u. Actual: %u. Available: %u\n",
1692                             drm_intel_gem_estimate_batch_space(bufmgr_gem->exec_bos,
1693                                                                bufmgr_gem->exec_count),
1694                             drm_intel_gem_compute_batch_space(bufmgr_gem->exec_bos,
1695                                                               bufmgr_gem->exec_count),
1696                             (unsigned int) bufmgr_gem->gtt_size);
1697                 }
1698         }
1699         drm_intel_update_buffer_offsets2(bufmgr_gem);
1700
1701         if (bufmgr_gem->bufmgr.debug)
1702                 drm_intel_gem_dump_validation_list(bufmgr_gem);
1703
1704         for (i = 0; i < bufmgr_gem->exec_count; i++) {
1705                 drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1706                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
1707
1708                 /* Disconnect the buffer from the validate list */
1709                 bo_gem->validate_index = -1;
1710                 bufmgr_gem->exec_bos[i] = NULL;
1711         }
1712         bufmgr_gem->exec_count = 0;
1713         pthread_mutex_unlock(&bufmgr_gem->lock);
1714
1715         return ret;
1716 }
1717
1718 static int
1719 drm_intel_gem_bo_exec2(drm_intel_bo *bo, int used,
1720                        drm_clip_rect_t *cliprects, int num_cliprects,
1721                        int DR4)
1722 {
1723         return drm_intel_gem_bo_mrb_exec2(bo, used,
1724                                         cliprects, num_cliprects, DR4,
1725                                         I915_EXEC_RENDER);
1726 }
1727
1728 static int
1729 drm_intel_gem_bo_pin(drm_intel_bo *bo, uint32_t alignment)
1730 {
1731         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1732         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1733         struct drm_i915_gem_pin pin;
1734         int ret;
1735
1736         memset(&pin, 0, sizeof(pin));
1737         pin.handle = bo_gem->gem_handle;
1738         pin.alignment = alignment;
1739
1740         ret = drmIoctl(bufmgr_gem->fd,
1741                        DRM_IOCTL_I915_GEM_PIN,
1742                        &pin);
1743         if (ret != 0)
1744                 return -errno;
1745
1746         bo->offset = pin.offset;
1747         return 0;
1748 }
1749
1750 static int
1751 drm_intel_gem_bo_unpin(drm_intel_bo *bo)
1752 {
1753         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1754         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1755         struct drm_i915_gem_unpin unpin;
1756         int ret;
1757
1758         memset(&unpin, 0, sizeof(unpin));
1759         unpin.handle = bo_gem->gem_handle;
1760
1761         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_UNPIN, &unpin);
1762         if (ret != 0)
1763                 return -errno;
1764
1765         return 0;
1766 }
1767
1768 static int
1769 drm_intel_gem_bo_set_tiling_internal(drm_intel_bo *bo,
1770                                      uint32_t tiling_mode,
1771                                      uint32_t stride)
1772 {
1773         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1774         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1775         struct drm_i915_gem_set_tiling set_tiling;
1776         int ret;
1777
1778         if (bo_gem->global_name == 0 &&
1779             tiling_mode == bo_gem->tiling_mode &&
1780             stride == bo_gem->stride)
1781                 return 0;
1782
1783         memset(&set_tiling, 0, sizeof(set_tiling));
1784         do {
1785                 /* set_tiling is slightly broken and overwrites the
1786                  * input on the error path, so we have to open code
1787                  * rmIoctl.
1788                  */
1789                 set_tiling.handle = bo_gem->gem_handle;
1790                 set_tiling.tiling_mode = tiling_mode;
1791                 set_tiling.stride = stride;
1792
1793                 ret = ioctl(bufmgr_gem->fd,
1794                             DRM_IOCTL_I915_GEM_SET_TILING,
1795                             &set_tiling);
1796         } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
1797         if (ret == -1)
1798                 return -errno;
1799
1800         bo_gem->tiling_mode = set_tiling.tiling_mode;
1801         bo_gem->swizzle_mode = set_tiling.swizzle_mode;
1802         bo_gem->stride = set_tiling.stride;
1803         return 0;
1804 }
1805
1806 static int
1807 drm_intel_gem_bo_set_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
1808                             uint32_t stride)
1809 {
1810         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1811         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1812         int ret;
1813
1814         /* Linear buffers have no stride. By ensuring that we only ever use
1815          * stride 0 with linear buffers, we simplify our code.
1816          */
1817         if (*tiling_mode == I915_TILING_NONE)
1818                 stride = 0;
1819
1820         ret = drm_intel_gem_bo_set_tiling_internal(bo, *tiling_mode, stride);
1821         if (ret == 0)
1822                 drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
1823
1824         *tiling_mode = bo_gem->tiling_mode;
1825         return ret;
1826 }
1827
1828 static int
1829 drm_intel_gem_bo_get_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
1830                             uint32_t * swizzle_mode)
1831 {
1832         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1833
1834         *tiling_mode = bo_gem->tiling_mode;
1835         *swizzle_mode = bo_gem->swizzle_mode;
1836         return 0;
1837 }
1838
1839 static int
1840 drm_intel_gem_bo_flink(drm_intel_bo *bo, uint32_t * name)
1841 {
1842         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1843         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1844         struct drm_gem_flink flink;
1845         int ret;
1846
1847         if (!bo_gem->global_name) {
1848                 memset(&flink, 0, sizeof(flink));
1849                 flink.handle = bo_gem->gem_handle;
1850
1851                 ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink);
1852                 if (ret != 0)
1853                         return -errno;
1854                 bo_gem->global_name = flink.name;
1855                 bo_gem->reusable = false;
1856
1857                 DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
1858         }
1859
1860         *name = bo_gem->global_name;
1861         return 0;
1862 }
1863
1864 /**
1865  * Enables unlimited caching of buffer objects for reuse.
1866  *
1867  * This is potentially very memory expensive, as the cache at each bucket
1868  * size is only bounded by how many buffers of that size we've managed to have
1869  * in flight at once.
1870  */
1871 void
1872 drm_intel_bufmgr_gem_enable_reuse(drm_intel_bufmgr *bufmgr)
1873 {
1874         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1875
1876         bufmgr_gem->bo_reuse = true;
1877 }
1878
1879 /**
1880  * Enable use of fenced reloc type.
1881  *
1882  * New code should enable this to avoid unnecessary fence register
1883  * allocation.  If this option is not enabled, all relocs will have fence
1884  * register allocated.
1885  */
1886 void
1887 drm_intel_bufmgr_gem_enable_fenced_relocs(drm_intel_bufmgr *bufmgr)
1888 {
1889         drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
1890
1891         if (bufmgr_gem->bufmgr.bo_exec == drm_intel_gem_bo_exec2)
1892                 bufmgr_gem->fenced_relocs = true;
1893 }
1894
1895 /**
1896  * Return the additional aperture space required by the tree of buffer objects
1897  * rooted at bo.
1898  */
1899 static int
1900 drm_intel_gem_bo_get_aperture_space(drm_intel_bo *bo)
1901 {
1902         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1903         int i;
1904         int total = 0;
1905
1906         if (bo == NULL || bo_gem->included_in_check_aperture)
1907                 return 0;
1908
1909         total += bo->size;
1910         bo_gem->included_in_check_aperture = true;
1911
1912         for (i = 0; i < bo_gem->reloc_count; i++)
1913                 total +=
1914                     drm_intel_gem_bo_get_aperture_space(bo_gem->
1915                                                         reloc_target_info[i].bo);
1916
1917         return total;
1918 }
1919
1920 /**
1921  * Count the number of buffers in this list that need a fence reg
1922  *
1923  * If the count is greater than the number of available regs, we'll have
1924  * to ask the caller to resubmit a batch with fewer tiled buffers.
1925  *
1926  * This function over-counts if the same buffer is used multiple times.
1927  */
1928 static unsigned int
1929 drm_intel_gem_total_fences(drm_intel_bo ** bo_array, int count)
1930 {
1931         int i;
1932         unsigned int total = 0;
1933
1934         for (i = 0; i < count; i++) {
1935                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo_array[i];
1936
1937                 if (bo_gem == NULL)
1938                         continue;
1939
1940                 total += bo_gem->reloc_tree_fences;
1941         }
1942         return total;
1943 }
1944
1945 /**
1946  * Clear the flag set by drm_intel_gem_bo_get_aperture_space() so we're ready
1947  * for the next drm_intel_bufmgr_check_aperture_space() call.
1948  */
1949 static void
1950 drm_intel_gem_bo_clear_aperture_space_flag(drm_intel_bo *bo)
1951 {
1952         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1953         int i;
1954
1955         if (bo == NULL || !bo_gem->included_in_check_aperture)
1956                 return;
1957
1958         bo_gem->included_in_check_aperture = false;
1959
1960         for (i = 0; i < bo_gem->reloc_count; i++)
1961                 drm_intel_gem_bo_clear_aperture_space_flag(bo_gem->
1962                                                            reloc_target_info[i].bo);
1963 }
1964
1965 /**
1966  * Return a conservative estimate for the amount of aperture required
1967  * for a collection of buffers. This may double-count some buffers.
1968  */
1969 static unsigned int
1970 drm_intel_gem_estimate_batch_space(drm_intel_bo **bo_array, int count)
1971 {
1972         int i;
1973         unsigned int total = 0;
1974
1975         for (i = 0; i < count; i++) {
1976                 drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo_array[i];
1977                 if (bo_gem != NULL)
1978                         total += bo_gem->reloc_tree_size;
1979         }
1980         return total;
1981 }
1982
1983 /**
1984  * Return the amount of aperture needed for a collection of buffers.
1985  * This avoids double counting any buffers, at the cost of looking
1986  * at every buffer in the set.
1987  */
1988 static unsigned int
1989 drm_intel_gem_compute_batch_space(drm_intel_bo **bo_array, int count)
1990 {
1991         int i;
1992         unsigned int total = 0;
1993
1994         for (i = 0; i < count; i++) {
1995                 total += drm_intel_gem_bo_get_aperture_space(bo_array[i]);
1996                 /* For the first buffer object in the array, we get an
1997                  * accurate count back for its reloc_tree size (since nothing
1998                  * had been flagged as being counted yet).  We can save that
1999                  * value out as a more conservative reloc_tree_size that
2000                  * avoids double-counting target buffers.  Since the first
2001                  * buffer happens to usually be the batch buffer in our
2002                  * callers, this can pull us back from doing the tree
2003                  * walk on every new batch emit.
2004                  */
2005                 if (i == 0) {
2006                         drm_intel_bo_gem *bo_gem =
2007                             (drm_intel_bo_gem *) bo_array[i];
2008                         bo_gem->reloc_tree_size = total;
2009                 }
2010         }
2011
2012         for (i = 0; i < count; i++)
2013                 drm_intel_gem_bo_clear_aperture_space_flag(bo_array[i]);
2014         return total;
2015 }
2016
2017 /**
2018  * Return -1 if the batchbuffer should be flushed before attempting to
2019  * emit rendering referencing the buffers pointed to by bo_array.
2020  *
2021  * This is required because if we try to emit a batchbuffer with relocations
2022  * to a tree of buffers that won't simultaneously fit in the aperture,
2023  * the rendering will return an error at a point where the software is not
2024  * prepared to recover from it.
2025  *
2026  * However, we also want to emit the batchbuffer significantly before we reach
2027  * the limit, as a series of batchbuffers each of which references buffers
2028  * covering almost all of the aperture means that at each emit we end up
2029  * waiting to evict a buffer from the last rendering, and we get synchronous
2030  * performance.  By emitting smaller batchbuffers, we eat some CPU overhead to
2031  * get better parallelism.
2032  */
2033 static int
2034 drm_intel_gem_check_aperture_space(drm_intel_bo **bo_array, int count)
2035 {
2036         drm_intel_bufmgr_gem *bufmgr_gem =
2037             (drm_intel_bufmgr_gem *) bo_array[0]->bufmgr;
2038         unsigned int total = 0;
2039         unsigned int threshold = bufmgr_gem->gtt_size * 3 / 4;
2040         int total_fences;
2041
2042         /* Check for fence reg constraints if necessary */
2043         if (bufmgr_gem->available_fences) {
2044                 total_fences = drm_intel_gem_total_fences(bo_array, count);
2045                 if (total_fences > bufmgr_gem->available_fences)
2046                         return -ENOSPC;
2047         }
2048
2049         total = drm_intel_gem_estimate_batch_space(bo_array, count);
2050
2051         if (total > threshold)
2052                 total = drm_intel_gem_compute_batch_space(bo_array, count);
2053
2054         if (total > threshold) {
2055                 DBG("check_space: overflowed available aperture, "
2056                     "%dkb vs %dkb\n",
2057                     total / 1024, (int)bufmgr_gem->gtt_size / 1024);
2058                 return -ENOSPC;
2059         } else {
2060                 DBG("drm_check_space: total %dkb vs bufgr %dkb\n", total / 1024,
2061                     (int)bufmgr_gem->gtt_size / 1024);
2062                 return 0;
2063         }
2064 }
2065
2066 /*
2067  * Disable buffer reuse for objects which are shared with the kernel
2068  * as scanout buffers
2069  */
2070 static int
2071 drm_intel_gem_bo_disable_reuse(drm_intel_bo *bo)
2072 {
2073         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2074
2075         bo_gem->reusable = false;
2076         return 0;
2077 }
2078
2079 static int
2080 drm_intel_gem_bo_is_reusable(drm_intel_bo *bo)
2081 {
2082         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2083
2084         return bo_gem->reusable;
2085 }
2086
2087 static int
2088 _drm_intel_gem_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo)
2089 {
2090         drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2091         int i;
2092
2093         for (i = 0; i < bo_gem->reloc_count; i++) {
2094                 if (bo_gem->reloc_target_info[i].bo == target_bo)
2095                         return 1;
2096                 if (bo == bo_gem->reloc_target_info[i].bo)
2097                         continue;
2098                 if (_drm_intel_gem_bo_references(bo_gem->reloc_target_info[i].bo,
2099                                                 target_bo))
2100                         return 1;
2101         }
2102
2103         return 0;
2104 }
2105
2106 /** Return true if target_bo is referenced by bo's relocation tree. */
2107 static int
2108 drm_intel_gem_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo)
2109 {
2110         drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) target_bo;
2111
2112         if (bo == NULL || target_bo == NULL)
2113                 return 0;
2114         if (target_bo_gem->used_as_reloc_target)
2115                 return _drm_intel_gem_bo_references(bo, target_bo);
2116         return 0;
2117 }
2118
2119 static void
2120 add_bucket(drm_intel_bufmgr_gem *bufmgr_gem, int size)
2121 {
2122         unsigned int i = bufmgr_gem->num_buckets;
2123
2124         assert(i < ARRAY_SIZE(bufmgr_gem->cache_bucket));
2125
2126         DRMINITLISTHEAD(&bufmgr_gem->cache_bucket[i].head);
2127         bufmgr_gem->cache_bucket[i].size = size;
2128         bufmgr_gem->num_buckets++;
2129 }
2130
2131 static void
2132 init_cache_buckets(drm_intel_bufmgr_gem *bufmgr_gem)
2133 {
2134         unsigned long size, cache_max_size = 64 * 1024 * 1024;
2135
2136         /* OK, so power of two buckets was too wasteful of memory.
2137          * Give 3 other sizes between each power of two, to hopefully
2138          * cover things accurately enough.  (The alternative is
2139          * probably to just go for exact matching of sizes, and assume
2140          * that for things like composited window resize the tiled
2141          * width/height alignment and rounding of sizes to pages will
2142          * get us useful cache hit rates anyway)
2143          */
2144         add_bucket(bufmgr_gem, 4096);
2145         add_bucket(bufmgr_gem, 4096 * 2);
2146         add_bucket(bufmgr_gem, 4096 * 3);
2147
2148         /* Initialize the linked lists for BO reuse cache. */
2149         for (size = 4 * 4096; size <= cache_max_size; size *= 2) {
2150                 add_bucket(bufmgr_gem, size);
2151
2152                 add_bucket(bufmgr_gem, size + size * 1 / 4);
2153                 add_bucket(bufmgr_gem, size + size * 2 / 4);
2154                 add_bucket(bufmgr_gem, size + size * 3 / 4);
2155         }
2156 }
2157
2158 /**
2159  * Initializes the GEM buffer manager, which uses the kernel to allocate, map,
2160  * and manage map buffer objections.
2161  *
2162  * \param fd File descriptor of the opened DRM device.
2163  */
2164 drm_intel_bufmgr *
2165 drm_intel_bufmgr_gem_init(int fd, int batch_size)
2166 {
2167         drm_intel_bufmgr_gem *bufmgr_gem;
2168         struct drm_i915_gem_get_aperture aperture;
2169         drm_i915_getparam_t gp;
2170         int ret, tmp;
2171         bool exec2 = false;
2172
2173         bufmgr_gem = calloc(1, sizeof(*bufmgr_gem));
2174         if (bufmgr_gem == NULL)
2175                 return NULL;
2176
2177         bufmgr_gem->fd = fd;
2178
2179         if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) {
2180                 free(bufmgr_gem);
2181                 return NULL;
2182         }
2183
2184         ret = drmIoctl(bufmgr_gem->fd,
2185                        DRM_IOCTL_I915_GEM_GET_APERTURE,
2186                        &aperture);
2187
2188         if (ret == 0)
2189                 bufmgr_gem->gtt_size = aperture.aper_available_size;
2190         else {
2191                 fprintf(stderr, "DRM_IOCTL_I915_GEM_APERTURE failed: %s\n",
2192                         strerror(errno));
2193                 bufmgr_gem->gtt_size = 128 * 1024 * 1024;
2194                 fprintf(stderr, "Assuming %dkB available aperture size.\n"
2195                         "May lead to reduced performance or incorrect "
2196                         "rendering.\n",
2197                         (int)bufmgr_gem->gtt_size / 1024);
2198         }
2199
2200         gp.param = I915_PARAM_CHIPSET_ID;
2201         gp.value = &bufmgr_gem->pci_device;
2202         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2203         if (ret) {
2204                 fprintf(stderr, "get chip id failed: %d [%d]\n", ret, errno);
2205                 fprintf(stderr, "param: %d, val: %d\n", gp.param, *gp.value);
2206         }
2207
2208         if (IS_GEN2(bufmgr_gem))
2209                 bufmgr_gem->gen = 2;
2210         else if (IS_GEN3(bufmgr_gem))
2211                 bufmgr_gem->gen = 3;
2212         else if (IS_GEN4(bufmgr_gem))
2213                 bufmgr_gem->gen = 4;
2214         else
2215                 bufmgr_gem->gen = 6;
2216
2217         gp.value = &tmp;
2218
2219         gp.param = I915_PARAM_HAS_EXECBUF2;
2220         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2221         if (!ret)
2222                 exec2 = true;
2223
2224         gp.param = I915_PARAM_HAS_BSD;
2225         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2226         bufmgr_gem->has_bsd = ret == 0;
2227
2228         gp.param = I915_PARAM_HAS_BLT;
2229         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2230         bufmgr_gem->has_blt = ret == 0;
2231
2232         gp.param = I915_PARAM_HAS_RELAXED_FENCING;
2233         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2234         bufmgr_gem->has_relaxed_fencing = ret == 0;
2235
2236         if (bufmgr_gem->gen < 4) {
2237                 gp.param = I915_PARAM_NUM_FENCES_AVAIL;
2238                 gp.value = &bufmgr_gem->available_fences;
2239                 ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2240                 if (ret) {
2241                         fprintf(stderr, "get fences failed: %d [%d]\n", ret,
2242                                 errno);
2243                         fprintf(stderr, "param: %d, val: %d\n", gp.param,
2244                                 *gp.value);
2245                         bufmgr_gem->available_fences = 0;
2246                 } else {
2247                         /* XXX The kernel reports the total number of fences,
2248                          * including any that may be pinned.
2249                          *
2250                          * We presume that there will be at least one pinned
2251                          * fence for the scanout buffer, but there may be more
2252                          * than one scanout and the user may be manually
2253                          * pinning buffers. Let's move to execbuffer2 and
2254                          * thereby forget the insanity of using fences...
2255                          */
2256                         bufmgr_gem->available_fences -= 2;
2257                         if (bufmgr_gem->available_fences < 0)
2258                                 bufmgr_gem->available_fences = 0;
2259                 }
2260         }
2261
2262         /* Let's go with one relocation per every 2 dwords (but round down a bit
2263          * since a power of two will mean an extra page allocation for the reloc
2264          * buffer).
2265          *
2266          * Every 4 was too few for the blender benchmark.
2267          */
2268         bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2;
2269
2270         bufmgr_gem->bufmgr.bo_alloc = drm_intel_gem_bo_alloc;
2271         bufmgr_gem->bufmgr.bo_alloc_for_render =
2272             drm_intel_gem_bo_alloc_for_render;
2273         bufmgr_gem->bufmgr.bo_alloc_tiled = drm_intel_gem_bo_alloc_tiled;
2274         bufmgr_gem->bufmgr.bo_reference = drm_intel_gem_bo_reference;
2275         bufmgr_gem->bufmgr.bo_unreference = drm_intel_gem_bo_unreference;
2276         bufmgr_gem->bufmgr.bo_map = drm_intel_gem_bo_map;
2277         bufmgr_gem->bufmgr.bo_unmap = drm_intel_gem_bo_unmap;
2278         bufmgr_gem->bufmgr.bo_subdata = drm_intel_gem_bo_subdata;
2279         bufmgr_gem->bufmgr.bo_get_subdata = drm_intel_gem_bo_get_subdata;
2280         bufmgr_gem->bufmgr.bo_wait_rendering = drm_intel_gem_bo_wait_rendering;
2281         bufmgr_gem->bufmgr.bo_emit_reloc = drm_intel_gem_bo_emit_reloc;
2282         bufmgr_gem->bufmgr.bo_emit_reloc_fence = drm_intel_gem_bo_emit_reloc_fence;
2283         bufmgr_gem->bufmgr.bo_pin = drm_intel_gem_bo_pin;
2284         bufmgr_gem->bufmgr.bo_unpin = drm_intel_gem_bo_unpin;
2285         bufmgr_gem->bufmgr.bo_get_tiling = drm_intel_gem_bo_get_tiling;
2286         bufmgr_gem->bufmgr.bo_set_tiling = drm_intel_gem_bo_set_tiling;
2287         bufmgr_gem->bufmgr.bo_flink = drm_intel_gem_bo_flink;
2288         /* Use the new one if available */
2289         if (exec2) {
2290                 bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2;
2291                 bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2;
2292         } else
2293                 bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec;
2294         bufmgr_gem->bufmgr.bo_busy = drm_intel_gem_bo_busy;
2295         bufmgr_gem->bufmgr.bo_madvise = drm_intel_gem_bo_madvise;
2296         bufmgr_gem->bufmgr.destroy = drm_intel_bufmgr_gem_destroy;
2297         bufmgr_gem->bufmgr.debug = 0;
2298         bufmgr_gem->bufmgr.check_aperture_space =
2299             drm_intel_gem_check_aperture_space;
2300         bufmgr_gem->bufmgr.bo_disable_reuse = drm_intel_gem_bo_disable_reuse;
2301         bufmgr_gem->bufmgr.bo_is_reusable = drm_intel_gem_bo_is_reusable;
2302         bufmgr_gem->bufmgr.get_pipe_from_crtc_id =
2303             drm_intel_gem_get_pipe_from_crtc_id;
2304         bufmgr_gem->bufmgr.bo_references = drm_intel_gem_bo_references;
2305
2306         DRMINITLISTHEAD(&bufmgr_gem->named);
2307         init_cache_buckets(bufmgr_gem);
2308
2309         return &bufmgr_gem->bufmgr;
2310 }