Subversion Repositories Kolibri OS

Rev

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

Rev 5367 Rev 6084
Line 28... Line 28...
28
 
28
 
29
#include 
29
#include 
30
#include 
30
#include 
Line -... Line 31...
-
 
31
#include "i915_drv.h"
-
 
32
 
-
 
33
#define KB(x) ((x) * 1024)
31
#include "i915_drv.h"
34
#define MB(x) (KB(x) * 1024)
32
 
35
 
33
/*
36
/*
34
 * The BIOS typically reserves some of the system's memory for the exclusive
37
 * The BIOS typically reserves some of the system's memory for the exclusive
35
 * use of the integrated graphics. This memory is no longer available for
38
 * use of the integrated graphics. This memory is no longer available for
Line 40... Line 43...
40
 * goal is try to reuse that object for our own fbcon which must always
43
 * goal is try to reuse that object for our own fbcon which must always
41
 * be available for panics. Anything else we can reuse the stolen memory
44
 * be available for panics. Anything else we can reuse the stolen memory
42
 * for is a boon.
45
 * for is a boon.
43
 */
46
 */
Line -... Line 47...
-
 
47
 
-
 
48
int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv,
-
 
49
					 struct drm_mm_node *node, u64 size,
-
 
50
					 unsigned alignment, u64 start, u64 end)
-
 
51
{
-
 
52
	int ret;
-
 
53
 
-
 
54
	if (!drm_mm_initialized(&dev_priv->mm.stolen))
-
 
55
		return -ENODEV;
-
 
56
 
-
 
57
	/* See the comment at the drm_mm_init() call for more about this check.
-
 
58
	 * WaSkipStolenMemoryFirstPage:bdw,chv (incomplete) */
-
 
59
	if (INTEL_INFO(dev_priv)->gen == 8 && start < 4096)
-
 
60
		start = 4096;
-
 
61
 
-
 
62
	mutex_lock(&dev_priv->mm.stolen_lock);
-
 
63
	ret = drm_mm_insert_node_in_range(&dev_priv->mm.stolen, node, size,
-
 
64
					  alignment, start, end,
-
 
65
					  DRM_MM_SEARCH_DEFAULT);
-
 
66
	mutex_unlock(&dev_priv->mm.stolen_lock);
-
 
67
 
-
 
68
	return ret;
-
 
69
}
-
 
70
 
-
 
71
int i915_gem_stolen_insert_node(struct drm_i915_private *dev_priv,
-
 
72
				struct drm_mm_node *node, u64 size,
-
 
73
				unsigned alignment)
-
 
74
{
-
 
75
	return i915_gem_stolen_insert_node_in_range(dev_priv, node, size,
-
 
76
					alignment, 0,
-
 
77
					dev_priv->gtt.stolen_usable_size);
-
 
78
}
-
 
79
 
-
 
80
void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
-
 
81
				 struct drm_mm_node *node)
-
 
82
{
-
 
83
	mutex_lock(&dev_priv->mm.stolen_lock);
-
 
84
	drm_mm_remove_node(node);
-
 
85
	mutex_unlock(&dev_priv->mm.stolen_lock);
-
 
86
}
44
 
87
 
