Subversion Repositories Kolibri OS

Rev

Rev 5368 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5368 Rev 6110
Line 45... Line 45...
45
#include 
45
#include 
46
#include 
46
#include 
47
#include 
47
#include 
48
#include 
48
#include 
49
//#include 
49
//#include 
-
 
50
#include 
-
 
51
#include 
50
#include 
52
#include 
Line 51... Line 53...
51
 
53
 
52
#include "errno.h"
54
#include "errno.h"
53
#ifndef ETIME
55
#ifndef ETIME
54
#define ETIME ETIMEDOUT
56
#define ETIME ETIMEDOUT
-
 
57
#endif
55
#endif
58
#include "libdrm_macros.h"
56
#include "libdrm_lists.h"
59
#include "libdrm_lists.h"
57
#include "intel_bufmgr.h"
60
#include "intel_bufmgr.h"
58
#include "intel_bufmgr_priv.h"
61
#include "intel_bufmgr_priv.h"
59
#include "intel_chipset.h"
-
 
60
#include "intel_aub.h"
62
#include "intel_chipset.h"
Line 61... Line 63...
61
#include "string.h"
63
#include "string.h"
Line 62... Line 64...
62
 
64
 
Line 68... Line 70...
68
#define VG(x) x
70
#define VG(x) x
69
#else
71
#else
70
#define VG(x)
72
#define VG(x)
71
#endif
73
#endif
Line 72... Line 74...
72
 
74
 
Line 73... Line 75...
73
#define VG_CLEAR(s) VG(memset(&s, 0, sizeof(s)))
75
#define memclear(s) memset(&s, 0, sizeof(s))
74
 
76
 
-
 
77
#if 0
75
#if 0
78
#define DBG(...) do {					\
76
#define DBG(...) do {					\
79
	if (bufmgr_gem->bufmgr.debug)			\
77
    fprintf(stderr, __VA_ARGS__);       \
80
		fprintf(stderr, __VA_ARGS__);		\
78
} while (0)
81
} while (0)
79
#else
82
#else
Line 80... Line 83...
80
#define DBG(...)
83
#define DBG(...)
-
 
84
#endif
-
 
85
 
-
 
86
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-
 
87
#define MAX2(A, B) ((A) > (B) ? (A) : (B))
-
 
88
 
-
 
89
/**
-
 
90
 * upper_32_bits - return bits 32-63 of a number
-
 
91
 * @n: the number we're accessing
-
 
92
 *
-
 
93
 * A basic shift-right of a 64- or 32-bit quantity.  Use this to suppress
-
 
94
 * the "right shift count >= width of type" warning when that quantity is
-
 
95
 * 32-bits.
-
 
96
 */
-
 
97
#define upper_32_bits(n) ((__u32)(((n) >> 16) >> 16))
-
 
98
 
-
 
99
/**
-
 
100
 * lower_32_bits - return bits 0-31 of a number
Line 81... Line 101...
81
#endif
101
 * @n: the number we're accessing
Line 82... Line 102...
82
 
102
 */
83
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
103
#define lower_32_bits(n) ((__u32)(n))
Line 90... Line 110...
90
};
110
};
Line 91... Line 111...
91
 
111
 
92
typedef struct _drm_intel_bufmgr_gem {
112
typedef struct _drm_intel_bufmgr_gem {
Line -... Line 113...
-
 
113
	drm_intel_bufmgr bufmgr;
-
 
114
 
93
	drm_intel_bufmgr bufmgr;
115
	atomic_t refcount;
Line 94... Line 116...
94
 
116
 
Line 95... Line 117...
95
	int fd;
117
	int fd;
Line 107... Line 129...
107
	/** Array of lists of cached gem objects of power-of-two sizes */
129
	/** Array of lists of cached gem objects of power-of-two sizes */
108
	struct drm_intel_gem_bo_bucket cache_bucket[14 * 4];
130
	struct drm_intel_gem_bo_bucket cache_bucket[14 * 4];
109
	int num_buckets;
131
	int num_buckets;
110
	time_t time;
132
	time_t time;
Line -... Line 133...
-
 
133
 
-
 
134
	drmMMListHead managers;
111
 
135
 
112
	drmMMListHead named;
136
	drmMMListHead named;
113
	drmMMListHead vma_cache;
137
	drmMMListHead vma_cache;
Line 114... Line 138...
114
	int vma_count, vma_open, vma_max;
138
	int vma_count, vma_open, vma_max;
Line 125... Line 149...
125
	unsigned int bo_reuse : 1;
149
	unsigned int bo_reuse : 1;
126
	unsigned int no_exec : 1;
150
	unsigned int no_exec : 1;
127
	unsigned int has_vebox : 1;
151
	unsigned int has_vebox : 1;
128
	bool fenced_relocs;
152
	bool fenced_relocs;
Line 129... Line 153...
129
 
153
 
130
	char *aub_filename;
154
	struct {
131
	FILE *aub_file;
155
		void *ptr;
-
 
156
		uint32_t handle;
-
 
157
	} userptr_active;
132
	uint32_t aub_offset;
158
 
Line 133... Line 159...
133
} drm_intel_bufmgr_gem;
159
} drm_intel_bufmgr_gem;
Line 134... Line 160...
134
 
160
 
Line 175... Line 201...
175
	 * Array of info structs corresponding to relocs[i].target_handle etc
201
	 * Array of info structs corresponding to relocs[i].target_handle etc
176
	 */
202
	 */
177
	drm_intel_reloc_target *reloc_target_info;
203
	drm_intel_reloc_target *reloc_target_info;
178
	/** Number of entries in relocs */
204
	/** Number of entries in relocs */
179
	int reloc_count;
205
	int reloc_count;
-
 
206
	/** Array of BOs that are referenced by this buffer and will be softpinned */
-
 
207
	drm_intel_bo **softpin_target;
-
 
208
	/** Number softpinned BOs that are referenced by this buffer */
-
 
209
	int softpin_target_count;
-
 
210
	/** Maximum amount of softpinned BOs that are referenced by this buffer */
-
 
211
	int softpin_target_size;
-
 
212
 
180
	/** Mapped address for the buffer, saved across map/unmap cycles */
213
	/** Mapped address for the buffer, saved across map/unmap cycles */
181
	void *mem_virtual;
214
	void *mem_virtual;
182
	/** GTT virtual address for the buffer, saved across map/unmap cycles */
215
	/** GTT virtual address for the buffer, saved across map/unmap cycles */
183
	void *gtt_virtual;
216
	void *gtt_virtual;
-
 
217
	/**
-
 
218
	 * Virtual address of the buffer allocated by user, used for userptr
-
 
219
	 * objects only.
-
 
220
	 */
-
 
221
	void *user_virtual;
184
	int map_count;
222
	int map_count;
185
	drmMMListHead vma_list;
223
	drmMMListHead vma_list;
Line 186... Line 224...
186
 
224
 
187
	/** BO cache list */
225
	/** BO cache list */
Line 218... Line 256...
218
	 * processes, so we don't know their state.
256
	 * processes, so we don't know their state.
219
	 */
257
	 */
220
	bool idle;
258
	bool idle;
Line 221... Line 259...
221
 
259
 
-
 
260
	/**
-
 
261
	 * Boolean of whether this buffer was allocated with userptr
-
 
262
	 */
-
 
263
	bool is_userptr;
-
 
264
 
-
 
265
	/**
-
 
266
	 * Boolean of whether this buffer can be placed in the full 48-bit
-
 
267
	 * address range on gen8+.
-
 
268
	 *
-
 
269
	 * By default, buffers will be keep in a 32-bit range, unless this
-
 
270
	 * flag is explicitly set.
-
 
271
	 */
-
 
272
	bool use_48b_address_range;
-
 
273
 
-
 
274
	/**
-
 
275
	 * Whether this buffer is softpinned at offset specified by the user
-
 
276
	 */
-
 
277
	bool is_softpin;
-
 
278
 
222
	/**
279
	/**
223
	 * Size in bytes of this buffer and its relocation descendents.
280
	 * Size in bytes of this buffer and its relocation descendents.
224
	 *
281
	 *
225
	 * Used to avoid costly tree walking in
282
	 * Used to avoid costly tree walking in
226
	 * drm_intel_bufmgr_check_aperture in the common case.
283
	 * drm_intel_bufmgr_check_aperture in the common case.
Line 233... Line 290...
233
	 */
290
	 */
234
	int reloc_tree_fences;
291
	int reloc_tree_fences;
Line 235... Line 292...
235
 
292
 
236
	/** Flags that we may need to do the SW_FINSIH ioctl on unmap. */
293
	/** Flags that we may need to do the SW_FINSIH ioctl on unmap. */
237
	bool mapped_cpu_write;
-
 
238
 
-
 
239
	uint32_t aub_offset;
-
 
240
 
-
 
241
	drm_intel_aub_annotation *aub_annotations;
-
 
242
	unsigned aub_annotation_count;
294
	bool mapped_cpu_write;
Line 243... Line 295...
243
};
295
};
244
 
296
 
Line 262... Line 314...
262
 
314
 
Line 263... Line 315...
263
static void drm_intel_gem_bo_unreference(drm_intel_bo *bo);
315
static void drm_intel_gem_bo_unreference(drm_intel_bo *bo);
Line -... Line 316...
-
 
316
 
-
 
317
static void drm_intel_gem_bo_free(drm_intel_bo *bo);
-
 
318
 
-
 
319
static inline drm_intel_bo_gem *to_bo_gem(drm_intel_bo *bo)
-
 
320
{
264
 
321
        return (drm_intel_bo_gem *)bo;
265
static void drm_intel_gem_bo_free(drm_intel_bo *bo);
322
}
266
 
323
 
267
static unsigned long
324
static unsigned long
268
drm_intel_gem_bo_tile_size(drm_intel_bufmgr_gem *bufmgr_gem, unsigned long size,
325
drm_intel_gem_bo_tile_size(drm_intel_bufmgr_gem *bufmgr_gem, unsigned long size,
Line 370... Line 427...
370
 
427
 
371
	for (i = 0; i < bufmgr_gem->exec_count; i++) {
428
	for (i = 0; i < bufmgr_gem->exec_count; i++) {
372
		drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
429
		drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
Line 373... Line 430...
373
		drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
430
		drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
374
 
431
 
-
 
432
		if (bo_gem->relocs == NULL && bo_gem->softpin_target == NULL) {
375
		if (bo_gem->relocs == NULL) {
433
			DBG("%2d: %d %s(%s)\n", i, bo_gem->gem_handle,
376
			DBG("%2d: %d (%s)\n", i, bo_gem->gem_handle,
434
			    bo_gem->is_softpin ? "*" : "",
377
			    bo_gem->name);
435
			    bo_gem->name);
Line 378... Line 436...
378
			continue;
436
			continue;
379
		}
437
		}
380
 
438
 
381
		for (j = 0; j < bo_gem->reloc_count; j++) {
439
		for (j = 0; j < bo_gem->reloc_count; j++) {
Line 382... Line 440...
382
			drm_intel_bo *target_bo = bo_gem->reloc_target_info[j].bo;
440
			drm_intel_bo *target_bo = bo_gem->reloc_target_info[j].bo;
383
			drm_intel_bo_gem *target_gem =
441
			drm_intel_bo_gem *target_gem =
384
			    (drm_intel_bo_gem *) target_bo;
442
			    (drm_intel_bo_gem *) target_bo;
385
 
443
 
-
 
444
			DBG("%2d: %d %s(%s)@0x%08x %08x -> "
-
 
445
			    "%d (%s)@0x%08x %08x + 0x%08x\n",
386
			DBG("%2d: %d (%s)@0x%08llx -> "
446
			    i,
-
 
447
			    bo_gem->gem_handle,
387
			    "%d (%s)@0x%08lx + 0x%08x\n",
448
			    bo_gem->is_softpin ? "*" : "",
388
			    i,
449
			    bo_gem->name,
-
 
450
			    upper_32_bits(bo_gem->relocs[j].offset),
389
			    bo_gem->gem_handle, bo_gem->name,
451
			    lower_32_bits(bo_gem->relocs[j].offset),
390
			    (unsigned long long)bo_gem->relocs[j].offset,
452
			    target_gem->gem_handle,
391
			    target_gem->gem_handle,
453
			    target_gem->name,
-
 
454
			    upper_32_bits(target_bo->offset64),
-
 
455
			    lower_32_bits(target_bo->offset64),
-
 
456
			    bo_gem->relocs[j].delta);
-
 
457
		}
-
 
458
 
-
 
459
		for (j = 0; j < bo_gem->softpin_target_count; j++) {
-
 
460
			drm_intel_bo *target_bo = bo_gem->softpin_target[j];
-
 
461
			drm_intel_bo_gem *target_gem =
-
 
462
			    (drm_intel_bo_gem *) target_bo;
-
 
463
			DBG("%2d: %d %s(%s) -> "
-
 
464
			    "%d *(%s)@0x%08x %08x\n",
-
 
465
			    i,
-
 
466
			    bo_gem->gem_handle,
-
 
467
			    bo_gem->is_softpin ? "*" : "",
-
 
468
			    bo_gem->name,
-
 
469
			    target_gem->gem_handle,
392
			    target_gem->name,
470
			    target_gem->name,
393
			    target_bo->offset64,
471
			    upper_32_bits(target_bo->offset64),
Line 394... Line 472...
394
			    bo_gem->relocs[j].delta);
472
			    lower_32_bits(target_bo->offset64));
395
		}
473
		}
Line 442... Line 520...
442
	bo_gem->validate_index = index;
520
	bo_gem->validate_index = index;
443
	/* Fill in array entry */
521
	/* Fill in array entry */
444
	bufmgr_gem->exec_objects[index].handle = bo_gem->gem_handle;
522
	bufmgr_gem->exec_objects[index].handle = bo_gem->gem_handle;
445
	bufmgr_gem->exec_objects[index].relocation_count = bo_gem->reloc_count;
523
	bufmgr_gem->exec_objects[index].relocation_count = bo_gem->reloc_count;
446
	bufmgr_gem->exec_objects[index].relocs_ptr = (uintptr_t) bo_gem->relocs;
524
	bufmgr_gem->exec_objects[index].relocs_ptr = (uintptr_t) bo_gem->relocs;
447
	bufmgr_gem->exec_objects[index].alignment = 0;
525
	bufmgr_gem->exec_objects[index].alignment = bo->align;
448
	bufmgr_gem->exec_objects[index].offset = 0;
526
	bufmgr_gem->exec_objects[index].offset = 0;
449
	bufmgr_gem->exec_bos[index] = bo;
527
	bufmgr_gem->exec_bos[index] = bo;
450
	bufmgr_gem->exec_count++;
528
	bufmgr_gem->exec_count++;
451
}
529
}
Line 454... Line 532...
454
drm_intel_add_validate_buffer2(drm_intel_bo *bo, int need_fence)
532
drm_intel_add_validate_buffer2(drm_intel_bo *bo, int need_fence)
455
{
533
{
456
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
534
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
457
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
535
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
458
	int index;
536
	int index;
-
 
537
	int flags = 0;
Line 459... Line -...
459
 
-
 
460
	if (bo_gem->validate_index != -1) {
538
 
-
 
539
	if (need_fence)
461
		if (need_fence)
540
		flags |= EXEC_OBJECT_NEEDS_FENCE;
-
 
541
	if (bo_gem->use_48b_address_range)
-
 
542
		flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
462
			bufmgr_gem->exec2_objects[bo_gem->validate_index].flags |=
543
	if (bo_gem->is_softpin)
-
 
544
		flags |= EXEC_OBJECT_PINNED;
-
 
545
 
-
 
546
	if (bo_gem->validate_index != -1) {
463
				EXEC_OBJECT_NEEDS_FENCE;
547
		bufmgr_gem->exec2_objects[bo_gem->validate_index].flags |= flags;
464
		return;
548
		return;
Line 465... Line 549...
465
	}
549
	}
466
 
550
 
Line 484... Line 568...
484
	bo_gem->validate_index = index;
568
	bo_gem->validate_index = index;
485
	/* Fill in array entry */
569
	/* Fill in array entry */
486
	bufmgr_gem->exec2_objects[index].handle = bo_gem->gem_handle;
570
	bufmgr_gem->exec2_objects[index].handle = bo_gem->gem_handle;
487
	bufmgr_gem->exec2_objects[index].relocation_count = bo_gem->reloc_count;
571
	bufmgr_gem->exec2_objects[index].relocation_count = bo_gem->reloc_count;
488
	bufmgr_gem->exec2_objects[index].relocs_ptr = (uintptr_t)bo_gem->relocs;
572
	bufmgr_gem->exec2_objects[index].relocs_ptr = (uintptr_t)bo_gem->relocs;
489
	bufmgr_gem->exec2_objects[index].alignment = 0;
573
	bufmgr_gem->exec2_objects[index].alignment = bo->align;
490
	bufmgr_gem->exec2_objects[index].offset = 0;
574
	bufmgr_gem->exec2_objects[index].offset = bo_gem->is_softpin ?
-
 
575
		bo->offset64 : 0;
491
	bufmgr_gem->exec_bos[index] = bo;
576
	bufmgr_gem->exec_bos[index] = bo;
492
	bufmgr_gem->exec2_objects[index].flags = 0;
577
	bufmgr_gem->exec2_objects[index].flags = flags;
493
	bufmgr_gem->exec2_objects[index].rsvd1 = 0;
578
	bufmgr_gem->exec2_objects[index].rsvd1 = 0;
494
	bufmgr_gem->exec2_objects[index].rsvd2 = 0;
579
	bufmgr_gem->exec2_objects[index].rsvd2 = 0;
495
	if (need_fence) {
-
 
496
		bufmgr_gem->exec2_objects[index].flags |=
-
 
497
			EXEC_OBJECT_NEEDS_FENCE;
-
 
498
	}
-
 
499
	bufmgr_gem->exec_count++;
580
	bufmgr_gem->exec_count++;
500
}
581
}
Line 501... Line 582...
501
 
582
 
502
#define RELOC_BUF_SIZE(x) ((I915_RELOC_HEADER + x * I915_RELOC0_STRIDE) * \
583
#define RELOC_BUF_SIZE(x) ((I915_RELOC_HEADER + x * I915_RELOC0_STRIDE) * \
Line 503... Line 584...
503
	sizeof(uint32_t))
584
	sizeof(uint32_t))
