Subversion Repositories Kolibri OS

Rev

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

Rev 1408 Rev 1964
Line 40... Line 40...
40
#ifdef CONFIG_DEBUG_FS
40
#ifdef CONFIG_DEBUG_FS
41
#include 
41
#include 
42
#endif
42
#endif
Line 43... Line 43...
43
 
43
 
44
struct drm_mm_node {
44
struct drm_mm_node {
45
	struct list_head fl_entry;
45
	struct list_head node_list;
-
 
46
	struct list_head hole_stack;
-
 
47
	unsigned hole_follows : 1;
-
 
48
	unsigned scanned_block : 1;
-
 
49
	unsigned scanned_prev_free : 1;
-
 
50
	unsigned scanned_next_free : 1;
46
	struct list_head ml_entry;
51
	unsigned scanned_preceeds_hole : 1;
47
	int free;
52
	unsigned allocated : 1;
48
	unsigned long start;
53
	unsigned long start;
49
	unsigned long size;
54
	unsigned long size;
50
	struct drm_mm *mm;
-
 
51
	void *private;
55
	struct drm_mm *mm;
Line 52... Line 56...
52
};
56
};
-
 
57
 
53
 
58
struct drm_mm {
-
 
59
	/* List of all memory nodes that immediately precede a free hole. */
-
 
60
	struct list_head hole_stack;
54
struct drm_mm {
61
	/* head_node.node_list is the list of all memory nodes, ordered
55
	struct list_head fl_entry;
62
	 * according to the (increasing) start address of the memory node. */
56
	struct list_head ml_entry;
63
	struct drm_mm_node head_node;
57
	struct list_head unused_nodes;
64
	struct list_head unused_nodes;
-
 
65
	int num_unused;
-
 
66
	spinlock_t unused_lock;
-
 
67
	unsigned int scan_check_range : 1;
-
 
68
	unsigned scan_alignment;
-
 
69
	unsigned long scan_size;
-
 
70
	unsigned long scan_hit_start;
-
 
71
	unsigned scan_hit_size;
-
 
72
	unsigned scanned_blocks;
-
 
73
	unsigned long scan_start;
58
	int num_unused;
74
	unsigned long scan_end;
Line -... Line 75...
-
 
75
	struct drm_mm_node *prev_scanned_node;
-
 
76
};
-
 
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; \
59
    spinlock_t unused_lock;
94
	     entry != NULL; entry = next, \
60
};
95
		next = entry ? list_entry(entry->node_list.next, \
61
 
96
			struct drm_mm_node, node_list) : NULL) \
62
/*
97
/*
63
 * Basic range manager support (drm_mm.c)
98
 * Basic range manager support (drm_mm.c)
Line 103... Line 138...
103
						unsigned long end)
138
						unsigned long end)
104
{
139
{
105
	return drm_mm_get_block_range_generic(parent, size, alignment,
140
	return drm_mm_get_block_range_generic(parent, size, alignment,
106
						start, end, 1);
141
						start, end, 1);
107
}
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);
108
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);
109
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,
110
					      unsigned long size,
153
					      unsigned long size,
111
					      unsigned alignment,
154
					      unsigned alignment,
112
					      int best_match);
155
					      int best_match);
113
extern struct drm_mm_node *drm_mm_search_free_in_range(
156
extern struct drm_mm_node *drm_mm_search_free_in_range(
Line 119... Line 162...
119
						int best_match);
162
						int best_match);
120
extern int drm_mm_init(struct drm_mm *mm, unsigned long start,
163
extern int drm_mm_init(struct drm_mm *mm, unsigned long start,
121
		       unsigned long size);
164
		       unsigned long size);
122
extern void drm_mm_takedown(struct drm_mm *mm);
165
extern void drm_mm_takedown(struct drm_mm *mm);
123
extern int drm_mm_clean(struct drm_mm *mm);
166
extern int drm_mm_clean(struct drm_mm *mm);
124
extern unsigned long drm_mm_tail_space(struct drm_mm *mm);
-
 
125
extern int drm_mm_remove_space_from_tail(struct drm_mm *mm,
-
 
126
					 unsigned long size);
-
 
127
extern int drm_mm_add_space_to_tail(struct drm_mm *mm,
-
 
128
				    unsigned long size, int atomic);
-
 
129
extern int drm_mm_pre_get(struct drm_mm *mm);
167
extern int drm_mm_pre_get(struct drm_mm *mm);
Line 130... Line 168...
130
 
168
 
131
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)
132
{
170
{
133
	return block->mm;
171
	return block->mm;
Line -... Line 172...
-
 
172
}
-
 
173
 
-
 
174
void drm_mm_init_scan(struct drm_mm *mm, unsigned long size,
-
 
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);
-
 
180
int drm_mm_scan_add_block(struct drm_mm_node *node);
134
}
181
int drm_mm_scan_remove_block(struct drm_mm_node *node);
135
 
182
 
136
extern void drm_mm_debug_table(struct drm_mm *mm, const char *prefix);
183
extern void drm_mm_debug_table(struct drm_mm *mm, const char *prefix);
137
#ifdef CONFIG_DEBUG_FS
184
#ifdef CONFIG_DEBUG_FS