aboutsummaryrefslogtreecommitdiff
path: root/payloads/libpayload/include/endian.h
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload/include/endian.h')
-rw-r--r--payloads/libpayload/include/endian.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/payloads/libpayload/include/endian.h b/payloads/libpayload/include/endian.h
index dd4d9fa2ca..3b79393492 100644
--- a/payloads/libpayload/include/endian.h
+++ b/payloads/libpayload/include/endian.h
@@ -30,6 +30,7 @@
#ifndef _ENDIAN_H_
#define _ENDIAN_H_
+#include <arch/io.h>
#include <arch/types.h>
#include <libpayload-config.h>
@@ -178,4 +179,20 @@ static inline void le32enc(void *pp, uint32_t u)
#define letohl(in) le32toh(in)
#define letohll(in) le64toh(in)
+/* Handy bit manipulation macros */
+
+#define clrsetbits_le32(addr, clear, set) writel(htole32((le32toh(readl(addr)) \
+ & ~(clear)) | (set)), (addr))
+#define setbits_le32(addr, set) writel(htole32(le32toh(readl(addr)) \
+ | (set)), (addr))
+#define clrbits_le32(addr, clear) writel(htole32(le32toh(readl(addr)) \
+ & ~(clear)), (addr))
+
+#define clrsetbits_be32(addr, clear, set) writel(htobe32((be32toh(readl(addr)) \
+ & ~(clear)) | (set)), (addr))
+#define setbits_be32(addr, set) writel(htobe32(be32toh(readl(addr)) \
+ | (set)), (addr))
+#define clrbits_be32(addr, clear) writel(htobe32(be32toh(readl(addr)) \
+ & ~(clear)), (addr))
+
#endif /* _ENDIAN_H_ */