diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-07-02 04:48:31 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-07-02 05:47:19 -0400 |
commit | 446f8d81ca2d9cefb614e87f2fabcc996a9e4e7e (patch) | |
tree | 0f4d7064d5175a6f46d82c733780d51010406b74 | |
parent | baf27f9b17bf2f369f3865e38c41d2163e8d815d (diff) |
drm/i915: Don't try to tear down the stolen drm_mm if it's not there
Every other place properly checks whether we've managed to set
up the stolen allocator at boot-up properly, with the exception
of the cleanup code. Which results in an ugly
*ERROR* Memory manager not clean. Delaying takedown
at module unload time since the drm_mm isn't initialized at all.
v2: While at it check whether the stolen drm_mm is initialized instead
of the more obscure stolen_base == 0 check.
v3: Fix up the logic. Also we need to keep the stolen_base check in
i915_gem_object_create_stolen_for_preallocated since that can be
called before stolen memory is fully set up. Spotted by Chris Wilson.
v4: Readd the conversion in i915_gem_object_create_stolen_for_preallocated,
the check is for the dev_priv->mm.gtt_space drm_mm, the stolen
allocatot must already be initialized when calling that function (if
we indeed have stolen memory).
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=65953
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Tested-by: lu hua <huax.lu@intel.com> (v3)
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_stolen.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index f713294618fe..982d4732cecf 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | |||
@@ -147,7 +147,7 @@ int i915_gem_stolen_setup_compression(struct drm_device *dev, int size) | |||
147 | { | 147 | { |
148 | struct drm_i915_private *dev_priv = dev->dev_private; | 148 | struct drm_i915_private *dev_priv = dev->dev_private; |
149 | 149 | ||
150 | if (dev_priv->mm.stolen_base == 0) | 150 | if (!drm_mm_initialized(&dev_priv->mm.stolen)) |
151 | return -ENODEV; | 151 | return -ENODEV; |
152 | 152 | ||
153 | if (size < dev_priv->cfb_size) | 153 | if (size < dev_priv->cfb_size) |
@@ -179,6 +179,9 @@ void i915_gem_cleanup_stolen(struct drm_device *dev) | |||
179 | { | 179 | { |
180 | struct drm_i915_private *dev_priv = dev->dev_private; | 180 | struct drm_i915_private *dev_priv = dev->dev_private; |
181 | 181 | ||
182 | if (!drm_mm_initialized(&dev_priv->mm.stolen)) | ||
183 | return; | ||
184 | |||
182 | i915_gem_stolen_cleanup_compression(dev); | 185 | i915_gem_stolen_cleanup_compression(dev); |
183 | drm_mm_takedown(&dev_priv->mm.stolen); | 186 | drm_mm_takedown(&dev_priv->mm.stolen); |
184 | } | 187 | } |
@@ -300,7 +303,7 @@ i915_gem_object_create_stolen(struct drm_device *dev, u32 size) | |||
300 | struct drm_i915_gem_object *obj; | 303 | struct drm_i915_gem_object *obj; |
301 | struct drm_mm_node *stolen; | 304 | struct drm_mm_node *stolen; |
302 | 305 | ||
303 | if (dev_priv->mm.stolen_base == 0) | 306 | if (!drm_mm_initialized(&dev_priv->mm.stolen)) |
304 | return NULL; | 307 | return NULL; |
305 | 308 | ||
306 | DRM_DEBUG_KMS("creating stolen object: size=%x\n", size); | 309 | DRM_DEBUG_KMS("creating stolen object: size=%x\n", size); |
@@ -331,7 +334,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, | |||
331 | struct drm_i915_gem_object *obj; | 334 | struct drm_i915_gem_object *obj; |
332 | struct drm_mm_node *stolen; | 335 | struct drm_mm_node *stolen; |
333 | 336 | ||
334 | if (dev_priv->mm.stolen_base == 0) | 337 | if (!drm_mm_initialized(&dev_priv->mm.stolen)) |
335 | return NULL; | 338 | return NULL; |
336 | 339 | ||
337 | DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n", | 340 | DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n", |