Introduce round_up/down() macros
authorSandrine Bailleux <sandrine.bailleux@arm.com>
Thu, 16 Jun 2016 14:05:39 +0000 (15:05 +0100)
committerSandrine Bailleux <sandrine.bailleux@arm.com>
Fri, 8 Jul 2016 13:37:11 +0000 (14:37 +0100)
This patch introduces the round_up() and round_down() macros,
which round up (respectively down) a value to a given boundary.
The boundary must be a power of two.

Change-Id: I589dd1074aeb5ec730dd523b4ebf098d55a7e967

include/lib/utils.h

index d45dff34cd993e951035e374313eb6f49aaf2317..9cc5468b3de029856a7d856767d908eaa0475edb 100644 (file)
 #define IS_POWER_OF_TWO(x)                     \
        (((x) & ((x) - 1)) == 0)
 
+/*
+ * The round_up() macro rounds up a value to the given boundary in a
+ * type-agnostic yet type-safe manner. The boundary must be a power of two.
+ * In other words, it computes the smallest multiple of boundary which is
+ * greater than or equal to value.
+ *
+ * round_down() is similar but rounds the value down instead.
+ */
+#define round_boundary(value, boundary)                \
+       ((__typeof__(value))((boundary) - 1))
+
+#define round_up(value, boundary)              \
+       ((((value) - 1) | round_boundary(value, boundary)) + 1)
+
+#define round_down(value, boundary)            \
+       ((value) & ~round_boundary(value, boundary))
+
 #endif /* __UTILS_H__ */