504
 
585
 
505
static void
586
static void
-
 
587
drm_intel_bo_gem_set_in_aperture_size(drm_intel_bufmgr_gem *bufmgr_gem,
506
drm_intel_bo_gem_set_in_aperture_size(drm_intel_bufmgr_gem *bufmgr_gem,
588
				      drm_intel_bo_gem *bo_gem,
507
				      drm_intel_bo_gem *bo_gem)
589
				      unsigned int alignment)
Line 508... Line 590...
508
{
590
{
Line 509... Line 591...
509
	int size;
591
	unsigned int size;
510
 
592
 
Line 516... Line 598...
516
	 * twice as large as the object in order for it to fit into the
598
	 * twice as large as the object in order for it to fit into the
517
	 * aperture. Optimal packing is for wimps.
599
	 * aperture. Optimal packing is for wimps.
518
	 */
600
	 */
519
	size = bo_gem->bo.size;
601
	size = bo_gem->bo.size;
520
	if (bufmgr_gem->gen < 4 && bo_gem->tiling_mode != I915_TILING_NONE) {
602
	if (bufmgr_gem->gen < 4 && bo_gem->tiling_mode != I915_TILING_NONE) {
521
		int min_size;
603
		unsigned int min_size;
Line 522... Line 604...
522
 
604
 
523
		if (bufmgr_gem->has_relaxed_fencing) {
605
		if (bufmgr_gem->has_relaxed_fencing) {
524
			if (bufmgr_gem->gen == 3)
606
			if (bufmgr_gem->gen == 3)
525
				min_size = 1024*1024;
607
				min_size = 1024*1024;
Line 530... Line 612...
530
				min_size *= 2;
612
				min_size *= 2;
531
		} else
613
		} else
532
			min_size = size;
614
			min_size = size;
Line 533... Line 615...
533
 
615
 
534
		/* Account for worst-case alignment. */
616
		/* Account for worst-case alignment. */
535
		size = 2 * min_size;
617
		alignment = MAX2(alignment, min_size);
Line 536... Line 618...
536
	}
618
	}
537
 
619
 
Line 538... Line 620...
538
	bo_gem->reloc_tree_size = size;
620
	bo_gem->reloc_tree_size = size + alignment;
539
}
621
}
540
 
622
 
Line 576... Line 658...
576
	int ret;
658
	int ret;
Line 577... Line 659...
577
 
659
 
578
	if (bo_gem->reusable && bo_gem->idle)
660
	if (bo_gem->reusable && bo_gem->idle)
Line 579... Line 661...
579
		return false;
661
		return false;
580
 
662
 
Line 581... Line 663...
581
	VG_CLEAR(busy);
663
	memclear(busy);
582
	busy.handle = bo_gem->gem_handle;
664
	busy.handle = bo_gem->gem_handle;
583
 
665
 
Line 595... Line 677...
595
drm_intel_gem_bo_madvise_internal(drm_intel_bufmgr_gem *bufmgr_gem,
677
drm_intel_gem_bo_madvise_internal(drm_intel_bufmgr_gem *bufmgr_gem,
596
				  drm_intel_bo_gem *bo_gem, int state)
678
				  drm_intel_bo_gem *bo_gem, int state)
597
{
679
{
598
	struct drm_i915_gem_madvise madv;
680
	struct drm_i915_gem_madvise madv;
Line 599... Line 681...
599
 
681
 
600
	VG_CLEAR(madv);
682
	memclear(madv);
601
	madv.handle = bo_gem->gem_handle;
683
	madv.handle = bo_gem->gem_handle;
602
	madv.madv = state;
684
	madv.madv = state;
603
	madv.retained = 1;
685
	madv.retained = 1;
Line 638... Line 720...
638
drm_intel_gem_bo_alloc_internal(drm_intel_bufmgr *bufmgr,
720
drm_intel_gem_bo_alloc_internal(drm_intel_bufmgr *bufmgr,
639
				const char *name,
721
				const char *name,
640
				unsigned long size,
722
				unsigned long size,
641
				unsigned long flags,
723
				unsigned long flags,
642
				uint32_t tiling_mode,
724
				uint32_t tiling_mode,
643
				unsigned long stride)
725
				unsigned long stride,
-
 
726
				unsigned int alignment)
644
{
727
{
645
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
728
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
646
	drm_intel_bo_gem *bo_gem;
729
	drm_intel_bo_gem *bo_gem;
647
	unsigned int page_size = 4096;
730
	unsigned int page_size = 4096;
648
	int ret;
731
	int ret;
Line 680... Line 763...
680
			 */
763
			 */
681
			bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
764
			bo_gem = DRMLISTENTRY(drm_intel_bo_gem,
682
					      bucket->head.prev, head);
765
					      bucket->head.prev, head);
683
			DRMLISTDEL(&bo_gem->head);
766
			DRMLISTDEL(&bo_gem->head);
684
			alloc_from_cache = true;
767
			alloc_from_cache = true;
-
 
768
			bo_gem->bo.align = alignment;
685
		} else {
769
		} else {
-
 
770
			assert(alignment == 0);
686
			/* For non-render-target BOs (where we're probably
771
			/* For non-render-target BOs (where we're probably
687
			 * going to map it first thing in order to fill it
772
			 * going to map it first thing in order to fill it
688
			 * with data), check if the last BO in the cache is
773
			 * with data), check if the last BO in the cache is
689
			 * unbusy, and only reuse in that case. Otherwise,
774
			 * unbusy, and only reuse in that case. Otherwise,
690
			 * allocating a new buffer is probably faster than
775
			 * allocating a new buffer is probably faster than
Line 724... Line 809...
724
		if (!bo_gem)
809
		if (!bo_gem)
725
			return NULL;
810
			return NULL;
Line 726... Line 811...
726
 
811
 
Line 727... Line 812...
727
		bo_gem->bo.size = bo_size;
812
		bo_gem->bo.size = bo_size;
728
 
813
 
Line 729... Line 814...
729
		VG_CLEAR(create);
814
		memclear(create);
730
		create.size = bo_size;
815
		create.size = bo_size;
731
 
816
 
Line 737... Line 822...
737
		if (ret != 0) {
822
		if (ret != 0) {
738
			free(bo_gem);
823
			free(bo_gem);
739
			return NULL;
824
			return NULL;
740
		}
825
		}
741
		bo_gem->bo.bufmgr = bufmgr;
826
		bo_gem->bo.bufmgr = bufmgr;
-
 
827
		bo_gem->bo.align = alignment;
Line 742... Line 828...
742
 
828
 
743
		bo_gem->tiling_mode = I915_TILING_NONE;
829
		bo_gem->tiling_mode = I915_TILING_NONE;
744
		bo_gem->swizzle_mode = I915_BIT_6_SWIZZLE_NONE;
830
		bo_gem->swizzle_mode = I915_BIT_6_SWIZZLE_NONE;
Line -... Line 831...
-
 
831
		bo_gem->stride = 0;
-
 
832
 
-
 
833
		/* drm_intel_gem_bo_free calls DRMLISTDEL() for an uninitialized
-
 
834
		   list (vma_list), so better set the list head here */
745
		bo_gem->stride = 0;
835
		DRMINITLISTHEAD(&bo_gem->name_list);
746
 
836
		DRMINITLISTHEAD(&bo_gem->vma_list);
747
		if (drm_intel_gem_bo_set_tiling_internal(&bo_gem->bo,
837
		if (drm_intel_gem_bo_set_tiling_internal(&bo_gem->bo,
748
							 tiling_mode,
838
							 tiling_mode,
749
							 stride)) {
839
							 stride)) {
750
		    drm_intel_gem_bo_free(&bo_gem->bo);
840
		    drm_intel_gem_bo_free(&bo_gem->bo);
751
		    return NULL;
-
 
752
		}
-
 
753
 
-
 
754
		DRMINITLISTHEAD(&bo_gem->name_list);
841
		    return NULL;
Line 755... Line 842...
755
		DRMINITLISTHEAD(&bo_gem->vma_list);
842
		}
756
	}
843
	}
757
 
844
 
758
	bo_gem->name = name;
845
	bo_gem->name = name;
759
	atomic_set(&bo_gem->refcount, 1);
846
	atomic_set(&bo_gem->refcount, 1);
760
	bo_gem->validate_index = -1;
847
	bo_gem->validate_index = -1;
761
	bo_gem->reloc_tree_fences = 0;
848
	bo_gem->reloc_tree_fences = 0;
762
	bo_gem->used_as_reloc_target = false;
849
	bo_gem->used_as_reloc_target = false;
763
	bo_gem->has_error = false;
-
 
Line 764... Line 850...
764
	bo_gem->reusable = true;
850
	bo_gem->has_error = false;
Line 765... Line 851...
765
	bo_gem->aub_annotations = NULL;
851
	bo_gem->reusable = true;
766
	bo_gem->aub_annotation_count = 0;
852
	bo_gem->use_48b_address_range = false;
Line 767... Line 853...
767
 
853
 
Line 779... Line 865...
779
				  unsigned long size,
865
				  unsigned long size,
780
				  unsigned int alignment)
866
				  unsigned int alignment)
781
{
867
{
782
	return drm_intel_gem_bo_alloc_internal(bufmgr, name, size,
868
	return drm_intel_gem_bo_alloc_internal(bufmgr, name, size,
783
					       BO_ALLOC_FOR_RENDER,
869
					       BO_ALLOC_FOR_RENDER,
784
					       I915_TILING_NONE, 0);
870
					       I915_TILING_NONE, 0,
-
 
871
					       alignment);
785
}
872
}
Line 786... Line 873...
786
 
873
 
787
static drm_intel_bo *
874
static drm_intel_bo *
788
drm_intel_gem_bo_alloc(drm_intel_bufmgr *bufmgr,
875
drm_intel_gem_bo_alloc(drm_intel_bufmgr *bufmgr,
789
		       const char *name,
876
		       const char *name,
790
		       unsigned long size,
877
		       unsigned long size,
791
		       unsigned int alignment)
878
		       unsigned int alignment)
792
{
879
{
793
	return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, 0,
880
	return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, 0,
794
					       I915_TILING_NONE, 0);
881
					       I915_TILING_NONE, 0, 0);
Line 795... Line 882...
795
}
882
}
796
 
883
 
797
static drm_intel_bo *
884
static drm_intel_bo *
Line 841... Line 928...
841
 
928
 
842
	if (tiling == I915_TILING_NONE)
929
	if (tiling == I915_TILING_NONE)
Line 843... Line 930...
843
		stride = 0;
930
		stride = 0;
844
 
931
 
-
 
932
	return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, flags,
-
 
933
					       tiling, stride, 0);
-
 
934
}
-
 
935
 
-
 
936
#if 0
-
 
937
static drm_intel_bo *
-
 
938
drm_intel_gem_bo_alloc_userptr(drm_intel_bufmgr *bufmgr,
-
 
939
				const char *name,
-
 
940
				void *addr,
-
 
941
				uint32_t tiling_mode,
-
 
942
				uint32_t stride,
-
 
943
				unsigned long size,
-
 
944
				unsigned long flags)
-
 
945
{
-
 
946
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
-
 
947
	drm_intel_bo_gem *bo_gem;
-
 
948
	int ret;
-
 
949
	struct drm_i915_gem_userptr userptr;
-
 
950
 
-
 
951
	/* Tiling with userptr surfaces is not supported
-
 
952
	 * on all hardware so refuse it for time being.
-
 
953
	 */
-
 
954
	if (tiling_mode != I915_TILING_NONE)
-
 
955
		return NULL;
-
 
956
 
-
 
957
	bo_gem = calloc(1, sizeof(*bo_gem));
-
 
958
	if (!bo_gem)
-
 
959
		return NULL;
-
 
960
 
-
 
961
	bo_gem->bo.size = size;
-
 
962
 
-
 
963
	memclear(userptr);
-
 
964
	userptr.user_ptr = (__u64)((unsigned long)addr);
-
 
965
	userptr.user_size = size;
-
 
966
	userptr.flags = flags;
-
 
967
 
-
 
968
	ret = drmIoctl(bufmgr_gem->fd,
-
 
969
			DRM_IOCTL_I915_GEM_USERPTR,
-
 
970
			&userptr);
-
 
971
	if (ret != 0) {
-
 
972
		DBG("bo_create_userptr: "
-
 
973
		    "ioctl failed with user ptr %p size 0x%lx, "
-
 
974
		    "user flags 0x%lx\n", addr, size, flags);
-
 
975
		free(bo_gem);
-
 
976
		return NULL;
-
 
977
	}
-
 
978
 
-
 
979
	bo_gem->gem_handle = userptr.handle;
-
 
980
	bo_gem->bo.handle = bo_gem->gem_handle;
-
 
981
	bo_gem->bo.bufmgr    = bufmgr;
-
 
982
	bo_gem->is_userptr   = true;
-
 
983
	bo_gem->bo.virtual   = addr;
-
 
984
	/* Save the address provided by user */
-
 
985
	bo_gem->user_virtual = addr;
-
 
986
	bo_gem->tiling_mode  = I915_TILING_NONE;
-
 
987
	bo_gem->swizzle_mode = I915_BIT_6_SWIZZLE_NONE;
-
 
988
	bo_gem->stride       = 0;
-
 
989
 
-
 
990
	DRMINITLISTHEAD(&bo_gem->name_list);
-
 
991
	DRMINITLISTHEAD(&bo_gem->vma_list);
-
 
992
 
-
 
993
	bo_gem->name = name;
-
 
994
	atomic_set(&bo_gem->refcount, 1);
-
 
995
	bo_gem->validate_index = -1;
-
 
996
	bo_gem->reloc_tree_fences = 0;
-
 
997
	bo_gem->used_as_reloc_target = false;
-
 
998
	bo_gem->has_error = false;
-
 
999
	bo_gem->reusable = false;
-
 
1000
	bo_gem->use_48b_address_range = false;
-
 
1001
 
-
 
1002
	drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0);
-
 
1003
 
-
 
1004
	DBG("bo_create_userptr: "
-
 
1005
	    "ptr %p buf %d (%s) size %ldb, stride 0x%x, tile mode %d\n",
-
 
1006
		addr, bo_gem->gem_handle, bo_gem->name,
-
 
1007
		size, stride, tiling_mode);
-
 
1008
 
-
 
1009
	return &bo_gem->bo;
-
 
1010
}
-
 
1011
 
-
 
1012
static bool
-
 
1013
has_userptr(drm_intel_bufmgr_gem *bufmgr_gem)
-
 
1014
{
-
 
1015
	int ret;
-
 
1016
	void *ptr;
-
 
1017
	long pgsz;
-
 
1018
	struct drm_i915_gem_userptr userptr;
-
 
1019
 
-
 
1020
	pgsz = sysconf(_SC_PAGESIZE);
-
 
1021
	assert(pgsz > 0);
-
 
1022
 
-
 
1023
	ret = posix_memalign(&ptr, pgsz, pgsz);
-
 
1024
	if (ret) {
-
 
1025
		DBG("Failed to get a page (%ld) for userptr detection!\n",
-
 
1026
			pgsz);
-
 
1027
		return false;
-
 
1028
	}
-
 
1029
 
-
 
1030
	memclear(userptr);
-
 
1031
	userptr.user_ptr = (__u64)(unsigned long)ptr;
-
 
1032
	userptr.user_size = pgsz;
-
 
1033
 
-
 
1034
retry:
-
 
1035
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr);
-
 
1036
	if (ret) {
-
 
1037
		if (errno == ENODEV && userptr.flags == 0) {
-
 
1038
			userptr.flags = I915_USERPTR_UNSYNCHRONIZED;
-
 
1039
			goto retry;
-
 
1040
		}
-
 
1041
		free(ptr);
-
 
1042
		return false;
-
 
1043
	}
-
 
1044
 
