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 | { |