Commit 1e507872 authored by Chris Wilson's avatar Chris Wilson

drm/i915/gem: Pass mem region to preallocated stolen

As the memory regions are setup early, we can rely on its existence as
we takeover the HW settings from BIOS.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191111182143.23479-2-chris@chris-wilson.co.uk
parent bdce2bea
...@@ -549,11 +549,10 @@ i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) ...@@ -549,11 +549,10 @@ i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
GEM_BUG_ON(!stolen); GEM_BUG_ON(!stolen);
i915_gem_object_release_memory_region(obj);
i915_gem_stolen_remove_node(i915, stolen); i915_gem_stolen_remove_node(i915, stolen);
kfree(stolen); kfree(stolen);
if (obj->mm.region)
i915_gem_object_release_memory_region(obj);
} }
static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = { static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = {
...@@ -563,9 +562,8 @@ static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = { ...@@ -563,9 +562,8 @@ static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = {
}; };
static struct drm_i915_gem_object * static struct drm_i915_gem_object *
__i915_gem_object_create_stolen(struct drm_i915_private *i915, __i915_gem_object_create_stolen(struct intel_memory_region *mem,
struct drm_mm_node *stolen, struct drm_mm_node *stolen)
struct intel_memory_region *mem)
{ {
static struct lock_class_key lock_class; static struct lock_class_key lock_class;
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj;
...@@ -576,20 +574,19 @@ __i915_gem_object_create_stolen(struct drm_i915_private *i915, ...@@ -576,20 +574,19 @@ __i915_gem_object_create_stolen(struct drm_i915_private *i915,
if (!obj) if (!obj)
goto err; goto err;
drm_gem_private_object_init(&i915->drm, &obj->base, stolen->size); drm_gem_private_object_init(&mem->i915->drm, &obj->base, stolen->size);
i915_gem_object_init(obj, &i915_gem_object_stolen_ops, &lock_class); i915_gem_object_init(obj, &i915_gem_object_stolen_ops, &lock_class);
obj->stolen = stolen; obj->stolen = stolen;
obj->read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT; obj->read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT;
cache_level = HAS_LLC(i915) ? I915_CACHE_LLC : I915_CACHE_NONE; cache_level = HAS_LLC(mem->i915) ? I915_CACHE_LLC : I915_CACHE_NONE;
i915_gem_object_set_cache_coherency(obj, cache_level); i915_gem_object_set_cache_coherency(obj, cache_level);
err = i915_gem_object_pin_pages(obj); err = i915_gem_object_pin_pages(obj);
if (err) if (err)
goto cleanup; goto cleanup;
if (mem) i915_gem_object_init_memory_region(obj, mem, 0);
i915_gem_object_init_memory_region(obj, mem, 0);
return obj; return obj;
...@@ -625,7 +622,7 @@ _i915_gem_object_create_stolen(struct intel_memory_region *mem, ...@@ -625,7 +622,7 @@ _i915_gem_object_create_stolen(struct intel_memory_region *mem,
goto err_free; goto err_free;
} }
obj = __i915_gem_object_create_stolen(i915, stolen, mem); obj = __i915_gem_object_create_stolen(mem, stolen);
if (IS_ERR(obj)) if (IS_ERR(obj))
goto err_remove; goto err_remove;
...@@ -681,6 +678,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *i915, ...@@ -681,6 +678,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *i915,
resource_size_t gtt_offset, resource_size_t gtt_offset,
resource_size_t size) resource_size_t size)
{ {
struct intel_memory_region *mem = i915->mm.regions[INTEL_REGION_STOLEN];
struct i915_ggtt *ggtt = &i915->ggtt; struct i915_ggtt *ggtt = &i915->ggtt;
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj;
struct drm_mm_node *stolen; struct drm_mm_node *stolen;
...@@ -714,7 +712,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *i915, ...@@ -714,7 +712,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *i915,
return ERR_PTR(ret); return ERR_PTR(ret);
} }
obj = __i915_gem_object_create_stolen(i915, stolen, NULL); obj = __i915_gem_object_create_stolen(mem, stolen);
if (IS_ERR(obj)) { if (IS_ERR(obj)) {
DRM_DEBUG_DRIVER("failed to allocate stolen object\n"); DRM_DEBUG_DRIVER("failed to allocate stolen object\n");
i915_gem_stolen_remove_node(i915, stolen); i915_gem_stolen_remove_node(i915, stolen);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment