[coreboot-gerrit] Patch set updated for coreboot: b631d12 libpayload: Expand setbits_le32() and fix readl() const-ness

Marc Jones (marc.jones@se-eng.com) gerrit at coreboot.org
Fri Jan 9 07:31:34 CET 2015


Marc Jones (marc.jones at se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8129

-gerrit

commit b631d12cea33726caffbce2906df2e388bcccf09
Author: Julius Werner <jwerner at chromium.org>
Date:   Thu Jul 17 10:43:15 2014 -0700

    libpayload: Expand setbits_le32() and fix readl() const-ness
    
    setbits_le32() is not really arch-specific... the arch-specific part of
    accessing memory is wrapped by readl() and writel(), and the endianness
    can be accounted for with the right macros. Generalize the definitions,
    add a be32 version and move them to endian.h so that all platforms can
    use them. Also include endian.h from libpayload.h so we won't update any
    payload's old use of the macros (endianness is something useful enough
    to always have avalable anyway, and shouldn't clash with other things).
    This also fixes a bug where these macros would only be available if
    libpayload-config.h had been independently included before.
    
    Also fix a bug with readl() macros on all archs where they refused to
    work on const pointers (which they should).
    
    CQ-DEPEND=CL:208712
    BUG=None
    TEST=Stuff still compiles. Built and booted on Storm.
    
    Original-Change-Id: I01a7fbadbb5d740675657d95c1e969027562ba8c
    Original-Signed-off-by: Julius Werner <jwerner at chromium.org>
    Original-Reviewed-on: https://chromium-review.googlesource.com/208713
    Original-Reviewed-by: Vadim Bendebury <vbendeb at chromium.org>
    Original-Reviewed-by: David Hendricks <dhendrix at chromium.org>
    (cherry picked from commit 951f8a6d77bc21bd793bf4f228a0965ade586f00)
    Signed-off-by: Marc Jones <marc.jones at se-eng.com>
    
    Change-Id: I51c25f01b200b91abbe32c879905349bb05dc9c8
---
 payloads/libpayload/include/arm/arch/io.h   | 24 ++++++------------------
 payloads/libpayload/include/arm64/arch/io.h | 12 ++++++------
 payloads/libpayload/include/endian.h        | 17 +++++++++++++++++
 payloads/libpayload/include/libpayload.h    |  1 +
 payloads/libpayload/include/x86/arch/io.h   |  6 +++---
 5 files changed, 33 insertions(+), 27 deletions(-)

diff --git a/payloads/libpayload/include/arm/arch/io.h b/payloads/libpayload/include/arm/arch/io.h
index 5cb66dc..4b0a687 100644
--- a/payloads/libpayload/include/arm/arch/io.h
+++ b/payloads/libpayload/include/arm/arch/io.h
@@ -34,22 +34,22 @@
 #include <stdint.h>
 #include <arch/cache.h>
 
-static inline uint8_t readb(volatile void *_a)
+static inline uint8_t readb(volatile const void *_a)
 {
 	dmb();
-	return *(volatile uint8_t *)_a;
+	return *(volatile const uint8_t *)_a;
 }
 
-static inline uint16_t readw(volatile void *_a)
+static inline uint16_t readw(volatile const void *_a)
 {
 	dmb();
-	return *(volatile uint16_t *)_a;
+	return *(volatile const uint16_t *)_a;
 }
 
-static inline uint32_t readl(volatile void *_a)
+static inline uint32_t readl(volatile const void *_a)
 {
 	dmb();
-	return *(volatile uint32_t *)_a;
+	return *(volatile const uint32_t *)_a;
 }
 
 static inline void writeb(uint8_t _v, volatile void *_a)
@@ -73,17 +73,5 @@ static inline void writel(uint32_t _v, volatile void *_a)
 	dmb();
 }
 
-/*
- * Handy bit manipulation macros, BE version will have to be added when/if
- * needed.
- */
-
-#ifdef CONFIG_LP_LITTLE_ENDIAN
-#define clrsetbits_le32(addr, clear, set) writel((readl(addr) & ~(clear)) |\
-						 (set), (addr))
-#define setbits_le32(addr, set) writel(readl(addr) | (set), (addr))
-#define clrbits_le32(addr, clear) writel(readl(addr) & ~(clear), (addr))
-#endif
-
 #endif
 
diff --git a/payloads/libpayload/include/arm64/arch/io.h b/payloads/libpayload/include/arm64/arch/io.h
index 8948e13..df3a0d5 100644
--- a/payloads/libpayload/include/arm64/arch/io.h
+++ b/payloads/libpayload/include/arm64/arch/io.h
@@ -34,22 +34,22 @@
 #include <stdint.h>
 #include <arch/cache.h>
 
-static inline uint8_t readb(volatile void *_a)
+static inline uint8_t readb(volatile const void *_a)
 {
 	dmb();
-	return *(volatile uint8_t *)_a;
+	return *(volatile const uint8_t *)_a;
 }
 
-static inline uint16_t readw(volatile void *_a)
+static inline uint16_t readw(volatile const void *_a)
 {
 	dmb();
-	return *(volatile uint16_t *)_a;
+	return *(volatile const uint16_t *)_a;
 }
 
-static inline uint32_t readl(volatile void *_a)
+static inline uint32_t readl(volatile const void *_a)
 {
 	dmb();
-	return *(volatile uint32_t *)_a;
+	return *(volatile const uint32_t *)_a;
 }
 
 static inline void writeb(uint8_t _v, volatile void *_a)
diff --git a/payloads/libpayload/include/endian.h b/payloads/libpayload/include/endian.h
index dd4d9fa..3b79393 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_ */
diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h
index 21b9da7..5bdd55d 100644
--- a/payloads/libpayload/include/libpayload.h
+++ b/payloads/libpayload/include/libpayload.h
@@ -46,6 +46,7 @@
 #include <libpayload-config.h>
 #include <ctype.h>
 #include <die.h>
+#include <endian.h>
 #include <ipchksum.h>
 #include <stddef.h>
 #include <stdio.h>
diff --git a/payloads/libpayload/include/x86/arch/io.h b/payloads/libpayload/include/x86/arch/io.h
index bcfd307..0cb610f 100644
--- a/payloads/libpayload/include/x86/arch/io.h
+++ b/payloads/libpayload/include/x86/arch/io.h
@@ -31,9 +31,9 @@
 #ifndef _ARCH_IO_H
 #define _ARCH_IO_H
 
-#define readb(_a) (*(volatile unsigned char *) (_a))
-#define readw(_a) (*(volatile unsigned short *) (_a))
-#define readl(_a) (*(volatile unsigned long *) (_a))
+#define readb(_a) (*(volatile const unsigned char *) (_a))
+#define readw(_a) (*(volatile const unsigned short *) (_a))
+#define readl(_a) (*(volatile const unsigned long *) (_a))
 
 #define writeb(_v, _a) (*(volatile unsigned char *) (_a) = (_v))
 #define writew(_v, _a) (*(volatile unsigned short *) (_a) = (_v))



More information about the coreboot-gerrit mailing list