|
@@ -2968,6 +2968,8 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
|
|
|
struct drm_mm_node *node;
|
|
|
u32 size, fence_size, fence_alignment, unfenced_alignment;
|
|
|
bool mappable, fenceable;
|
|
|
+ size_t gtt_max = map_and_fenceable ?
|
|
|
+ dev_priv->gtt.mappable_end : dev_priv->gtt.total;
|
|
|
int ret;
|
|
|
|
|
|
fence_size = i915_gem_get_gtt_size(dev,
|
|
@@ -2994,12 +2996,11 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
|
|
|
/* If the object is bigger than the entire aperture, reject it early
|
|
|
* before evicting everything in a vain attempt to find space.
|
|
|
*/
|
|
|
- if (obj->base.size >
|
|
|
- (map_and_fenceable ? dev_priv->gtt.mappable_end : dev_priv->gtt.total)) {
|
|
|
+ if (obj->base.size > gtt_max) {
|
|
|
DRM_ERROR("Attempting to bind an object larger than the aperture: object=%zd > %s aperture=%ld\n",
|
|
|
obj->base.size,
|
|
|
map_and_fenceable ? "mappable" : "total",
|
|
|
- map_and_fenceable ? dev_priv->gtt.mappable_end : dev_priv->gtt.total);
|
|
|
+ gtt_max);
|
|
|
return -E2BIG;
|
|
|
}
|
|
|
|
|
@@ -3015,14 +3016,10 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- search_free:
|
|
|
- if (map_and_fenceable)
|
|
|
- ret = drm_mm_insert_node_in_range_generic(&dev_priv->mm.gtt_space, node,
|
|
|
- size, alignment, obj->cache_level,
|
|
|
- 0, dev_priv->gtt.mappable_end);
|
|
|
- else
|
|
|
- ret = drm_mm_insert_node_generic(&dev_priv->mm.gtt_space, node,
|
|
|
- size, alignment, obj->cache_level);
|
|
|
+search_free:
|
|
|
+ ret = drm_mm_insert_node_in_range_generic(&dev_priv->mm.gtt_space, node,
|
|
|
+ size, alignment,
|
|
|
+ obj->cache_level, 0, gtt_max);
|
|
|
if (ret) {
|
|
|
ret = i915_gem_evict_something(dev, size, alignment,
|
|
|
obj->cache_level,
|