Message ID | 20221205080339.12801-4-tomi.valkeinen+renesas@ideasonboard.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Kieran Bingham |
Headers | show |
Series | Support Y210, Y212, Y216 | expand |
Hi Tomi, Thank you for the patch. On Mon, Dec 05, 2022 at 10:03:38AM +0200, Tomi Valkeinen wrote: > Add simple endianness supporting write function, and, for now, only one > shortcut helper, write16le(). > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > kms++util/inc/kms++util/endian.h | 46 ++++++++++++++++++++++++++++++++ > 1 file changed, 46 insertions(+) > create mode 100644 kms++util/inc/kms++util/endian.h > > diff --git a/kms++util/inc/kms++util/endian.h b/kms++util/inc/kms++util/endian.h > new file mode 100644 > index 0000000..0f7aecd > --- /dev/null > +++ b/kms++util/inc/kms++util/endian.h > @@ -0,0 +1,46 @@ > +#pragma once > + > +#include <type_traits> > +#include <byteswap.h> > +#include <stdint.h> > + > +static_assert((__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || > + (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__), > + "Unable to detect endianness"); > + > +enum class endian { > + little = __ORDER_LITTLE_ENDIAN__, > + big = __ORDER_BIG_ENDIAN__, > + native = __BYTE_ORDER__ > +}; > + > +template<typename T> > +constexpr T byteswap(T value) noexcept > +{ > + static_assert(std::is_integral<T>(), "Type is not integral"); > + static_assert(sizeof(T) == 2 || > + sizeof(T) == 4 || > + sizeof(T) == 8, > + "Illegal value size"); > + > + switch (sizeof(T)) { > + case 2: return bswap_16(value); > + case 4: return bswap_32(value); > + case 8: return bswap_64(value); > + } > +} > + > +template<endian E, typename T> > +static void write_endian(T* dst, T val) > +{ > + if constexpr (E != endian::native) > + val = byteswap(val); > + > + *dst = val; > +} > + > +[[maybe_unused]] > +static void write16le(uint16_t* dst, uint16_t val) > +{ > + write_endian<endian::little, uint16_t>(dst, val); > +}
diff --git a/kms++util/inc/kms++util/endian.h b/kms++util/inc/kms++util/endian.h new file mode 100644 index 0000000..0f7aecd --- /dev/null +++ b/kms++util/inc/kms++util/endian.h @@ -0,0 +1,46 @@ +#pragma once + +#include <type_traits> +#include <byteswap.h> +#include <stdint.h> + +static_assert((__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || + (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__), + "Unable to detect endianness"); + +enum class endian { + little = __ORDER_LITTLE_ENDIAN__, + big = __ORDER_BIG_ENDIAN__, + native = __BYTE_ORDER__ +}; + +template<typename T> +constexpr T byteswap(T value) noexcept +{ + static_assert(std::is_integral<T>(), "Type is not integral"); + static_assert(sizeof(T) == 2 || + sizeof(T) == 4 || + sizeof(T) == 8, + "Illegal value size"); + + switch (sizeof(T)) { + case 2: return bswap_16(value); + case 4: return bswap_32(value); + case 8: return bswap_64(value); + } +} + +template<endian E, typename T> +static void write_endian(T* dst, T val) +{ + if constexpr (E != endian::native) + val = byteswap(val); + + *dst = val; +} + +[[maybe_unused]] +static void write16le(uint16_t* dst, uint16_t val) +{ + write_endian<endian::little, uint16_t>(dst, val); +}
Add simple endianness supporting write function, and, for now, only one shortcut helper, write16le(). Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com> --- kms++util/inc/kms++util/endian.h | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 kms++util/inc/kms++util/endian.h