45
static unsigned long i915_stolen_to_physical(struct drm_device *dev)
88
static unsigned long i915_stolen_to_physical(struct drm_device *dev)
46
{
89
{
47
	struct drm_i915_private *dev_priv = dev->dev_private;
90
	struct drm_i915_private *dev_priv = dev->dev_private;
48
	struct resource *r;
91
	struct resource *r;
Line 49... Line 92...
49
	u32 base;
92
	u32 base;
50
 
93
 
51
	/* Almost universally we can find the Graphics Base of Stolen Memory
94
	/* Almost universally we can find the Graphics Base of Stolen Memory
52
	 * at offset 0x5c in the igfx configuration space. On a few (desktop)
95
	 * at offset 0x5c in the igfx configuration space. On a few (desktop)
-
 
96
	 * machines this is also mirrored in the bridge device at different
53
	 * machines this is also mirrored in the bridge device at different
97
	 * locations, or in the MCHBAR.
-
 
98
	 *
54
	 * locations, or in the MCHBAR. On gen2, the layout is again slightly
99
	 * On 865 we just check the TOUD register.
55
	 * different with the Graphics Segment immediately following Top of
100
	 *
56
	 * Memory (or Top of Usable DRAM). Note it appears that TOUD is only
-
 
57
	 * reported by 865g, so we just use the top of memory as determined
101
	 * On 830/845/85x the stolen memory base isn't available in any
58
	 * by the e820 probe.
-
 
59
	 *
102
	 * register. We need to calculate it as TOM-TSEG_SIZE-stolen_size.
60
	 * XXX However gen2 requires an unavailable symbol.
103
	 *
61
	 */
104
	 */
62
	base = 0;
105
	base = 0;
63
	if (INTEL_INFO(dev)->gen >= 3) {
106
	if (INTEL_INFO(dev)->gen >= 3) {
Line 150... Line 193...
150
	}
193
	}
151
#endif
194
#endif
152
	return base;
195
	return base;
153
}
196
}
Line 154... Line 197...
154
 
197
 
155
static int find_compression_threshold(struct drm_device *dev,
-
 
156
				      struct drm_mm_node *node,
-
 
157
				      int size,
-
 
158
				      int fb_cpp)
198
void i915_gem_cleanup_stolen(struct drm_device *dev)
159
{
199
{
160
	struct drm_i915_private *dev_priv = dev->dev_private;
-
 
161
	int compression_threshold = 1;
-
 
Line 162... Line -...
162
	int ret;
-
 
163
 
-
 
164
	/* HACK: This code depends on what we will do in *_enable_fbc. If that
-
 
165
	 * code changes, this code needs to change as well.
-
 
166
	 *
-
 
167
	 * The enable_fbc code will attempt to use one of our 2 compression
-
 
168
	 * thresholds, therefore, in that case, we only have 1 resort.
-
 
169
	 */
-
 
170
 
200
	struct drm_i915_private *dev_priv = dev->dev_private;
171
	/* Try to over-allocate to reduce reallocations and fragmentation. */
-
 
172
	ret = drm_mm_insert_node(&dev_priv->mm.stolen, node,
-
 
173
				 size <<= 1, 4096, DRM_MM_SEARCH_DEFAULT);
-
 
174
	if (ret == 0)
-
 
175
		return compression_threshold;
-
 
176
 
-
 
177
again:
-
 
178
	/* HW's ability to limit the CFB is 1:4 */
-
 
179
	if (compression_threshold > 4 ||
201
 
Line 180... Line 202...
180
	    (fb_cpp == 2 && compression_threshold == 2))
202
	if (!drm_mm_initialized(&dev_priv->mm.stolen))
181
		return 0;
-
 
182
 
-
 
183
	ret = drm_mm_insert_node(&dev_priv->mm.stolen, node,
-
 
184
					 size >>= 1, 4096,
-
 
185
					 DRM_MM_SEARCH_DEFAULT);
-
 
186
	if (ret && INTEL_INFO(dev)->gen <= 4) {
-
 
187
		return 0;
-
 
188
	} else if (ret) {
-
 
189
		compression_threshold <<= 1;
-
 
190
		goto again;
-
 
191
	} else {
203
		return;
Line 192... Line 204...
192
		return compression_threshold;
204
 
-
 
205
	drm_mm_takedown(&dev_priv->mm.stolen);
193
	}
206
}
194
}
207
 
-
 
208
static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv,
-
 
209
				    unsigned long *base, unsigned long *size)
195
 
