aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_mm.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-11-15 06:32:16 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-11-30 17:20:09 -0500
commit5973c7ee519e2a240c68b290a1836bdb25ed3701 (patch)
tree3d9138cd36bb494eeeda9b6db3b50b12f870e809 /drivers/gpu/drm/drm_mm.c
parentacd15b6cc20f85bcef9e08b6ed4f142c34791c32 (diff)
drm: Introduce drm_mm_create_block()
To be used later by i915 to preallocate exact blocks of space from the range manager. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Dave Airlie <airlied@redhat.com> Acked-by: Dave Airlie <airlied@redhat.com> Cc: dri-devel@lists.freedesktop.org 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.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
index 0761a03cdbb2..bd203b61a72b 100644
--- a/drivers/gpu/drm/drm_mm.c
+++ b/drivers/gpu/drm/drm_mm.c
@@ -161,6 +161,56 @@ static void drm_mm_insert_helper(struct drm_mm_node *hole_node,
161 } 161 }
162} 162}
163 163
164struct drm_mm_node *drm_mm_create_block(struct drm_mm *mm,
165 unsigned long start,
166 unsigned long size,
167 bool atomic)
168{
169 struct drm_mm_node *hole, *node;
170 unsigned long end = start + size;
171
172 list_for_each_entry(hole, &mm->hole_stack, hole_stack) {
173 unsigned long hole_start;
174 unsigned long hole_end;
175
176 BUG_ON(!hole->hole_follows);
177 hole_start = drm_mm_hole_node_start(hole);
178 hole_end = drm_mm_hole_node_end(hole);
179
180 if (hole_start > start || hole_end < end)
181 continue;
182
183 node = drm_mm_kmalloc(mm, atomic);
184 if (unlikely(node == NULL))
185 return NULL;
186
187 node->start = start;
188 node->size = size;
189 node->mm = mm;
190 node->allocated = 1;
191
192 INIT_LIST_HEAD(&node->hole_stack);
193 list_add(&node->node_list, &hole->node_list);
194
195 if (start == hole_start) {
196 hole->hole_follows = 0;
197 list_del_init(&hole->hole_stack);
198 }
199
200 node->hole_follows = 0;
201 if (end != hole_end) {
202 list_add(&node->hole_stack, &mm->hole_stack);
203 node->hole_follows = 1;
204 }
205
206 return node;
207 }
208
209 WARN(1, "no hole found for block 0x%lx + 0x%lx\n", start, size);
210 return NULL;
211}
212EXPORT_SYMBOL(drm_mm_create_block);
213
164struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *hole_node, 214struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *hole_node,
165 unsigned long size, 215 unsigned long size,
166 unsigned alignment, 216 unsigned alignment,