OSDN Git Service

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