-
 
1045
	/* We don't release the userptr bo here as we want to keep the
-
 
1046
	 * kernel mm tracking alive for our lifetime. The first time we
-
 
1047
	 * create a userptr object the kernel has to install a mmu_notifer
-
 
1048
	 * which is a heavyweight operation (e.g. it requires taking all
-
 
1049
	 * mm_locks and stop_machine()).
-
 
1050
	 */
-
 
1051
 
-
 
1052
	bufmgr_gem->userptr_active.ptr = ptr;
-
 
1053
	bufmgr_gem->userptr_active.handle = userptr.handle;
-
 
1054
 
-
 
1055
	return true;
-
 
1056
}
-
 
1057
 
-
 
1058
#endif
-
 
1059
 
-
 
1060
static drm_intel_bo *
-
 
1061
check_bo_alloc_userptr(drm_intel_bufmgr *bufmgr,
-
 
1062
		       const char *name,
-
 
1063
		       void *addr,
-
 
1064
		       uint32_t tiling_mode,
-
 
1065
		       uint32_t stride,
-
 
1066
		       unsigned long size,
-
 
1067
		       unsigned long flags)
-
 
1068
{
-
 
1069
		bufmgr->bo_alloc_userptr = NULL;
-
 
1070
 
845
	return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, flags,
1071
	return drm_intel_bo_alloc_userptr(bufmgr, name, addr,
Line 846... Line 1072...
846
					       tiling, stride);
1072
					  tiling_mode, stride, size, flags);
847
}
1073
}
848
 
1074
 
Line 878... Line 1104...
878
			drm_intel_gem_bo_reference(&bo_gem->bo);
1104
			drm_intel_gem_bo_reference(&bo_gem->bo);
879
			return &bo_gem->bo;
1105
			return &bo_gem->bo;
880
		}
1106
		}
881
	}
1107
	}
Line 882... Line 1108...
882
 
1108
 
883
	VG_CLEAR(open_arg);
1109
	memclear(open_arg);
884
	open_arg.name = handle;
1110
	open_arg.name = handle;
885
	ret = drmIoctl(bufmgr_gem->fd,
1111
	ret = drmIoctl(bufmgr_gem->fd,
886
		       DRM_IOCTL_GEM_OPEN,
1112
		       DRM_IOCTL_GEM_OPEN,
887
		       &open_arg);
1113
		       &open_arg);
Line 918... Line 1144...
918
	bo_gem->validate_index = -1;
1144
	bo_gem->validate_index = -1;
919
	bo_gem->gem_handle = open_arg.handle;
1145
	bo_gem->gem_handle = open_arg.handle;
920
	bo_gem->bo.handle = open_arg.handle;
1146
	bo_gem->bo.handle = open_arg.handle;
921
	bo_gem->global_name = handle;
1147
	bo_gem->global_name = handle;
922
	bo_gem->reusable = false;
1148
	bo_gem->reusable = false;
-
 
1149
	bo_gem->use_48b_address_range = false;
Line 923... Line 1150...
923
 
1150
 
924
	VG_CLEAR(get_tiling);
1151
	memclear(get_tiling);
925
	get_tiling.handle = bo_gem->gem_handle;
1152
	get_tiling.handle = bo_gem->gem_handle;
926
	ret = drmIoctl(bufmgr_gem->fd,
1153
	ret = drmIoctl(bufmgr_gem->fd,
927
		       DRM_IOCTL_I915_GEM_GET_TILING,
1154
		       DRM_IOCTL_I915_GEM_GET_TILING,
928
		       &get_tiling);
1155
		       &get_tiling);
Line 931... Line 1158...
931
		return NULL;
1158
		return NULL;
932
	}
1159
	}
933
	bo_gem->tiling_mode = get_tiling.tiling_mode;
1160
	bo_gem->tiling_mode = get_tiling.tiling_mode;
934
	bo_gem->swizzle_mode = get_tiling.swizzle_mode;
1161
	bo_gem->swizzle_mode = get_tiling.swizzle_mode;
935
	/* XXX stride is unknown */
1162
	/* XXX stride is unknown */
936
	drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
1163
	drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0);
Line 937... Line 1164...
937
 
1164
 
938
	DRMINITLISTHEAD(&bo_gem->vma_list);
1165
	DRMINITLISTHEAD(&bo_gem->vma_list);
939
	DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
1166
	DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
Line 958... Line 1185...
958
	if (bo_gem->gtt_virtual) {
1185
	if (bo_gem->gtt_virtual) {
959
		bufmgr_gem->vma_count--;
1186
		bufmgr_gem->vma_count--;
960
	}
1187
	}
Line 961... Line 1188...
961
 
1188
 
962
	/* Close this object */
1189
	/* Close this object */
963
	VG_CLEAR(close);
1190
	memclear(close);
964
	close.handle = bo_gem->gem_handle;
1191
	close.handle = bo_gem->gem_handle;
965
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close);
1192
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close);
966
	if (ret != 0) {
1193
	if (ret != 0) {
967
		DBG("DRM_IOCTL_GEM_CLOSE %d failed (%s): %s\n",
1194
		DBG("DRM_IOCTL_GEM_CLOSE %d failed (%s): %s\n",
968
		    bo_gem->gem_handle, bo_gem->name, strerror(errno));
1195
		    bo_gem->gem_handle, bo_gem->name, strerror(errno));
969
	}
-
 
970
	free(bo_gem->aub_annotations);
1196
	}
971
	free(bo);
1197
	free(bo);
Line 972... Line 1198...
972
}
1198
}
973
 
1199
 
Line 1090... Line 1316...
1090
			drm_intel_gem_bo_unreference_locked_timed(bo_gem->
1316
			drm_intel_gem_bo_unreference_locked_timed(bo_gem->
1091
								  reloc_target_info[i].bo,
1317
								  reloc_target_info[i].bo,
1092
								  time);
1318
								  time);
1093
		}
1319
		}
1094
	}
1320
	}
-
 
1321
	for (i = 0; i < bo_gem->softpin_target_count; i++)
-
 
1322
		drm_intel_gem_bo_unreference_locked_timed(bo_gem->softpin_target[i],
-
 
1323
								  time);
1095
	bo_gem->reloc_count = 0;
1324
	bo_gem->reloc_count = 0;
1096
	bo_gem->used_as_reloc_target = false;
1325
	bo_gem->used_as_reloc_target = false;
-
 
1326
	bo_gem->softpin_target_count = 0;
Line 1097... Line 1327...
1097
 
1327
 
1098
	DBG("bo_unreference final: %d (%s)\n",
1328
	DBG("bo_unreference final: %d (%s)\n",
Line 1099... Line 1329...
1099
	    bo_gem->gem_handle, bo_gem->name);
1329
	    bo_gem->gem_handle, bo_gem->name);
Line 1105... Line 1335...
1105
	}
1335
	}
1106
	if (bo_gem->relocs) {
1336
	if (bo_gem->relocs) {
1107
		free(bo_gem->relocs);
1337
		free(bo_gem->relocs);
1108
		bo_gem->relocs = NULL;
1338
		bo_gem->relocs = NULL;
1109
	}
1339
	}
-
 
1340
	if (bo_gem->softpin_target) {
-
 
1341
		free(bo_gem->softpin_target);
-
 
1342
		bo_gem->softpin_target = NULL;
-
 
1343
		bo_gem->softpin_target_size = 0;
-
 
1344
	}
Line 1110... Line 1345...
1110
 
1345
 
1111
	/* Clear any left-over mappings */
1346
	/* Clear any left-over mappings */
1112
	if (bo_gem->map_count) {
1347
	if (bo_gem->map_count) {
1113
		DBG("bo freed with non-zero map-count %d\n", bo_gem->map_count);
1348
		DBG("bo freed with non-zero map-count %d\n", bo_gem->map_count);
Line 1147... Line 1382...
1147
static void drm_intel_gem_bo_unreference(drm_intel_bo *bo)
1382
static void drm_intel_gem_bo_unreference(drm_intel_bo *bo)
1148
{
1383
{
1149
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1384
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
Line 1150... Line 1385...
1150
 
1385
 
-
 
1386
	assert(atomic_read(&bo_gem->refcount) > 0);
1151
	assert(atomic_read(&bo_gem->refcount) > 0);
1387
 
1152
	if (atomic_dec_and_test(&bo_gem->refcount)) {
1388
	if (atomic_add_unless(&bo_gem->refcount, -1, 1)) {
1153
		drm_intel_bufmgr_gem *bufmgr_gem =
1389
		drm_intel_bufmgr_gem *bufmgr_gem =
1154
		    (drm_intel_bufmgr_gem *) bo->bufmgr;
1390
		    (drm_intel_bufmgr_gem *) bo->bufmgr;
Line 1155... Line 1391...
1155
//		struct timespec time;
1391
		struct timespec time;
Line 1156... Line 1392...
1156
 
1392
 
-
 
1393
		clock_gettime(CLOCK_MONOTONIC, &time);
-
 
1394
 
1157
//		clock_gettime(CLOCK_MONOTONIC, &time);
1395
//		pthread_mutex_lock(&bufmgr_gem->lock);
1158
 
1396
 
-
 
1397
		if (atomic_dec_and_test(&bo_gem->refcount)) {
-
 
1398
			drm_intel_gem_bo_unreference_final(bo, time.tv_sec);
1159
//		pthread_mutex_lock(&bufmgr_gem->lock);
1399
			drm_intel_gem_cleanup_bo_cache(bufmgr_gem, time.tv_sec);
1160
		drm_intel_gem_bo_unreference_final(bo, 0);
1400
		}
1161
		drm_intel_gem_cleanup_bo_cache(bufmgr_gem, 0);
1401
 
Line 1162... Line 1402...
1162
//		pthread_mutex_unlock(&bufmgr_gem->lock);
1402
//		pthread_mutex_unlock(&bufmgr_gem->lock);
Line 1168... Line 1408...
1168
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1408
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1169
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1409
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1170
	struct drm_i915_gem_set_domain set_domain;
1410
	struct drm_i915_gem_set_domain set_domain;
1171
	int ret;
1411
	int ret;
Line -... Line 1412...
-
 
1412
 
-
 
1413
	if (bo_gem->is_userptr) {
-
 
1414
		/* Return the same user ptr */
-
 
1415
		bo->virtual = bo_gem->user_virtual;
-
 
1416
		return 0;
-
 
1417
	}
1172
 
1418
 
Line 1173... Line 1419...
1173
//	pthread_mutex_lock(&bufmgr_gem->lock);
1419
//	pthread_mutex_lock(&bufmgr_gem->lock);
1174
 
1420
 
Line 1179... Line 1425...
1179
		struct drm_i915_gem_mmap mmap_arg;
1425
		struct drm_i915_gem_mmap mmap_arg;
Line 1180... Line 1426...
1180
 
1426
 
1181
		DBG("bo_map: %d (%s), map_count=%d\n",
1427
		DBG("bo_map: %d (%s), map_count=%d\n",
Line 1182... Line 1428...
1182
		    bo_gem->gem_handle, bo_gem->name, bo_gem->map_count);
1428
		    bo_gem->gem_handle, bo_gem->name, bo_gem->map_count);
1183
 
1429
 
1184
		VG_CLEAR(mmap_arg);
-
 
1185
		mmap_arg.handle = bo_gem->gem_handle;
1430
		memclear(mmap_arg);
1186
		mmap_arg.offset = 0;
1431
		mmap_arg.handle = bo_gem->gem_handle;
1187
		mmap_arg.size = bo->size;
1432
		mmap_arg.size = bo->size;
1188
		ret = drmIoctl(bufmgr_gem->fd,
1433
		ret = drmIoctl(bufmgr_gem->fd,
1189
			       DRM_IOCTL_I915_GEM_MMAP,
1434
			       DRM_IOCTL_I915_GEM_MMAP,
Line 1203... Line 1448...
1203
	}
1448
	}
1204
	DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
1449
	DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
1205
	    bo_gem->mem_virtual);
1450
	    bo_gem->mem_virtual);
1206
	bo->virtual = bo_gem->mem_virtual;
1451
	bo->virtual = bo_gem->mem_virtual;
Line 1207... Line 1452...
1207
 
1452
 
1208
	VG_CLEAR(set_domain);
1453
	memclear(set_domain);
1209
	set_domain.handle = bo_gem->gem_handle;
1454
	set_domain.handle = bo_gem->gem_handle;
1210
	set_domain.read_domains = I915_GEM_DOMAIN_CPU;
1455
	set_domain.read_domains = I915_GEM_DOMAIN_CPU;
1211
	if (write_enable)
1456
	if (write_enable)
1212
		set_domain.write_domain = I915_GEM_DOMAIN_CPU;
1457
		set_domain.write_domain = I915_GEM_DOMAIN_CPU;
Line 1236... Line 1481...
1236
{
1481
{
1237
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1482
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1238
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1483
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1239
	int ret;
1484
	int ret;
Line -... Line 1485...
-
 
1485
 
-
 
1486
	if (bo_gem->is_userptr)
-
 
1487
		return -EINVAL;
1240
 
1488
 
1241
	if (bo_gem->map_count++ == 0)
1489
	if (bo_gem->map_count++ == 0)
Line 1242... Line 1490...
1242
		drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem);
1490
		drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem);
1243
 
1491
 
1244
	/* Get a mapping of the buffer if we haven't before. */
1492
	/* Get a mapping of the buffer if we haven't before. */
Line 1245... Line 1493...
1245
	if (bo_gem->gtt_virtual == NULL) {
1493
	if (bo_gem->gtt_virtual == NULL) {
1246
		struct drm_i915_gem_mmap_gtt mmap_arg;
1494
		struct drm_i915_gem_mmap_gtt mmap_arg;
Line 1247... Line 1495...
1247
 
1495
 
1248
		DBG("bo_map_gtt: mmap %d (%s), map_count=%d\n",
1496
		DBG("bo_map_gtt: mmap %d (%s), map_count=%d\n",
1249
		    bo_gem->gem_handle, bo_gem->name, bo_gem->map_count);
-
 
Line 1250... Line 1497...
1250
 
1497
		    bo_gem->gem_handle, bo_gem->name, bo_gem->map_count);
1251
		VG_CLEAR(mmap_arg);
1498
 
1252
		mmap_arg.handle = bo_gem->gem_handle;
1499
		memclear(mmap_arg);
1253
		mmap_arg.offset = 0;
1500
		mmap_arg.handle = bo_gem->gem_handle;
Line 1266... Line 1513...
1266
				drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1513
				drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem);
1267
			return ret;
1514
			return ret;
1268
		}
1515
		}
Line 1269... Line 1516...
1269
 
1516
 
1270
		/* and mmap it */
1517
		/* and mmap it */
1271
		bo_gem->gtt_virtual = mmap_arg.offset;
1518
		bo_gem->gtt_virtual = (void*)(__u32)mmap_arg.offset;
1272
		if (bo_gem->gtt_virtual == 0) {
1519
		if (bo_gem->gtt_virtual == 0) {
1273
			bo_gem->gtt_virtual = NULL;
1520
			bo_gem->gtt_virtual = NULL;
1274
			ret = -errno;
1521
			ret = -errno;
1275
			DBG("%s:%d: Error mapping buffer %d (%s): %s .\n",
1522
			DBG("%s:%d: Error mapping buffer %d (%s): %s .\n",
Line 1288... Line 1535...
1288
	    bo_gem->gtt_virtual);
1535
	    bo_gem->gtt_virtual);
Line 1289... Line 1536...
1289
 
1536
 
1290
	return 0;
1537
	return 0;
Line -... Line 1538...
-
 
1538
}
1291
}
1539
 
1292
 
1540
int
1293
int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
1541
drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
1294
{
1542
{
1295
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1543
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1296
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1544
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
Line 1312... Line 1560...
1312
	 * The pagefault handler does this domain change for us when
1560
	 * The pagefault handler does this domain change for us when
1313
	 * it has unbound the BO from the GTT, but it's up to us to
1561
	 * it has unbound the BO from the GTT, but it's up to us to
1314
	 * tell it when we're about to use things if we had done
1562
	 * tell it when we're about to use things if we had done
1315
	 * rendering and it still happens to be bound to the GTT.
1563
	 * rendering and it still happens to be bound to the GTT.
1316
	 */
1564
	 */
1317
	VG_CLEAR(set_domain);
1565
	memclear(set_domain);
1318
	set_domain.handle = bo_gem->gem_handle;
1566
	set_domain.handle = bo_gem->gem_handle;
1319
	set_domain.read_domains = I915_GEM_DOMAIN_GTT;
1567
	set_domain.read_domains = I915_GEM_DOMAIN_GTT;
1320
	set_domain.write_domain = I915_GEM_DOMAIN_GTT;
1568
	set_domain.write_domain = I915_GEM_DOMAIN_GTT;
1321
	ret = drmIoctl(bufmgr_gem->fd,
1569
	ret = drmIoctl(bufmgr_gem->fd,
1322
		       DRM_IOCTL_I915_GEM_SET_DOMAIN,
1570
		       DRM_IOCTL_I915_GEM_SET_DOMAIN,
Line 1346... Line 1594...
1346
 * data that the GPU is busy using (or, more specifically, that if it
1594
 * data that the GPU is busy using (or, more specifically, that if it
1347
 * does write over the data, it acknowledges that rendering is
1595
 * does write over the data, it acknowledges that rendering is
1348
 * undefined).
1596
 * undefined).
1349
 */
1597
 */
Line -... Line 1598...
-
 
1598
 
1350
 
1599
int
1351
int drm_intel_gem_bo_map_unsynchronized(drm_intel_bo *bo)
1600
drm_intel_gem_bo_map_unsynchronized(drm_intel_bo *bo)
1352
{
1601
{
1353
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1602
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1354
#ifdef HAVE_VALGRIND
1603
#ifdef HAVE_VALGRIND
1355
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1604
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
Line 1373... Line 1622...
1373
	return ret;
1622
	return ret;
1374
}
1623
}
Line 1375... Line 1624...
1375
 
1624
 
1376
static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
1625
static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
1377
{
1626
{
1378
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1627
	drm_intel_bufmgr_gem *bufmgr_gem;
1379
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1628
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
Line 1380... Line 1629...
1380
	int ret = 0;
1629
	int ret = 0;
1381
 
1630
 
Line -... Line 1631...
-
 
1631
	if (bo == NULL)
-
 
1632
		return 0;
-
 
1633
 
-
 
1634
	if (bo_gem->is_userptr)
1382
	if (bo == NULL)
1635
		return 0;
Line 1383... Line 1636...
1383
		return 0;
1636
 
1384
 
1637
	bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1385
//	pthread_mutex_lock(&bufmgr_gem->lock);
1638
//	pthread_mutex_lock(&bufmgr_gem->lock);
Line 1417... Line 1670...
1417
//	pthread_mutex_unlock(&bufmgr_gem->lock);
1670
//	pthread_mutex_unlock(&bufmgr_gem->lock);
Line 1418... Line 1671...
1418
 
1671
 
1419
	return ret;
1672
	return ret;
Line -... Line 1673...
-
 
1673
}
1420
}
1674
 
1421
 
1675
int
1422
int drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo)
1676
drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo)
1423
{
1677
{
Line 1424... Line 1678...
1424
	return drm_intel_gem_bo_unmap(bo);
1678
	return drm_intel_gem_bo_unmap(bo);
Line 1431... Line 1685...
1431
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1685
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1432
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1686
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1433
	struct drm_i915_gem_pwrite pwrite;
1687
	struct drm_i915_gem_pwrite pwrite;
1434
	int ret;
1688
	int ret;
Line -... Line 1689...
-
 
1689
 
-
 
1690
	if (bo_gem->is_userptr)
-
 
1691
		return -EINVAL;
1435
 
1692
 
1436
 	VG_CLEAR(pwrite);
1693
	memclear(pwrite);
1437
	pwrite.handle = bo_gem->gem_handle;
1694
	pwrite.handle = bo_gem->gem_handle;
1438
	pwrite.offset = offset;
1695
	pwrite.offset = offset;
1439
	pwrite.size = size;
1696
	pwrite.size = size;
1440
	pwrite.data_ptr = (uint64_t) (uintptr_t) data;
1697
	pwrite.data_ptr = (uint64_t) (uintptr_t) data;
Line 1457... Line 1714...
1457
{
1714
{
1458
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1715
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1459
	struct drm_i915_get_pipe_from_crtc_id get_pipe_from_crtc_id;
1716
	struct drm_i915_get_pipe_from_crtc_id get_pipe_from_crtc_id;
1460
	int ret;
1717
	int ret;
Line 1461... Line 1718...
1461
 
1718
 
1462
	VG_CLEAR(get_pipe_from_crtc_id);
1719
	memclear(get_pipe_from_crtc_id);
1463
	get_pipe_from_crtc_id.crtc_id = crtc_id;
1720
	get_pipe_from_crtc_id.crtc_id = crtc_id;
1464
	ret = drmIoctl(bufmgr_gem->fd,
1721
	ret = drmIoctl(bufmgr_gem->fd,
1465
		       DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID,
1722
		       DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID,
1466
		       &get_pipe_from_crtc_id);
1723
		       &get_pipe_from_crtc_id);
Line 1474... Line 1731...
1474
		return -1;
1731
		return -1;
1475
	}
1732
	}
Line 1476... Line 1733...
1476
 
1733
 
1477
	return get_pipe_from_crtc_id.pipe;
1734
	return get_pipe_from_crtc_id.pipe;
-
 
1735
}
Line 1478... Line 1736...
1478
}
1736
#endif
1479
 
1737
 
1480
static int
1738
static int
1481
drm_intel_gem_bo_get_subdata(drm_intel_bo *bo, unsigned long offset,
1739
drm_intel_gem_bo_get_subdata(drm_intel_bo *bo, unsigned long offset,
1482
			     unsigned long size, void *data)
1740
			     unsigned long size, void *data)
1483
{
1741
{
1484
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1742
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1485
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1743
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
Line -... Line 1744...
-
 
1744
	struct drm_i915_gem_pread pread;
-
 
1745
	int ret;
-
 
1746
 
1486
	struct drm_i915_gem_pread pread;
1747
	if (bo_gem->is_userptr)
1487
	int ret;
1748
		return -EINVAL;
1488
 
1749
 
1489
	VG_CLEAR(pread);
1750
	memclear(pread);
1490
	pread.handle = bo_gem->gem_handle;
1751
	pread.handle = bo_gem->gem_handle;
1491
	pread.offset = offset;
1752
	pread.offset = offset;
Line 1502... Line 1763...
1502
	}
1763
	}
Line 1503... Line 1764...
1503
 
1764
 
1504
	return ret;
1765
	return ret;
Line 1505... Line -...
1505
}
-
 
1506
 
-
 
1507
#endif
1766
}
1508
 
1767
 
1509
/** Waits for all GPU rendering with the object to have completed. */
1768
/** Waits for all GPU rendering with the object to have completed. */
1510
static void
1769
static void
1511
drm_intel_gem_bo_wait_rendering(drm_intel_bo *bo)
1770
drm_intel_gem_bo_wait_rendering(drm_intel_bo *bo)
Line 1534... Line 1793...
1534
 * The implementation shall wait until the object is no longer actively
1793
 * The implementation shall wait until the object is no longer actively
1535
 * referenced within a batch buffer at the time of the call. The wait will
1794
 * referenced within a batch buffer at the time of the call. The wait will
1536
 * not guarantee that the buffer is re-issued via another thread, or an flinked
1795
 * not guarantee that the buffer is re-issued via another thread, or an flinked
1537
 * handle. Userspace must make sure this race does not occur if such precision
1796
 * handle. Userspace must make sure this race does not occur if such precision
1538
 * is important.
1797
 * is important.
-
 
1798
 *
-
 
1799
 * Note that some kernels have broken the inifite wait for negative values
-
 
1800
 * promise, upgrade to latest stable kernels if this is the case.
1539
 */
1801
 */
-
 
1802
int
1540
int drm_intel_gem_bo_wait(drm_intel_bo *bo, int64_t timeout_ns)
1803
drm_intel_gem_bo_wait(drm_intel_bo *bo, int64_t timeout_ns)
1541
{
1804
{
1542
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1805
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1543
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1806
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1544
	struct drm_i915_gem_wait wait;
1807
	struct drm_i915_gem_wait wait;
1545
	int ret;
1808
	int ret;
Line 1549... Line 1812...
1549
		    "infinite wait\n", __FILE__, __LINE__);
1812
		    "infinite wait\n", __FILE__, __LINE__);
1550
		if (timeout_ns) {
1813
		if (timeout_ns) {
1551
			drm_intel_gem_bo_wait_rendering(bo);
1814
			drm_intel_gem_bo_wait_rendering(bo);
1552
			return 0;
1815
			return 0;
1553
		} else {
1816
		} else {
1554
			return drm_intel_gem_bo_busy(bo) ? -1 : 0;
1817
			return drm_intel_gem_bo_busy(bo) ? -ETIME : 0;
1555
		}
1818
		}
1556
	}
1819
	}
Line -... Line 1820...
-
 
1820
 
1557
 
1821
	memclear(wait);
1558
	wait.bo_handle = bo_gem->gem_handle;
1822
	wait.bo_handle = bo_gem->gem_handle;
1559
	wait.timeout_ns = timeout_ns;
-
 
1560
	wait.flags = 0;
1823
	wait.timeout_ns = timeout_ns;
1561
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_WAIT, &wait);
1824
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_WAIT, &wait);
1562
	if (ret == -1)
