summaryrefslogtreecommitdiff
path: root/payloads/libpayload
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload')
-rw-r--r--payloads/libpayload/include/endian.h55
1 files changed, 42 insertions, 13 deletions
diff --git a/payloads/libpayload/include/endian.h b/payloads/libpayload/include/endian.h
index b387e66243..ec0825dc31 100644
--- a/payloads/libpayload/include/endian.h
+++ b/payloads/libpayload/include/endian.h
@@ -181,18 +181,47 @@ static inline void le32enc(void *pp, uint32_t u)
/* 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))
+#define __clrsetbits(endian, bits, addr, clear, set) \
+ write##bits(addr, hto##endian##bits((endian##bits##toh( \
+ read##bits(addr)) & ~((uint##bits##_t)(clear))) | (set)))
+
+#define clrbits_le64(addr, clear) __clrsetbits(le, 64, addr, clear, 0)
+#define clrbits_be64(addr, clear) __clrsetbits(be, 64, addr, clear, 0)
+#define clrbits_le32(addr, clear) __clrsetbits(le, 32, addr, clear, 0)
+#define clrbits_be32(addr, clear) __clrsetbits(be, 32, addr, clear, 0)
+#define clrbits_le16(addr, clear) __clrsetbits(le, 16, addr, clear, 0)
+#define clrbits_be16(addr, clear) __clrsetbits(be, 16, addr, clear, 0)
+
+#define setbits_le64(addr, set) __clrsetbits(le, 64, addr, 0, set)
+#define setbits_be64(addr, set) __clrsetbits(be, 64, addr, 0, set)
+#define setbits_le32(addr, set) __clrsetbits(le, 32, addr, 0, set)
+#define setbits_be32(addr, set) __clrsetbits(be, 32, addr, 0, set)
+#define setbits_le16(addr, set) __clrsetbits(le, 16, addr, 0, set)
+#define setbits_be16(addr, set) __clrsetbits(be, 16, addr, 0, set)
+
+#define clrsetbits_le64(addr, clear, set) __clrsetbits(le, 64, addr, clear, set)
+#define clrsetbits_be64(addr, clear, set) __clrsetbits(be, 64, addr, clear, set)
+#define clrsetbits_le32(addr, clear, set) __clrsetbits(le, 32, addr, clear, set)
+#define clrsetbits_be32(addr, clear, set) __clrsetbits(be, 32, addr, clear, set)
+#define clrsetbits_le16(addr, clear, set) __clrsetbits(le, 16, addr, clear, set)
+#define clrsetbits_be16(addr, clear, set) __clrsetbits(be, 16, addr, clear, set)
+
+#define __clrsetbits_impl(bits, addr, clear, set) write##bits(addr, \
+ (read##bits(addr) & ~((uint##bits##_t)(clear))) | (set))
+
+#define clrsetbits8(addr, clear, set) __clrsetbits_impl(8, addr, clear, set)
+#define clrsetbits16(addr, clear, set) __clrsetbits_impl(16, addr, clear, set)
+#define clrsetbits32(addr, clear, set) __clrsetbits_impl(32, addr, clear, set)
+#define clrsetbits64(addr, clear, set) __clrsetbits_impl(64, addr, clear, set)
+
+#define setbits8(addr, set) clrsetbits8(addr, 0, set)
+#define setbits16(addr, set) clrsetbits16(addr, 0, set)
+#define setbits32(addr, set) clrsetbits32(addr, 0, set)
+#define setbits64(addr, set) clrsetbits64(addr, 0, set)
+
+#define clrbits8(addr, clear) clrsetbits8(addr, clear, 0)
+#define clrbits16(addr, clear) clrsetbits16(addr, clear, 0)
+#define clrbits32(addr, clear) clrsetbits32(addr, clear, 0)
+#define clrbits64(addr, clear) clrsetbits64(addr, clear, 0)
#endif /* _ENDIAN_H_ */