From patchwork Fri Apr 24 16:50:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sylwester Nawrocki X-Patchwork-Id: 1276520 X-Patchwork-Delegate: matthias.bgg@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.a=rsa-sha256 header.s=mail20170921 header.b=HsNveawr; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4980bm5R0Dz9sSJ for ; Sat, 25 Apr 2020 02:53:08 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 11AB981994; Fri, 24 Apr 2020 18:52:42 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="HsNveawr"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id B8D8A8193C; Fri, 24 Apr 2020 18:52:15 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 054D181947 for ; Fri, 24 Apr 2020 18:52:11 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=s.nawrocki@samsung.com Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20200424165210euoutp02c5d8cd28a8cad08741a028aaa408e949~Iz5plKoKY1988919889euoutp02U for ; Fri, 24 Apr 2020 16:52:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200424165210euoutp02c5d8cd28a8cad08741a028aaa408e949~Iz5plKoKY1988919889euoutp02U DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1587747130; bh=vigY8bUQuTvRZiBwShiOpXR8DblzAMsnVlm5lI1ZTeI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HsNveawrpAX2SP47/augx41t9pzlccLgMMvxCV7Nhf2D6wZJoaG2ectZvEU4OPY+b D9/4/YPuNUjYGJy3CFLNL2De+orbG1mgmAd9n4/4OZrrYkX4aZ7cV7TkpsOaELH33b ntQjUuI+gkQMC2cx/oSc6gR5s13mlP6t1Qkfbr/s= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20200424165210eucas1p2b2d391cdc3404579349a986923dae37f~Iz5pWGSnI0594105941eucas1p2I; Fri, 24 Apr 2020 16:52:10 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 0D.D5.61286.A3913AE5; Fri, 24 Apr 2020 17:52:10 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20200424165210eucas1p2f371c116aa8354550009512c6d55cd52~Iz5pC24ej0593605936eucas1p2F; Fri, 24 Apr 2020 16:52:10 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200424165210eusmtrp1d89d962b06c764a294b466f6c2ee0473~Iz5pCOSqe1224212242eusmtrp1M; Fri, 24 Apr 2020 16:52:10 +0000 (GMT) X-AuditID: cbfec7f2-ef1ff7000001ef66-da-5ea3193a8860 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 93.4F.08375.A3913AE5; Fri, 24 Apr 2020 17:52:10 +0100 (BST) Received: from AMDC3061.digital.local (unknown [106.120.51.75]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20200424165209eusmtip2271b7ddd14b8ec8bbc28a2cc0a7ad204~Iz5ohERLD1549415494eusmtip2a; Fri, 24 Apr 2020 16:52:09 +0000 (GMT) From: Sylwester Nawrocki To: u-boot@lists.denx.de, mbrugger@suse.com, marex@denx.de, bmeng.cn@gmail.com Cc: sjg@chromium.org, nsaenzjulienne@suse.de, jh80.chung@samsung.com, m.szyprowski@samsung.com, b.zolnierkie@samsung.com, Sylwester Nawrocki Subject: [PATCH v1 07/10] linux/bitfield.h: Add primitives for manipulating bitfields both in host- and fixed-endian. Date: Fri, 24 Apr 2020 18:50:09 +0200 Message-Id: <20200424165012.31915-8-s.nawrocki@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200424165012.31915-1-s.nawrocki@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprGKsWRmVeSWpSXmKPExsWy7djPc7pWkovjDG43SlhsnLGe1WJqT7zF jV9trBZrj9xlt3jT1shosWDyE1aLbbOWs1kcftPOavFtyzZGi7d7O9kduDxmN1xk8Zg36wSL x85Zd9k9zt7ZwejRt2UVo8f6LVdZPDafrg5gj+KySUnNySxLLdK3S+DK+DRxFmtBh3BFz+4L bA2Ml/m7GDk5JARMJCZ3NjF1MXJxCAmsYJSYeOsKG4TzhVHiePsrRgjnM6PEid5pzDAtv6Y+ YYFILGeUuLl4LTNcy99fm8Cq2AQMJXqP9jGC2CICARLXfk4DG8UssJJR4lvfObCEsEC5xKu1 7WA2i4CqxLm7y9lBbF4Ba4l1z2dCrZOXWL3hAJjNKWAj0Xj2FdhqCYHJ7BInDh1ghyhykbh7 9C8LhC0s8er4Fqi4jMTpyT1QDc2MEj27b7NDOBMYJe4fX8AIUWUtcefcL6C/OYDu05RYv0sf IuwosXDfPlaQsIQAn8SNt4IgYWYgc9K26cwQYV6JjjYhiGoVid+rpjNB2FIS3U/+Q53jIXF6 51NooPYzSuyZv4t5AqP8LIRlCxgZVzGKp5YW56anFhvmpZbrFSfmFpfmpesl5+duYgSmltP/ jn/awfj1UtIhRgEORiUe3ogji+KEWBPLiitzDzFKcDArifDGlACFeFMSK6tSi/Lji0pzUosP MUpzsCiJ8xovehkrJJCeWJKanZpakFoEk2Xi4JRqYNTii+MO/M27M/B1YZFtvtkHaVnRGRKr xYPXZNxqvWm24NYbFd85M3SXbsxYl+mYIX10+uq6GZ2nLLrvep5rkw6rl2oqNvWRXj8z1lRQ 7uw5N1/tyLgpT+4vMNPbx6Tzs+ZhyNzimu0f5+iv15vA47lpzmvruNZpfRVnjrQe25GXX6DE a6ZWpcRSnJFoqMVcVJwIAOV1idEpAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrKLMWRmVeSWpSXmKPExsVy+t/xe7pWkovjDKa8YbbYOGM9q8XUnniL G7/aWC3WHrnLbvGmrZHRYsHkJ6wW22YtZ7M4/Kad1eLblm2MFm/3drI7cHnMbrjI4jFv1gkW j52z7rJ7nL2zg9Gjb8sqRo/1W66yeGw+XR3AHqVnU5RfWpKqkJFfXGKrFG1oYaRnaGmhZ2Ri qWdobB5rZWSqpG9nk5Kak1mWWqRvl6CX8WniLNaCDuGKnt0X2BoYL/N3MXJySAiYSPya+oSl i5GLQ0hgKaPEuus3WLsYOYASUhLzW5QgaoQl/lzrYoOo+cQo8eDdFWaQBJuAoUTv0T5GEFtE IETixdErTCBFzALrGSU23JjJBpIQFiiVWLXiFpjNIqAqce7ucnYQm1fAWmLd85nMEBvkJVZv OABmcwrYSDSefcUCYgsB1Wyb+ZxlAiPfAkaGVYwiqaXFuem5xYZ6xYm5xaV56XrJ+bmbGIFB vu3Yz807GC9tDD7EKMDBqMTDG3FkUZwQa2JZcWXuIUYJDmYlEd6YEqAQb0piZVVqUX58UWlO avEhRlOgoyYyS4km5wMjMK8k3tDU0NzC0tDc2NzYzEJJnLdD4GCMkEB6YklqdmpqQWoRTB8T B6dUA2MVd8jXY7Of3rzleeOc8Hdn6WId79B9+h3hb+7vD5uzVv3KlB3+yq1Jxssm6NgomJbz 7M0viQjWfnCLOfBxfbLx6n09Rju3vFzX4f5hovxfuzNuBcpR3CbRfCZ9XB/VHGe68/TFT9Bk m7uceQ2L0+2E5fbxu89tSfeRynyjrGof3frKuveggBJLcUaioRZzUXEiAOzJFh+IAgAA X-CMS-MailID: 20200424165210eucas1p2f371c116aa8354550009512c6d55cd52 X-Msg-Generator: CA X-RootMTR: 20200424165210eucas1p2f371c116aa8354550009512c6d55cd52 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200424165210eucas1p2f371c116aa8354550009512c6d55cd52 References: <20200424165012.31915-1-s.nawrocki@samsung.com> X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean From: Nicolas Saenz Julienne 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 Signed-off-by: Sylwester Nawrocki --- Changes since RFC: - new patch. --- include/linux/bitfield.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h index 8b9d6ff..4964213 100644 --- a/include/linux/bitfield.h +++ b/include/linux/bitfield.h @@ -103,4 +103,50 @@ (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