1825
	if (ret == -1)
Line 1563... Line 1826...
1563
		return -errno;
1826
		return -errno;
Line 1578... Line 1841...
1578
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1841
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1579
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1842
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1580
	struct drm_i915_gem_set_domain set_domain;
1843
	struct drm_i915_gem_set_domain set_domain;
1581
	int ret;
1844
	int ret;
Line 1582... Line 1845...
1582
 
1845
 
1583
	VG_CLEAR(set_domain);
1846
	memclear(set_domain);
1584
	set_domain.handle = bo_gem->gem_handle;
1847
	set_domain.handle = bo_gem->gem_handle;
1585
	set_domain.read_domains = I915_GEM_DOMAIN_GTT;
1848
	set_domain.read_domains = I915_GEM_DOMAIN_GTT;
1586
	set_domain.write_domain = write_enable ? I915_GEM_DOMAIN_GTT : 0;
1849
	set_domain.write_domain = write_enable ? I915_GEM_DOMAIN_GTT : 0;
1587
	ret = drmIoctl(bufmgr_gem->fd,
1850
	ret = drmIoctl(bufmgr_gem->fd,
Line 1597... Line 1860...
1597
 
1860
 
1598
static void
1861
static void
1599
drm_intel_bufmgr_gem_destroy(drm_intel_bufmgr *bufmgr)
1862
drm_intel_bufmgr_gem_destroy(drm_intel_bufmgr *bufmgr)
1600
{
1863
{
-
 
1864
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1601
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr;
1865
	struct drm_gem_close close_bo;
Line 1602... Line 1866...
1602
	int i;
1866
	int i, ret;
1603
 
1867
 
1604
	free(bufmgr_gem->exec2_objects);
1868
	free(bufmgr_gem->exec2_objects);
1605
	free(bufmgr_gem->exec_objects);
-
 
Line 1606... Line 1869...
1606
	free(bufmgr_gem->exec_bos);
1869
	free(bufmgr_gem->exec_objects);
Line 1607... Line 1870...
1607
	free(bufmgr_gem->aub_filename);
1870
	free(bufmgr_gem->exec_bos);
1608
 
1871
 
Line 1671... Line 1934...
1671
 
1934
 
1672
	/* Check args */
1935
	/* Check args */
1673
	assert(offset <= bo->size - 4);
1936
	assert(offset <= bo->size - 4);
Line -... Line 1937...
-
 
1937
	assert((write_domain & (write_domain - 1)) == 0);
-
 
1938
 
-
 
1939
	/* An object needing a fence is a tiled buffer, so it won't have
-
 
1940
	 * relocs to other buffers.
-
 
1941
	 */
-
 
1942
	if (need_fence) {
-
 
1943
		assert(target_bo_gem->reloc_count == 0);
-
 
1944
		target_bo_gem->reloc_tree_fences = 1;
1674
	assert((write_domain & (write_domain - 1)) == 0);
1945
	}
1675
 
1946
 
1676
	/* Make sure that we're not adding a reloc to something whose size has
1947
	/* Make sure that we're not adding a reloc to something whose size has
1677
	 * already been accounted for.
1948
	 * already been accounted for.
1678
	 */
1949
	 */
1679
	assert(!bo_gem->used_as_reloc_target);
1950
	assert(!bo_gem->used_as_reloc_target);
1680
	if (target_bo_gem != bo_gem) {
1951
	if (target_bo_gem != bo_gem) {
1681
		target_bo_gem->used_as_reloc_target = true;
-
 
1682
		bo_gem->reloc_tree_size += target_bo_gem->reloc_tree_size;
-
 
1683
	}
-
 
1684
	/* An object needing a fence is a tiled buffer, so it won't have
-
 
1685
	 * relocs to other buffers.
-
 
1686
	 */
-
 
1687
	if (need_fence)
1952
		target_bo_gem->used_as_reloc_target = true;
1688
		target_bo_gem->reloc_tree_fences = 1;
1953
		bo_gem->reloc_tree_size += target_bo_gem->reloc_tree_size;
1689
	bo_gem->reloc_tree_fences += target_bo_gem->reloc_tree_fences;
-
 
1690
 
-
 
1691
	bo_gem->relocs[bo_gem->reloc_count].offset = offset;
-
 
1692
	bo_gem->relocs[bo_gem->reloc_count].delta = target_offset;
-
 
1693
	bo_gem->relocs[bo_gem->reloc_count].target_handle =
-
 
1694
	    target_bo_gem->gem_handle;
-
 
1695
	bo_gem->relocs[bo_gem->reloc_count].read_domains = read_domains;
-
 
Line 1696... Line 1954...
1696
	bo_gem->relocs[bo_gem->reloc_count].write_domain = write_domain;
1954
		bo_gem->reloc_tree_fences += target_bo_gem->reloc_tree_fences;
1697
	bo_gem->relocs[bo_gem->reloc_count].presumed_offset = target_bo->offset64;
1955
	}
1698
 
1956
 
1699
	bo_gem->reloc_target_info[bo_gem->reloc_count].bo = target_bo;
1957
	bo_gem->reloc_target_info[bo_gem->reloc_count].bo = target_bo;
1700
	if (target_bo != bo)
1958
	if (target_bo != bo)
1701
		drm_intel_gem_bo_reference(target_bo);
1959
		drm_intel_gem_bo_reference(target_bo);
1702
	if (fenced_command)
1960
	if (fenced_command)
1703
		bo_gem->reloc_target_info[bo_gem->reloc_count].flags =
1961
		bo_gem->reloc_target_info[bo_gem->reloc_count].flags =
Line -... Line 1962...
-
 
1962
			DRM_INTEL_RELOC_FENCE;
-
 
1963
	else
-
 
1964
		bo_gem->reloc_target_info[bo_gem->reloc_count].flags = 0;
-
 
1965
 
-
 
1966
	bo_gem->relocs[bo_gem->reloc_count].offset = offset;
-
 
1967
	bo_gem->relocs[bo_gem->reloc_count].delta = target_offset;
-
 
1968
	bo_gem->relocs[bo_gem->reloc_count].target_handle =
1704
			DRM_INTEL_RELOC_FENCE;
1969
	    target_bo_gem->gem_handle;
Line 1705... Line 1970...
1705
	else
1970
	bo_gem->relocs[bo_gem->reloc_count].read_domains = read_domains;
1706
		bo_gem->reloc_target_info[bo_gem->reloc_count].flags = 0;
1971
	bo_gem->relocs[bo_gem->reloc_count].write_domain = write_domain;
Line -... Line 1972...
-
 
1972
	bo_gem->relocs[bo_gem->reloc_count].presumed_offset = target_bo->offset64;
-
 
1973
	bo_gem->reloc_count++;
-
 
1974
 
-
 
1975
	return 0;
-
 
1976
}
-
 
1977
 
-
 
1978
static void
-
 
1979
drm_intel_gem_bo_use_48b_address_range(drm_intel_bo *bo, uint32_t enable)
-
 
1980
{
-
 
1981
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
-
 
1982
	bo_gem->use_48b_address_range = enable;
-
 
1983
}
-
 
1984
 
-
 
1985
static int
-
 
1986
drm_intel_gem_bo_add_softpin_target(drm_intel_bo *bo, drm_intel_bo *target_bo)
-
 
1987
{
-
 
1988
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
-
 
1989
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
-
 
1990
	drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) target_bo;
-
 
1991
	if (bo_gem->has_error)
-
 
1992
		return -ENOMEM;
-
 
1993
 
-
 
1994
	if (target_bo_gem->has_error) {
-
 
1995
		bo_gem->has_error = true;
-
 
1996
		return -ENOMEM;
-
 
1997
	}
-
 
1998
 
-
 
1999
	if (!target_bo_gem->is_softpin)
-
 
2000
		return -EINVAL;
-
 
2001
	if (target_bo_gem == bo_gem)
-
 
2002
		return -EINVAL;
-
 
2003
 
-
 
2004
	if (bo_gem->softpin_target_count == bo_gem->softpin_target_size) {
-
 
2005
		int new_size = bo_gem->softpin_target_size * 2;
-
 
2006
		if (new_size == 0)
-
 
2007
			new_size = bufmgr_gem->max_relocs;
-
 
2008
 
-
 
2009
		bo_gem->softpin_target = realloc(bo_gem->softpin_target, new_size *
-
 
2010
				sizeof(drm_intel_bo *));
-
 
2011
		if (!bo_gem->softpin_target)
-
 
2012
			return -ENOMEM;
-
 
2013
 
-
 
2014
		bo_gem->softpin_target_size = new_size;
-
 
2015
	}
-
 
2016
	bo_gem->softpin_target[bo_gem->softpin_target_count] = target_bo;
1707
 
2017
	drm_intel_gem_bo_reference(target_bo);
1708
	bo_gem->reloc_count++;
2018
	bo_gem->softpin_target_count++;
1709
 
2019
 
1710
	return 0;
2020
	return 0;
1711
}
2021
}
1712
 
2022
 
-
 
2023
static int
Line -... Line 2024...
-
 
2024
drm_intel_gem_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
-
 
2025
			    drm_intel_bo *target_bo, uint32_t target_offset,
-
 
2026
			    uint32_t read_domains, uint32_t write_domain)