210
{
196
static int i915_setup_compression(struct drm_device *dev, int size, int fb_cpp)
211
	uint32_t reg_val = I915_READ(IS_GM45(dev_priv) ?
-
 
212
				     CTG_STOLEN_RESERVED :
-
 
213
				     ELK_STOLEN_RESERVED);
-
 
214
	unsigned long stolen_top = dev_priv->mm.stolen_base +
-
 
215
		dev_priv->gtt.stolen_size;
197
{
216
 
-
 
217
	*base = (reg_val & G4X_STOLEN_RESERVED_ADDR2_MASK) << 16;
198
	struct drm_i915_private *dev_priv = dev->dev_private;
218
 
-
 
219
	WARN_ON((reg_val & G4X_STOLEN_RESERVED_ADDR1_MASK) < *base);
199
	struct drm_mm_node *uninitialized_var(compressed_llb);
220
 
200
	int ret;
221
	/* On these platforms, the register doesn't have a size field, so the
201
 
222
	 * size is the distance between the base and the top of the stolen
-
 
223
	 * memory. We also have the genuine case where base is zero and there's
202
	ret = find_compression_threshold(dev, &dev_priv->fbc.compressed_fb,
224
	 * nothing reserved. */
203
					 size, fb_cpp);
-
 
204
	if (!ret)
-
 
205
		goto err_llb;
225
	if (*base == 0)
Line 206... Line -...
206
	else if (ret > 1) {
-
 
207
		DRM_INFO("Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS.\n");
-
 
208
 
-
 
209
	}
226
		*size = 0;
210
 
-
 
211
	dev_priv->fbc.threshold = ret;
-
 
212
 
-
 
213
	if (HAS_PCH_SPLIT(dev))
227
	else
214
		I915_WRITE(ILK_DPFC_CB_BASE, dev_priv->fbc.compressed_fb.start);
-
 
215
	else if (IS_GM45(dev)) {
-
 
216
		I915_WRITE(DPFC_CB_BASE, dev_priv->fbc.compressed_fb.start);
228
		*size = stolen_top - *base;
217
	} else {
-
 
218
		compressed_llb = kzalloc(sizeof(*compressed_llb), GFP_KERNEL);
229
}
219
		if (!compressed_llb)
-
 
220
			goto err_fb;
-
 
Line 221... Line 230...
221
 
230
 
Line -... Line 231...
-
 
231
static void gen6_get_stolen_reserved(struct drm_i915_private *dev_priv,
222
		ret = drm_mm_insert_node(&dev_priv->mm.stolen, compressed_llb,
232
				     unsigned long *base, unsigned long *size)
-
 
233
{
-
 
234
	uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
-
 
235
 
-
 
236
	*base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
-
 
237
 
-
 
238
	switch (reg_val & GEN6_STOLEN_RESERVED_SIZE_MASK) {
-
 
239
	case GEN6_STOLEN_RESERVED_1M:
-
 
240
		*size = 1024 * 1024;
223
					 4096, 4096, DRM_MM_SEARCH_DEFAULT);
241
		break;
-
 
242
	case GEN6_STOLEN_RESERVED_512K:
-
 
243
		*size = 512 * 1024;
-
 
244
		break;
224
		if (ret)
245
	case GEN6_STOLEN_RESERVED_256K:
225
			goto err_fb;
246
		*size = 256 * 1024;
226
 
247
		break;
227
		dev_priv->fbc.compressed_llb = compressed_llb;
-
 
228
 
-
 
229
		I915_WRITE(FBC_CFB_BASE,
-
 
230
			   dev_priv->mm.stolen_base + dev_priv->fbc.compressed_fb.start);
-
 
231
		I915_WRITE(FBC_LL_BASE,
-
 
232
			   dev_priv->mm.stolen_base + compressed_llb->start);
-
 
233
	}
-
 
234
 
-
 
235
	dev_priv->fbc.size = size / dev_priv->fbc.threshold;
-
 
236
 
-
 
237
	DRM_DEBUG_KMS("reserved %d bytes of contiguous stolen space for FBC\n",
-
 
238
		      size);
-
 
239
 
-
 
240
	return 0;
-
 
241
 
248
	case GEN6_STOLEN_RESERVED_128K:
Line 242... Line 249...
242
err_fb:
249
		*size = 128 * 1024;
-
 
250
		break;
243
	kfree(compressed_llb);
251
	default:
244
	drm_mm_remove_node(&dev_priv->fbc.compressed_fb);
252
		*size = 1024 * 1024;
245
err_llb:
-
 
246
	pr_info_once("drm: not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size);
-
 
247
	return -ENOSPC;
-
 
Line 248... Line -...
248
}
-
 
249
 
-
 
250
int i915_gem_stolen_setup_compression(struct drm_device *dev, int size, int fb_cpp)
-
 
251
{
-
 
252
	struct drm_i915_private *dev_priv = dev->dev_private;
253
		MISSING_CASE(reg_val & GEN6_STOLEN_RESERVED_SIZE_MASK);
Line 253... Line 254...
253
 
254
	}
-
 
255
}
-
 
256
 
-
 
257
static void gen7_get_stolen_reserved(struct drm_i915_private *dev_priv,
-
 
258
				     unsigned long *base, unsigned long *size)
-
 
259
{
-
 
260
	uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
-
 
261
 
-
 
262
	*base = reg_val & GEN7_STOLEN_RESERVED_ADDR_MASK;
-
 
263
 
-
 
264
	switch (reg_val & GEN7_STOLEN_RESERVED_SIZE_MASK) {
254
	if (!drm_mm_initialized(&dev_priv->mm.stolen))
265
	case GEN7_STOLEN_RESERVED_1M:
Line 255... Line 266...
255
		return -ENODEV;
266
		*size = 1024 * 1024;
-
 
267
		break;
256
 
268
	case GEN7_STOLEN_RESERVED_256K:
257
	if (size < dev_priv->fbc.size)
269
		*size = 256 * 1024;
258
		return 0;
-
 
259
 
-
 
260
	/* Release any current block */
-
 
Line 261... Line 270...
261
	i915_gem_stolen_cleanup_compression(dev);
270
		break;
Line 262... Line 271...
262
 
271
	default:
263
	return i915_setup_compression(dev, size, fb_cpp);
272
		*size = 1024 * 1024;
-
 
273
		MISSING_CASE(reg_val & GEN7_STOLEN_RESERVED_SIZE_MASK);
-
 
274
	}
-
 
275
}
-
 
276
 
-
 
277
static void gen8_get_stolen_reserved(struct drm_i915_private *dev_priv,
-
 
278
				     unsigned long *base, unsigned long *size)
-
 
279
{
-
 
280
	uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
264
}
281
 
-
 
282
	*base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
-
 
283
 
-
 
284
	switch (reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK) {
-
 
285
	case GEN8_STOLEN_RESERVED_1M:
-
 
286
		*size = 1024 * 1024;
265
 
287
		break;
266
void i915_gem_stolen_cleanup_compression(struct drm_device *dev)
-
 
267
{
-
 
268
	struct drm_i915_private *dev_priv = dev->dev_private;
288
	case GEN8_STOLEN_RESERVED_2M:
Line 269... Line 289...
269
 
289
		*size = 2 * 1024 * 1024;
-
 
290
		break;
270
	if (dev_priv->fbc.size == 0)
291
	case GEN8_STOLEN_RESERVED_4M:
271
		return;
292
		*size = 4 * 1024 * 1024;
-
 
293
		break;
Line 272... Line 294...
272
 
294
	case GEN8_STOLEN_RESERVED_8M:
273
	drm_mm_remove_node(&dev_priv->fbc.compressed_fb);
-
 
Line 274... Line 295...
274
 
295
		*size = 8 * 1024 * 1024;
-
 
296
		break;
-
 
297
	default:
-
 
298
		*size = 8 * 1024 * 1024;
-
 
299
		MISSING_CASE(reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK);
-
 
300
	}
-
 
301
}
-
 
302
 
-
 
303
static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv,
275
	if (dev_priv->fbc.compressed_llb) {
304
				    unsigned long *base, unsigned long *size)
276
		drm_mm_remove_node(dev_priv->fbc.compressed_llb);
305
{
Line 277... Line 306...
277
		kfree(dev_priv->fbc.compressed_llb);
306
	uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
278
	}
307
	unsigned long stolen_top;
279
 
308
 
-
 
309
	stolen_top = dev_priv->mm.stolen_base + dev_priv->gtt.stolen_size;
280
	dev_priv->fbc.size = 0;
310
 
-
 
311
	*base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
281
}
312
 
