diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2013-07-05 17:41:03 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-07-08 16:04:33 -0400 |
commit | 338710e7aff3428dc8170a03704a8ae981b58dcd (patch) | |
tree | 5c95329df3cd1114ddd3f59181f36fc4cbd5ab96 | |
parent | b3a070cccb9135f8bec63d9f194ddaa422136fb0 (diff) |
drm: Change create block to reserve node
With the previous patch we no longer actually create a node, we simply
find the correct hole and occupy it. This very well could have been
squashed with the last patch, but since I already had David's review, I
figured it's easiest to keep it distinct.
Also update the users in i915. Conveniently this is the only user of the
interface.
CC: David Airlie <airlied@linux.ie>
CC: <dri-devel@lists.freedesktop.org>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Acked-by: David Airlie <airlied@linux.ie>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/drm_mm.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_stolen.c | 12 | ||||
-rw-r--r-- | include/drm/drm_mm.h | 5 |
4 files changed, 22 insertions, 22 deletions
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index 9e8dfbc1955e..52e0ee7f4a6f 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c | |||
@@ -147,27 +147,27 @@ static void drm_mm_insert_helper(struct drm_mm_node *hole_node, | |||
147 | } | 147 | } |
148 | } | 148 | } |
149 | 149 | ||
150 | int drm_mm_create_block(struct drm_mm *mm, struct drm_mm_node *node, | 150 | int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node) |
151 | unsigned long start, unsigned long size) | ||
152 | { | 151 | { |
153 | struct drm_mm_node *hole; | 152 | struct drm_mm_node *hole; |
154 | unsigned long end = start + size; | 153 | unsigned long end = node->start + node->size; |
155 | unsigned long hole_start; | 154 | unsigned long hole_start; |
156 | unsigned long hole_end; | 155 | unsigned long hole_end; |
157 | 156 | ||
157 | BUG_ON(node == NULL); | ||
158 | |||
159 | /* Find the relevant hole to add our node to */ | ||
158 | drm_mm_for_each_hole(hole, mm, hole_start, hole_end) { | 160 | drm_mm_for_each_hole(hole, mm, hole_start, hole_end) { |
159 | if (hole_start > start || hole_end < end) | 161 | if (hole_start > node->start || hole_end < end) |
160 | continue; | 162 | continue; |
161 | 163 | ||
162 | node->start = start; | ||
163 | node->size = size; | ||
164 | node->mm = mm; | 164 | node->mm = mm; |
165 | node->allocated = 1; | 165 | node->allocated = 1; |
166 | 166 | ||
167 | INIT_LIST_HEAD(&node->hole_stack); | 167 | INIT_LIST_HEAD(&node->hole_stack); |
168 | list_add(&node->node_list, &hole->node_list); | 168 | list_add(&node->node_list, &hole->node_list); |
169 | 169 | ||
170 | if (start == hole_start) { | 170 | if (node->start == hole_start) { |
171 | hole->hole_follows = 0; | 171 | hole->hole_follows = 0; |
172 | list_del_init(&hole->hole_stack); | 172 | list_del_init(&hole->hole_stack); |
173 | } | 173 | } |
@@ -181,10 +181,11 @@ int drm_mm_create_block(struct drm_mm *mm, struct drm_mm_node *node, | |||
181 | return 0; | 181 | return 0; |
182 | } | 182 | } |
183 | 183 | ||
184 | WARN(1, "no hole found for block 0x%lx + 0x%lx\n", start, size); | 184 | WARN(1, "no hole found for node 0x%lx + 0x%lx\n", |
185 | node->start, node->size); | ||
185 | return -ENOSPC; | 186 | return -ENOSPC; |
186 | } | 187 | } |
187 | EXPORT_SYMBOL(drm_mm_create_block); | 188 | EXPORT_SYMBOL(drm_mm_reserve_node); |
188 | 189 | ||
189 | struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *hole_node, | 190 | struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *hole_node, |
190 | unsigned long size, | 191 | unsigned long size, |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 88180a597c0a..afba7e5e7739 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -640,10 +640,10 @@ void i915_gem_setup_global_gtt(struct drm_device *dev, | |||
640 | obj->gtt_offset); | 640 | obj->gtt_offset); |
641 | continue; | 641 | continue; |
642 | } | 642 | } |
643 | ret = drm_mm_create_block(&dev_priv->mm.gtt_space, | 643 | obj->gtt_space->start = obj->gtt_offset; |
644 | obj->gtt_space, | 644 | obj->gtt_space->size = obj->base.size; |
645 | obj->gtt_offset, | 645 | ret = drm_mm_reserve_node(&dev_priv->mm.gtt_space, |
646 | obj->base.size); | 646 | obj->gtt_space); |
647 | if (ret) { | 647 | if (ret) { |
648 | DRM_DEBUG_KMS("Reservation failed\n"); | 648 | DRM_DEBUG_KMS("Reservation failed\n"); |
649 | kfree(obj->gtt_space); | 649 | kfree(obj->gtt_space); |
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index 2746ff2d846a..4e6dbbb47dfe 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | |||
@@ -349,8 +349,9 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, | |||
349 | if (!stolen) | 349 | if (!stolen) |
350 | return NULL; | 350 | return NULL; |
351 | 351 | ||
352 | ret = drm_mm_create_block(&dev_priv->mm.stolen, stolen, stolen_offset, | 352 | stolen->start = stolen_offset; |
353 | size); | 353 | stolen->size = size; |
354 | ret = drm_mm_reserve_node(&dev_priv->mm.stolen, stolen); | ||
354 | if (ret) { | 355 | if (ret) { |
355 | DRM_DEBUG_KMS("failed to allocate stolen space\n"); | 356 | DRM_DEBUG_KMS("failed to allocate stolen space\n"); |
356 | kfree(stolen); | 357 | kfree(stolen); |
@@ -380,9 +381,10 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, | |||
380 | goto unref_out; | 381 | goto unref_out; |
381 | } | 382 | } |
382 | 383 | ||
383 | ret = drm_mm_create_block(&dev_priv->mm.gtt_space, | 384 | obj->gtt_space->start = gtt_offset; |
384 | obj->gtt_space, | 385 | obj->gtt_space->size = size; |
385 | gtt_offset, size); | 386 | ret = drm_mm_reserve_node(&dev_priv->mm.gtt_space, |
387 | obj->gtt_space); | ||
386 | if (ret) { | 388 | if (ret) { |
387 | DRM_DEBUG_KMS("failed to allocate stolen GTT space\n"); | 389 | DRM_DEBUG_KMS("failed to allocate stolen GTT space\n"); |
388 | goto free_out; | 390 | goto free_out; |
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index d8b56b7d1839..2de91e3da5cc 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
@@ -138,10 +138,7 @@ static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) | |||
138 | /* | 138 | /* |
139 | * Basic range manager support (drm_mm.c) | 139 | * Basic range manager support (drm_mm.c) |
140 | */ | 140 | */ |
141 | extern int drm_mm_create_block(struct drm_mm *mm, | 141 | extern int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); |
142 | struct drm_mm_node *node, | ||
143 | unsigned long start, | ||
144 | unsigned long size); | ||
145 | extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, | 142 | extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, |
146 | unsigned long size, | 143 | unsigned long size, |
147 | unsigned alignment, | 144 | unsigned alignment, |