1713
static int
2027
{
1714
drm_intel_gem_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
2028
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
1715
			    drm_intel_bo *target_bo, uint32_t target_offset,
2029
	drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *)target_bo;
1716
			    uint32_t read_domains, uint32_t write_domain)
2030
 
Line 1750... Line 2064...
1750
 * batchbuffer including drm_intel_gem_get_reloc_count(), emit all the
2064
 * batchbuffer including drm_intel_gem_get_reloc_count(), emit all the
1751
 * state, and then check if it still fits in the aperture.
2065
 * state, and then check if it still fits in the aperture.
1752
 *
2066
 *
1753
 * Any further drm_intel_bufmgr_check_aperture_space() queries
2067
 * Any further drm_intel_bufmgr_check_aperture_space() queries
1754
 * involving this buffer in the tree are undefined after this call.
2068
 * involving this buffer in the tree are undefined after this call.
-
 
2069
 *
-
 
2070
 * This also removes all softpinned targets being referenced by the BO.
1755
 */
2071
 */
1756
void
2072
void
1757
drm_intel_gem_bo_clear_relocs(drm_intel_bo *bo, int start)
2073
drm_intel_gem_bo_clear_relocs(drm_intel_bo *bo, int start)
1758
{
2074
{
-
 
2075
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
1759
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2076
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
1760
	int i;
2077
	int i;
1761
//	struct timespec time;
2078
	struct timespec time;
Line 1762... Line 2079...
1762
 
2079
 
Line 1763... Line 2080...
1763
//	clock_gettime(CLOCK_MONOTONIC, &time);
2080
	clock_gettime(CLOCK_MONOTONIC, &time);
-
 
2081
 
1764
 
2082
	assert(bo_gem->reloc_count >= start);
1765
	assert(bo_gem->reloc_count >= start);
2083
 
1766
	/* Unreference the cleared target buffers */
2084
	/* Unreference the cleared target buffers */
1767
	for (i = start; i < bo_gem->reloc_count; i++) {
2085
	for (i = start; i < bo_gem->reloc_count; i++) {
1768
		drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->reloc_target_info[i].bo;
2086
		drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->reloc_target_info[i].bo;
1769
		if (&target_bo_gem->bo != bo) {
2087
		if (&target_bo_gem->bo != bo) {
1770
			bo_gem->reloc_tree_fences -= target_bo_gem->reloc_tree_fences;
2088
			bo_gem->reloc_tree_fences -= target_bo_gem->reloc_tree_fences;
1771
			drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo,
2089
			drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo,
1772
								  0);
2090
								  time.tv_sec);
1773
		}
2091
		}
-
 
2092
	}
-
 
2093
	bo_gem->reloc_count = start;
-
 
2094
 
-
 
2095
	for (i = 0; i < bo_gem->softpin_target_count; i++) {
-
 
2096
		drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->softpin_target[i];
-
 
2097
		drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo, time.tv_sec);
1774
	}
2098
	}
Line 1775... Line 2099...
1775
	bo_gem->reloc_count = start;
2099
	bo_gem->softpin_target_count = 0;
1776
}
2100
}
1777
 
2101
 
Line 1809... Line 2133...
1809
drm_intel_gem_bo_process_reloc2(drm_intel_bo *bo)
2133
drm_intel_gem_bo_process_reloc2(drm_intel_bo *bo)
1810
{
2134
{
1811
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
2135
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
1812
	int i;
2136
	int i;
Line 1813... Line 2137...
1813
 
2137
 
1814
	if (bo_gem->relocs == NULL)
2138
	if (bo_gem->relocs == NULL && bo_gem->softpin_target == NULL)
Line 1815... Line 2139...
1815
		return;
2139
		return;
1816
 
2140
 
1817
	for (i = 0; i < bo_gem->reloc_count; i++) {
2141
	for (i = 0; i < bo_gem->reloc_count; i++) {
Line 1830... Line 2154...
1830
			      DRM_INTEL_RELOC_FENCE);
2154
			      DRM_INTEL_RELOC_FENCE);
Line 1831... Line 2155...
1831
 
2155
 
1832
		/* Add the target to the validate list */
2156
		/* Add the target to the validate list */
1833
		drm_intel_add_validate_buffer2(target_bo, need_fence);
2157
		drm_intel_add_validate_buffer2(target_bo, need_fence);
-
 
2158
	}
-
 
2159
 
-
 
2160
	for (i = 0; i < bo_gem->softpin_target_count; i++) {
-
 
2161
		drm_intel_bo *target_bo = bo_gem->softpin_target[i];
-
 
2162
 
-
 
2163
		if (target_bo == bo)
-
 
2164
			continue;
-
 
2165
 
-
 
2166
		drm_intel_gem_bo_mark_mmaps_incoherent(bo);
-
 
2167
		drm_intel_gem_bo_process_reloc2(target_bo);
-
 
2168
		drm_intel_add_validate_buffer2(target_bo, false);
1834
	}
2169
	}
Line 1835... Line 2170...
1835
}
2170
}
1836
 
2171
 
Line 1844... Line 2179...
1844
		drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
2179
		drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1845
		drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2180
		drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
Line 1846... Line 2181...
1846
 
2181
 
1847
		/* Update the buffer offset */
2182
		/* Update the buffer offset */
1848
		if (bufmgr_gem->exec_objects[i].offset != bo->offset64) {
2183
		if (bufmgr_gem->exec_objects[i].offset != bo->offset64) {
1849
			DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n",
2184
			DBG("BO %d (%s) migrated: 0x%08x %08x -> 0x%08x %08x\n",
-
 
2185
			    bo_gem->gem_handle, bo_gem->name,
-
 
2186
			    upper_32_bits(bo->offset64),
1850
			    bo_gem->gem_handle, bo_gem->name, bo->offset64,
2187
			    lower_32_bits(bo->offset64),
1851
			    (unsigned long long)bufmgr_gem->exec_objects[i].
2188
			    upper_32_bits(bufmgr_gem->exec_objects[i].offset),
1852
			    offset);
2189
			    lower_32_bits(bufmgr_gem->exec_objects[i].offset));
1853
			bo->offset64 = bufmgr_gem->exec_objects[i].offset;
2190
			bo->offset64 = bufmgr_gem->exec_objects[i].offset;
1854
			bo->offset = bufmgr_gem->exec_objects[i].offset;
2191
			bo->offset = bufmgr_gem->exec_objects[i].offset;
1855
		}
2192
		}
1856
	}
2193
	}
Line 1865... Line 2202...
1865
		drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
2202
		drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
1866
		drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
2203
		drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
Line 1867... Line 2204...
1867
 
2204
 
1868
		/* Update the buffer offset */
2205
		/* Update the buffer offset */
-
 
2206
		if (bufmgr_gem->exec2_objects[i].offset != bo->offset64) {
-
 
2207
			/* If we're seeing softpinned object here it means that the kernel
-
 
2208
			 * has relocated our object... Indicating a programming error
-
 
2209
			 */
1869
		if (bufmgr_gem->exec2_objects[i].offset != bo->offset64) {
2210
			assert(!bo_gem->is_softpin);
1870
			DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n",
2211
			DBG("BO %d (%s) migrated: 0x%08x %08x -> 0x%08x %08x\n",
-
 
2212
			    bo_gem->gem_handle, bo_gem->name,
-
 
2213
			    upper_32_bits(bo->offset64),
1871
			    bo_gem->gem_handle, bo_gem->name, bo->offset64,
2214
			    lower_32_bits(bo->offset64),
-
 
2215
			    upper_32_bits(bufmgr_gem->exec2_objects[i].offset),
1872
			    (unsigned long long)bufmgr_gem->exec2_objects[i].offset);
2216
			    lower_32_bits(bufmgr_gem->exec2_objects[i].offset));
1873
			bo->offset64 = bufmgr_gem->exec2_objects[i].offset;
2217
			bo->offset64 = bufmgr_gem->exec2_objects[i].offset;
1874
			bo->offset = bufmgr_gem->exec2_objects[i].offset;
2218
			bo->offset = bufmgr_gem->exec2_objects[i].offset;
1875
		}
2219
		}
1876
	}
2220
	}
Line 1877... Line -...
1877
}
-
 
1878
 
-
 
1879
static void
-
 
1880
aub_out(drm_intel_bufmgr_gem *bufmgr_gem, uint32_t data)
-
 
1881
{
-
 
1882
	fwrite(&data, 1, 4, bufmgr_gem->aub_file);
-
 
1883
}
-
 
1884
 
-
 
1885
static void
-
 
1886
aub_out_data(drm_intel_bufmgr_gem *bufmgr_gem, void *data, size_t size)
-
 
1887
{
-
 
1888
	fwrite(data, 1, size, bufmgr_gem->aub_file);
-
 
1889
}
-
 
1890
 
-
 
1891
static void
-
 
1892
aub_write_bo_data(drm_intel_bo *bo, uint32_t offset, uint32_t size)
-
 
1893
{
-
 
1894
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
-
 
1895
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
-
 
1896
	uint32_t *data;
-
 
1897
	unsigned int i;
-
 
1898
 
-
 
1899
	data = malloc(bo->size);
-
 
1900
	drm_intel_bo_get_subdata(bo, offset, size, data);
-
 
1901
 
-
 
1902
	/* Easy mode: write out bo with no relocations */
-
 
1903
	if (!bo_gem->reloc_count) {
-
 
1904
		aub_out_data(bufmgr_gem, data, size);
-
 
1905
		free(data);
-
 
1906
		return;
-
 
1907
	}
-
 
1908
 
-
 
1909
	/* Otherwise, handle the relocations while writing. */
-
 
1910
	for (i = 0; i < size / 4; i++) {
-
 
1911
		int r;
-
 
1912
		for (r = 0; r < bo_gem->reloc_count; r++) {
-
 
1913
			struct drm_i915_gem_relocation_entry *reloc;
-
 
1914
			drm_intel_reloc_target *info;
-
 
1915
 
-
 
1916
			reloc = &bo_gem->relocs[r];
-
 
1917
			info = &bo_gem->reloc_target_info[r];
-
 
1918
 
-
 
1919
			if (reloc->offset == offset + i * 4) {
-
 
1920
				drm_intel_bo_gem *target_gem;
-
 
1921
				uint32_t val;
-
 
1922
 
-
 
1923
				target_gem = (drm_intel_bo_gem *)info->bo;
-
 
1924
 
-
 
1925
				val = reloc->delta;
-
 
1926
				val += target_gem->aub_offset;
-
 
1927
 
-
 
1928
				aub_out(bufmgr_gem, val);
-
 
1929
				data[i] = val;
-
 
1930
				break;
-
 
1931
			}
-
 
1932
		}
-
 
1933
		if (r == bo_gem->reloc_count) {
-
 
1934
			/* no relocation, just the data */
-
 
1935
			aub_out(bufmgr_gem, data[i]);
-
 
1936
		}
-
 
1937
	}
-
 
1938
 
-
 
1939
	free(data);
-
 
1940
}
-
 
1941
 
-
 
1942
static void
-
 
1943
aub_bo_get_address(drm_intel_bo *bo)
-
 
1944
{
-
 
1945
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
-
 
1946
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
-
 
1947
 
-
 
1948
	/* Give the object a graphics address in the AUB file.  We
-
 
1949
	 * don't just use the GEM object address because we do AUB
-
 
1950
	 * dumping before execution -- we want to successfully log
-
 
1951
	 * when the hardware might hang, and we might even want to aub
-
 
1952
	 * capture for a driver trying to execute on a different
-
 
1953
	 * generation of hardware by disabling the actual kernel exec
-
 
1954
	 * call.
-
 
1955
	 */
-
 
1956
	bo_gem->aub_offset = bufmgr_gem->aub_offset;
-
 
1957
	bufmgr_gem->aub_offset += bo->size;
-
 
1958
	/* XXX: Handle aperture overflow. */
-
 
1959
	assert(bufmgr_gem->aub_offset < 256 * 1024 * 1024);
-
 
1960
}
-
 
1961
 
-
 
1962
static void
-
 
1963
aub_write_trace_block(drm_intel_bo *bo, uint32_t type, uint32_t subtype,
-
 
1964
		      uint32_t offset, uint32_t size)
-
 
1965
{
-
 
1966
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
-
 
1967
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
-
 
1968
 
-
 
1969
	aub_out(bufmgr_gem,
-
 
1970
		CMD_AUB_TRACE_HEADER_BLOCK |
-
 
1971
		((bufmgr_gem->gen >= 8 ? 6 : 5) - 2));
-
 
1972
	aub_out(bufmgr_gem,
-
 
1973
		AUB_TRACE_MEMTYPE_GTT | type | AUB_TRACE_OP_DATA_WRITE);
-
 
1974
	aub_out(bufmgr_gem, subtype);
-
 
1975
	aub_out(bufmgr_gem, bo_gem->aub_offset + offset);
-
 
1976
	aub_out(bufmgr_gem, size);
-
 
1977
	if (bufmgr_gem->gen >= 8)
-
 
1978
		aub_out(bufmgr_gem, 0);
-
 
1979
	aub_write_bo_data(bo, offset, size);
-
 
1980
}
-
 
1981
 
-
 
1982
/**
-
 
1983
 * Break up large objects into multiple writes.  Otherwise a 128kb VBO
-
 
1984
 * would overflow the 16 bits of size field in the packet header and
-
 
1985
 * everything goes badly after that.
-
 
1986
 */
-
 
1987
static void
-
 
1988
aub_write_large_trace_block(drm_intel_bo *bo, uint32_t type, uint32_t subtype,
-
 
1989
			    uint32_t offset, uint32_t size)
-
 
1990
{
-
 
1991
	uint32_t block_size;
-
 
1992
	uint32_t sub_offset;
-
 
1993
 
-
 
1994
	for (sub_offset = 0; sub_offset < size; sub_offset += block_size) {
-
 
1995
		block_size = size - sub_offset;
-
 
1996
 
-
 
1997
		if (block_size > 8 * 4096)
-
 
1998
			block_size = 8 * 4096;
-
 
1999
 
-
 
2000
		aub_write_trace_block(bo, type, subtype, offset + sub_offset,
-
 
2001
				      block_size);
-
 
2002
	}
-
 
2003
}
-
 
2004
 
-
 
2005
static void
-
 
2006
aub_write_bo(drm_intel_bo *bo)
-
 
2007
{
-
 
2008
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
-
 
2009
	uint32_t offset = 0;
-
 
2010
	unsigned i;
-
 
2011
 
-
 
2012
	aub_bo_get_address(bo);
-
 
2013
 
-
 
2014
	/* Write out each annotated section separately. */
-
 
2015
	for (i = 0; i < bo_gem->aub_annotation_count; ++i) {
-
 
2016
		drm_intel_aub_annotation *annotation =
-
 
2017
			&bo_gem->aub_annotations[i];
-
 
2018
		uint32_t ending_offset = annotation->ending_offset;
-
 
2019
		if (ending_offset > bo->size)
-
 
2020
			ending_offset = bo->size;
-
 
2021
		if (ending_offset > offset) {
-
 
2022
			aub_write_large_trace_block(bo, annotation->type,
-
 
2023
						    annotation->subtype,
-
 
2024
						    offset,
-
 
2025
						    ending_offset - offset);
-
 
2026
			offset = ending_offset;
-
 
2027
		}
-
 
2028
	}
-
 
2029
 
-
 
2030
	/* Write out any remaining unannotated data */
-
 
2031
	if (offset < bo->size) {
-
 
2032
		aub_write_large_trace_block(bo, AUB_TRACE_TYPE_NOTYPE, 0,
-
 
2033
					    offset, bo->size - offset);
-
 
2034
	}
-
 
2035
}
-
 
2036
 
-
 
2037
/*
-
 
2038
 * Make a ringbuffer on fly and dump it
-
 
2039
 */
-
 
2040
static void
-
 
2041
aub_build_dump_ringbuffer(drm_intel_bufmgr_gem *bufmgr_gem,
-
 
2042
			  uint32_t batch_buffer, int ring_flag)
-
 
