diff options
Diffstat (limited to 'include/drm/drm_mm.h')
-rw-r--r-- | include/drm/drm_mm.h | 56 |
1 files changed, 44 insertions, 12 deletions
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index bf01531193d5..564b14aa7e16 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
@@ -42,33 +42,58 @@ | |||
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | struct drm_mm_node { | 44 | struct drm_mm_node { |
45 | struct list_head free_stack; | ||
46 | struct list_head node_list; | 45 | struct list_head node_list; |
47 | unsigned free : 1; | 46 | struct list_head hole_stack; |
47 | unsigned hole_follows : 1; | ||
48 | unsigned scanned_block : 1; | 48 | unsigned scanned_block : 1; |
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; | ||
52 | unsigned allocated : 1; | ||
51 | unsigned long start; | 53 | unsigned long start; |
52 | unsigned long size; | 54 | unsigned long size; |
53 | struct drm_mm *mm; | 55 | struct drm_mm *mm; |
54 | }; | 56 | }; |
55 | 57 | ||
56 | struct drm_mm { | 58 | struct drm_mm { |
57 | /* List of free memory blocks, most recently freed ordered. */ | 59 | /* List of all memory nodes that immediately precede a free hole. */ |
58 | struct list_head free_stack; | 60 | struct list_head hole_stack; |
59 | /* List of all memory nodes, ordered according to the (increasing) start | 61 | /* head_node.node_list is the list of all memory nodes, ordered |
60 | * address of the memory node. */ | 62 | * according to the (increasing) start address of the memory node. */ |
61 | struct list_head node_list; | 63 | struct drm_mm_node head_node; |
62 | struct list_head unused_nodes; | 64 | struct list_head unused_nodes; |
63 | int num_unused; | 65 | int num_unused; |
64 | spinlock_t unused_lock; | 66 | spinlock_t unused_lock; |
67 | unsigned int scan_check_range : 1; | ||
65 | unsigned scan_alignment; | 68 | unsigned scan_alignment; |
66 | unsigned long scan_size; | 69 | unsigned long scan_size; |
67 | unsigned long scan_hit_start; | 70 | unsigned long scan_hit_start; |
68 | unsigned scan_hit_size; | 71 | unsigned scan_hit_size; |
69 | unsigned scanned_blocks; | 72 | unsigned scanned_blocks; |
73 | unsigned long scan_start; | ||
74 | unsigned long scan_end; | ||
75 | struct drm_mm_node *prev_scanned_node; | ||
70 | }; | 76 | }; |
71 | 77 | ||
78 | static inline bool drm_mm_node_allocated(struct drm_mm_node *node) | ||
79 | { | ||
80 | return node->allocated; | ||
81 | } | ||
82 | |||
83 | static inline bool drm_mm_initialized(struct drm_mm *mm) | ||
84 | { | ||
85 | return mm->hole_stack.next; | ||
86 | } | ||
87 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ | ||
88 | &(mm)->head_node.node_list, \ | ||
89 | node_list) | ||
90 | #define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \ | ||
91 | for (entry = (mm)->prev_scanned_node, \ | ||
92 | next = entry ? list_entry(entry->node_list.next, \ | ||
93 | struct drm_mm_node, node_list) : NULL; \ | ||
94 | entry != NULL; entry = next, \ | ||
95 | next = entry ? list_entry(entry->node_list.next, \ | ||
96 | struct drm_mm_node, node_list) : NULL) \ | ||
72 | /* | 97 | /* |
73 | * Basic range manager support (drm_mm.c) | 98 | * Basic range manager support (drm_mm.c) |
74 | */ | 99 | */ |
@@ -115,7 +140,15 @@ static inline struct drm_mm_node *drm_mm_get_block_atomic_range( | |||
115 | return drm_mm_get_block_range_generic(parent, size, alignment, | 140 | return drm_mm_get_block_range_generic(parent, size, alignment, |
116 | start, end, 1); | 141 | start, end, 1); |
117 | } | 142 | } |
143 | extern int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node, | ||
144 | unsigned long size, unsigned alignment); | ||
145 | extern int drm_mm_insert_node_in_range(struct drm_mm *mm, | ||
146 | struct drm_mm_node *node, | ||
147 | unsigned long size, unsigned alignment, | ||
148 | unsigned long start, unsigned long end); | ||
118 | extern void drm_mm_put_block(struct drm_mm_node *cur); | 149 | extern void drm_mm_put_block(struct drm_mm_node *cur); |
150 | extern void drm_mm_remove_node(struct drm_mm_node *node); | ||
151 | extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); | ||
119 | extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, | 152 | extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, |
120 | unsigned long size, | 153 | unsigned long size, |
121 | unsigned alignment, | 154 | unsigned alignment, |
@@ -131,11 +164,6 @@ extern int drm_mm_init(struct drm_mm *mm, unsigned long start, | |||
131 | unsigned long size); | 164 | unsigned long size); |
132 | extern void drm_mm_takedown(struct drm_mm *mm); | 165 | extern void drm_mm_takedown(struct drm_mm *mm); |
133 | extern int drm_mm_clean(struct drm_mm *mm); | 166 | extern int drm_mm_clean(struct drm_mm *mm); |
134 | extern unsigned long drm_mm_tail_space(struct drm_mm *mm); | ||
135 | extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, | ||
136 | unsigned long size); | ||
137 | extern int drm_mm_add_space_to_tail(struct drm_mm *mm, | ||
138 | unsigned long size, int atomic); | ||
139 | extern int drm_mm_pre_get(struct drm_mm *mm); | 167 | extern int drm_mm_pre_get(struct drm_mm *mm); |
140 | 168 | ||
141 | static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) | 169 | static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) |
@@ -145,6 +173,10 @@ static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) | |||
145 | 173 | ||
146 | void drm_mm_init_scan(struct drm_mm *mm, unsigned long size, | 174 | void drm_mm_init_scan(struct drm_mm *mm, unsigned long size, |
147 | unsigned alignment); | 175 | unsigned alignment); |
176 | void drm_mm_init_scan_with_range(struct drm_mm *mm, unsigned long size, | ||
177 | unsigned alignment, | ||
178 | unsigned long start, | ||
179 | unsigned long end); | ||
148 | int drm_mm_scan_add_block(struct drm_mm_node *node); | 180 | int drm_mm_scan_add_block(struct drm_mm_node *node); |
149 | int drm_mm_scan_remove_block(struct drm_mm_node *node); | 181 | int drm_mm_scan_remove_block(struct drm_mm_node *node); |
150 | 182 | ||