aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2013-07-05 17:41:03 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-07-08 16:04:33 -0400
commit338710e7aff3428dc8170a03704a8ae981b58dcd (patch)
tree5c95329df3cd1114ddd3f59181f36fc4cbd5ab96
parentb3a070cccb9135f8bec63d9f194ddaa422136fb0 (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.c19
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c8
-rw-r--r--drivers/gpu/drm/i915/i915_gem_stolen.c12
-rw-r--r--include/drm/drm_mm.h5
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
150int drm_mm_create_block(struct drm_mm *mm, struct drm_mm_node *node, 150int 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}
187EXPORT_SYMBOL(drm_mm_create_block); 188EXPORT_SYMBOL(drm_mm_reserve_node);
188 189
189struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *hole_node, 190struct 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 */
141extern int drm_mm_create_block(struct drm_mm *mm, 141extern 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);
145extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, 142extern 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,