2043
{
-
 
2044
	uint32_t ringbuffer[4096];
-
 
2045
	int ring = AUB_TRACE_TYPE_RING_PRB0; /* The default ring */
-
 
2046
	int ring_count = 0;
-
 
2047
 
-
 
2048
	if (ring_flag == I915_EXEC_BSD)
-
 
2049
		ring = AUB_TRACE_TYPE_RING_PRB1;
-
 
2050
	else if (ring_flag == I915_EXEC_BLT)
-
 
2051
		ring = AUB_TRACE_TYPE_RING_PRB2;
-
 
2052
 
-
 
2053
	/* Make a ring buffer to execute our batchbuffer. */
-
 
2054
	memset(ringbuffer, 0, sizeof(ringbuffer));
-
 
2055
	if (bufmgr_gem->gen >= 8) {
-
 
2056
		ringbuffer[ring_count++] = AUB_MI_BATCH_BUFFER_START | (3 - 2);
-
 
2057
		ringbuffer[ring_count++] = batch_buffer;
-
 
2058
		ringbuffer[ring_count++] = 0;
-
 
2059
	} else {
-
 
2060
	ringbuffer[ring_count++] = AUB_MI_BATCH_BUFFER_START;
-
 
2061
	ringbuffer[ring_count++] = batch_buffer;
-
 
2062
	}
-
 
2063
 
-
 
2064
	/* Write out the ring.  This appears to trigger execution of
-
 
2065
	 * the ring in the simulator.
-
 
2066
	 */
-
 
2067
	aub_out(bufmgr_gem,
-
 
2068
		CMD_AUB_TRACE_HEADER_BLOCK |
-
 
2069
		((bufmgr_gem->gen >= 8 ? 6 : 5) - 2));
-
 
2070
	aub_out(bufmgr_gem,
-
 
2071
		AUB_TRACE_MEMTYPE_GTT | ring | AUB_TRACE_OP_COMMAND_WRITE);
-
 
2072
	aub_out(bufmgr_gem, 0); /* general/surface subtype */
-
 
2073
	aub_out(bufmgr_gem, bufmgr_gem->aub_offset);
-
 
2074
	aub_out(bufmgr_gem, ring_count * 4);
-
 
2075
	if (bufmgr_gem->gen >= 8)
-
 
2076
		aub_out(bufmgr_gem, 0);
-
 
2077
 
-
 
2078
	/* FIXME: Need some flush operations here? */
-
 
2079
	aub_out_data(bufmgr_gem, ringbuffer, ring_count * 4);
-
 
2080
 
-
 
2081
	/* Update offset pointer */
-
 
2082
	bufmgr_gem->aub_offset += 4096;
-
 
2083
}
2221
}
2084
 
2222
 
2085
void
2223
void
2086
drm_intel_gem_bo_aub_dump_bmp(drm_intel_bo *bo,
2224
drm_intel_gem_bo_aub_dump_bmp(drm_intel_bo *bo,
2087
			      int x1, int y1, int width, int height,
2225
			      int x1, int y1, int width, int height,
2088
			      enum aub_dump_bmp_format format,
2226
			      enum aub_dump_bmp_format format,
2089
			      int pitch, int offset)
-
 
2090
{
-
 
2091
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
-
 
2092
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
-
 
2093
	uint32_t cpp;
-
 
2094
 
-
 
2095
	switch (format) {
-
 
2096
	case AUB_DUMP_BMP_FORMAT_8BIT:
-
 
2097
		cpp = 1;
-
 
2098
		break;
-
 
2099
	case AUB_DUMP_BMP_FORMAT_ARGB_4444:
-
 
2100
		cpp = 2;
-
 
2101
		break;
-
 
2102
	case AUB_DUMP_BMP_FORMAT_ARGB_0888:
-
 
2103
	case AUB_DUMP_BMP_FORMAT_ARGB_8888:
-
 
2104
		cpp = 4;
-
 
2105
		break;
-
 
2106
	default:
-
 
2107
		printf("Unknown AUB dump format %d\n", format);
-
 
2108
		return;
-
 
2109
	}
-
 
2110
 
-
 
2111
	if (!bufmgr_gem->aub_file)
-
 
2112
		return;
-
 
2113
 
-
 
2114
	aub_out(bufmgr_gem, CMD_AUB_DUMP_BMP | 4);
-
 
2115
	aub_out(bufmgr_gem, (y1 << 16) | x1);
-
 
2116
	aub_out(bufmgr_gem,
-
 
2117
		(format << 24) |
-
 
2118
		(cpp << 19) |
-
 
2119
		pitch / 4);
-
 
2120
	aub_out(bufmgr_gem, (height << 16) | width);
-
 
2121
	aub_out(bufmgr_gem, bo_gem->aub_offset + offset);
-
 
2122
	aub_out(bufmgr_gem,
-
 
2123
		((bo_gem->tiling_mode != I915_TILING_NONE) ? (1 << 2) : 0) |
2227
			      int pitch, int offset)
Line 2124... Line 2228...
2124
		((bo_gem->tiling_mode == I915_TILING_Y) ? (1 << 3) : 0));
2228
{
2125
}
2229
}
-
 
2230
 
2126
 
2231
static int
2127
static void
2232
drm_intel_gem_bo_exec(drm_intel_bo *bo, int used,
2128
aub_exec(drm_intel_bo *bo, int ring_flag, int used)
2233
		      drm_clip_rect_t * cliprects, int num_cliprects, int DR4)
