From patchwork Mon May 25 11:39:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sylwester Nawrocki X-Patchwork-Id: 1297309 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=knmG7asO; 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 49VwDF1knZz9sT1 for ; Mon, 25 May 2020 21:41:49 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 8650381CA8; Mon, 25 May 2020 13:40:55 +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="knmG7asO"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id C3B5481A4E; Mon, 25 May 2020 13:40:32 +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 A249081B69 for ; Mon, 25 May 2020 13:40:18 +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 20200525114018euoutp02a1ee14384a1c87959f1d13c86d79daae~SQpMd9GPS0304603046euoutp02K for ; Mon, 25 May 2020 11:40:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200525114018euoutp02a1ee14384a1c87959f1d13c86d79daae~SQpMd9GPS0304603046euoutp02K DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1590406818; bh=OpdhDxRWqzyn+8uM0s0N5fA3WtvbCG7Kez/vs8PQxrM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=knmG7asOGl9MWsWqt9078wmPLA0jnITwAsahLIJirEpCyvNT+59iuXbGRWhktej00 RTc8PsbdogxfSTwjOTHESYdb+PFN+j/QkSuoxzzQCbeKKgDpIFWT1WJN9ffFKXNDIM mn34/+/F3eQcAIG/RGqjvfiWpryc2dovT0fU7Ab0= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20200525114017eucas1p21549dfe9a169e3bf1b158b30705a2b78~SQpMGnh8I2854728547eucas1p2T; Mon, 25 May 2020 11:40:17 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 05.C8.60698.1AEABCE5; Mon, 25 May 2020 12:40:17 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20200525114017eucas1p2c9fa0e56eeb828d05891b8bf4545ad9c~SQpLzKV8-3086930869eucas1p2r; Mon, 25 May 2020 11:40:17 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200525114017eusmtrp108fb186e01e078735157a657fa030704~SQpLyh8Yc1781117811eusmtrp1e; Mon, 25 May 2020 11:40:17 +0000 (GMT) X-AuditID: cbfec7f5-a29ff7000001ed1a-ed-5ecbaea14015 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id DD.9B.08375.1AEABCE5; Mon, 25 May 2020 12:40:17 +0100 (BST) Received: from AMDC3061.digital.local (unknown [106.120.51.75]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20200525114016eusmtip1b9151dc9e8634ce33139d954a2386cfe~SQpLSzq-l2561125611eusmtip1x; Mon, 25 May 2020 11:40:16 +0000 (GMT) From: Sylwester Nawrocki To: u-boot@lists.denx.de, mbrugger@suse.com Cc: marex@denx.de, bmeng.cn@gmail.com, james.quinlan@broadcom.com, sjg@chromium.org, nsaenzjulienne@suse.de, jh80.chung@samsung.com, m.szyprowski@samsung.com, b.zolnierkie@samsung.com, Sylwester Nawrocki Subject: [PATCH v4 6/9] linux/bitfield.h: Add primitives for manipulating bitfields both in host- and fixed-endian Date: Mon, 25 May 2020 13:39:56 +0200 Message-Id: <20200525113959.11886-7-s.nawrocki@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200525113959.11886-1-s.nawrocki@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA0WSe0hTYRjG+TyXHa3JaSp+aGCNFFLywiQPKGEkdP5RjP4JKXXmYRPdXNu0 1AjNmLflJTNjWmlBXmZOc00tlrbUqVMz0tLUVLxAS0NMA2+Z82D993ue93mfFz4+AuE9wtyI BKmSkUuFSXzcATX0bAydqm60RPvPVXpRzQ91GFWmjqGMS0U4NbapwqgXXVMcakmVBaiq0nmM MmhqcOr9Ug5G/dYbALVszOOEHqI104M4XZH5EaUfa3pRul0zxaEHJ9sAXaivB7ROP4rSLZaM SCLKISSeSUpIZeR+Z2IdxFOzakxW53Ija7gfzwR1R/KBPQHJQKjN/ozlAweCR9YC2DuZh7Ni DcD5kUrAil8ANj1ZwQ5WdNplO3ZQA+CqdoPzb0VXq0JtKZwMgHe7C4GNnUkfON5g2N9ASCuA iyvG/SonUgl/tvYhNkZJT5g3u7TnEwSXDIY7I9fYax5Q29S5H7EnQ2D/u2+IrQeSzznQalwH tjwkw+D45DE27wStZj2H5aPQUqpG2Xw2gOo3ExxWFAM4ba4CbCoYTg5t4rYihDwJda/9WPss vN36DGP7HeHY8v6DIXt4z1COsDYX5qp4bPoE3Kovt2PZDRbM76Is07B0uwG3MY8sAnB4AS8G Hpr/t6oAqAeuTIpCImIUAilz3VchlChSpCLfq8mSl2Dv01j+mNfbwNvtOBMgCcA/zKUaLNE8 TJiqSJOYACQQvjNXdX7P4sYL09IZeXKMPCWJUZiAO4HyXbmCp9+v8EiRUMkkMoyMkR9M7Qh7 t0ygjSpI7AmTzjR7qmX5QaGLgluqr32vwju/TMz5nA6fCRLesRvocA+JEF+4bI6aS/hUIShb GM3J7e5qiitRDojF59rzNrwDhzeaqcqIB+mx/taLu03Rhh+OAT7EVvWO3wcvU0tkY4XoZhEJ XDjTx2XVzZfWGksG7++2j/MzVn06+KhCLAzwRuQK4V/V21ZUMAMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrHLMWRmVeSWpSXmKPExsVy+t/xu7oL152OMzh0mt9i44z1rBZTe+It 9r7pZ7O48auN1WLtkbvsFm/aGhktFkx+wmqxbdZyNovDb9pZLb5t2cZo8XZvJ7sDt8es+2fZ PGY3XGTxmDfrBIvHzll32T3O3tnB6NG3ZRWjx/otV1k8Np+uDuCI0rMpyi8tSVXIyC8usVWK NrQw0jO0tNAzMrHUMzQ2j7UyMlXSt7NJSc3JLEst0rdL0Mu4+7CHtWClaEXjhVNsDYwrBbsY OTkkBEwk1q9+y9TFyMUhJLCUUeLv9X+MXYwcQAkpifktShA1whJ/rnWxQdR8YpRY3N/PDJJg EzCU6D3axwhiiwjoSjT2rGMBKWIW+MIosenAYjaQhLBAkcS+h1fBilgEVCU6H75hBVnAK2At 8fdKIcQCeYnVGw6AzeQUsJE4dfAemC0EVDJz1jPGCYx8CxgZVjGKpJYW56bnFhvqFSfmFpfm pesl5+duYgSG/bZjPzfvYLy0MfgQowAHoxIPr8Wa03FCrIllxZW5hxglOJiVRHjb3IFCvCmJ lVWpRfnxRaU5qcWHGE2BbprILCWanA+MybySeENTQ3MLS0NzY3NjMwslcd4OgYMxQgLpiSWp 2ampBalFMH1MHJxSDYydLL8U+yxCzWTCfuh8TbN+uSPzvrXj/yXT9OZ5GHyYob/ikMesIxFf A29JT1C0SixIm6DM2FuzWir7/tFdUw61TZ/v8/sb45mndzeY/ng5/8FlluOaEdVt5212XfhZ 86XCPeRTufKfc6ni12+nXTo47azu/Qb5wvUR+hafd16ymvqiZOW3RY2hSizFGYmGWsxFxYkA P30uOZECAAA= X-CMS-MailID: 20200525114017eucas1p2c9fa0e56eeb828d05891b8bf4545ad9c X-Msg-Generator: CA X-RootMTR: 20200525114017eucas1p2c9fa0e56eeb828d05891b8bf4545ad9c X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200525114017eucas1p2c9fa0e56eeb828d05891b8bf4545ad9c References: <20200525113959.11886-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 v3: - none. 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(+) 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