Line 282... Line 313...
282
 
313
	/* On these platforms, the register doesn't have a size field, so the
283
void i915_gem_cleanup_stolen(struct drm_device *dev)
314
	 * size is the distance between the base and the top of the stolen
284
{
315
	 * memory. We also have the genuine case where base is zero and there's
285
	struct drm_i915_private *dev_priv = dev->dev_private;
316
	 * nothing reserved. */
Line 309... Line 340...
309
 
340
 
310
	dev_priv->mm.stolen_base = i915_stolen_to_physical(dev);
341
	dev_priv->mm.stolen_base = i915_stolen_to_physical(dev);
311
	if (dev_priv->mm.stolen_base == 0)
342
	if (dev_priv->mm.stolen_base == 0)
Line 312... Line -...
312
		return 0;
-
 
313
 
343
		return 0;
Line 314... Line 344...
314
	DRM_DEBUG_KMS("found %zd bytes of stolen memory at %08lx\n",
344
 
-
 
345
	stolen_top = dev_priv->mm.stolen_base + dev_priv->gtt.stolen_size;
-
 
346
 
-
 
347
	switch (INTEL_INFO(dev_priv)->gen) {
-
 
348
	case 2:
-
 
349
	case 3:
-
 
350
		break;
-
 
351
	case 4:
-
 
352
		if (IS_G4X(dev))
-
 
353
			g4x_get_stolen_reserved(dev_priv, &reserved_base,
-
 
354
						&reserved_size);
315
		      dev_priv->gtt.stolen_size, dev_priv->mm.stolen_base);
355
		break;
316
 
356
	case 5:
-
 
357
		/* Assume the gen6 maximum for the older platforms. */
-
 
358
		reserved_size = 1024 * 1024;
-
 
359
		reserved_base = stolen_top - reserved_size;
-
 
360
		break;
-
 
361
	case 6:
-
 
362
		gen6_get_stolen_reserved(dev_priv, &reserved_base,
-
 
363
					 &reserved_size);
317
	if (INTEL_INFO(dev)->gen >= 8) {
364
		break;
-
 
365
	case 7:
-
 
366
		gen7_get_stolen_reserved(dev_priv, &reserved_base,
-
 
367
					 &reserved_size);
-
 
368
		break;
318
		tmp = I915_READ(GEN7_BIOS_RESERVED);
369
	default:
-
 
370
		if (IS_BROADWELL(dev_priv) || IS_SKYLAKE(dev_priv))
-
 
371
			bdw_get_stolen_reserved(dev_priv, &reserved_base,
-
 
372
						&reserved_size);
-
 
373
		else
-
 
374
			gen8_get_stolen_reserved(dev_priv, &reserved_base,
-
 
375
						 &reserved_size);
-
 
376
		break;
-
 
377
	}
319
		tmp >>= GEN8_BIOS_RESERVED_SHIFT;
378
 
-
 
379
	/* It is possible for the reserved base to be zero, but the register
320
		tmp &= GEN8_BIOS_RESERVED_MASK;
380
	 * field for size doesn't have a zero option. */
-
 
381
	if (reserved_base == 0) {
-
 
382
		reserved_size = 0;
321
		bios_reserved = (1024*1024) << tmp;
383
		reserved_base = stolen_top;
-
 
384
	}
-
 
385
 
-
 
386
	if (reserved_base < dev_priv->mm.stolen_base ||
-
 
387
	    reserved_base + reserved_size > stolen_top) {
322
	} else if (IS_GEN7(dev)) {
388
		DRM_DEBUG_KMS("Stolen reserved area [0x%08lx - 0x%08lx] outside stolen memory [0x%08lx - 0x%08lx]\n",
323
		tmp = I915_READ(GEN7_BIOS_RESERVED);
389
			      reserved_base, reserved_base + reserved_size,
Line -... Line 390...
-
 
390
			      dev_priv->mm.stolen_base, stolen_top);
-
 
391
		return 0;
-
 
392
	}
-
 
393
 
324
		bios_reserved = tmp & GEN7_BIOS_RESERVED_256K ?
394
	/* It is possible for the reserved area to end before the end of stolen
325
			256*1024 : 1024*1024;
395
	 * memory, so just consider the start. */
-
 
396
	reserved_total = stolen_top - reserved_base;
Line -... Line 397...
-
 
397
 
-
 
398
	DRM_DEBUG_KMS("Memory reserved for graphics device: %zuK, usable: %luK\n",
-
 
399
		      dev_priv->gtt.stolen_size >> 10,
-
 
400
		      (dev_priv->gtt.stolen_size - reserved_total) >> 10);
326
	}