2129
{
2234
{
2130
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
-
 
Line 2131... Line 2235...
2131
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2235
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2132
	int i;
2236
	struct drm_i915_gem_execbuffer execbuf;
Line -... Line 2237...
-
 
2237
	int ret, i;
-
 
2238
 
-
 
2239
	if (to_bo_gem(bo)->has_error)
2133
	bool batch_buffer_needs_annotations;
2240
		return -ENOMEM;
2134
 
2241
 
2135
	if (!bufmgr_gem->aub_file)
2242
	/* Update indices and set up the validate list. */
2136
		return;
-
 
2137
 
-
 
2138
	/* If batch buffer is not annotated, annotate it the best we
2243
	drm_intel_gem_bo_process_reloc(bo);
2139
	 * can.
-
 
2140
	 */
-
 
2141
	batch_buffer_needs_annotations = bo_gem->aub_annotation_count == 0;
-
 
2142
	if (batch_buffer_needs_annotations) {
-
 
2143
		drm_intel_aub_annotation annotations[2] = {
-
 
Line -... Line 2244...
-
 
2244
 
2144
			{ AUB_TRACE_TYPE_BATCH, 0, used },
2245
	/* Add the batch buffer to the validation list.  There are no
2145
			{ AUB_TRACE_TYPE_NOTYPE, 0, bo->size }
2246
	 * relocations pointing to it.
-
 
2247
	 */
-
 
2248
	drm_intel_add_validate_buffer(bo);
-
 
2249
 
-
 
2250
	memclear(execbuf);
-
 
2251
	execbuf.buffers_ptr = (uintptr_t) bufmgr_gem->exec_objects;
-
 
2252
	execbuf.buffer_count = bufmgr_gem->exec_count;
-
 
2253
	execbuf.batch_start_offset = 0;
-
 
2254
	execbuf.batch_len = used;
-
 
2255
	execbuf.cliprects_ptr = (uintptr_t) cliprects;
-
 
2256
	execbuf.num_cliprects = num_cliprects;
-
 
2257
	execbuf.DR1 = 0;
-
 
2258
	execbuf.DR4 = DR4;
-
 
2259
 
-
 
2260
	ret = drmIoctl(bufmgr_gem->fd,
-
 
2261
		       DRM_IOCTL_I915_GEM_EXECBUFFER,
-
 
2262
		       &execbuf);
-
 
2263
	if (ret != 0) {
-
 
2264
		ret = -errno;
-
 
2265
		if (errno == ENOSPC) {
-
 
2266
			DBG("Execbuffer fails to pin. "
-
 
2267
			    "Estimate: %u. Actual: %u. Available: %u\n",
2146
		};
2268
			    drm_intel_gem_estimate_batch_space(bufmgr_gem->exec_bos,
2147
		drm_intel_bufmgr_gem_set_aub_annotations(bo, annotations, 2);
2269
							       bufmgr_gem->
-
 
2270
							       exec_count),
-
 
2271
			    drm_intel_gem_compute_batch_space(bufmgr_gem->exec_bos,
Line 2148... Line -...
2148
	}
-
 
2149
 
2272
							      bufmgr_gem->
2150
	/* Write out all buffers to AUB memory */
2273
							      exec_count),
Line 2151... Line 2274...
2151
	for (i = 0; i < bufmgr_gem->exec_count; i++) {
2274
			    (unsigned int)bufmgr_gem->gtt_size);
2152
		aub_write_bo(bufmgr_gem->exec_bos[i]);
2275
		}
Line 2153... Line 2276...
2153
	}
2276
	}
Line 2154... Line -...
2154
 
-
 
2155
	/* Remove any annotations we added */
2277
	drm_intel_update_buffer_offsets(bufmgr_gem);
2156
	if (batch_buffer_needs_annotations)
-
 
2157
		drm_intel_bufmgr_gem_set_aub_annotations(bo, NULL, 0);
2278
 
2158
 
-
 
2159
	/* Dump ring buffer */
2279
	if (bufmgr_gem->bufmgr.debug)
2160
	aub_build_dump_ringbuffer(bufmgr_gem, bo_gem->aub_offset, ring_flag);
2280
		drm_intel_gem_dump_validation_list(bufmgr_gem);
-
 
2281
 
Line -... Line 2282...
-
 
2282
	for (i = 0; i < bufmgr_gem->exec_count; i++) {
-
 
2283
		drm_intel_bo_gem *bo_gem = to_bo_gem(bufmgr_gem->exec_bos[i]);
Line 2161... Line 2284...
2161
 
2284
 
2162
	fflush(bufmgr_gem->aub_file);
2285
		bo_gem->idle = false;
2163
 
2286
 
2164
	/*
2287
		/* Disconnect the buffer from the validate list */
Line 2178... Line 2301...
2178
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
2301
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
2179
	struct drm_i915_gem_execbuffer2 execbuf;
2302
	struct drm_i915_gem_execbuffer2 execbuf;
2180
	int ret = 0;
2303
	int ret = 0;
2181
	int i;
2304
	int i;
Line -... Line 2305...
-
 
2305
 
-
 
2306
	if (to_bo_gem(bo)->has_error)
-
 
2307
		return -ENOMEM;
2182
 
2308
 
2183
	switch (flags & 0x7) {
2309
	switch (flags & 0x7) {
2184
	default:
2310
	default:
2185
		return -EINVAL;
2311
		return -EINVAL;
2186
	case I915_EXEC_BLT:
2312
	case I915_EXEC_BLT:
Line 2207... Line 2333...
2207
	/* Add the batch buffer to the validation list.  There are no relocations
2333
	/* Add the batch buffer to the validation list.  There are no relocations
2208
	 * pointing to it.
2334
	 * pointing to it.
2209
	 */
2335
	 */
2210
	drm_intel_add_validate_buffer2(bo, 0);
2336
	drm_intel_add_validate_buffer2(bo, 0);
Line 2211... Line 2337...
2211
 
2337
 
2212
	VG_CLEAR(execbuf);
2338
	memclear(execbuf);
2213
	execbuf.buffers_ptr = (uintptr_t)bufmgr_gem->exec2_objects;
2339
	execbuf.buffers_ptr = (uintptr_t)bufmgr_gem->exec2_objects;
2214
	execbuf.buffer_count = bufmgr_gem->exec_count;
2340
	execbuf.buffer_count = bufmgr_gem->exec_count;
2215
	execbuf.batch_start_offset = 0;
2341
	execbuf.batch_start_offset = 0;
2216
	execbuf.batch_len = used;
2342
	execbuf.batch_len = used;
Line 2223... Line 2349...
2223
		i915_execbuffer2_set_context_id(execbuf, 0);
2349
		i915_execbuffer2_set_context_id(execbuf, 0);
2224
	else
2350
	else
2225
		i915_execbuffer2_set_context_id(execbuf, ctx->ctx_id);
2351
		i915_execbuffer2_set_context_id(execbuf, ctx->ctx_id);
2226
	execbuf.rsvd2 = 0;
2352
	execbuf.rsvd2 = 0;
Line 2227... Line -...
2227
 
-
 
2228
	aub_exec(bo, flags, used);
-
 
2229
 
2353
 
2230
	if (bufmgr_gem->no_exec)
2354
	if (bufmgr_gem->no_exec)
Line 2231... Line 2355...
2231
		goto skip_execution;
2355
		goto skip_execution;
2232
 
2356
 
Line 2250... Line 2374...
2250
skip_execution:
2374
skip_execution:
2251
	if (bufmgr_gem->bufmgr.debug)
2375
	if (bufmgr_gem->bufmgr.debug)
2252
		drm_intel_gem_dump_validation_list(bufmgr_gem);
2376
		drm_intel_gem_dump_validation_list(bufmgr_gem);
Line 2253... Line 2377...
2253
 
2377
 
2254
	for (i = 0; i < bufmgr_gem->exec_count; i++) {
2378
	for (i = 0; i < bufmgr_gem->exec_count; i++) {
2255
		drm_intel_bo *bo = bufmgr_gem->exec_bos[i];
-
 
Line 2256... Line 2379...
2256
		drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
2379
		drm_intel_bo_gem *bo_gem = to_bo_gem(bufmgr_gem->exec_bos[i]);
Line 2257... Line 2380...
2257
 
2380
 
2258
		bo_gem->idle = false;
2381
		bo_gem->idle = false;
Line 2298... Line 2421...
2298
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2421
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2299
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2422
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2300
	struct drm_i915_gem_pin pin;
2423
	struct drm_i915_gem_pin pin;
2301
	int ret;
2424
	int ret;
Line 2302... Line 2425...
2302
 
2425
 
2303
	VG_CLEAR(pin);
2426
	memclear(pin);
2304
	pin.handle = bo_gem->gem_handle;
2427
	pin.handle = bo_gem->gem_handle;
Line 2305... Line 2428...
2305
	pin.alignment = alignment;
2428
	pin.alignment = alignment;
2306
 
2429
 
Line 2321... Line 2444...
2321
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2444
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2322
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2445
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2323
	struct drm_i915_gem_unpin unpin;
2446
	struct drm_i915_gem_unpin unpin;
2324
	int ret;
2447
	int ret;
Line 2325... Line 2448...
2325
 
2448
 
2326
	VG_CLEAR(unpin);
2449
	memclear(unpin);
Line 2327... Line 2450...
2327
	unpin.handle = bo_gem->gem_handle;
2450
	unpin.handle = bo_gem->gem_handle;
2328
 
2451
 
2329
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_UNPIN, &unpin);
2452
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_UNPIN, &unpin);
Line 2377... Line 2500...
2377
{
2500
{
2378
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2501
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
2379
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2502
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
2380
	int ret;
2503
	int ret;
Line -... Line 2504...
-
 
2504
 
-
 
2505
	/* Tiling with userptr surfaces is not supported
-
 
2506
	 * on all hardware so refuse it for time being.
-
 
2507
	 */
-
 
2508
	if (bo_gem->is_userptr)
-
 
2509
		return -EINVAL;
2381
 
2510
 
2382
	/* Linear buffers have no stride. By ensuring that we only ever use
2511
	/* Linear buffers have no stride. By ensuring that we only ever use
2383
	 * stride 0 with linear buffers, we simplify our code.
2512
	 * stride 0 with linear buffers, we simplify our code.
2384
	 */
2513
	 */
2385
	if (*tiling_mode == I915_TILING_NONE)
2514
	if (*tiling_mode == I915_TILING_NONE)
Line 2386... Line 2515...
2386
		stride = 0;
2515
		stride = 0;
2387
 
2516
 
2388
	ret = drm_intel_gem_bo_set_tiling_internal(bo, *tiling_mode, stride);
2517
	ret = drm_intel_gem_bo_set_tiling_internal(bo, *tiling_mode, stride);
Line 2389... Line 2518...
2389
	if (ret == 0)
2518
	if (ret == 0)
2390
		drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
2519
		drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0);
2391
 
2520
 
Line 2402... Line 2531...
2402
	*tiling_mode = bo_gem->tiling_mode;
2531
	*tiling_mode = bo_gem->tiling_mode;
2403
	*swizzle_mode = bo_gem->swizzle_mode;
2532
	*swizzle_mode = bo_gem->swizzle_mode;
2404
	return 0;
2533
	return 0;
2405
}
2534
}
Line -... Line 2535...
-
 
2535
 
-
 
2536
static int
-
 
2537
drm_intel_gem_bo_set_softpin_offset(drm_intel_bo *bo, uint64_t offset)
-
 
2538
{
-
 
2539
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
-
 
2540
 
-
 
2541
	bo_gem->is_softpin = true;
-
 
2542
	bo->offset64 = offset;
-
 
2543
	bo->offset = offset;
-
 
2544
	return 0;
2406
 
2545
}
2407
#if 0
2546
#if 0
2408
drm_intel_bo *
2547
drm_intel_bo *
2409
drm_intel_bo_gem_create_from_prime(drm_intel_bufmgr *bufmgr, int prime_fd, int size)
2548
drm_intel_bo_gem_create_from_prime(drm_intel_bufmgr *bufmgr, int prime_fd, int size)
2410
{
2549
{
Line 2414... Line 2553...
2414
	drm_intel_bo_gem *bo_gem;
2553
	drm_intel_bo_gem *bo_gem;
2415
	struct drm_i915_gem_get_tiling get_tiling;
2554
	struct drm_i915_gem_get_tiling get_tiling;
2416
	drmMMListHead *list;
2555
	drmMMListHead *list;
Line 2417... Line 2556...
2417
 
2556
 
-
 
2557
	ret = drmPrimeFDToHandle(bufmgr_gem->fd, prime_fd, &handle);
-
 
2558
	if (ret) {
-
 
2559
		DBG("create_from_prime: failed to obtain handle from fd: %s\n", strerror(errno));
-
 
2560
		pthread_mutex_unlock(&bufmgr_gem->lock);
-
 
2561
		return NULL;
Line 2418... Line 2562...
2418
	ret = drmPrimeFDToHandle(bufmgr_gem->fd, prime_fd, &handle);
2562
	}
2419
 
2563
 
2420
	/*
2564
	/*
2421
	 * See if the kernel has already returned this buffer to us. Just as
2565
	 * See if the kernel has already returned this buffer to us. Just as
Line 2430... Line 2574...
2430
			drm_intel_gem_bo_reference(&bo_gem->bo);
2574
			drm_intel_gem_bo_reference(&bo_gem->bo);
2431
			return &bo_gem->bo;
2575
			return &bo_gem->bo;
2432
		}
2576
		}
2433
	}
2577
	}
Line 2434... Line -...
2434
 
-
 
2435
	if (ret) {
-
 
2436
	  fprintf(stderr,"ret is %d %d\n", ret, errno);
-
 
2437
		return NULL;
-
 
2438
	}
-
 
2439
 
2578
 
2440
	bo_gem = calloc(1, sizeof(*bo_gem));
2579
	bo_gem = calloc(1, sizeof(*bo_gem));
2441
	if (!bo_gem)
2580
	if (!bo_gem) {
2442
		return NULL;
2581
		return NULL;
2443
 
2582
	}
2444
	/* Determine size of bo.  The fd-to-handle ioctl really should
2583
	/* Determine size of bo.  The fd-to-handle ioctl really should
2445
	 * return the size, but it doesn't.  If we have kernel 3.12 or
2584
	 * return the size, but it doesn't.  If we have kernel 3.12 or
2446
	 * later, we can lseek on the prime fd to get the size.  Older
2585
	 * later, we can lseek on the prime fd to get the size.  Older
2447
	 * kernels will just fail, in which case we fall back to the
2586
	 * kernels will just fail, in which case we fall back to the
Line 2463... Line 2602...
2463
	bo_gem->validate_index = -1;
2602
	bo_gem->validate_index = -1;
2464
	bo_gem->reloc_tree_fences = 0;
2603
	bo_gem->reloc_tree_fences = 0;
2465
	bo_gem->used_as_reloc_target = false;
2604
	bo_gem->used_as_reloc_target = false;
2466
	bo_gem->has_error = false;
2605
	bo_gem->has_error = false;
2467
	bo_gem->reusable = false;
2606
	bo_gem->reusable = false;
-
 
2607
	bo_gem->use_48b_address_range = false;
Line 2468... Line 2608...
2468
 
2608
 
2469
	DRMINITLISTHEAD(&bo_gem->vma_list);
2609
	DRMINITLISTHEAD(&bo_gem->vma_list);
Line 2470... Line 2610...
2470
	DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
2610
	DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
2471
 
2611
 
2472
	VG_CLEAR(get_tiling);
2612
	memclear(get_tiling);
2473
	get_tiling.handle = bo_gem->gem_handle;
2613
	get_tiling.handle = bo_gem->gem_handle;
2474
	ret = drmIoctl(bufmgr_gem->fd,
2614
	ret = drmIoctl(bufmgr_gem->fd,
2475
		       DRM_IOCTL_I915_GEM_GET_TILING,
2615
		       DRM_IOCTL_I915_GEM_GET_TILING,
-
 
2616
		       &get_tiling);
2476
		       &get_tiling);
2617
	if (ret != 0) {
2477
	if (ret != 0) {
2618
		DBG("create_from_prime: failed to get tiling: %s\n", strerror(errno));
2478
		drm_intel_gem_bo_unreference(&bo_gem->bo);
2619
		drm_intel_gem_bo_unreference(&bo_gem->bo);
2479
		return NULL;
2620
		return NULL;
2480
	}
2621
	}
2481
	bo_gem->tiling_mode = get_tiling.tiling_mode;
2622
	bo_gem->tiling_mode = get_tiling.tiling_mode;
2482
	bo_gem->swizzle_mode = get_tiling.swizzle_mode;
2623
	bo_gem->swizzle_mode = get_tiling.swizzle_mode;
Line 2483... Line 2624...
2483
	/* XXX stride is unknown */
2624
	/* XXX stride is unknown */
2484
	drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
2625
	drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0);
Line 2485... Line 2626...
2485
 
2626
 
Line 2513... Line 2654...
2513
	int ret;
2654
	int ret;
Line 2514... Line 2655...
2514
 
2655
 
2515
	if (!bo_gem->global_name) {
2656
	if (!bo_gem->global_name) {
Line 2516... Line 2657...
2516
		struct drm_gem_flink flink;
2657
		struct drm_gem_flink flink;
2517
 
2658
 
Line 2518... Line 2659...
2518
		VG_CLEAR(flink);
2659
		memclear(flink);
2519
		flink.handle = bo_gem->gem_handle;
2660
		flink.handle = bo_gem->gem_handle;
2520
 
2661
 
Line 2525... Line 2666...
2525
		bo_gem->global_name = flink.name;
2666
		bo_gem->global_name = flink.name;
2526
		bo_gem->reusable = false;
2667
		bo_gem->reusable = false;
Line 2527... Line 2668...
2527
 
2668
 
2528
		if (DRMLISTEMPTY(&bo_gem->name_list))
2669
                if (DRMLISTEMPTY(&bo_gem->name_list))
-
 
2670
                        DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
2529
			DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
2671
 
Line 2530... Line 2672...
2530
	}
2672
	}
2531
 
2673
 
2532
	*name = bo_gem->global_name;
2674
	*name = bo_gem->global_name;
Line 2770... Line 2912...
2770
		if (_drm_intel_gem_bo_references(bo_gem->reloc_target_info[i].bo,
2912
		if (_drm_intel_gem_bo_references(bo_gem->reloc_target_info[i].bo,
2771
						target_bo))
2913
						target_bo))
2772
			return 1;
2914
			return 1;
2773
	}
2915
	}
Line -... Line 2916...
-
 
2916
 
-
 
2917
	for (i = 0; i< bo_gem->softpin_target_count; i++) {
-
 
2918
		if (bo_gem->softpin_target[i] == target_bo)
-
 
2919
			return 1;
-
 
2920
		if (_drm_intel_gem_bo_references(bo_gem->softpin_target[i], target_bo))
-
 
2921
			return 1;
-
 
2922
	}
2774
 
2923
 
2775
	return 0;
2924
	return 0;
Line 2776... Line 2925...
2776
}
2925
}
2777
 
2926
 
Line 2843... Line 2992...
2843
 */
2992
 */
2844
static int
2993
static int
2845
get_pci_device_id(drm_intel_bufmgr_gem *bufmgr_gem)
2994
get_pci_device_id(drm_intel_bufmgr_gem *bufmgr_gem)
2846
{
2995
{
2847
	char *devid_override;
2996
	char *devid_override;
2848
	int devid;
2997
	int devid = 0;
2849
	int ret;
2998
	int ret;
2850
	drm_i915_getparam_t gp;
2999
	drm_i915_getparam_t gp;
Line 2851... Line -...
2851
 
-
 
2852
	VG_CLEAR(devid);
3000
 
2853
	VG_CLEAR(gp);
3001
	memclear(gp);
2854
	gp.param = I915_PARAM_CHIPSET_ID;
3002
	gp.param = I915_PARAM_CHIPSET_ID;
2855
	gp.value = &devid;
3003
	gp.value = &devid;
2856
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3004
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
2857
	if (ret) {
3005
	if (ret) {
Line 2868... Line 3016...
2868
 
3016
 
2869
	return bufmgr_gem->pci_device;
3017
	return bufmgr_gem->pci_device;
Line 2870... Line 3018...
2870
}
3018
}
-
 
3019
 
-
 
3020
/**
-
 
3021
 * Sets the AUB filename.
-
 
3022
 *
-
 
3023
 * This function has to be called before drm_intel_bufmgr_gem_set_aub_dump()
-
 
3024
 * for it to have any effect.
-
 
3025
 */
-
 
3026
void
-
 
3027
drm_intel_bufmgr_gem_set_aub_filename(drm_intel_bufmgr *bufmgr,
-
 
3028
				      const char *filename)
-
 
3029
{
-
 
3030
}
2871
 
3031
 
2872
/**
3032
/**
2873
 * Sets up AUB dumping.
3033
 * Sets up AUB dumping.
2874
 *
3034
 *
2875
 * This is a trace file format that can be used with the simulator.
3035
 * This is a trace file format that can be used with the simulator.
2876
 * Packets are emitted in a format somewhat like GPU command packets.
3036
 * Packets are emitted in a format somewhat like GPU command packets.
2877
 * You can set up a GTT and upload your objects into the referenced
3037
 * You can set up a GTT and upload your objects into the referenced
2878
 * space, then send off batchbuffers and get BMPs out the other end.
3038
 * space, then send off batchbuffers and get BMPs out the other end.
2879
 */
3039
 */
2880
void
3040
void
2881
drm_intel_bufmgr_gem_set_aub_dump(drm_intel_bufmgr *bufmgr, int enable)
3041
drm_intel_bufmgr_gem_set_aub_dump(drm_intel_bufmgr *bufmgr, int enable)
2882
{
-
 
2883
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
-
 
2884
	int entry = 0x200003;
-
 
2885
	int i;
-
 
2886
	int gtt_size = 0x10000;
-
 
2887
	const char *filename;
-
 
2888
 
-
 
2889
	if (!enable) {
-
 
2890
		if (bufmgr_gem->aub_file) {
-
 
2891
			fclose(bufmgr_gem->aub_file);
-
 
2892
			bufmgr_gem->aub_file = NULL;
-
 
2893
		}
-
 
2894
		return;
-
 
2895
	}
3042
{
2896
 
3043
	fprintf(stderr, "libdrm aub dumping is deprecated.\n\n"
2897
	bufmgr_gem->aub_file = fopen("intel.aub", "w+");
-
 
2898
	if (!bufmgr_gem->aub_file)
-
 
2899
		return;
3044
		"Use intel_aubdump from intel-gpu-tools instead.  Install intel-gpu-tools,\n"
2900
 
-
 
2901
	/* Start allocating objects from just after the GTT. */
-
 
2902
	bufmgr_gem->aub_offset = gtt_size;
-
 
2903
 
-
 
2904
	/* Start with a (required) version packet. */
-
 
2905
	aub_out(bufmgr_gem, CMD_AUB_HEADER | (13 - 2));
-
 
2906
	aub_out(bufmgr_gem,
-
 
2907
		(4 << AUB_HEADER_MAJOR_SHIFT) |
-
 
2908
		(0 << AUB_HEADER_MINOR_SHIFT));
-
 
2909
	for (i = 0; i < 8; i++) {
-
 
2910
		aub_out(bufmgr_gem, 0); /* app name */
-
 
2911
	}
-
 
2912
	aub_out(bufmgr_gem, 0); /* timestamp */
-
 
2913
	aub_out(bufmgr_gem, 0); /* timestamp */
-
 
2914
	aub_out(bufmgr_gem, 0); /* comment len */
3045
		"then run (for example)\n\n"
2915
 
-
 
2916
	/* Set up the GTT. The max we can handle is 256M */
-
 
2917
	aub_out(bufmgr_gem, CMD_AUB_TRACE_HEADER_BLOCK | ((bufmgr_gem->gen >= 8 ? 6 : 5) - 2));
-
 
2918
	aub_out(bufmgr_gem, AUB_TRACE_MEMTYPE_NONLOCAL | 0 | AUB_TRACE_OP_DATA_WRITE);
-
 
2919
	aub_out(bufmgr_gem, 0); /* subtype */
-
 
2920
	aub_out(bufmgr_gem, 0); /* offset */
-
 
2921
	aub_out(bufmgr_gem, gtt_size); /* size */
-
 
2922
	for (i = 0x000; i < gtt_size; i += 4, entry += 0x1000) {
-
 
2923
		aub_out(bufmgr_gem, entry);
3046
		"\t$ intel_aubdump --output=trace.aub glxgears -geometry 500x500\n\n"
Line 2924... Line 3047...
2924
	}
3047
		"See the intel_aubdump man page for more details.\n");
2925
}
3048
}
2926
 
3049
 
Line 2934... Line 3057...
2934
 
3057
 
2935
	context = calloc(1, sizeof(*context));
3058
	context = calloc(1, sizeof(*context));
2936
	if (!context)
3059
	if (!context)
Line 2937... Line 3060...
2937
		return NULL;
3060
		return NULL;
2938
 
3061
 
2939
	VG_CLEAR(create);
3062
	memclear(create);
2940
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create);
3063
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create);
2941
	if (ret != 0) {
3064
	if (ret != 0) {
2942
		DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE failed: %s\n",
3065
		DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE failed: %s\n",
Line 2959... Line 3082...
2959
	int ret;
3082
	int ret;
Line 2960... Line 3083...
2960
 
3083
 
2961
	if (ctx == NULL)
3084
	if (ctx == NULL)
Line 2962... Line 3085...
2962
		return;
3085
		return;
Line 2963... Line 3086...
2963
 
3086
 
2964
	VG_CLEAR(destroy);
3087
	memclear(destroy);
2965
 
3088
 
2966
	bufmgr_gem = (drm_intel_bufmgr_gem *)ctx->bufmgr;
3089
	bufmgr_gem = (drm_intel_bufmgr_gem *)ctx->bufmgr;
Line 2981... Line 3104...
2981
{
3104
{
2982
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
3105
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
2983
	struct drm_i915_reg_read reg_read;
3106
	struct drm_i915_reg_read reg_read;
2984
	int ret;
3107
	int ret;
Line 2985... Line 3108...
2985
 
3108
 
2986
	VG_CLEAR(reg_read);
3109
	memclear(reg_read);
Line 2987... Line 3110...
2987
	reg_read.offset = offset;
3110
	reg_read.offset = offset;
Line 2988... Line 3111...
2988
 
3111
 
2989
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_REG_READ, ®_read);
3112
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_REG_READ, ®_read);
2990
 
3113
 
Line -... Line 3114...
-
 
3114
	*result = reg_read.val;
-
 
3115
	return ret;
-
 
3116
}
-
 
3117
 
-
 
3118
int
-
 
3119
drm_intel_get_subslice_total(int fd, unsigned int *subslice_total)
-
 
3120
{
-
 
3121
	drm_i915_getparam_t gp;
-
 
3122
	int ret;
-
 
3123
 
-
 
3124
	memclear(gp);
-
 
3125
	gp.value = (int*)subslice_total;
-
 
3126
	gp.param = I915_PARAM_SUBSLICE_TOTAL;
-
 
3127
	ret = drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
-
 
3128
	if (ret)
-
 
3129
		return -errno;
-
 
3130
 
-
 
3131
	return 0;
-
 
3132
}
-
 
3133
 
-
 
3134
int
-
 
3135
drm_intel_get_eu_total(int fd, unsigned int *eu_total)
-
 
3136
{
-
 
3137
	drm_i915_getparam_t gp;
-
 
3138
	int ret;
-
 
3139
 
-
 
3140
	memclear(gp);
-
 
3141
	gp.value = (int*)eu_total;
-
 
3142
	gp.param = I915_PARAM_EU_TOTAL;
-
 
3143
	ret = drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
-
 
3144
	if (ret)
Line 2991... Line 3145...
2991
	*result = reg_read.val;
3145
		return -errno;
2992
	return ret;
3146
 
2993
}
3147
	return 0;
2994
 
3148
}
Line 3017... Line 3171...
3017
void
3171
void
3018
drm_intel_bufmgr_gem_set_aub_annotations(drm_intel_bo *bo,
3172
drm_intel_bufmgr_gem_set_aub_annotations(drm_intel_bo *bo,
3019
					 drm_intel_aub_annotation *annotations,
3173
					 drm_intel_aub_annotation *annotations,
3020
					 unsigned count)
3174
					 unsigned count)
3021
{
3175
{
3022
	drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
-
 
3023
	unsigned size = sizeof(*annotations) * count;
-
 
3024
	drm_intel_aub_annotation *new_annotations =
-
 
3025
		count > 0 ? realloc(bo_gem->aub_annotations, size) : NULL;
-
 
3026
	if (new_annotations == NULL) {
-
 
3027
		free(bo_gem->aub_annotations);
-
 
3028
		bo_gem->aub_annotations = NULL;
-
 
3029
		bo_gem->aub_annotation_count = 0;
-
 
3030
		return;
-
 
3031
	}
3176
}
-
 
3177
 
-
 
3178
static drmMMListHead bufmgr_list = { &bufmgr_list, &bufmgr_list };
-
 
3179
 
-
 
3180
static drm_intel_bufmgr_gem *
3032
	memcpy(new_annotations, annotations, size);
3181
drm_intel_bufmgr_gem_find(int fd)
-
 
3182
{
3033
	bo_gem->aub_annotations = new_annotations;
3183
	drm_intel_bufmgr_gem *bufmgr_gem;
-
 
3184
 
-
 
3185
	DRMLISTFOREACHENTRY(bufmgr_gem, &bufmgr_list, managers) {
-
 
3186
		if (bufmgr_gem->fd == fd) {
3034
	bo_gem->aub_annotation_count = count;
3187
			atomic_inc(&bufmgr_gem->refcount);
-
 
3188
			return bufmgr_gem;
-
 
3189
		}
-
 
3190
	}
-
 
3191
 
-
 
3192
	return NULL;
-
 
3193
}
-
 
3194
 
-
 
3195
static void
-
 
3196
drm_intel_bufmgr_gem_unref(drm_intel_bufmgr *bufmgr)
-
 
3197
{
-
 
3198
	drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
-
 
3199
 
-
 
3200
	if (atomic_add_unless(&bufmgr_gem->refcount, -1, 1)) {
-
 
3201
//		pthread_mutex_lock(&bufmgr_list_mutex);
-
 
3202
 
-
 
3203
		if (atomic_dec_and_test(&bufmgr_gem->refcount)) {
-
 
3204
			DRMLISTDEL(&bufmgr_gem->managers);
-
 
3205
			drm_intel_bufmgr_gem_destroy(bufmgr);
-
 
3206
		}
-
 
3207
 
-
 
3208
//		pthread_mutex_unlock(&bufmgr_list_mutex);
-
 
3209
	}
3035
}
3210
}
Line 3036... Line 3211...
3036
 
3211
 
3037
/**
3212
/**
3038
 * Initializes the GEM buffer manager, which uses the kernel to allocate, map,
3213
 * Initializes the GEM buffer manager, which uses the kernel to allocate, map,
Line 3047... Line 3222...
3047
	struct drm_i915_gem_get_aperture aperture;
3222
	struct drm_i915_gem_get_aperture aperture;
3048
	drm_i915_getparam_t gp;
3223
	drm_i915_getparam_t gp;
3049
	int ret, tmp;
3224
	int ret, tmp;
3050
	bool exec2 = false;
3225
	bool exec2 = false;
Line -... Line 3226...
-
 
3226
 
-
 
3227
//	pthread_mutex_lock(&bufmgr_list_mutex);
-
 
3228
 
-
 
3229
	bufmgr_gem = drm_intel_bufmgr_gem_find(fd);
-
 
3230
	if (bufmgr_gem)
-
 
3231
		goto exit;
3051
 
3232
 
3052
	bufmgr_gem = calloc(1, sizeof(*bufmgr_gem));
3233
	bufmgr_gem = calloc(1, sizeof(*bufmgr_gem));
3053
	if (bufmgr_gem == NULL)
3234
	if (bufmgr_gem == NULL)
Line 3054... Line 3235...
3054
		return NULL;
3235
		goto exit;
-
 
3236
 
Line 3055... Line 3237...
3055
 
3237
	bufmgr_gem->fd = fd;
3056
	bufmgr_gem->fd = fd;
3238
	atomic_set(&bufmgr_gem->refcount, 1);
3057
 
3239
 
3058
//	if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) {
3240
//	if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) {
Line -... Line 3241...
-
 
3241
//		free(bufmgr_gem);
3059
//		free(bufmgr_gem);
3242
//		return NULL;
3060
//		return NULL;
3243
//	}
3061
//	}
3244
 
Line 3062... Line 3245...
3062
 
3245
	memclear(aperture);
3063
	ret = drmIoctl(bufmgr_gem->fd,
3246
	ret = drmIoctl(bufmgr_gem->fd,
3064
		       DRM_IOCTL_I915_GEM_GET_APERTURE,
3247
		       DRM_IOCTL_I915_GEM_GET_APERTURE,
3065
		       &aperture);
3248
		       &aperture);
3066
 
3249
 
3067
	if (ret == 0)
3250
	if (ret == 0)
3068
		bufmgr_gem->gtt_size = aperture.aper_available_size;
3251
		bufmgr_gem->gtt_size = aperture.aper_available_size;
3069
	else {
3252
	else {
3070
		printf("DRM_IOCTL_I915_GEM_APERTURE failed: %s\n",
3253
		fprintf(stderr, "DRM_IOCTL_I915_GEM_APERTURE failed: %s\n",
3071
			strerror(errno));
3254
			strerror(errno));
3072
		bufmgr_gem->gtt_size = 128 * 1024 * 1024;
3255
		bufmgr_gem->gtt_size = 128 * 1024 * 1024;
Line 3088... Line 3271...
3088
		bufmgr_gem->gen = 5;
3271
		bufmgr_gem->gen = 5;
3089
	else if (IS_GEN6(bufmgr_gem->pci_device))
3272
	else if (IS_GEN6(bufmgr_gem->pci_device))
3090
		bufmgr_gem->gen = 6;
3273
		bufmgr_gem->gen = 6;
3091
	else if (IS_GEN7(bufmgr_gem->pci_device))
3274
	else if (IS_GEN7(bufmgr_gem->pci_device))
3092
		bufmgr_gem->gen = 7;
3275
		bufmgr_gem->gen = 7;
-
 
3276
	else if (IS_GEN8(bufmgr_gem->pci_device))
-
 
3277
		bufmgr_gem->gen = 8;
-
 
3278
	else if (IS_GEN9(bufmgr_gem->pci_device))
-
 
3279
		bufmgr_gem->gen = 9;
3093
	else {
3280
	else {
3094
		free(bufmgr_gem);
3281
		free(bufmgr_gem);
3095
		return NULL;
3282
		bufmgr_gem = NULL;
-
 
3283
		goto exit;
3096
	}
3284
	}
Line 3097... Line -...
3097
 
-
 
3098
//    printf("gen %d\n", bufmgr_gem->gen);
-
 
3099
 
3285
 
3100
	if (IS_GEN3(bufmgr_gem->pci_device) &&
3286
	if (IS_GEN3(bufmgr_gem->pci_device) &&
3101
	    bufmgr_gem->gtt_size > 256*1024*1024) {
3287
	    bufmgr_gem->gtt_size > 256*1024*1024) {
3102
		/* The unmappable part of gtt on gen 3 (i.e. above 256MB) can't
3288
		/* The unmappable part of gtt on gen 3 (i.e. above 256MB) can't
3103
		 * be used for tiled blits. To simplify the accounting, just
3289
		 * be used for tiled blits. To simplify the accounting, just
3104
		 * substract the unmappable part (fixed to 256MB on all known
3290
		 * substract the unmappable part (fixed to 256MB on all known
3105
		 * gen3 devices) if the kernel advertises it. */
3291
		 * gen3 devices) if the kernel advertises it. */
