41,6 → 41,11 |
#include <linux/seq_file.h> |
#endif |
|
enum drm_mm_search_flags { |
DRM_MM_SEARCH_DEFAULT = 0, |
DRM_MM_SEARCH_BEST = 1 << 0, |
}; |
|
struct drm_mm_node { |
struct list_head node_list; |
struct list_head hole_stack; |
62,9 → 67,6 |
/* 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_color; |
115,13 → 117,6 |
#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) \ |
|
/* Note that we need to unroll list_for_each_entry in order to inline |
* setting hole_start and hole_end on each iteration and keep the |
138,71 → 133,23 |
/* |
* Basic range manager support (drm_mm.c) |
*/ |
extern struct drm_mm_node *drm_mm_create_block(struct drm_mm *mm, |
unsigned long start, |
extern int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); |
|
extern int drm_mm_insert_node_generic(struct drm_mm *mm, |
struct drm_mm_node *node, |
unsigned long size, |
bool atomic); |
extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, |
unsigned long size, |
unsigned alignment, |
unsigned long color, |
int atomic); |
extern struct drm_mm_node *drm_mm_get_block_range_generic( |
enum drm_mm_search_flags flags); |
static inline int drm_mm_insert_node(struct drm_mm *mm, |
struct drm_mm_node *node, |
unsigned long size, |
unsigned alignment, |
unsigned long color, |
unsigned long start, |
unsigned long end, |
int atomic); |
static inline struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *parent, |
unsigned long size, |
unsigned alignment) |
enum drm_mm_search_flags flags) |
{ |
return drm_mm_get_block_generic(parent, size, alignment, 0, 0); |
return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags); |
} |
static inline struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent, |
unsigned long size, |
unsigned alignment) |
{ |
return drm_mm_get_block_generic(parent, size, alignment, 0, 1); |
} |
static inline struct drm_mm_node *drm_mm_get_block_range( |
struct drm_mm_node *parent, |
unsigned long size, |
unsigned alignment, |
unsigned long start, |
unsigned long end) |
{ |
return drm_mm_get_block_range_generic(parent, size, alignment, 0, |
start, end, 0); |
} |
static inline struct drm_mm_node *drm_mm_get_block_atomic_range( |
struct drm_mm_node *parent, |
unsigned long size, |
unsigned alignment, |
unsigned long start, |
unsigned long end) |
{ |
return drm_mm_get_block_range_generic(parent, size, alignment, 0, |
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 int drm_mm_insert_node_generic(struct drm_mm *mm, |
struct drm_mm_node *node, |
unsigned long size, |
unsigned alignment, |
unsigned long color); |
extern int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, |
struct drm_mm_node *node, |
unsigned long size, |
209,54 → 156,28 |
unsigned alignment, |
unsigned long color, |
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_generic(const struct drm_mm *mm, |
unsigned long size, |
unsigned alignment, |
unsigned long color, |
bool best_match); |
extern struct drm_mm_node *drm_mm_search_free_in_range_generic( |
const struct drm_mm *mm, |
unsigned long size, |
unsigned alignment, |
unsigned long color, |
unsigned long start, |
unsigned long end, |
bool best_match); |
static inline struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, |
enum drm_mm_search_flags flags); |
static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, |
struct drm_mm_node *node, |
unsigned long size, |
unsigned alignment, |
bool best_match) |
{ |
return drm_mm_search_free_generic(mm,size, alignment, 0, best_match); |
} |
static inline struct drm_mm_node *drm_mm_search_free_in_range( |
const struct drm_mm *mm, |
unsigned long size, |
unsigned alignment, |
unsigned long start, |
unsigned long end, |
bool best_match) |
enum drm_mm_search_flags flags) |
{ |
return drm_mm_search_free_in_range_generic(mm, size, alignment, 0, |
start, end, best_match); |
return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, |
0, start, end, flags); |
} |
|
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 void drm_mm_init(struct drm_mm *mm, |
unsigned long start, |
unsigned long size); |
extern void drm_mm_takedown(struct drm_mm *mm); |
extern int drm_mm_clean(struct drm_mm *mm); |
extern int drm_mm_pre_get(struct drm_mm *mm); |
|
static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) |
{ |
return block->mm; |
} |
|
void drm_mm_init_scan(struct drm_mm *mm, |
unsigned long size, |
unsigned alignment, |