Subversion Repositories Kolibri OS

Rev

Rev 4065 | Rev 4110 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4065 Rev 4103
Line 39... Line 39...
39
#include 
39
#include 
40
#ifdef CONFIG_DEBUG_FS
40
#ifdef CONFIG_DEBUG_FS
41
#include 
41
#include 
42
#endif
42
#endif
Line -... Line 43...
-
 
43
 
-
 
44
enum drm_mm_search_flags {
-
 
45
	DRM_MM_SEARCH_DEFAULT =		0,
-
 
46
	DRM_MM_SEARCH_BEST =		1 << 0,
-
 
47
};
43
 
48
 
44
struct drm_mm_node {
49
struct drm_mm_node {
45
	struct list_head node_list;
50
	struct list_head node_list;
46
	struct list_head hole_stack;
51
	struct list_head hole_stack;
47
	unsigned hole_follows : 1;
52
	unsigned hole_follows : 1;
Line 60... Line 65...
60
	/* List of all memory nodes that immediately precede a free hole. */
65
	/* List of all memory nodes that immediately precede a free hole. */
61
	struct list_head hole_stack;
66
	struct list_head hole_stack;
62
	/* head_node.node_list is the list of all memory nodes, ordered
67
	/* head_node.node_list is the list of all memory nodes, ordered
63
	 * according to the (increasing) start address of the memory node. */
68
	 * according to the (increasing) start address of the memory node. */
64
	struct drm_mm_node head_node;
69
	struct drm_mm_node head_node;
65
	struct list_head unused_nodes;
-
 
66
	int num_unused;
-
 
67
	spinlock_t unused_lock;
-
 
68
	unsigned int scan_check_range : 1;
70
	unsigned int scan_check_range : 1;
69
	unsigned scan_alignment;
71
	unsigned scan_alignment;
70
	unsigned long scan_color;
72
	unsigned long scan_color;
71
	unsigned long scan_size;
73
	unsigned long scan_size;
72
	unsigned long scan_hit_start;
74
	unsigned long scan_hit_start;
Line 113... Line 115...
113
}
115
}
Line 114... Line 116...
114
 
116
 
115
#define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \
117
#define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \
116
						&(mm)->head_node.node_list, \
118
						&(mm)->head_node.node_list, \
117
						node_list)
-
 
118
#define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \
-
 
119
	for (entry = (mm)->prev_scanned_node, \
-
 
120
		next = entry ? list_entry(entry->node_list.next, \
-
 
121
			struct drm_mm_node, node_list) : NULL; \
-
 
122
	     entry != NULL; entry = next, \
-
 
123
		next = entry ? list_entry(entry->node_list.next, \
-
 
Line 124... Line 119...
124
			struct drm_mm_node, node_list) : NULL) \
119
						node_list)
125
 
120
 
126
/* Note that we need to unroll list_for_each_entry in order to inline
121
/* Note that we need to unroll list_for_each_entry in order to inline
127
 * setting hole_start and hole_end on each iteration and keep the
122
 * setting hole_start and hole_end on each iteration and keep the
Line 136... Line 131...
136
	     entry = list_entry(entry->hole_stack.next, struct drm_mm_node, hole_stack))
131
	     entry = list_entry(entry->hole_stack.next, struct drm_mm_node, hole_stack))
Line 137... Line 132...
137
 
132
 
138
/*
133
/*
139
 * Basic range manager support (drm_mm.c)
134
 * Basic range manager support (drm_mm.c)
140
 */
135
 */
141
extern struct drm_mm_node *drm_mm_create_block(struct drm_mm *mm,
-
 
142
					       unsigned long start,
-
 
143
					       unsigned long size,
-
 
-
 
136
extern int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node);
144
					       bool atomic);
137
 
145
extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node,
-
 
146
						    unsigned long size,
-
 
147
						    unsigned alignment,
-
 
148
						    unsigned long color,
-
 
149
						    int atomic);
-
 
150
extern struct drm_mm_node *drm_mm_get_block_range_generic(
138
extern int drm_mm_insert_node_generic(struct drm_mm *mm,
151
						struct drm_mm_node *node,
139
				      struct drm_mm_node *node,
152
						unsigned long size,
140
						    unsigned long size,
153
						unsigned alignment,
141
						    unsigned alignment,
154
						unsigned long color,
-
 
155
						unsigned long start,
-
 
156
						unsigned long end,
-
 
157
						int atomic);
-
 
158
static inline struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *parent,
-
 
159
						   unsigned long size,
-
 
160
						   unsigned alignment)
-
 
161
{
-
 
162
	return drm_mm_get_block_generic(parent, size, alignment, 0, 0);
-
 
163
}
-
 
164
static inline struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent,
-
 
165
							  unsigned long size,
-
 
166
							  unsigned alignment)
-
 
167
{
-
 
168
	return drm_mm_get_block_generic(parent, size, alignment, 0, 1);
-
 
169
}
-
 
170
static inline struct drm_mm_node *drm_mm_get_block_range(
-
 
171
						struct drm_mm_node *parent,
-
 
172
						unsigned long size,
-
 
173
						unsigned alignment,
-
 
174
						unsigned long start,
-
 
175
						unsigned long end)