3106
		bufmgr_gem->gtt_size -= 256*1024*1024;
3292
		bufmgr_gem->gtt_size -= 256*1024*1024;
Line 3107... Line 3293...
3107
	}
3293
	}
3108
 
3294
 
Line 3109... Line 3295...
3109
	VG_CLEAR(gp);
3295
	memclear(gp);
3110
	gp.value = &tmp;
3296
	gp.value = &tmp;
3111
 
3297
 
Line 3124... Line 3310...
3124
 
3310
 
3125
	gp.param = I915_PARAM_HAS_RELAXED_FENCING;
3311
	gp.param = I915_PARAM_HAS_RELAXED_FENCING;
3126
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3312
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
Line -... Line 3313...
-
 
3313
	bufmgr_gem->has_relaxed_fencing = ret == 0;
-
 
3314
 
3127
	bufmgr_gem->has_relaxed_fencing = ret == 0;
3315
	bufmgr_gem->bufmgr.bo_alloc_userptr = NULL;
3128
 
3316
 
3129
	gp.param = I915_PARAM_HAS_WAIT_TIMEOUT;
3317
	gp.param = I915_PARAM_HAS_WAIT_TIMEOUT;
Line 3130... Line 3318...
3130
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3318
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
Line 3143... Line 3331...
3143
 
3331
 
3144
	gp.param = I915_PARAM_HAS_VEBOX;
3332
	gp.param = I915_PARAM_HAS_VEBOX;
3145
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
3333
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
Line -... Line 3334...
-
 
3334
	bufmgr_gem->has_vebox = (ret == 0) & (*gp.value > 0);
-
 
3335
 
-
 
3336
	gp.param = I915_PARAM_HAS_EXEC_SOFTPIN;
-
 
3337
	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
-
 
3338
	if (ret == 0 && *gp.value > 0)
3146
	bufmgr_gem->has_vebox = (ret == 0) & (*gp.value > 0);
3339
		bufmgr_gem->bufmgr.bo_set_softpin_offset = drm_intel_gem_bo_set_softpin_offset;
3147
 
3340
 
3148
	if (bufmgr_gem->gen < 4) {
3341
	if (bufmgr_gem->gen < 4) {
3149
		gp.param = I915_PARAM_NUM_FENCES_AVAIL;
3342
		gp.param = I915_PARAM_NUM_FENCES_AVAIL;
3150
		gp.value = &bufmgr_gem->available_fences;
3343
		gp.value = &bufmgr_gem->available_fences;
Line 3186... Line 3379...
3186
	bufmgr_gem->bufmgr.bo_reference = drm_intel_gem_bo_reference;
3379
	bufmgr_gem->bufmgr.bo_reference = drm_intel_gem_bo_reference;
3187
	bufmgr_gem->bufmgr.bo_unreference = drm_intel_gem_bo_unreference;
3380
	bufmgr_gem->bufmgr.bo_unreference = drm_intel_gem_bo_unreference;
3188
	bufmgr_gem->bufmgr.bo_map = drm_intel_gem_bo_map;
3381
	bufmgr_gem->bufmgr.bo_map = drm_intel_gem_bo_map;
3189
	bufmgr_gem->bufmgr.bo_unmap = drm_intel_gem_bo_unmap;
3382
	bufmgr_gem->bufmgr.bo_unmap = drm_intel_gem_bo_unmap;
3190
	bufmgr_gem->bufmgr.bo_subdata = drm_intel_gem_bo_subdata;
3383
	bufmgr_gem->bufmgr.bo_subdata = drm_intel_gem_bo_subdata;
3191
//	bufmgr_gem->bufmgr.bo_get_subdata = drm_intel_gem_bo_get_subdata;
3384
	bufmgr_gem->bufmgr.bo_get_subdata = drm_intel_gem_bo_get_subdata;
3192
	bufmgr_gem->bufmgr.bo_wait_rendering = drm_intel_gem_bo_wait_rendering;
3385
	bufmgr_gem->bufmgr.bo_wait_rendering = drm_intel_gem_bo_wait_rendering;
3193
	bufmgr_gem->bufmgr.bo_emit_reloc = drm_intel_gem_bo_emit_reloc;
3386
	bufmgr_gem->bufmgr.bo_emit_reloc = drm_intel_gem_bo_emit_reloc;
3194
	bufmgr_gem->bufmgr.bo_emit_reloc_fence = drm_intel_gem_bo_emit_reloc_fence;
3387
	bufmgr_gem->bufmgr.bo_emit_reloc_fence = drm_intel_gem_bo_emit_reloc_fence;
3195
	bufmgr_gem->bufmgr.bo_pin = drm_intel_gem_bo_pin;
3388
	bufmgr_gem->bufmgr.bo_pin = drm_intel_gem_bo_pin;
3196
	bufmgr_gem->bufmgr.bo_unpin = drm_intel_gem_bo_unpin;
3389
	bufmgr_gem->bufmgr.bo_unpin = drm_intel_gem_bo_unpin;
3197
	bufmgr_gem->bufmgr.bo_get_tiling = drm_intel_gem_bo_get_tiling;
3390
	bufmgr_gem->bufmgr.bo_get_tiling = drm_intel_gem_bo_get_tiling;
3198
	bufmgr_gem->bufmgr.bo_set_tiling = drm_intel_gem_bo_set_tiling;
3391
	bufmgr_gem->bufmgr.bo_set_tiling = drm_intel_gem_bo_set_tiling;
3199
	bufmgr_gem->bufmgr.bo_flink = drm_intel_gem_bo_flink;
3392
	bufmgr_gem->bufmgr.bo_flink = drm_intel_gem_bo_flink;
3200
	/* Use the new one if available */
3393
	/* Use the new one if available */
3201
//	if (exec2) {
3394
	if (exec2) {
3202
		bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2;
3395
		bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2;
3203
		bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2;
3396
		bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2;
3204
//	} else
3397
	} else
3205
//		bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec;
3398
		bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec;
3206
  	bufmgr_gem->bufmgr.bo_busy = drm_intel_gem_bo_busy;
3399
	bufmgr_gem->bufmgr.bo_busy = drm_intel_gem_bo_busy;
3207
	bufmgr_gem->bufmgr.bo_madvise = drm_intel_gem_bo_madvise;
3400
	bufmgr_gem->bufmgr.bo_madvise = drm_intel_gem_bo_madvise;
3208
	bufmgr_gem->bufmgr.destroy = drm_intel_bufmgr_gem_destroy;
3401
	bufmgr_gem->bufmgr.destroy = drm_intel_bufmgr_gem_unref;
3209
	bufmgr_gem->bufmgr.debug = 0;
3402
	bufmgr_gem->bufmgr.debug = 0;
3210
	bufmgr_gem->bufmgr.check_aperture_space =
3403
	bufmgr_gem->bufmgr.check_aperture_space =
3211
	    drm_intel_gem_check_aperture_space;
3404
	    drm_intel_gem_check_aperture_space;
3212
	bufmgr_gem->bufmgr.bo_disable_reuse = drm_intel_gem_bo_disable_reuse;
3405
	bufmgr_gem->bufmgr.bo_disable_reuse = drm_intel_gem_bo_disable_reuse;
3213
	bufmgr_gem->bufmgr.bo_is_reusable = drm_intel_gem_bo_is_reusable;
3406
	bufmgr_gem->bufmgr.bo_is_reusable = drm_intel_gem_bo_is_reusable;
Line 3219... Line 3412...
3219
	init_cache_buckets(bufmgr_gem);
3412
	init_cache_buckets(bufmgr_gem);
Line 3220... Line 3413...
3220
 
3413
 
3221
	DRMINITLISTHEAD(&bufmgr_gem->vma_cache);
3414
	DRMINITLISTHEAD(&bufmgr_gem->vma_cache);
Line -... Line 3415...
-
 
3415
	bufmgr_gem->vma_max = -1; /* unlimited by default */
-
 
3416
 
-
 
3417
	DRMLISTADD(&bufmgr_gem->managers, &bufmgr_list);
-
 
3418
 
-
 
3419
exit:
3222
	bufmgr_gem->vma_max = -1; /* unlimited by default */
3420
//	pthread_mutex_unlock(&bufmgr_list_mutex);
3223
 
3421
 
Line 3224... Line 3422...
3224
	return &bufmgr_gem->bufmgr;
3422
	return bufmgr_gem != NULL ? &bufmgr_gem->bufmgr : NULL;
3225
}
3423
}
Line 3264... Line 3462...
3264
	bo_gem->gem_handle = handle;
3462
	bo_gem->gem_handle = handle;
3265
	bo_gem->bo.handle = handle;
3463
	bo_gem->bo.handle = handle;
3266
	bo_gem->global_name = 0;
3464
	bo_gem->global_name = 0;
3267
	bo_gem->reusable = false;
3465
	bo_gem->reusable = false;
Line 3268... Line 3466...
3268
 
3466
 
3269
	VG_CLEAR(get_tiling);
3467
	memclear(get_tiling);
3270
	get_tiling.handle = bo_gem->gem_handle;
3468
	get_tiling.handle = bo_gem->gem_handle;
3271
	ret = drmIoctl(bufmgr_gem->fd,
3469
	ret = drmIoctl(bufmgr_gem->fd,
3272
		       DRM_IOCTL_I915_GEM_GET_TILING,
3470
		       DRM_IOCTL_I915_GEM_GET_TILING,
3273
		       &get_tiling);
3471
		       &get_tiling);
Line 3276... Line 3474...
3276
		return NULL;
3474
		return NULL;
3277
	}
3475
	}
3278
	bo_gem->tiling_mode = get_tiling.tiling_mode;
3476
	bo_gem->tiling_mode = get_tiling.tiling_mode;
3279
	bo_gem->swizzle_mode = get_tiling.swizzle_mode;
3477
	bo_gem->swizzle_mode = get_tiling.swizzle_mode;
3280
	/* XXX stride is unknown */
3478
	/* XXX stride is unknown */
3281
	drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem);
3479
	drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0);
Line 3282... Line 3480...
3282
 
3480
 
3283
	DRMINITLISTHEAD(&bo_gem->vma_list);
3481
	DRMINITLISTHEAD(&bo_gem->vma_list);
3284
	DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
3482
	DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);