diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2011-02-18 11:59:14 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-02-22 19:32:51 -0500 |
commit | b0b7af1884b7d807a3504804f9825d472de78708 (patch) | |
tree | ba9e2dde9575caab3ae6f4b0a1d1ef15c09caf67 /include/drm | |
parent | 9fc935debb33d90bf302ba42f7234b78e322f195 (diff) |
drm: mm: add api for embedding struct drm_mm_node
The old api has a two-step process: First search for a suitable
free hole, then allocate from that specific hole. No user used
this to do anything clever. So drop it for the embeddable variant
of the drm_mm api (the old one retains this ability, for the time
being).
With struct drm_mm_node embedded, we cannot track allocations
anymore by checking for a NULL pointer. So keep track of this
and add a small helper drm_mm_node_allocated.
Also add a function to move allocations between different struct
drm_mm_node.
v2: Implement suggestions by Chris Wilson.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'include/drm')
-rw-r--r-- | include/drm/drm_mm.h | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index 34fa36f2de70..17a070e11d3c 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
@@ -49,6 +49,7 @@ struct drm_mm_node { | |||
49 | unsigned scanned_prev_free : 1; | 49 | unsigned scanned_prev_free : 1; |
50 | unsigned scanned_next_free : 1; | 50 | unsigned scanned_next_free : 1; |
51 | unsigned scanned_preceeds_hole : 1; | 51 | unsigned scanned_preceeds_hole : 1; |
52 | unsigned allocated : 1; | ||
52 | unsigned long start; | 53 | unsigned long start; |
53 | unsigned long size; | 54 | unsigned long size; |
54 | struct drm_mm *mm; | 55 | struct drm_mm *mm; |
@@ -73,6 +74,11 @@ struct drm_mm { | |||
73 | unsigned long scan_end; | 74 | unsigned long scan_end; |
74 | }; | 75 | }; |
75 | 76 | ||
77 | static inline bool drm_mm_node_allocated(struct drm_mm_node *node) | ||
78 | { | ||
79 | return node->allocated; | ||
80 | } | ||
81 | |||
76 | static inline bool drm_mm_initialized(struct drm_mm *mm) | 82 | static inline bool drm_mm_initialized(struct drm_mm *mm) |
77 | { | 83 | { |
78 | return mm->hole_stack.next; | 84 | return mm->hole_stack.next; |
@@ -126,7 +132,15 @@ static inline struct drm_mm_node *drm_mm_get_block_atomic_range( | |||
126 | return drm_mm_get_block_range_generic(parent, size, alignment, | 132 | return drm_mm_get_block_range_generic(parent, size, alignment, |
127 | start, end, 1); | 133 | start, end, 1); |
128 | } | 134 | } |
135 | extern int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node, | ||
136 | unsigned long size, unsigned alignment); | ||
137 | extern int drm_mm_insert_node_in_range(struct drm_mm *mm, | ||
138 | struct drm_mm_node *node, | ||
139 | unsigned long size, unsigned alignment, | ||
140 | unsigned long start, unsigned long end); | ||
129 | extern void drm_mm_put_block(struct drm_mm_node *cur); | 141 | extern void drm_mm_put_block(struct drm_mm_node *cur); |
142 | extern void drm_mm_remove_node(struct drm_mm_node *node); | ||
143 | extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); | ||
130 | extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, | 144 | extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, |
131 | unsigned long size, | 145 | unsigned long size, |
132 | unsigned alignment, | 146 | unsigned alignment, |
@@ -142,11 +156,6 @@ extern int drm_mm_init(struct drm_mm *mm, unsigned long start, | |||
142 | unsigned long size); | 156 | unsigned long size); |
143 | extern void drm_mm_takedown(struct drm_mm *mm); | 157 | extern void drm_mm_takedown(struct drm_mm *mm); |
144 | extern int drm_mm_clean(struct drm_mm *mm); | 158 | extern int drm_mm_clean(struct drm_mm *mm); |
145 | extern unsigned long drm_mm_tail_space(struct drm_mm *mm); | ||
146 | extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, | ||
147 | unsigned long size); | ||
148 | extern int drm_mm_add_space_to_tail(struct drm_mm *mm, | ||
149 | unsigned long size, int atomic); | ||
150 | extern int drm_mm_pre_get(struct drm_mm *mm); | 159 | extern int drm_mm_pre_get(struct drm_mm *mm); |
151 | 160 | ||
152 | static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) | 161 | static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) |