diff options
author | Julius Werner <jwerner@chromium.org> | 2015-02-23 14:31:09 -0800 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2015-04-21 08:23:25 +0200 |
commit | 9ff8f6f818d4e5a8aa0fe21cbfaba9ccd865bc7b (patch) | |
tree | bc668e3ddf5f0abf9fc5c5f7911e29895bee46a6 /src/include | |
parent | 941847652406982f3c9944fdd98cce4029b533fb (diff) |
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>
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/device/pci_rom.h | 2 | ||||
-rw-r--r-- | src/include/endian.h | 67 |
2 files changed, 68 insertions, 1 deletions
diff --git a/src/include/device/pci_rom.h b/src/include/device/pci_rom.h index a929206318..2fb2f7a8d5 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 b511a491a8..ce6d7c3c21 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 |