401
 
-
 
402
	dev_priv->gtt.stolen_usable_size = dev_priv->gtt.stolen_size -
-
 
403
					   reserved_total;
-
 
404
 
-
 
405
	/*
327
 
406
	 * Basic memrange allocator for stolen space.
-
 
407
	 *
-
 
408
	 * TODO: Notice that some platforms require us to not use the first page
328
	if (WARN_ON(bios_reserved > dev_priv->gtt.stolen_size))
409
	 * of the stolen memory but their BIOSes may still put the framebuffer
-
 
410
	 * on the first page. So we don't reserve this page for now because of
-
 
411
	 * that. Our current solution is to just prevent new nodes from being
Line 329... Line 412...
329
		return 0;
412
	 * inserted on the first page - see the check we have at
330
 
413
	 * i915_gem_stolen_insert_node_in_range(). We may want to fix the fbcon
Line 331... Line 414...
331
	/* Basic memrange allocator for stolen space */
414
	 * problem later.
Line 385... Line 468...
385
 
468
 
386
 
469
 
387
static void
470
static void
-
 
471
i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
-
 
472
{
388
i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
473
	struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
389
{
474
 
390
	if (obj->stolen) {
475
	if (obj->stolen) {
391
		drm_mm_remove_node(obj->stolen);
476
		i915_gem_stolen_remove_node(dev_priv, obj->stolen);
392
		kfree(obj->stolen);
477
		kfree(obj->stolen);
393
		obj->stolen = NULL;
478
		obj->stolen = NULL;
394
	}
479
	}
Line 415... Line 500...
415
	obj->pages = i915_pages_create_for_stolen(dev,
500
	obj->pages = i915_pages_create_for_stolen(dev,
416
						  stolen->start, stolen->size);
501
						  stolen->start, stolen->size);
417
	if (obj->pages == NULL)
502
	if (obj->pages == NULL)
418
		goto cleanup;
503
		goto cleanup;
Line 419... Line -...
419
 
-
 
420
	obj->has_dma_mapping = true;
504
 
421
	i915_gem_object_pin_pages(obj);
505
	i915_gem_object_pin_pages(obj);
Line 422... Line 506...
422
	obj->stolen = stolen;
506
	obj->stolen = stolen;
423
 
507
 
Line 448... Line 532...
448
 
532
 
449
	stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
533
	stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
450
	if (!stolen)
534
	if (!stolen)
Line 451... Line 535...
451
		return NULL;
535
		return NULL;
452
 
-
 
453
	ret = drm_mm_insert_node(&dev_priv->mm.stolen, stolen, size,
536
 
454
				 4096, DRM_MM_SEARCH_DEFAULT);
537
	ret = i915_gem_stolen_insert_node(dev_priv, stolen, size, 4096);
455
	if (ret) {
538
	if (ret) {
456
		kfree(stolen);
539
		kfree(stolen);
Line 457... Line 540...
457
		return NULL;
540
		return NULL;
458
	}
541
	}
459
 
542
 
Line 460... Line 543...
460
	obj = _i915_gem_object_create_stolen(dev, stolen);
543
	obj = _i915_gem_object_create_stolen(dev, stolen);
461
	if (obj)
544
	if (obj)
462
		return obj;
545
		return obj;
463
 
546
 
Line 464... Line 547...
464
	drm_mm_remove_node(stolen);
547
	i915_gem_stolen_remove_node(dev_priv, stolen);
Line 484... Line 567...
484
 
567
 
485
	DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n",
568
	DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n",
Line 486... Line 569...
486
			stolen_offset, gtt_offset, size);
569
			stolen_offset, gtt_offset, size);
