diff options
Diffstat (limited to 'include/drm/drm_mm.h')
| -rw-r--r-- | include/drm/drm_mm.h | 40 | 
1 files changed, 40 insertions, 0 deletions
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index 3527fb3f75b..88591ef8fa2 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h @@ -89,6 +89,29 @@ static inline bool drm_mm_initialized(struct drm_mm *mm)  {  	return mm->hole_stack.next;  } + +static inline unsigned long __drm_mm_hole_node_start(struct drm_mm_node *hole_node) +{ +	return hole_node->start + hole_node->size; +} + +static inline unsigned long drm_mm_hole_node_start(struct drm_mm_node *hole_node) +{ +	BUG_ON(!hole_node->hole_follows); +	return __drm_mm_hole_node_start(hole_node); +} + +static inline unsigned long __drm_mm_hole_node_end(struct drm_mm_node *hole_node) +{ +	return list_entry(hole_node->node_list.next, +			  struct drm_mm_node, node_list)->start; +} + +static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) +{ +	return __drm_mm_hole_node_end(hole_node); +} +  #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \  						&(mm)->head_node.node_list, \  						node_list) @@ -99,9 +122,26 @@ static inline bool drm_mm_initialized(struct drm_mm *mm)  	     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 + * macro sane. + */ +#define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \ +	for (entry = list_entry((mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ +	     &entry->hole_stack != &(mm)->hole_stack ? \ +	     hole_start = drm_mm_hole_node_start(entry), \ +	     hole_end = drm_mm_hole_node_end(entry), \ +	     1 : 0; \ +	     entry = list_entry(entry->hole_stack.next, struct drm_mm_node, hole_stack)) +  /*   * Basic range manager support (drm_mm.c)   */ +extern struct drm_mm_node *drm_mm_create_block(struct drm_mm *mm, +					       unsigned long start, +					       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,  |