diff options
author | Tom Rini <trini@konsulko.com> | 2020-07-10 14:31:22 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2020-07-10 14:31:22 -0400 |
commit | 3113c84ba25ec3ceae072cc5ad450c4238425939 (patch) | |
tree | dbcdb8d6692c2ef2d6b926de1ad1f9ff456a27a9 /include/linux | |
parent | 618c30679086e0b6d74e427b52931a31a2767af6 (diff) | |
parent | d6ecb71a1f0c764c94f1bb381f085734d57e94e9 (diff) | |
download | u-boot-3113c84ba25ec3ceae072cc5ad450c4238425939.zip u-boot-3113c84ba25ec3ceae072cc5ad450c4238425939.tar.gz u-boot-3113c84ba25ec3ceae072cc5ad450c4238425939.tar.bz2 |
Merge tag 'rpi-next-2020.10' of https://gitlab.denx.de/u-boot/custodians/u-boot-raspberrypi
- add support for PCI and XHCI for RPi4 (64 bit only)
- optionally reset XHCI device on registration
- enable USB_KEYBOARD for rpi_4_defconfig
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/bitfield.h | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h index 8b9d6ff..7ad02f8 100644 --- a/include/linux/bitfield.h +++ b/include/linux/bitfield.h @@ -16,6 +16,7 @@ #define _LINUX_BITFIELD_H #include <linux/bug.h> +#include <asm/byteorder.h> /* * Bitfield access macros @@ -103,4 +104,56 @@ (typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask)); \ }) +extern void __compiletime_error("value doesn't fit into mask") +__field_overflow(void); +extern void __compiletime_error("bad bitfield mask") +__bad_mask(void); + +static __always_inline u64 field_multiplier(u64 field) +{ + if ((field | (field - 1)) & ((field | (field - 1)) + 1)) + __bad_mask(); + return field & -field; +} + +static __always_inline u64 field_mask(u64 field) +{ + return field / field_multiplier(field); +} + +#define ____MAKE_OP(type, base, to, from) \ +static __always_inline __##type type##_encode_bits(base v, base field) \ +{ \ + if (__builtin_constant_p(v) && (v & ~field_mask(field))) \ + __field_overflow(); \ + return to((v & field_mask(field)) * field_multiplier(field)); \ +} \ +static __always_inline __##type type##_replace_bits(__##type old, \ + base val, base field) \ +{ \ + return (old & ~to(field)) | type##_encode_bits(val, field); \ +} \ +static __always_inline void type##p_replace_bits(__##type * p, \ + base val, base field) \ +{ \ + *p = (*p & ~to(field)) | type##_encode_bits(val, field); \ +} \ +static __always_inline base type##_get_bits(__##type v, base field) \ +{ \ + return (from(v) & field) / field_multiplier(field); \ +} + +#define __MAKE_OP(size) \ + ____MAKE_OP(le##size, u##size, cpu_to_le##size, le##size##_to_cpu) \ + ____MAKE_OP(be##size, u##size, cpu_to_be##size, be##size##_to_cpu) \ + ____MAKE_OP(u##size, u##size, ,) + +____MAKE_OP(u8, u8, ,) +__MAKE_OP(16) +__MAKE_OP(32) +__MAKE_OP(64) + +#undef __MAKE_OP +#undef ____MAKE_OP + #endif |