487
 
570
 
488
	/* KISS and expect everything to be page-aligned */
-
 
489
	BUG_ON(stolen_offset & 4095);
-
 
490
	BUG_ON(size & 4095);
571
	/* KISS and expect everything to be page-aligned */
491
 
572
	if (WARN_ON(size == 0) || WARN_ON(size & 4095) ||
Line 492... Line 573...
492
	if (WARN_ON(size == 0))
573
	    WARN_ON(stolen_offset & 4095))
493
		return NULL;
574
		return NULL;
494
 
575
 
Line 495... Line 576...
495
	stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
576
	stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
496
	if (!stolen)
577
	if (!stolen)
-
 
578
		return NULL;
497
		return NULL;
579
 
-
 
580
	stolen->start = stolen_offset;
498
 
581
	stolen->size = size;
499
	stolen->start = stolen_offset;
582
	mutex_lock(&dev_priv->mm.stolen_lock);
500
	stolen->size = size;
583
	ret = drm_mm_reserve_node(&dev_priv->mm.stolen, stolen);
501
	ret = drm_mm_reserve_node(&dev_priv->mm.stolen, stolen);
584
	mutex_unlock(&dev_priv->mm.stolen_lock);
502
	if (ret) {
585
	if (ret) {
Line 503... Line 586...
503
		DRM_DEBUG_KMS("failed to allocate stolen space\n");
586
		DRM_DEBUG_KMS("failed to allocate stolen space\n");
504
		kfree(stolen);
587
		kfree(stolen);
505
		return NULL;
588
		return NULL;
506
	}
589
	}