-
 
176
{
-
 
177
	return drm_mm_get_block_range_generic(parent, size, alignment, 0,
142
						    unsigned long color,
178
					      start, end, 0);
-
 
179
}
143
				      enum drm_mm_search_flags flags);
180
static inline struct drm_mm_node *drm_mm_get_block_atomic_range(
144
static inline int drm_mm_insert_node(struct drm_mm *mm,
181
						struct drm_mm_node *parent,
145
						struct drm_mm_node *node,
182
						unsigned long size,
146
						unsigned long size,
183
						unsigned alignment,
147
						unsigned alignment,
184
						unsigned long start,
-
 
185
						unsigned long end)
148
				     enum drm_mm_search_flags flags)
186
{
149
{
187
	return drm_mm_get_block_range_generic(parent, size, alignment, 0,
-
 
188
						start, end, 1);
150
	return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags);
Line 189... Line -...
189
}
-
 
190
 
-
 
191
extern int drm_mm_insert_node(struct drm_mm *mm,
-
 
192
			      struct drm_mm_node *node,
-
 
193
			      unsigned long size,
-
 
194
			      unsigned alignment);
-
 
195
extern int drm_mm_insert_node_in_range(struct drm_mm *mm,
-
 
196
				       struct drm_mm_node *node,
-
 
197
				       unsigned long size,
-
 
198
				       unsigned alignment,
-
 
199
				       unsigned long start,
-
 
200
				       unsigned long end);
-
 
201
extern int drm_mm_insert_node_generic(struct drm_mm *mm,
-
 
202
				      struct drm_mm_node *node,
-
 
203
				      unsigned long size,
-
 
204
				      unsigned alignment,
151
}
205
				      unsigned long color);
152
 
206
extern int drm_mm_insert_node_in_range_generic(struct drm_mm *mm,
153
extern int drm_mm_insert_node_in_range_generic(struct drm_mm *mm,
207
				       struct drm_mm_node *node,
154
				       struct drm_mm_node *node,
208
				       unsigned long size,
155
				       unsigned long size,
209
				       unsigned alignment,
156
				       unsigned alignment,
210
				       unsigned long color,
-
 
211
				       unsigned long start,
-
 
212
				       unsigned long end);
-
 
213
extern void drm_mm_put_block(struct drm_mm_node *cur);
-
 
214
extern void drm_mm_remove_node(struct drm_mm_node *node);
-
 
215
extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new);
-
 
216
extern struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm,
-
 
217
					      unsigned long size,
-
 
218
					      unsigned alignment,
-
 
219
						      unsigned long color,
-
 
220
						      bool best_match);
-
 
221
extern struct drm_mm_node *drm_mm_search_free_in_range_generic(
-
 
222
						const struct drm_mm *mm,
-
 
223
						unsigned long size,
-
 
224
						unsigned alignment,
-
 
225
						unsigned long color,
157
				       unsigned long color,
226
						unsigned long start,
158
				       unsigned long start,
227
						unsigned long end,
159
						unsigned long end,
228
						bool best_match);
-
 
229
static inline struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
-
 
230
						     unsigned long size,
-
 
231
						     unsigned alignment,
-
 
232
						     bool best_match)
-
 
233
{
-
 
234
	return drm_mm_search_free_generic(mm,size, alignment, 0, best_match);
-
 
235
}
160
				       enum drm_mm_search_flags flags);
236
static inline  struct drm_mm_node *drm_mm_search_free_in_range(
161
static inline int drm_mm_insert_node_in_range(struct drm_mm *mm,
237
						const struct drm_mm *mm,
162
					      struct drm_mm_node *node,
238
						unsigned long size,
163
						unsigned long size,
239
						unsigned alignment,
164
						unsigned alignment,
240
						unsigned long start,
165
						unsigned long start,
241
						unsigned long end,
166
						unsigned long end,
242
						bool best_match)
167
					      enum drm_mm_search_flags flags)
243
{
168
{
244
	return drm_mm_search_free_in_range_generic(mm, size, alignment, 0,
169
	return drm_mm_insert_node_in_range_generic(mm, node, size, alignment,
Line -... Line 170...
-
 
170
						   0, start, end, flags);
-
 
171
}
245
						   start, end, best_match);
172
 
246
}
173
extern void drm_mm_remove_node(struct drm_mm_node *node);
247
 
174
extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new);
248
extern void drm_mm_init(struct drm_mm *mm,
175
extern void drm_mm_init(struct drm_mm *mm,
249
		       unsigned long start,
176
		       unsigned long start,
250
		       unsigned long size);
-
 
251
extern void drm_mm_takedown(struct drm_mm *mm);
-
 
252
extern int drm_mm_clean(struct drm_mm *mm);
-
 
253
extern int drm_mm_pre_get(struct drm_mm *mm);
-
 
254
 
-
 
255
static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block)
-
 
Line 256... Line 177...
256
{
177
		       unsigned long size);
257
	return block->mm;
178
extern void drm_mm_takedown(struct drm_mm *mm);
258
}
179
extern int drm_mm_clean(struct drm_mm *mm);
259
 
180