diff options
-rw-r--r-- | drivers/gpu/drm/drm_mm.c | 4 | ||||
-rw-r--r-- | include/drm/drm_mm.h | 8 |
2 files changed, 12 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index d6432f9e49c1..add1737dae0d 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c | |||
@@ -460,6 +460,7 @@ void drm_mm_init_scan(struct drm_mm *mm, unsigned long size, | |||
460 | mm->scan_hit_start = 0; | 460 | mm->scan_hit_start = 0; |
461 | mm->scan_hit_size = 0; | 461 | mm->scan_hit_size = 0; |
462 | mm->scan_check_range = 0; | 462 | mm->scan_check_range = 0; |
463 | mm->prev_scanned_node = NULL; | ||
463 | } | 464 | } |
464 | EXPORT_SYMBOL(drm_mm_init_scan); | 465 | EXPORT_SYMBOL(drm_mm_init_scan); |
465 | 466 | ||
@@ -485,6 +486,7 @@ void drm_mm_init_scan_with_range(struct drm_mm *mm, unsigned long size, | |||
485 | mm->scan_start = start; | 486 | mm->scan_start = start; |
486 | mm->scan_end = end; | 487 | mm->scan_end = end; |
487 | mm->scan_check_range = 1; | 488 | mm->scan_check_range = 1; |
489 | mm->prev_scanned_node = NULL; | ||
488 | } | 490 | } |
489 | EXPORT_SYMBOL(drm_mm_init_scan_with_range); | 491 | EXPORT_SYMBOL(drm_mm_init_scan_with_range); |
490 | 492 | ||
@@ -514,6 +516,8 @@ int drm_mm_scan_add_block(struct drm_mm_node *node) | |||
514 | prev_node->hole_follows = 1; | 516 | prev_node->hole_follows = 1; |
515 | list_del(&node->node_list); | 517 | list_del(&node->node_list); |
516 | node->node_list.prev = &prev_node->node_list; | 518 | node->node_list.prev = &prev_node->node_list; |
519 | node->node_list.next = &mm->prev_scanned_node->node_list; | ||
520 | mm->prev_scanned_node = node; | ||
517 | 521 | ||
518 | hole_start = drm_mm_hole_node_start(prev_node); | 522 | hole_start = drm_mm_hole_node_start(prev_node); |
519 | hole_end = drm_mm_hole_node_end(prev_node); | 523 | hole_end = drm_mm_hole_node_end(prev_node); |
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index 17a070e11d3c..b1e7809e5e15 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
@@ -72,6 +72,7 @@ struct drm_mm { | |||
72 | unsigned scanned_blocks; | 72 | unsigned scanned_blocks; |
73 | unsigned long scan_start; | 73 | unsigned long scan_start; |
74 | unsigned long scan_end; | 74 | unsigned long scan_end; |
75 | struct drm_mm_node *prev_scanned_node; | ||
75 | }; | 76 | }; |
76 | 77 | ||
77 | static inline bool drm_mm_node_allocated(struct drm_mm_node *node) | 78 | static inline bool drm_mm_node_allocated(struct drm_mm_node *node) |
@@ -86,6 +87,13 @@ static inline bool drm_mm_initialized(struct drm_mm *mm) | |||
86 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ | 87 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ |
87 | &(mm)->head_node.node_list, \ | 88 | &(mm)->head_node.node_list, \ |
88 | 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; \ | ||
94 | entry != NULL; entry = next, \ | ||
95 | next = entry ? list_entry(entry->node_list.next, \ | ||
96 | struct drm_mm_node, node_list) : NULL) \ | ||
89 | /* | 97 | /* |
90 | * Basic range manager support (drm_mm.c) | 98 | * Basic range manager support (drm_mm.c) |
91 | */ | 99 | */ |