507
 
590
 
508
	obj = _i915_gem_object_create_stolen(dev, stolen);
591
	obj = _i915_gem_object_create_stolen(dev, stolen);
509
	if (obj == NULL) {
592
	if (obj == NULL) {
Line 510... Line 593...
510
		DRM_DEBUG_KMS("failed to allocate stolen object\n");
593
		DRM_DEBUG_KMS("failed to allocate stolen object\n");
Line 518... Line 601...
518
		return obj;
601
		return obj;
Line 519... Line 602...
519
 
602
 
520
	vma = i915_gem_obj_lookup_or_create_vma(obj, ggtt);
603
	vma = i915_gem_obj_lookup_or_create_vma(obj, ggtt);
521
	if (IS_ERR(vma)) {
604
	if (IS_ERR(vma)) {
522
		ret = PTR_ERR(vma);
605
		ret = PTR_ERR(vma);
523
		goto err_out;
606
		goto err;
Line 524... Line 607...
524
	}
607
	}
525
 
608
 
526
	/* To simplify the initialisation sequence between KMS and GTT,
609
	/* To simplify the initialisation sequence between KMS and GTT,
Line 532... Line 615...
532
	vma->node.size = size;
615
	vma->node.size = size;
533
	if (drm_mm_initialized(&ggtt->mm)) {
616
	if (drm_mm_initialized(&ggtt->mm)) {
534
		ret = drm_mm_reserve_node(&ggtt->mm, &vma->node);
617
		ret = drm_mm_reserve_node(&ggtt->mm, &vma->node);
535
		if (ret) {
618
		if (ret) {
536
			DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
619
			DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
537
			goto err_vma;
620
			goto err;
538
		}
-
 
539
		}
621
		}
Line 540... Line 622...
540
 
622
 
-
 
623
		vma->bound |= GLOBAL_BIND;
-
 
624
		__i915_vma_set_map_and_fenceable(vma);
-
 
625
		list_add_tail(&vma->mm_list, &ggtt->inactive_list);
Line 541... Line 626...
541
	vma->bound |= GLOBAL_BIND;
626
	}
542
 
-
 
543
	list_add_tail(&obj->global_list, &dev_priv->mm.bound_list);
627
 
Line 544... Line 628...
544
	list_add_tail(&vma->mm_list, &ggtt->inactive_list);
628
	list_add_tail(&obj->global_list, &dev_priv->mm.bound_list);
Line 545... Line -...
545
	i915_gem_object_pin_pages(obj);
-
 
546
 
-
 
547
	return obj;
629
	i915_gem_object_pin_pages(obj);
548
 
-
 
549
err_vma:
-
 
550
	i915_gem_vma_destroy(vma);
630
 
551
err_out:
631
	return obj;
552
	drm_mm_remove_node(stolen);
632