aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_mm.c4
-rw-r--r--include/drm/drm_mm.h8
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}
464EXPORT_SYMBOL(drm_mm_init_scan); 465EXPORT_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}
489EXPORT_SYMBOL(drm_mm_init_scan_with_range); 491EXPORT_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
77static inline bool drm_mm_node_allocated(struct drm_mm_node *node) 78static 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 */