From patchwork Tue May 12 18:47:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sylwester Nawrocki X-Patchwork-Id: 1288732 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=2a01:238:438b:c500:173d:9f52:ddab:ee01; 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=OrqQU0UN; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (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 49M6KH0ykgz9sSW for ; Wed, 13 May 2020 04:49:07 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 43B8081CF5; Tue, 12 May 2020 20:48:39 +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="OrqQU0UN"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id A041C81CD4; Tue, 12 May 2020 20:48:36 +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.2 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 AF9CA81CB4 for ; Tue, 12 May 2020 20:48:33 +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 20200512184833euoutp02024bfc004b3a38e7abe168cdd77f5dbb~OXGZmHDwG0461204612euoutp024 for ; Tue, 12 May 2020 18:48:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200512184833euoutp02024bfc004b3a38e7abe168cdd77f5dbb~OXGZmHDwG0461204612euoutp024 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1589309313; bh=gVSWmpdQ36VgD8o/W/rduik6grJJCng+jGVfBPUAF8U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OrqQU0UN8Z7QKS+4Unt5PDDDw3i2iYhOJT4TdbEKloVbg23X7ARl1QJTAaFBBNzJT 8AXLlGfGZj4mJo1gPBdQ/TOVDG7RDy4i/+ujixIckKJXDA+AjclrJdeEAcngq0Ulnn NbOUAtPbCSEM0S/0RPnWwC90UpPAmcqGeCkVrazE= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20200512184833eucas1p1dc7466ebb73dd2f787e4253f171a3b9d~OXGZbAMzF2083120831eucas1p1w; Tue, 12 May 2020 18:48:33 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id F5.AA.60679.18FEABE5; Tue, 12 May 2020 19:48:33 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20200512184832eucas1p1b75fca7f5ed42e3cb38f98410f51f1ad~OXGZA7swA2288022880eucas1p17; Tue, 12 May 2020 18:48:32 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20200512184832eusmtrp2c7ee802f60d431184d93a34cbe4b5279~OXGZAXbrx1654916549eusmtrp2o; Tue, 12 May 2020 18:48:32 +0000 (GMT) X-AuditID: cbfec7f4-0e5ff7000001ed07-fd-5ebaef8142ae Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id A3.F8.07950.08FEABE5; Tue, 12 May 2020 19:48:32 +0100 (BST) Received: from AMDC3061.digital.local (unknown [106.120.51.75]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20200512184832eusmtip1ffa9d15a350dcc63557ad23be081cb76~OXGYefx_f2778327783eusmtip1V; Tue, 12 May 2020 18:48:32 +0000 (GMT) From: Sylwester Nawrocki To: u-boot@lists.denx.de, mbrugger@suse.com, marex@denx.de, bmeng.cn@gmail.com Cc: james.quinlan@broadcom.com, nsaenzjulienne@suse.de, sjg@chromium.org, jh80.chung@samsung.com, m.szyprowski@samsung.com, b.zolnierkie@samsung.com, Sylwester Nawrocki Subject: [PATCH v3 6/9] linux/bitfield.h: Add primitives for manipulating bitfields both in host- and fixed-endian Date: Tue, 12 May 2020 20:47:13 +0200 Message-Id: <20200512184716.2869-7-s.nawrocki@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200512184716.2869-1-s.nawrocki@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrAKsWRmVeSWpSXmKPExsWy7djP87qN73fFGdy/yWqxccZ6VoupPfEW e9/0s1nc+NXGarH2yF12izdtjYwWCyY/YbXYNms5m8XhN+2sFt+2bGO0eLu3k92B22PW/bNs HrMbLrJ4zJt1gsVj56y77B5n7+xg9OjbsorRY/2Wqywem09XB3BEcdmkpOZklqUW6dslcGW8 v/6XuWCuSMXm151sDYzHBboYOTkkBEwkrv3+z9LFyMUhJLCCUeLqqz+MEM4XRom+t9+gnM+M Em3XbrLAtGy428wOkVjOKPG0YSMbXMvD1X3sIFVsAoYSvUf7GEFsEYEAiWs/p4GNYhY4yiix Zv8fsFHCAiUSs/9OZgWxWQRUJZbeOQXWwCtgJfH35FwmiHXyEqs3HGAGsTkFrCWubz7GDDJI QmAVu8S60+uhbnKRmL9tJTuELSzx6vgWKFtG4v/O+UwQDc2MEj27b7NDOBMYJe4fX8AIUWUt cefcL6AnOIDu05RYv0sfIuwo0Xb0KTtIWEKAT+LGW0GQMDOQOWnbdGaIMK9ER5sQRLWKxO9V 06FulpLofvIf6jQPiebdl6Ah1McocXD2TqYJjPKzEJYtYGRcxSieWlqcm55abJSXWq5XnJhb XJqXrpecn7uJEZhuTv87/mUH464/SYcYBTgYlXh4GWp3xQmxJpYVV+YeYpTgYFYS4W3J3Bkn xJuSWFmVWpQfX1Sak1p8iFGag0VJnNd40ctYIYH0xJLU7NTUgtQimCwTB6dUA6ODfX6J8vRP kS+KX7b+sr18ZKLND/H+CxvqW3meFD769EE8d07Cr1VxR9y0XX2uzm7Ya7jTOKjbT6fT7NTx ctavcrxzXr8sF/94MOp3a0neVQeztyzlwSmL/z0VS1j6k2HvYg9180Vfo4KOzvp5jX/63V7/ KbVNp0sWCu+TUPHIenjq2JX2Xy5KLMUZiYZazEXFiQAsWJztMwMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrHLMWRmVeSWpSXmKPExsVy+t/xu7oN73fFGWxZpGGxccZ6VoupPfEW e9/0s1nc+NXGarH2yF12izdtjYwWCyY/YbXYNms5m8XhN+2sFt+2bGO0eLu3k92B22PW/bNs HrMbLrJ4zJt1gsVj56y77B5n7+xg9OjbsorRY/2Wqywem09XB3BE6dkU5ZeWpCpk5BeX2CpF G1oY6RlaWugZmVjqGRqbx1oZmSrp29mkpOZklqUW6dsl6GW8v/6XuWCuSMXm151sDYzHBboY OTkkBEwkNtxtZu9i5OIQEljKKNG88z5jFyMHUEJKYn6LEkSNsMSfa11sILaQwCdGiQPbpUFs NgFDid6jfYwgtohAiMSLo1eYQOYwC5xllFjU+YEVJCEsUCRxef86JhCbRUBVYumdU2ANvAJW En9PzmWCWCAvsXrDAWYQm1PAWuL65mPMEMusJPZ8e8c2gZFvASPDKkaR1NLi3PTcYiO94sTc 4tK8dL3k/NxNjMCw33bs55YdjF3vgg8xCnAwKvHwRtTvihNiTSwrrsw9xCjBwawkwtuSuTNO iDclsbIqtSg/vqg0J7X4EKMp0FETmaVEk/OBMZlXEm9oamhuYWlobmxubGahJM7bIXAwRkgg PbEkNTs1tSC1CKaPiYNTqoGRL+bltk22/7+9+eEy57X8YZkID4Uj5VoKoSuTez9IRTw9cJA9 f+mEOlbeZyvTnFlM/r3fsWl2FUuAYz97waprdvs3vpx9QyUl8rbyZJloPYMp4k5TRTm2vecX qjC8NG3F+bgO9kV25i0VwYy7Fnjm/ZmhHZI93Y7bduZik0DpvXJcJvwfj8opsRRnJBpqMRcV JwIAdir705ECAAA= X-CMS-MailID: 20200512184832eucas1p1b75fca7f5ed42e3cb38f98410f51f1ad X-Msg-Generator: CA X-RootMTR: 20200512184832eucas1p1b75fca7f5ed42e3cb38f98410f51f1ad X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200512184832eucas1p1b75fca7f5ed42e3cb38f98410f51f1ad References: <20200512184716.2869-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 [s.nawrocki: added empty lines between functions and macros] Signed-off-by: Sylwester Nawrocki --- Changes since v1: - added empty lines between functions and macros. Changes since RFC: - new patch. --- include/linux/bitfield.h | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h index 8b9d6ff..7acba4c 100644 --- a/include/linux/bitfield.h +++ b/include/linux/bitfield.h @@ -103,4 +103,54 @@ (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