aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_mm.c
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 /drivers/gpu/drm/drm_mm.c
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>
Diffstat (limited to 'drivers/gpu/drm/drm_mm.c')
-rw-r--r--drivers/gpu/drm/drm_mm.c19
1 files changed, 10 insertions, 9 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,