42,23 → 42,58 |
#endif |
|
struct drm_mm_node { |
struct list_head fl_entry; |
struct list_head ml_entry; |
int free; |
struct list_head node_list; |
struct list_head hole_stack; |
unsigned hole_follows : 1; |
unsigned scanned_block : 1; |
unsigned scanned_prev_free : 1; |
unsigned scanned_next_free : 1; |
unsigned scanned_preceeds_hole : 1; |
unsigned allocated : 1; |
unsigned long start; |
unsigned long size; |
struct drm_mm *mm; |
void *private; |
}; |
|
struct drm_mm { |
struct list_head fl_entry; |
struct list_head ml_entry; |
/* List of all memory nodes that immediately precede a free hole. */ |
struct list_head hole_stack; |
/* head_node.node_list is the list of all memory nodes, ordered |
* according to the (increasing) start address of the memory node. */ |
struct drm_mm_node head_node; |
struct list_head unused_nodes; |
int num_unused; |
spinlock_t unused_lock; |
unsigned int scan_check_range : 1; |
unsigned scan_alignment; |
unsigned long scan_size; |
unsigned long scan_hit_start; |
unsigned scan_hit_size; |
unsigned scanned_blocks; |
unsigned long scan_start; |
unsigned long scan_end; |
struct drm_mm_node *prev_scanned_node; |
}; |
|
static inline bool drm_mm_node_allocated(struct drm_mm_node *node) |
{ |
return node->allocated; |
} |
|
static inline bool drm_mm_initialized(struct drm_mm *mm) |
{ |
return mm->hole_stack.next; |
} |
#define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ |
&(mm)->head_node.node_list, \ |
node_list) |
#define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \ |
for (entry = (mm)->prev_scanned_node, \ |
next = entry ? list_entry(entry->node_list.next, \ |
struct drm_mm_node, node_list) : NULL; \ |
entry != NULL; entry = next, \ |
next = entry ? list_entry(entry->node_list.next, \ |
struct drm_mm_node, node_list) : NULL) \ |
/* |
* Basic range manager support (drm_mm.c) |
*/ |
105,7 → 140,15 |
return drm_mm_get_block_range_generic(parent, size, alignment, |
start, end, 1); |
} |
extern int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node, |
unsigned long size, unsigned alignment); |
extern int drm_mm_insert_node_in_range(struct drm_mm *mm, |
struct drm_mm_node *node, |
unsigned long size, unsigned alignment, |
unsigned long start, unsigned long end); |
extern void drm_mm_put_block(struct drm_mm_node *cur); |
extern void drm_mm_remove_node(struct drm_mm_node *node); |
extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); |
extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, |
unsigned long size, |
unsigned alignment, |
121,11 → 164,6 |
unsigned long size); |
extern void drm_mm_takedown(struct drm_mm *mm); |
extern int drm_mm_clean(struct drm_mm *mm); |
extern unsigned long drm_mm_tail_space(struct drm_mm *mm); |
extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, |
unsigned long size); |
extern int drm_mm_add_space_to_tail(struct drm_mm *mm, |
unsigned long size, int atomic); |
extern int drm_mm_pre_get(struct drm_mm *mm); |
|
static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) |
133,6 → 171,15 |
return block->mm; |
} |
|
void drm_mm_init_scan(struct drm_mm *mm, unsigned long size, |
unsigned alignment); |
void drm_mm_init_scan_with_range(struct drm_mm *mm, unsigned long size, |
unsigned alignment, |
unsigned long start, |
unsigned long end); |
int drm_mm_scan_add_block(struct drm_mm_node *node); |
int drm_mm_scan_remove_block(struct drm_mm_node *node); |
|
extern void drm_mm_debug_table(struct drm_mm *mm, const char *prefix); |
#ifdef CONFIG_DEBUG_FS |
int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm); |