* Backport USB PCIe/XHCI patches to U-Boot 2020.07 Backport relevant patches required to make PCIe/USB XHCI work. * Backport/integrate PCIe device tree changes from upstream Linux U-Boot uses the device tree provided by upstream Linux. Make sure the device tree has the relevant chanages to make VL805 USB controller reset work. * Document RPi 4 USB mass storage support (#746)
86 lines
2.8 KiB
Diff
86 lines
2.8 KiB
Diff
From 9c761488487ce27517e2a9e425f4ed0777708c53 Mon Sep 17 00:00:00 2001
|
|
Message-Id: <9c761488487ce27517e2a9e425f4ed0777708c53.1595101389.git.stefan@agner.ch>
|
|
In-Reply-To: <040a141f84f2f84bf8be18f85b4cdb34bf066df0.1595101389.git.stefan@agner.ch>
|
|
References: <040a141f84f2f84bf8be18f85b4cdb34bf066df0.1595101389.git.stefan@agner.ch>
|
|
From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
|
Date: Mon, 25 May 2020 13:39:56 +0200
|
|
Subject: [PATCH 07/20] linux/bitfield.h: Add primitives for manipulating
|
|
bitfields both in host- and fixed-endian
|
|
|
|
Imports Al Viro's original Linux commit 00b0c9b82663a, which contains
|
|
an in depth explanation and two fixes from Johannes Berg:
|
|
e7d4a95da86e0 "bitfield: fix *_encode_bits()",
|
|
37a3862e12382 "bitfield: add u8 helpers".
|
|
|
|
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
|
[s.nawrocki: added empty lines between functions and macros]
|
|
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
|
|
---
|
|
include/linux/bitfield.h | 52 ++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 52 insertions(+)
|
|
|
|
diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h
|
|
index 8b9d6fff00..7ad8b088ed 100644
|
|
--- a/include/linux/bitfield.h
|
|
+++ b/include/linux/bitfield.h
|
|
@@ -103,4 +103,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
|
|
--
|
|
2.27.0
|
|
|