Subversion Repositories Kolibri OS

Rev

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

Rev 3480 Rev 3764
Line 310... Line 310...
310
 
310
 
311
	drm_mm_put_block(stolen);
311
	drm_mm_put_block(stolen);
312
	return NULL;
312
	return NULL;
Line -... Line 313...
-
 
313
}
-
 
314
 
-
 
315
struct drm_i915_gem_object *
-
 
316
i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
-
 
317
					       u32 stolen_offset,
-
 
318
					       u32 gtt_offset,
-
 
319
					       u32 size)
-
 
320
{
-
 
321
	struct drm_i915_private *dev_priv = dev->dev_private;
-
 
322
	struct drm_i915_gem_object *obj;
-
 
323
	struct drm_mm_node *stolen;
-
 
324
 
-
 
325
	if (dev_priv->mm.stolen_base == 0)
-
 
326
		return NULL;
-
 
327
 
-
 
328
	DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n",
-
 
329
			stolen_offset, gtt_offset, size);
-
 
330
 
-
 
331
	/* KISS and expect everything to be page-aligned */
-
 
332
	BUG_ON(stolen_offset & 4095);
-
 
333
	BUG_ON(gtt_offset & 4095);
-
 
334
	BUG_ON(size & 4095);
-
 
335
 
-
 
336
	if (WARN_ON(size == 0))
-
 
337
		return NULL;
-
 
338
 
-
 
339
	stolen = drm_mm_create_block(&dev_priv->mm.stolen,
-
 
340
				     stolen_offset, size,
-
 
341
				     false);
-
 
342
	if (stolen == NULL) {
-
 
343
		DRM_DEBUG_KMS("failed to allocate stolen space\n");
-
 
344
		return NULL;
-
 
345
	}
-
 
346
 
-
 
347
	obj = _i915_gem_object_create_stolen(dev, stolen);
-
 
348
	if (obj == NULL) {
-
 
349
		DRM_DEBUG_KMS("failed to allocate stolen object\n");
-
 
350
		drm_mm_put_block(stolen);
-
 
351
		return NULL;
-
 
352
	}
-
 
353
 
-
 
354
	/* To simplify the initialisation sequence between KMS and GTT,
-
 
355
	 * we allow construction of the stolen object prior to
-
 
356
	 * setting up the GTT space. The actual reservation will occur
-
 
357
	 * later.
-
 
358
	 */
-
 
359
	if (drm_mm_initialized(&dev_priv->mm.gtt_space)) {
-
 
360
		obj->gtt_space = drm_mm_create_block(&dev_priv->mm.gtt_space,
-
 
361
						     gtt_offset, size,
-
 
362
						     false);
-
 
363
		if (obj->gtt_space == NULL) {
-
 
364
			DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
-
 
365
			drm_gem_object_unreference(&obj->base);
-
 
366
			return NULL;
-
 
367
		}
-
 
368
	} else
-
 
369
		obj->gtt_space = I915_GTT_RESERVED;
-
 
370
 
-
 
371
	obj->gtt_offset = gtt_offset;
-
 
372
	obj->has_global_gtt_mapping = 1;
-
 
373
 
-
 
374
	list_add_tail(&obj->gtt_list, &dev_priv->mm.bound_list);
-
 
375
	list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
-
 
376
 
-
 
377
	return obj;
313
}
378
}
314
 
379
 
315
void
380
void
316
i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
381
i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
317
{
382
{