1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
227811d8cSYinghai Lu #ifndef _LINUX_RANGE_H
327811d8cSYinghai Lu #define _LINUX_RANGE_H
4a4574f63SDan Williams #include <linux/types.h>
527811d8cSYinghai Lu
627811d8cSYinghai Lu struct range {
727811d8cSYinghai Lu u64 start;
827811d8cSYinghai Lu u64 end;
927811d8cSYinghai Lu };
1027811d8cSYinghai Lu
range_len(const struct range * range)11a4574f63SDan Williams static inline u64 range_len(const struct range *range)
12a4574f63SDan Williams {
13a4574f63SDan Williams return range->end - range->start + 1;
14a4574f63SDan Williams }
15a4574f63SDan Williams
16*06cf321aSIra Weiny /* True if r1 completely contains r2 */
range_contains(const struct range * r1,const struct range * r2)1793c177fdSDan Williams static inline bool range_contains(const struct range *r1,
1893c177fdSDan Williams const struct range *r2)
1993c177fdSDan Williams {
2093c177fdSDan Williams return r1->start <= r2->start && r1->end >= r2->end;
2193c177fdSDan Williams }
22*06cf321aSIra Weiny
23*06cf321aSIra Weiny /* True if any part of r1 overlaps r2 */
range_overlaps(const struct range * r1,const struct range * r2)24*06cf321aSIra Weiny static inline bool range_overlaps(const struct range *r1,
25*06cf321aSIra Weiny const struct range *r2)
26*06cf321aSIra Weiny {
27*06cf321aSIra Weiny return r1->start <= r2->end && r1->end >= r2->start;
28*06cf321aSIra Weiny }
2927811d8cSYinghai Lu
3027811d8cSYinghai Lu int add_range(struct range *range, int az, int nr_range,
3127811d8cSYinghai Lu u64 start, u64 end);
3227811d8cSYinghai Lu
3327811d8cSYinghai Lu
3427811d8cSYinghai Lu int add_range_with_merge(struct range *range, int az, int nr_range,
3527811d8cSYinghai Lu u64 start, u64 end);
3627811d8cSYinghai Lu
3727811d8cSYinghai Lu void subtract_range(struct range *range, int az, u64 start, u64 end);
3827811d8cSYinghai Lu
3927811d8cSYinghai Lu int clean_sort_range(struct range *range, int az);
4027811d8cSYinghai Lu
4127811d8cSYinghai Lu void sort_range(struct range *range, int nr_range);
4227811d8cSYinghai Lu
43 #define DEFINE_RANGE(_start, _end) \
44 (struct range) { \
45 .start = (_start), \
46 .end = (_end), \
47 }
48
49 #endif
50