aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2015-02-23 14:31:09 -0800
committerPatrick Georgi <pgeorgi@google.com>2015-04-21 08:23:25 +0200
commit9ff8f6f818d4e5a8aa0fe21cbfaba9ccd865bc7b (patch)
treebc668e3ddf5f0abf9fc5c5f7911e29895bee46a6
parent941847652406982f3c9944fdd98cce4029b533fb (diff)
downloadcoreboot-9ff8f6f818d4e5a8aa0fe21cbfaba9ccd865bc7b.tar.gz
coreboot-9ff8f6f818d4e5a8aa0fe21cbfaba9ccd865bc7b.tar.xz
coreboot-9ff8f6f818d4e5a8aa0fe21cbfaba9ccd865bc7b.zip
Unify byte order macros and clrsetbits
This patch removes quite a bit of code duplication between cpu_to_le32() and clrsetbits_le32() style macros on the different architectures. This also syncs those macros back up to the new write32(a, v) style IO accessor macros that are now used on ARM and ARM64. CQ-DEPEND=CL:254862 BRANCH=none BUG=chromium:444723 TEST=Compiled Cosmos, Daisy, Blaze, Falco, Pinky, Pit, Rambi, Ryu, Storm and Urara. Booted on Jerry. Tried to compare binary images... unfortunately something about the new macro notation makes the compiler evaluate it more efficiently (not recalculating the address between the read and the write), so this was of limited value. Change-Id: If8ab62912c952d68a67a0f71e82b038732cd1317 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: fd43bf446581bfb84bec4f2ebb56b5de95971c3b Original-Change-Id: I7d301b5bb5ac0db7f5ff39e3adc2b28a1f402a72 Original-Signed-off-by: Julius Werner <jwerner@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/254866 Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/9838 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
-rw-r--r--src/arch/arm/include/arch/byteorder.h21
-rw-r--r--src/arch/arm/include/arch/io.h96
-rw-r--r--src/arch/arm/include/armv4/arch/io.h (renamed from src/arch/arm/include/armv4/arch/arch_io.h)7
-rw-r--r--src/arch/arm/include/armv7/arch/io.h (renamed from src/arch/arm/include/armv7/arch/arch_io.h)7
-rw-r--r--src/arch/arm64/include/arch/byteorder.h21
-rw-r--r--src/arch/arm64/include/arch/io.h94
-rw-r--r--src/arch/arm64/include/armv8/arch/io.h (renamed from src/arch/arm64/include/armv8/arch/arch_io.h)7
-rw-r--r--src/arch/mips/include/arch/byteorder.h21
-rw-r--r--src/arch/mips/include/arch/io.h57
-rw-r--r--src/arch/riscv/include/arch/byteorder.h21
-rw-r--r--src/arch/x86/boot/smbios.c2
-rw-r--r--src/arch/x86/include/arch/byteorder.h21
-rw-r--r--src/arch/x86/include/arch/cbfs.h2
-rw-r--r--src/arch/x86/include/arch/io.h1
-rw-r--r--src/device/oprom/yabel/device.h2
-rw-r--r--src/device/oprom/yabel/vbe.c2
-rw-r--r--src/drivers/i2c/tpm/tis.c2
-rw-r--r--src/drivers/i2c/tpm/tpm.c2
-rw-r--r--src/drivers/pc80/tpm/tpm.c1
-rw-r--r--src/drivers/usb/ehci_debug.c1
-rw-r--r--src/include/device/pci_rom.h2
-rw-r--r--src/include/endian.h67
-rw-r--r--src/lib/edid.c1
-rw-r--r--src/lib/selfboot.c2
-rw-r--r--src/mainboard/amd/inagua/broadcom.c2
-rw-r--r--src/mainboard/google/butterfly/romstage.c1
-rw-r--r--src/mainboard/google/link/romstage.c1
-rw-r--r--src/mainboard/google/parrot/romstage.c1
-rw-r--r--src/mainboard/google/samus/spd/spd.c2
-rw-r--r--src/mainboard/google/stout/romstage.c1
-rw-r--r--src/mainboard/samsung/lumpy/romstage.c1
-rw-r--r--src/mainboard/samsung/stumpy/romstage.c1
32 files changed, 92 insertions, 378 deletions
diff --git a/src/arch/arm/include/arch/byteorder.h b/src/arch/arm/include/arch/byteorder.h
index 8dc069f48..3478bdb3c 100644
--- a/src/arch/arm/include/arch/byteorder.h
+++ b/src/arch/arm/include/arch/byteorder.h
@@ -3,25 +3,4 @@
#define __LITTLE_ENDIAN 1234
-#include <stdint.h>
-#include <swab.h>
-
-#define cpu_to_le64(x) ((uint64_t)(x))
-#define le64_to_cpu(x) ((uint64_t)(x))
-#define cpu_to_le32(x) ((uint32_t)(x))
-#define le32_to_cpu(x) ((uint32_t)(x))
-#define cpu_to_le16(x) ((uint16_t)(x))
-#define le16_to_cpu(x) ((uint16_t)(x))
-#define cpu_to_be64(x) swab64(x)
-#define be64_to_cpu(x) swab64(x)
-#define cpu_to_be32(x) swab32((x))
-#define be32_to_cpu(x) swab32((x))
-#define cpu_to_be16(x) swab16((x))
-#define be16_to_cpu(x) swab16((x))
-
-#define ntohll(x) be64_to_cpu(x)
-#define htonll(x) cpu_to_be64(x)
-#define ntohl(x) be32_to_cpu(x)
-#define htonl(x) cpu_to_be32(x)
-
#endif /* _BYTEORDER_H */
diff --git a/src/arch/arm/include/arch/io.h b/src/arch/arm/include/arch/io.h
deleted file mode 100644
index 51d96b925..000000000
--- a/src/arch/arm/include/arch/io.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Originally imported from linux/include/asm-arm/io.h. This file has changed
- * substantially since then.
- *
- * Copyright 2013 Google Inc.
- * Copyright (C) 1996-2000 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Modifications:
- * 08-Apr-2013 G Replaced several macros with inlines for type safety.
- * 16-Sep-1996 RMK Inlined the inx/outx functions & optimised for both
- * constant addresses and variable addresses.
- * 04-Dec-1997 RMK Moved a lot of this stuff to the new architecture
- * specific IO header files.
- * 27-Mar-1999 PJB Second parameter of memcpy_toio is const..
- * 04-Apr-1999 PJB Added check_signature.
- * 12-Dec-1999 RMK More cleanups
- * 18-Jun-2000 RMK Removed virt_to_* and friends definitions
- */
-#ifndef __ASM_ARM_IO_H
-#define __ASM_ARM_IO_H
-
-#include <arch/byteorder.h>
-#include <arch/arch_io.h>
-#include <stdint.h>
-
-/*
- * FIXME: These are to avoid breaking existing ARM code. We should eventually
- * re-factor all code to specify the data length intended.
- */
-#define readb(a) read8(a)
-#define writeb(v,a) write8(a,v)
-#define readw(a) read16(a)
-#define writew(v,a) write16(a,v)
-#define readl(a) read32(a)
-#define writel(v,a) write32(a,v)
-
-/*
- * Clear and set bits in one shot. These macros can be used to clear and
- * set multiple bits in a register using a single call. These macros can
- * also be used to set a multiple-bit bit pattern using a mask, by
- * specifying the mask in the 'clear' parameter and the new bit pattern
- * in the 'set' parameter.
- */
-
-#define out_arch(type,endian,a,v) write##type(cpu_to_##endian(v),a)
-#define in_arch(type,endian,a) endian##_to_cpu(read##type(a))
-
-#define out_le32(a,v) out_arch(l,le32,a,v)
-#define out_le16(a,v) out_arch(w,le16,a,v)
-
-#define in_le32(a) in_arch(l,le32,a)
-#define in_le16(a) in_arch(w,le16,a)
-
-#define out_be32(a,v) out_arch(l,be32,a,v)
-#define out_be16(a,v) out_arch(w,be16,a,v)
-
-#define in_be32(a) in_arch(l,be32,a)
-#define in_be16(a) in_arch(w,be16,a)
-
-#define out_8(a,v) writeb(v,a)
-#define in_8(a) readb(a)
-
-#define clrbits(type, addr, clear) \
- out_##type((addr), in_##type(addr) & ~(clear))
-
-#define setbits(type, addr, set) \
- out_##type((addr), in_##type(addr) | (set))
-
-#define clrsetbits(type, addr, clear, set) \
- out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
-
-#define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
-#define setbits_be32(addr, set) setbits(be32, addr, set)
-#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
-
-#define clrbits_le32(addr, clear) clrbits(le32, addr, clear)
-#define setbits_le32(addr, set) setbits(le32, addr, set)
-#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
-
-#define clrbits_be16(addr, clear) clrbits(be16, addr, clear)
-#define setbits_be16(addr, set) setbits(be16, addr, set)
-#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
-
-#define clrbits_le16(addr, clear) clrbits(le16, addr, clear)
-#define setbits_le16(addr, set) setbits(le16, addr, set)
-#define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
-
-#define clrbits_8(addr, clear) clrbits(8, addr, clear)
-#define setbits_8(addr, set) setbits(8, addr, set)
-#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
-
-#endif /* __ASM_ARM_IO_H */
diff --git a/src/arch/arm/include/armv4/arch/arch_io.h b/src/arch/arm/include/armv4/arch/io.h
index cf5a9e115..12af03827 100644
--- a/src/arch/arm/include/armv4/arch/arch_io.h
+++ b/src/arch/arm/include/armv4/arch/io.h
@@ -20,9 +20,10 @@
* 12-Dec-1999 RMK More cleanups
* 18-Jun-2000 RMK Removed virt_to_* and friends definitions
*/
-#ifndef __ASM_ARM_ARCH_IO_H
-#define __ASM_ARM_ARCH_IO_H
+#ifndef __ARCH_IO_H
+#define __ARCH_IO_H
+#include <endian.h>
#include <stdint.h>
static inline uint8_t read8(const void *addr)
@@ -55,4 +56,4 @@ static inline void write32(void *addr, uint32_t val)
*(volatile uint32_t *)addr = val;
}
-#endif /* __ASM_ARM_ARCH_IO_H */
+#endif /* __ARCH_IO_H */
diff --git a/src/arch/arm/include/armv7/arch/arch_io.h b/src/arch/arm/include/armv7/arch/io.h
index 53eafc696..9d060032e 100644
--- a/src/arch/arm/include/armv7/arch/arch_io.h
+++ b/src/arch/arm/include/armv7/arch/io.h
@@ -20,10 +20,11 @@
* 12-Dec-1999 RMK More cleanups
* 18-Jun-2000 RMK Removed virt_to_* and friends definitions
*/
-#ifndef __ASM_ARM_ARCH_IO_H
-#define __ASM_ARM_ARCH_IO_H
+#ifndef __ARCH_IO_H
+#define __ARCH_IO_H
#include <arch/cache.h> /* for dmb() */
+#include <endian.h>
#include <stdint.h>
static inline uint8_t read8(const void *addr)
@@ -65,4 +66,4 @@ static inline void write32(void *addr, uint32_t val)
dmb();
}
-#endif /* __ASM_ARM_ARCH_IO_H */
+#endif /* __ARCH_IO_H */
diff --git a/src/arch/arm64/include/arch/byteorder.h b/src/arch/arm64/include/arch/byteorder.h
index 8dc069f48..3478bdb3c 100644
--- a/src/arch/arm64/include/arch/byteorder.h
+++ b/src/arch/arm64/include/arch/byteorder.h
@@ -3,25 +3,4 @@
#define __LITTLE_ENDIAN 1234
-#include <stdint.h>
-#include <swab.h>
-
-#define cpu_to_le64(x) ((uint64_t)(x))
-#define le64_to_cpu(x) ((uint64_t)(x))
-#define cpu_to_le32(x) ((uint32_t)(x))
-#define le32_to_cpu(x) ((uint32_t)(x))
-#define cpu_to_le16(x) ((uint16_t)(x))
-#define le16_to_cpu(x) ((uint16_t)(x))
-#define cpu_to_be64(x) swab64(x)
-#define be64_to_cpu(x) swab64(x)
-#define cpu_to_be32(x) swab32((x))
-#define be32_to_cpu(x) swab32((x))
-#define cpu_to_be16(x) swab16((x))
-#define be16_to_cpu(x) swab16((x))
-
-#define ntohll(x) be64_to_cpu(x)
-#define htonll(x) cpu_to_be64(x)
-#define ntohl(x) be32_to_cpu(x)
-#define htonl(x) cpu_to_be32(x)
-
#endif /* _BYTEORDER_H */
diff --git a/src/arch/arm64/include/arch/io.h b/src/arch/arm64/include/arch/io.h
deleted file mode 100644
index 9ec13dcf8..000000000
--- a/src/arch/arm64/include/arch/io.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Originally imported from linux/include/asm-arm/io.h. This file has changed
- * substantially since then.
- *
- * Copyright 2013 Google Inc.
- * Copyright (C) 1996-2000 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Modifications:
- * 08-Apr-2013 G Replaced several macros with inlines for type safety.
- * 16-Sep-1996 RMK Inlined the inx/outx functions & optimised for both
- * constant addresses and variable addresses.
- * 04-Dec-1997 RMK Moved a lot of this stuff to the new architecture
- * specific IO header files.
- * 27-Mar-1999 PJB Second parameter of memcpy_toio is const..
- * 04-Apr-1999 PJB Added check_signature.
- * 12-Dec-1999 RMK More cleanups
- * 18-Jun-2000 RMK Removed virt_to_* and friends definitions
- */
-#ifndef __ASM_ARM64_IO_H
-#define __ASM_ARM64_IO_H
-
-#include <arch/byteorder.h>
-#include <arch/arch_io.h>
-#include <stdint.h>
-
-/*
- * FIXME: These are to avoid breaking existing ARM code. We should eventually
- * re-factor all code to specify the data length intended.
- */
-#define readb(a) read8(a)
-#define writeb(v,a) write8(a,v)
-#define readl(a) read32(a)
-#define writel(v,a) write32(a,v)
-
-/*
- * Clear and set bits in one shot. These macros can be used to clear and
- * set multiple bits in a register using a single call. These macros can
- * also be used to set a multiple-bit bit pattern using a mask, by
- * specifying the mask in the 'clear' parameter and the new bit pattern
- * in the 'set' parameter.
- */
-
-#define out_arch(type,endian,a,v) write##type(cpu_to_##endian(v),a)
-#define in_arch(type,endian,a) endian##_to_cpu(read##type(a))
-
-#define out_le32(a,v) out_arch(l,le32,a,v)
-#define out_le16(a,v) out_arch(w,le16,a,v)
-
-#define in_le32(a) in_arch(l,le32,a)
-#define in_le16(a) in_arch(w,le16,a)
-
-#define out_be32(a,v) out_arch(l,be32,a,v)
-#define out_be16(a,v) out_arch(w,be16,a,v)
-
-#define in_be32(a) in_arch(l,be32,a)
-#define in_be16(a) in_arch(w,be16,a)
-
-#define out_8(a,v) writeb(v,a)
-#define in_8(a) readb(a)
-
-#define clrbits(type, addr, clear) \
- out_##type((addr), in_##type(addr) & ~(clear))
-
-#define setbits(type, addr, set) \
- out_##type((addr), in_##type(addr) | (set))
-
-#define clrsetbits(type, addr, clear, set) \
- out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
-
-#define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
-#define setbits_be32(addr, set) setbits(be32, addr, set)
-#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
-
-#define clrbits_le32(addr, clear) clrbits(le32, addr, clear)
-#define setbits_le32(addr, set) setbits(le32, addr, set)
-#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
-
-#define clrbits_be16(addr, clear) clrbits(be16, addr, clear)
-#define setbits_be16(addr, set) setbits(be16, addr, set)
-#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
-
-#define clrbits_le16(addr, clear) clrbits(le16, addr, clear)
-#define setbits_le16(addr, set) setbits(le16, addr, set)
-#define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
-
-#define clrbits_8(addr, clear) clrbits(8, addr, clear)
-#define setbits_8(addr, set) setbits(8, addr, set)
-#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
-
-#endif /* __ASM_ARM64_IO_H */
diff --git a/src/arch/arm64/include/armv8/arch/arch_io.h b/src/arch/arm64/include/armv8/arch/io.h
index 96a15d72a..bac64c3d1 100644
--- a/src/arch/arm64/include/armv8/arch/arch_io.h
+++ b/src/arch/arm64/include/armv8/arch/io.h
@@ -20,9 +20,10 @@
* 12-Dec-1999 RMK More cleanups
* 18-Jun-2000 RMK Removed virt_to_* and friends definitions
*/
-#ifndef __ASM_ARM64_ARCH_IO_H
-#define __ASM_ARM64_ARCH_IO_H
+#ifndef __ARCH_IO_H
+#define __ARCH_IO_H
+#include <endian.h>
#include <stdint.h>
#include <arch/barrier.h>
#include <arch/lib_helpers.h>
@@ -66,4 +67,4 @@ static inline void write32(void *addr, uint32_t val)
dmb();
}
-#endif /* __ASM_ARM64_ARCH_IO_H */
+#endif /* __ARCH_IO_H */
diff --git a/src/arch/mips/include/arch/byteorder.h b/src/arch/mips/include/arch/byteorder.h
index 90c375e69..a70ce82ba 100644
--- a/src/arch/mips/include/arch/byteorder.h
+++ b/src/arch/mips/include/arch/byteorder.h
@@ -20,29 +20,10 @@
#ifndef __MIPS_ARCH_BYTEORDER_H
#define __MIPS_ARCH_BYTEORDER_H
-#include <stdint.h>
-#include <swab.h>
-
#ifndef __ORDER_LITTLE_ENDIAN__
#errror "What endian are you!?"
#endif
-#define cpu_to_le64(x) ((uint64_t)(x))
-#define le64_to_cpu(x) ((uint64_t)(x))
-#define cpu_to_le32(x) ((uint32_t)(x))
-#define le32_to_cpu(x) ((uint32_t)(x))
-#define cpu_to_le16(x) ((uint16_t)(x))
-#define le16_to_cpu(x) ((uint16_t)(x))
-#define cpu_to_be64(x) swab64(x)
-#define be64_to_cpu(x) swab64(x)
-#define cpu_to_be32(x) swab32((x))
-#define be32_to_cpu(x) swab32((x))
-#define cpu_to_be16(x) swab16((x))
-#define be16_to_cpu(x) swab16((x))
-
-#define ntohll(x) be64_to_cpu(x)
-#define htonll(x) cpu_to_be64(x)
-#define ntohl(x) be32_to_cpu(x)
-#define htonl(x) cpu_to_be32(x)
+#define __LITTLE_ENDIAN 1234
#endif /* __MIPS_ARCH_BYTEORDER_H */
diff --git a/src/arch/mips/include/arch/io.h b/src/arch/mips/include/arch/io.h
index d034b09dc..1d3d6c450 100644
--- a/src/arch/mips/include/arch/io.h
+++ b/src/arch/mips/include/arch/io.h
@@ -26,7 +26,7 @@
#include <types.h>
#include <arch/cache.h>
-#include <arch/byteorder.h>
+#include <endian.h>
static inline uint8_t read8(unsigned long addr)
{
@@ -67,59 +67,4 @@ static inline void write32(unsigned long addr, uint32_t val)
asm("sync");
}
-/*
- * Clear and set bits in one shot. These macros can be used to clear and
- * set multiple bits in a register using a single call. These macros can
- * also be used to set a multiple-bit bit pattern using a mask, by
- * specifying the mask in the 'clear' parameter and the new bit pattern
- * in the 'set' parameter.
- */
-
-#define out_arch(type, endian, a, v) write##type(cpu_to_##endian(v), a)
-#define in_arch(type, endian, a) endian##_to_cpu(read##type(a))
-
-#define out_le32(a, v) out_arch(l, le32, a, v)
-#define out_le16(a, v) out_arch(w, le16, a, v)
-
-#define in_le32(a) in_arch(l, le32, a)
-#define in_le16(a) in_arch(w, le16, a)
-
-#define out_be32(a, v) out_arch(l, be32, a, v)
-#define out_be16(a, v) out_arch(w, be16, a, v)
-
-#define in_be32(a) in_arch(l, be32, a)
-#define in_be16(a) in_arch(w, be16, a)
-
-#define out_8(a, v) writeb(v, a)
-#define in_8(a) readb(a)
-
-#define clrbits(type, addr, clear) \
- out_##type((addr), in_##type(addr) & ~(clear))
-
-#define setbits(type, addr, set) \
- out_##type((addr), in_##type(addr) | (set))
-
-#define clrsetbits(type, addr, clear, set) \
- out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
-
-#define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
-#define setbits_be32(addr, set) setbits(be32, addr, set)
-#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
-
-#define clrbits_le32(addr, clear) clrbits(le32, addr, clear)
-#define setbits_le32(addr, set) setbits(le32, addr, set)
-#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
-
-#define clrbits_be16(addr, clear) clrbits(be16, addr, clear)
-#define setbits_be16(addr, set) setbits(be16, addr, set)
-#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
-
-#define clrbits_le16(addr, clear) clrbits(le16, addr, clear)
-#define setbits_le16(addr, set) setbits(le16, addr, set)
-#define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
-
-#define clrbits_8(addr, clear) clrbits(8, addr, clear)
-#define setbits_8(addr, set) setbits(8, addr, set)
-#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
-
#endif /* __MIPS_ARCH_IO_H */
diff --git a/src/arch/riscv/include/arch/byteorder.h b/src/arch/riscv/include/arch/byteorder.h
index 8dc069f48..3478bdb3c 100644
--- a/src/arch/riscv/include/arch/byteorder.h
+++ b/src/arch/riscv/include/arch/byteorder.h
@@ -3,25 +3,4 @@
#define __LITTLE_ENDIAN 1234
-#include <stdint.h>
-#include <swab.h>
-
-#define cpu_to_le64(x) ((uint64_t)(x))
-#define le64_to_cpu(x) ((uint64_t)(x))
-#define cpu_to_le32(x) ((uint32_t)(x))
-#define le32_to_cpu(x) ((uint32_t)(x))
-#define cpu_to_le16(x) ((uint16_t)(x))
-#define le16_to_cpu(x) ((uint16_t)(x))
-#define cpu_to_be64(x) swab64(x)
-#define be64_to_cpu(x) swab64(x)
-#define cpu_to_be32(x) swab32((x))
-#define be32_to_cpu(x) swab32((x))
-#define cpu_to_be16(x) swab16((x))
-#define be16_to_cpu(x) swab16((x))
-
-#define ntohll(x) be64_to_cpu(x)
-#define htonll(x) cpu_to_be64(x)
-#define ntohl(x) be32_to_cpu(x)
-#define htonl(x) cpu_to_be32(x)
-
#endif /* _BYTEORDER_H */
diff --git a/src/arch/x86/boot/smbios.c b/src/arch/x86/boot/smbios.c
index 0ba793f39..c3ac54ab8 100644
--- a/src/arch/x86/boot/smbios.c
+++ b/src/arch/x86/boot/smbios.c
@@ -28,8 +28,8 @@
#include <device/device.h>
#include <arch/cpu.h>
#include <cpu/x86/name.h>
-#include <arch/byteorder.h>
#include <elog.h>
+#include <endian.h>
#include <memory_info.h>
#include <spd.h>
#include <cbmem.h>
diff --git a/src/arch/x86/include/arch/byteorder.h b/src/arch/x86/include/arch/byteorder.h
index 8dc069f48..3478bdb3c 100644
--- a/src/arch/x86/include/arch/byteorder.h
+++ b/src/arch/x86/include/arch/byteorder.h
@@ -3,25 +3,4 @@
#define __LITTLE_ENDIAN 1234
-#include <stdint.h>
-#include <swab.h>
-
-#define cpu_to_le64(x) ((uint64_t)(x))
-#define le64_to_cpu(x) ((uint64_t)(x))
-#define cpu_to_le32(x) ((uint32_t)(x))
-#define le32_to_cpu(x) ((uint32_t)(x))
-#define cpu_to_le16(x) ((uint16_t)(x))
-#define le16_to_cpu(x) ((uint16_t)(x))
-#define cpu_to_be64(x) swab64(x)
-#define be64_to_cpu(x) swab64(x)
-#define cpu_to_be32(x) swab32((x))
-#define be32_to_cpu(x) swab32((x))
-#define cpu_to_be16(x) swab16((x))
-#define be16_to_cpu(x) swab16((x))
-
-#define ntohll(x) be64_to_cpu(x)
-#define htonll(x) cpu_to_be64(x)
-#define ntohl(x) be32_to_cpu(x)
-#define htonl(x) cpu_to_be32(x)
-
#endif /* _BYTEORDER_H */
diff --git a/src/arch/x86/include/arch/cbfs.h b/src/arch/x86/include/arch/cbfs.h
index f2aed3b01..4a5a3c2ef 100644
--- a/src/arch/x86/include/arch/cbfs.h
+++ b/src/arch/x86/include/arch/cbfs.h
@@ -20,8 +20,8 @@
#ifndef __INCLUDE_ARCH_CBFS__
#define __INCLUDE_ARCH_CBFS__
-#include <arch/byteorder.h>
#include <cbfs_serialized.h>
+#include <endian.h>
#define CBFS_SUBHEADER(_p) ( (void *) ((((uint8_t *) (_p)) + ntohl((_p)->offset))) )
diff --git a/src/arch/x86/include/arch/io.h b/src/arch/x86/include/arch/io.h
index 3130f6472..ce9477358 100644
--- a/src/arch/x86/include/arch/io.h
+++ b/src/arch/x86/include/arch/io.h
@@ -1,6 +1,7 @@
#ifndef _ASM_IO_H
#define _ASM_IO_H
+#include <endian.h>
#include <stdint.h>
#include <rules.h>
diff --git a/src/device/oprom/yabel/device.h b/src/device/oprom/yabel/device.h
index 63f1d8e50..5259125f7 100644
--- a/src/device/oprom/yabel/device.h
+++ b/src/device/oprom/yabel/device.h
@@ -15,7 +15,7 @@
#define DEVICE_LIB_H
#include <types.h>
-#include <arch/byteorder.h>
+#include <endian.h>
#include "compat/of.h"
#include "debug.h"
diff --git a/src/device/oprom/yabel/vbe.c b/src/device/oprom/yabel/vbe.c
index 6354afe92..ab92c0ad2 100644
--- a/src/device/oprom/yabel/vbe.c
+++ b/src/device/oprom/yabel/vbe.c
@@ -17,7 +17,7 @@
#include <boot/coreboot_tables.h>
#endif
-#include <arch/byteorder.h>
+#include <endian.h>
#include "debug.h"
diff --git a/src/drivers/i2c/tpm/tis.c b/src/drivers/i2c/tpm/tis.c
index d9a765100..47823e895 100644
--- a/src/drivers/i2c/tpm/tis.c
+++ b/src/drivers/i2c/tpm/tis.c
@@ -25,8 +25,8 @@
#include <string.h>
#include <assert.h>
#include <delay.h>
-#include <arch/byteorder.h>
#include <device/i2c.h>
+#include <endian.h>
#include <tpm.h>
#include "tpm.h"
#include <timer.h>
diff --git a/src/drivers/i2c/tpm/tpm.c b/src/drivers/i2c/tpm/tpm.c
index 63ef29547..830a04b04 100644
--- a/src/drivers/i2c/tpm/tpm.c
+++ b/src/drivers/i2c/tpm/tpm.c
@@ -41,8 +41,8 @@
#include <types.h>
#include <delay.h>
#include <console/console.h>
-#include <arch/byteorder.h>
#include <device/i2c.h>
+#include <endian.h>
#include "tpm.h"
/* Address of the TPM on the I2C bus */
diff --git a/src/drivers/pc80/tpm/tpm.c b/src/drivers/pc80/tpm/tpm.c
index 22dbc4114..8006894da 100644
--- a/src/drivers/pc80/tpm/tpm.c
+++ b/src/drivers/pc80/tpm/tpm.c
@@ -31,7 +31,6 @@
#include <string.h>
#include <delay.h>
#include <arch/io.h>
-#include <arch/byteorder.h>
#include <console/console.h>
#include <tpm.h>
#include <arch/early_variables.h>
diff --git a/src/drivers/usb/ehci_debug.c b/src/drivers/usb/ehci_debug.c
index 379a1bdeb..16f9164f6 100644
--- a/src/drivers/usb/ehci_debug.c
+++ b/src/drivers/usb/ehci_debug.c
@@ -22,7 +22,6 @@
#include <console/console.h>
#include <console/usb.h>
#include <arch/io.h>
-#include <arch/byteorder.h>
#include <arch/early_variables.h>
#include <string.h>
#include <cbmem.h>
diff --git a/src/include/device/pci_rom.h b/src/include/device/pci_rom.h
index a92920631..2fb2f7a8d 100644
--- a/src/include/device/pci_rom.h
+++ b/src/include/device/pci_rom.h
@@ -1,6 +1,6 @@
#ifndef PCI_ROM_H
#define PCI_ROM_H
-#include <arch/byteorder.h>
+#include <endian.h>
#include <stddef.h>
#define PCI_ROM_HDR 0xAA55
diff --git a/src/include/endian.h b/src/include/endian.h
index b511a491a..ce6d7c3c2 100644
--- a/src/include/endian.h
+++ b/src/include/endian.h
@@ -21,5 +21,72 @@
#define _ENDIAN_H_
#include <arch/byteorder.h>
+#include <stdint.h>
+#include <swab.h>
+
+#if defined(__LITTLE_ENDIAN)
+ #define cpu_to_le64(x) ((uint64_t)(x))
+ #define le64_to_cpu(x) ((uint64_t)(x))
+ #define cpu_to_le32(x) ((uint32_t)(x))
+ #define le32_to_cpu(x) ((uint32_t)(x))
+ #define cpu_to_le16(x) ((uint16_t)(x))
+ #define le16_to_cpu(x) ((uint16_t)(x))
+ #define cpu_to_be64(x) swab64(x)
+ #define be64_to_cpu(x) swab64(x)
+ #define cpu_to_be32(x) swab32(x)
+ #define be32_to_cpu(x) swab32(x)
+ #define cpu_to_be16(x) swab16(x)
+ #define be16_to_cpu(x) swab16(x)
+#elif defined(__BIG_ENDIAN)
+ #define cpu_to_le64(x) swab64(x)
+ #define le64_to_cpu(x) swab64(x)
+ #define cpu_to_le32(x) swab32(x)
+ #define le32_to_cpu(x) swab32(x)
+ #define cpu_to_le16(x) swab16(x)
+ #define le16_to_cpu(x) swab16(x)
+ #define cpu_to_be64(x) ((uint64_t)(x))
+ #define be64_to_cpu(x) ((uint64_t)(x))
+ #define cpu_to_be32(x) ((uint32_t)(x))
+ #define be32_to_cpu(x) ((uint32_t)(x))
+ #define cpu_to_be16(x) ((uint16_t)(x))
+ #define be16_to_cpu(x) ((uint16_t)(x))
+#else
+ #error "<arch/byteorder.h> must #define __LITTLE_ENDIAN or __BIG_ENDIAN"
+#endif
+
+#define ntohll(x) be64_to_cpu(x)
+#define htonll(x) cpu_to_be64(x)
+#define ntohl(x) be32_to_cpu(x)
+#define htonl(x) cpu_to_be32(x)
+
+#define __clrsetbits(endian, bits, addr, clear, set) \
+ write##bits(addr, cpu_to_##endian##bits((endian##bits##_to_cpu( \
+ 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_8(addr, clear, set) \
+ write8(addr, (read8(addr) & ~(clear)) | (set))
+#define clrbits_8(addr, clear) clrsetbits_8(addr, clear, 0)
+#define setbits_8(addr, set) setbits_8(addr, 0, set)
#endif
diff --git a/src/lib/edid.c b/src/lib/edid.c
index 2242d1c3d..db0f412ba 100644
--- a/src/lib/edid.c
+++ b/src/lib/edid.c
@@ -31,7 +31,6 @@
#include <stddef.h>
#include <console/console.h>
#include <arch/io.h>
-#include <arch/byteorder.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index d73b3f56a..edf36e707 100644
--- a/src/lib/selfboot.c
+++ b/src/lib/selfboot.c
@@ -18,9 +18,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
*/
-#include <arch/byteorder.h>
#include <console/console.h>
#include <cpu/cpu.h>
+#include <endian.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
diff --git a/src/mainboard/amd/inagua/broadcom.c b/src/mainboard/amd/inagua/broadcom.c
index 86de3b455..2807870f8 100644
--- a/src/mainboard/amd/inagua/broadcom.c
+++ b/src/mainboard/amd/inagua/broadcom.c
@@ -29,11 +29,11 @@
*/
#include <types.h>
-#include <arch/byteorder.h>
#include <console/console.h>
#include <device/device.h> //Coreboot device access
#include <device/pci.h>
#include <delay.h>
+#include <endian.h>
void broadcom_init(void);
diff --git a/src/mainboard/google/butterfly/romstage.c b/src/mainboard/google/butterfly/romstage.c
index 7f9ab605c..1753cd57e 100644
--- a/src/mainboard/google/butterfly/romstage.c
+++ b/src/mainboard/google/butterfly/romstage.c
@@ -22,7 +22,6 @@
#include <string.h>
#include <lib.h>
#include <timestamp.h>
-#include <arch/byteorder.h>
#include <arch/io.h>
#include <device/pci_def.h>
#include <device/pnp_def.h>
diff --git a/src/mainboard/google/link/romstage.c b/src/mainboard/google/link/romstage.c
index 2e7ee5240..5844aa616 100644
--- a/src/mainboard/google/link/romstage.c
+++ b/src/mainboard/google/link/romstage.c
@@ -22,7 +22,6 @@
#include <string.h>
#include <lib.h>
#include <timestamp.h>
-#include <arch/byteorder.h>
#include <arch/io.h>
#include <device/pci.h>
#include <device/pci_def.h>
diff --git a/src/mainboard/google/parrot/romstage.c b/src/mainboard/google/parrot/romstage.c
index f2e7345ce..ab82bde63 100644
--- a/src/mainboard/google/parrot/romstage.c
+++ b/src/mainboard/google/parrot/romstage.c
@@ -22,7 +22,6 @@
#include <string.h>
#include <lib.h>
#include <timestamp.h>
-#include <arch/byteorder.h>
#include <arch/io.h>
#include <device/pci_def.h>
#include <device/pnp_def.h>
diff --git a/src/mainboard/google/samus/spd/spd.c b/src/mainboard/google/samus/spd/spd.c
index 4f4f9efac..1308ab262 100644
--- a/src/mainboard/google/samus/spd/spd.c
+++ b/src/mainboard/google/samus/spd/spd.c
@@ -17,9 +17,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <arch/byteorder.h>
#include <cbfs.h>
#include <console/console.h>
+#include <endian.h>
#include <string.h>
#include <soc/gpio.h>
#include <soc/pei_data.h>
diff --git a/src/mainboard/google/stout/romstage.c b/src/mainboard/google/stout/romstage.c
index 714d8f13c..6a6aa480d 100644
--- a/src/mainboard/google/stout/romstage.c
+++ b/src/mainboard/google/stout/romstage.c
@@ -22,7 +22,6 @@
#include <string.h>
#include <lib.h>
#include <timestamp.h>
-#include <arch/byteorder.h>
#include <arch/io.h>
#include <device/pci_def.h>
#include <device/pnp_def.h>
diff --git a/src/mainboard/samsung/lumpy/romstage.c b/src/mainboard/samsung/lumpy/romstage.c
index e63a8f996..29a238a14 100644
--- a/src/mainboard/samsung/lumpy/romstage.c
+++ b/src/mainboard/samsung/lumpy/romstage.c
@@ -23,7 +23,6 @@
#include <lib.h>
#include <timestamp.h>
#include <arch/io.h>
-#include <arch/byteorder.h>
#include <device/pci_def.h>
#include <device/pnp_def.h>
#include <cpu/x86/lapic.h>
diff --git a/src/mainboard/samsung/stumpy/romstage.c b/src/mainboard/samsung/stumpy/romstage.c
index 5db877337..346026f45 100644
--- a/src/mainboard/samsung/stumpy/romstage.c
+++ b/src/mainboard/samsung/stumpy/romstage.c
@@ -22,7 +22,6 @@
#include <string.h>
#include <lib.h>
#include <timestamp.h>
-#include <arch/byteorder.h>
#include <arch/io.h>
#include <device/pci_def.h>
#include <device/pnp_def.h>