Lines Matching refs:scan
781 * DOC: lru scan roster
791 * interfaces. First a scan operation needs to be initialized with
801 * in the scan mode no other operation is allowed.
804 * reported true) in the scan, and any overlapping nodes after color adjustment
808 * scan operation even begins this is linear in the number of objects. It
814 * @scan: scan state
815 * @mm: drm_mm to scan
827 * As long as the scan list is non-empty, no other operations than
828 * adding/removing nodes to/from the scan list are allowed.
830 void drm_mm_scan_init_with_range(struct drm_mm_scan *scan,
843 scan->mm = mm;
848 scan->color = color;
849 scan->alignment = alignment;
850 scan->remainder_mask = is_power_of_2(alignment) ? alignment - 1 : 0;
851 scan->size = size;
852 scan->mode = mode;
855 scan->range_start = start;
856 scan->range_end = end;
858 scan->hit_start = U64_MAX;
859 scan->hit_end = 0;
864 * drm_mm_scan_add_block - add a node to the scan list
865 * @scan: the active drm_mm scanner
868 * Add a node to the scan list that might be freed to make space for the desired
874 bool drm_mm_scan_add_block(struct drm_mm_scan *scan,
877 struct drm_mm *mm = scan->mm;
904 mm->color_adjust(hole, scan->color, &col_start, &col_end);
906 adj_start = max(col_start, scan->range_start);
907 adj_end = min(col_end, scan->range_end);
908 if (adj_end <= adj_start || adj_end - adj_start < scan->size)
911 if (scan->mode == DRM_MM_INSERT_HIGH)
912 adj_start = adj_end - scan->size;
914 if (scan->alignment) {
917 if (likely(scan->remainder_mask))
918 rem = adj_start & scan->remainder_mask;
920 div64_u64_rem(adj_start, scan->alignment, &rem);
923 if (scan->mode != DRM_MM_INSERT_HIGH)
924 adj_start += scan->alignment;
925 if (adj_start < max(col_start, scan->range_start) ||
926 min(col_end, scan->range_end) - adj_start < scan->size)
930 adj_end - adj_start < scan->size)
935 scan->hit_start = adj_start;
936 scan->hit_end = adj_start + scan->size;
938 DRM_MM_BUG_ON(scan->hit_start >= scan->hit_end);
939 DRM_MM_BUG_ON(scan->hit_start < hole_start);
940 DRM_MM_BUG_ON(scan->hit_end > hole_end);
947 * drm_mm_scan_remove_block - remove a node from the scan list
948 * @scan: the active drm_mm scanner
951 * Nodes **must** be removed in exactly the reverse order from the scan list as
956 * When the scan list is empty, the selected memory nodes can be freed. An
965 bool drm_mm_scan_remove_block(struct drm_mm_scan *scan,
970 DRM_MM_BUG_ON(node->mm != scan->mm);
990 return (node->start + node->size > scan->hit_start &&
991 node->start < scan->hit_end);
997 * @scan: drm_mm scan with target hole
999 * After completing an eviction scan and removing the selected nodes, we may
1006 struct drm_mm_node *drm_mm_scan_color_evict(struct drm_mm_scan *scan)
1008 struct drm_mm *mm = scan->mm;
1026 if (hole_start <= scan->hit_start &&
1027 hole_end >= scan->hit_end)
1036 DRM_MM_BUG_ON(hole_start > scan->hit_start);
1037 DRM_MM_BUG_ON(hole_end < scan->hit_end);
1039 mm->color_adjust(hole, scan->color, &hole_start, &hole_end);
1040 if (hole_start > scan->hit_start)
1042 if (hole_end < scan->hit_end)