Merge coreboot and libpayload <endian.h> into commonlib

We've accumulated a number of endianness-handling and related macros
that are duplicated between coreboot and libpayload. This patch reduces
duplication by merging them into a commonlib header. This has the added
side-benefit of bringing the coreboot implementation of beXXenc/dec()
functions to libpayload, which lead to better code generation by
avoiding https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92716.

Keep the htobell()-style functions in libpayload only since they're not
needed in coreboot and not preferred. Keep the cpu_to_beXX()-style
functions in coreboot only -- maybe we should deprecate those
eventually.

This patch is explicitly copying and relicensing some of the code I
originally added as GPLv2 in commit e8e92d60c4 ("endian.h: Add
be32dec/be32enc family of functions") to BSD-3.

Change-Id: I5eb83d44a98b3aa59bba65b8e22df668874d2668
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/90308
Reviewed-by: Maximilian Brune <maximilian.brune@9elements.com>
Reviewed-by: Yu-Ping Wu <yupingso@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Julius Werner 2025-12-01 15:45:15 -08:00 committed by Yu-Ping Wu
commit 02a2fe7907
4 changed files with 193 additions and 451 deletions

View file

@ -8,39 +8,6 @@
#include <endian.h>
#include <types.h>
#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)
#define clrsetbits8p(addr, clear, set) clrsetbits8((void *)((uintptr_t)addr), clear, set)
#define clrsetbits16p(addr, clear, set) clrsetbits16((void *)((uintptr_t)addr), clear, set)
#define clrsetbits32p(addr, clear, set) clrsetbits32((void *)((uintptr_t)addr), clear, set)
#define clrsetbits64p(addr, clear, set) clrsetbits64((void *)((uintptr_t)addr), clear, set)
#define setbits8p(addr, set) clrsetbits8((void *)((uintptr_t)addr), 0, set)
#define setbits16p(addr, set) clrsetbits16((void *)((uintptr_t)addr), 0, set)
#define setbits32p(addr, set) clrsetbits32((void *)((uintptr_t)addr), 0, set)
#define setbits64p(addr, set) clrsetbits64((void *)((uintptr_t)addr), 0, set)
#define clrbits8p(addr, clear) clrsetbits8((void *)((uintptr_t)addr), clear, 0)
#define clrbits16p(addr, clear) clrsetbits16((void *)((uintptr_t)addr), clear, 0)
#define clrbits32p(addr, clear) clrsetbits32((void *)((uintptr_t)addr), clear, 0)
#define clrbits64p(addr, clear) clrsetbits64((void *)((uintptr_t)addr), clear, 0)
/*
* Reads a transfer buffer from 32-bit FIFO registers. fifo_stride is the
* distance in bytes between registers (e.g. pass 4 for a normal array of 32-bit
@ -222,44 +189,4 @@ static inline void buffer_to_fifo32(const void *buffer, size_t size, void *fifo,
#define READ32_BITFIELD(addr, name) \
EXTRACT_BITFIELD(read32(addr), name)
static __always_inline uint8_t read8p(const uintptr_t addr)
{
return read8((void *)addr);
}
static __always_inline uint16_t read16p(const uintptr_t addr)
{
return read16((void *)addr);
}
static __always_inline uint32_t read32p(const uintptr_t addr)
{
return read32((void *)addr);
}
static __always_inline uint64_t read64p(const uintptr_t addr)
{
return read64((void *)addr);
}
static __always_inline void write8p(const uintptr_t addr, const uint8_t value)
{
write8((void *)addr, value);
}
static __always_inline void write16p(const uintptr_t addr, const uint16_t value)
{
write16((void *)addr, value);
}
static __always_inline void write32p(const uintptr_t addr, const uint32_t value)
{
write32((void *)addr, value);
}
static __always_inline void write64p(const uintptr_t addr, const uint64_t value)
{
write64((void *)addr, value);
}
#endif /* __DEVICE_MMIO_H__ */