From patchwork Tue May 12 19:04:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sylwester Nawrocki X-Patchwork-Id: 1288744 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=asAyLiMQ; 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 49M6gY6fttz9sRR for ; Wed, 13 May 2020 05:04:57 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 2078D81C67; Tue, 12 May 2020 21:04:53 +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="asAyLiMQ"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id CC86B81C8F; Tue, 12 May 2020 21:04:50 +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 16B45819A7 for ; Tue, 12 May 2020 21:04:44 +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 eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20200512190443euoutp02afa444a6590c4797b85e250c34ff1ecc~OXUhUgQxx1708617086euoutp02D for ; Tue, 12 May 2020 19:04:43 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200512190443euoutp02afa444a6590c4797b85e250c34ff1ecc~OXUhUgQxx1708617086euoutp02D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1589310283; bh=r9ptFfGCl8hxP+KxpCbUtcuv7A/Js7YEheM+cmvcRKs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=asAyLiMQXkiiepUfvZCKGibB5A2JmD+50yWvcz8P7R8Q/uf3oU5zE2CtufJJagZ3C zuefW91LKVuZVA2Zsdsb+eborsym0kyDyp0Wqasdb/gK2S0PFK4EKh9TmRgIcJs4oi 7IzTe//BPPEssm/3gMXJFEWUhQk6hvDd/pbCqlcg= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20200512190443eucas1p1f41cd206e4d4bdb9a4a92eea641d2874~OXUhAOh9n1497014970eucas1p1e; Tue, 12 May 2020 19:04:43 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id FD.0B.60679.B43FABE5; Tue, 12 May 2020 20:04:43 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20200512190442eucas1p278509fbc3a5d4bc7303797e5b8b284d6~OXUf1cwKq1151411514eucas1p2d; Tue, 12 May 2020 19:04:42 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200512190442eusmtrp1104f5e69b0368a6cfa797d8ea9dc72d6~OXUf0wctA1525015250eusmtrp1S; Tue, 12 May 2020 19:04:42 +0000 (GMT) X-AuditID: cbfec7f4-0cbff7000001ed07-2e-5ebaf34b4e61 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 10.49.07950.943FABE5; Tue, 12 May 2020 20:04:42 +0100 (BST) Received: from AMDC3061.digital.local (unknown [106.120.51.75]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20200512190441eusmtip1f368bbe7b9b00d9d8354b595b89a9423~OXUfSYLrx0650906509eusmtip1y; Tue, 12 May 2020 19:04:41 +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: [RESEND PATCH v3 6/9] linux/bitfield.h: Add primitives for manipulating bitfields both in host- and fixed-endian Date: Tue, 12 May 2020 21:04:32 +0200 Message-Id: <20200512190432.3916-1-s.nawrocki@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200512184716.2869-7-s.nawrocki@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprDKsWRmVeSWpSXmKPExsWy7djPc7ren3fFGcycL2qxccZ6VoupPfEW e9/0s1nc+NXGarH2yF12izdtjYwWCyY/YbXYNms5m8XhN+2sFt+2bGO0eLu3k92B22PW/bNs HrMbLrJ4zJt1gsVj56y77B5n7+xg9OjbsorRY/2Wqywem09XB3BEcdmkpOZklqUW6dslcGVM vz2FteCiaEXTxutMDYwnBLsYOTkkBEwk9s6/xAhiCwmsYJSYskCui5ELyP7CKPFkzgF2iMRn Roktp3RhGg5e+MAGUbScUWLyqa+scB3Tzu5nBaliEzCU6D3aBzZWRCBA4trPaYwgRcwCRxkl 1uz/w9LFyMEhLFAt8WtLKUgNi4CqxMJfj8HqeQWsJDbc3c0KsU1eYvWGA8wgNqeAtcS7331g cyQEFrFLLJm8nAWiyEVizYldjBC2sMSr41vYIWwZidOTe1ggGpoZJXp232aHcCYwStw/vgCq w1rizrlfbCAXMQtoSqzfpQ8RdpS4/mYfWFhCgE/ixltweDEDmZO2TWeGCPNKdLQJQVSrSPxe NZ0JwpaS6H7yH+o0D4lPh1ugwdvHKHF8SdkERvlZCLsWMDKuYhRPLS3OTU8tNspLLdcrTswt Ls1L10vOz93ECEwzp/8d/7KDcdefpEOMAhyMSjy8DLW74oRYE8uKK3MPMUpwMCuJ8LZk7owT 4k1JrKxKLcqPLyrNSS0+xCjNwaIkzmu86GWskEB6YklqdmpqQWoRTJaJg1OqgTHZ56CXgmGQ 9Ibbgp+0e++8XZL3W3JbJ/vr/x4OubPuXo7RdjO9qipltPV9w9Hj+bkOEz6u0uMNtZXbEzZ7 snbq7X/in9YZf7dnvnrwAmMYn8DuhqIlXVmHv3xTrZdNM9g2TS9Uead9f/G60zU1j+V/7vT6 YL4riOf6Erfrl7guPZoQx7B96VUlluKMREMt5qLiRACwOBQyLwMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrPLMWRmVeSWpSXmKPExsVy+t/xu7pen3fFGby7z2ixccZ6VoupPfEW e9/0s1nc+NXGarH2yF12izdtjYwWCyY/YbXYNms5m8XhN+2sFt+2bGO0eLu3k92B22PW/bNs HrMbLrJ4zJt1gsVj56y77B5n7+xg9OjbsorRY/2Wqywem09XB3BE6dkU5ZeWpCpk5BeX2CpF G1oY6RlaWugZmVjqGRqbx1oZmSrp29mkpOZklqUW6dsl6GVMvz2FteCiaEXTxutMDYwnBLsY OTkkBEwkDl74wNbFyMUhJLCUUWLpv4+sXYwcQAkpifktShA1whJ/rnVB1XxilFh7vJkVJMEm YCjRe7SPEcQWEQiReHH0ChNIEbPAWUaJRZ0fwIqEBSolfj/cBFbEIqAqsfDXYzCbV8BKYsPd 3awQG+QlVm84wAxicwpYS7z7DTFUCKhmXs99xgmMfAsYGVYxiqSWFuem5xYb6RUn5haX5qXr JefnbmIEBv62Yz+37GDsehd8iFGAg1GJhzeiflecEGtiWXFl7iFGCQ5mJRHelsydcUK8KYmV ValF+fFFpTmpxYcYTYGOmsgsJZqcD4zKvJJ4Q1NDcwtLQ3Njc2MzCyVx3g6BgzFCAumJJanZ qakFqUUwfUwcnFINjBKPQ3WT84JO6a1bN7HH4O+9ayfv6O9sujAz1ds29P47lbLzPK9rlxx2 qVKKbJQt3x+8bNXlnpIafkkTu+/6kQ8dZR40nuk5FKr/v/CEJ1d6gtfJvNfndGYa/mHd3b3L zCpdwPHuX9lZezcFrZM/LBc+Y52Nd+zq+8ITHNU+d3RZeW1setu3X4mlOCPRUIu5qDgRAKzh 5OqSAgAA X-CMS-MailID: 20200512190442eucas1p278509fbc3a5d4bc7303797e5b8b284d6 X-Msg-Generator: CA X-RootMTR: 20200512190442eucas1p278509fbc3a5d4bc7303797e5b8b284d6 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200512190442eucas1p278509fbc3a5d4bc7303797e5b8b284d6 References: <20200512184716.2869-7-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 --- Resending as I sent wrong version of [PATCH v3 6/9] by mistake. Changes since v2: - added some more missing whitespaces as pointed out by checkpatch.pl. Changes since v1: - added empty lines between functions and macros. Changes since RFC: - new patch. --- include/linux/bitfield.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) -- 2.7.4 diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h index 8b9d6ff..7ad8b08 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