Subversion Repositories Kolibri OS

Rev

Rev 4363 | Rev 5368 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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