From patchwork Fri Aug 3 06:58:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 953055 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="qX3Ifqys"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 41hd6V3dHGz9s2g for ; Fri, 3 Aug 2018 16:53:22 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id E7747C21C51; Fri, 3 Aug 2018 06:53:16 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 54FDDC21DAF; Fri, 3 Aug 2018 06:53:13 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 602B0C21C2F; Fri, 3 Aug 2018 06:53:12 +0000 (UTC) Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by lists.denx.de (Postfix) with ESMTPS id C4BDEC21C51 for ; Fri, 3 Aug 2018 06:53:11 +0000 (UTC) Received: by mail-pf1-f195.google.com with SMTP id u24-v6so2707646pfn.13 for ; Thu, 02 Aug 2018 23:53:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=KEhYQsSYYg6m87kfKsVGuG7wLVWU74voWvq/UtIKIIU=; b=qX3IfqysTjwE0g0Q/ntBHsyL0z0YH7FNCk9key8DMdLfM4SpmLs4DfWHhoaI/iHVu4 ljk1tzhUB4o8GOaTX3qYlkNjqSFx23RXL0fuV2b/H1+u5+7K3ObRC7K8bAWSBYVuYAQL EzVbIRraPPm6PvzZizU1tm5QMndH67F5KipDGXuZtsTxakcuHd9sn8B5Yr/6Mn5/8/Hw KR0Y3O61wtJl6w0wpwb5xQ0cYxj06HpyQs97fznzTGMlB/evMQHm4w84Iv5qRzUQqjJ0 2kTePHRMZ5Q86LBqgzl2zb+4LivqUYjSZLg7hEOZauE3Y6X6kCWuOe0ywwJLuF/9OdP6 HoyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=KEhYQsSYYg6m87kfKsVGuG7wLVWU74voWvq/UtIKIIU=; b=dODPRmDRF3GFpz7qIF08lKkraiDPE8+RaLR8GLZsYbJSv6Z3p6zBK6w4Jaf5sa/dZL U57pzvIOdyccARFbH9+Z2VUrxffldSfGAPdF6TtAHBLCV6ouckyKcapF2L1RGFLsJAHr 3gZRvDxU2ek7h3p2giZwf+NdXCe06q96YF82hKd57M+m4ceLzhENGX7rbTM8NvR3WygM 1+mRtfJXj8oZ32DBsfc9dVCSJsqK8sUbOl+B1wz99RhNyd8zKkmdF+uiafO8OqFz6oBx 4hl7vC9rOLQnGyDHtuHJlPXo5yEs+9YFLnD4A8wE93Ov6E99Y68WnC306cRQFnG3Kj4t U3Bg== X-Gm-Message-State: AOUpUlHjHgXYiS6+oNRFNvmB089rVTM+JFH/PBrNpcDWDX3xN3HjWk+P k8p7N/C2vp4GWgcDGM0CusTEj95D X-Google-Smtp-Source: AAOMgpc44jVolKTIsKuKn131vImcVfZzONAaNw/UCaJIJiTj/LgRKhwMlT5ZxxB3Ve8UmmXBBy49vg== X-Received: by 2002:a62:d693:: with SMTP id a19-v6mr2937199pfl.248.1533279190421; Thu, 02 Aug 2018 23:53:10 -0700 (PDT) Received: from ala-d2121-lx1.wrs.com (unknown-156-139.windriver.com. [147.11.156.139]) by smtp.gmail.com with ESMTPSA id y4-v6sm5264468pfm.137.2018.08.02.23.53.09 (version=TLS1_1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 02 Aug 2018 23:53:09 -0700 (PDT) From: Bin Meng To: Simon Glass , U-Boot Mailing List Date: Thu, 2 Aug 2018 23:58:02 -0700 Message-Id: <1533279483-439-1-git-send-email-bmeng.cn@gmail.com> X-Mailer: git-send-email 1.7.9.5 Subject: [U-Boot] [PATCH v2 1/2] lib: bitrev: Sync with Linux kernel v4.17 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Signed-off-by: Bin Meng Reviewed-by: Simon Glass --- Changes in v2: None include/linux/bitrev.h | 102 ++++++++++++++++++++++++++++++++++++++++++++----- lib/bitrev.c | 28 +++++--------- 2 files changed, 102 insertions(+), 28 deletions(-) diff --git a/include/linux/bitrev.h b/include/linux/bitrev.h index cc5abd7..8ec9411 100644 --- a/include/linux/bitrev.h +++ b/include/linux/bitrev.h @@ -1,21 +1,105 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * Based on bitrev from the Linux kernel, by Akinobu Mita - */ - +/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_BITREV_H #define _LINUX_BITREV_H #include -extern u8 const byte_rev_table[256]; +#ifdef CONFIG_HAVE_ARCH_BITREVERSE +#include + +#define __bitrev32 __arch_bitrev32 +#define __bitrev16 __arch_bitrev16 +#define __bitrev8 __arch_bitrev8 -static inline u8 bitrev8(u8 byte) +#else +extern u8 const byte_rev_table[256]; +static inline u8 __bitrev8(u8 byte) { return byte_rev_table[byte]; } -u16 bitrev16(u16 in); -u32 bitrev32(u32 in); +static inline u16 __bitrev16(u16 x) +{ + return (__bitrev8(x & 0xff) << 8) | __bitrev8(x >> 8); +} + +static inline u32 __bitrev32(u32 x) +{ + return (__bitrev16(x & 0xffff) << 16) | __bitrev16(x >> 16); +} + +#endif /* CONFIG_HAVE_ARCH_BITREVERSE */ + +#define __bitrev8x4(x) (__bitrev32(swab32(x))) + +#define __constant_bitrev32(x) \ +({ \ + u32 __x = x; \ + __x = (__x >> 16) | (__x << 16);\ + __x = ((__x & (u32)0xFF00FF00UL) >> 8) | ((__x & (u32)0x00FF00FFUL) << 8); \ + __x = ((__x & (u32)0xF0F0F0F0UL) >> 4) | ((__x & (u32)0x0F0F0F0FUL) << 4); \ + __x = ((__x & (u32)0xCCCCCCCCUL) >> 2) | ((__x & (u32)0x33333333UL) << 2); \ + __x = ((__x & (u32)0xAAAAAAAAUL) >> 1) | ((__x & (u32)0x55555555UL) << 1); \ + __x; \ +}) + +#define __constant_bitrev16(x) \ +({ \ + u16 __x = x; \ + __x = (__x >> 8) | (__x << 8); \ + __x = ((__x & (u16)0xF0F0U) >> 4) | ((__x & (u16)0x0F0FU) << 4); \ + __x = ((__x & (u16)0xCCCCU) >> 2) | ((__x & (u16)0x3333U) << 2); \ + __x = ((__x & (u16)0xAAAAU) >> 1) | ((__x & (u16)0x5555U) << 1); \ + __x; \ +}) + +#define __constant_bitrev8x4(x) \ +({ \ + u32 __x = x; \ + __x = ((__x & (u32)0xF0F0F0F0UL) >> 4) | ((__x & (u32)0x0F0F0F0FUL) << 4); \ + __x = ((__x & (u32)0xCCCCCCCCUL) >> 2) | ((__x & (u32)0x33333333UL) << 2); \ + __x = ((__x & (u32)0xAAAAAAAAUL) >> 1) | ((__x & (u32)0x55555555UL) << 1); \ + __x; \ +}) + +#define __constant_bitrev8(x) \ +({ \ + u8 __x = x; \ + __x = (__x >> 4) | (__x << 4); \ + __x = ((__x & (u8)0xCCU) >> 2) | ((__x & (u8)0x33U) << 2); \ + __x = ((__x & (u8)0xAAU) >> 1) | ((__x & (u8)0x55U) << 1); \ + __x; \ +}) + +#define bitrev32(x) \ +({ \ + u32 __x = x; \ + __builtin_constant_p(__x) ? \ + __constant_bitrev32(__x) : \ + __bitrev32(__x); \ +}) + +#define bitrev16(x) \ +({ \ + u16 __x = x; \ + __builtin_constant_p(__x) ? \ + __constant_bitrev16(__x) : \ + __bitrev16(__x); \ +}) + +#define bitrev8x4(x) \ +({ \ + u32 __x = x; \ + __builtin_constant_p(__x) ? \ + __constant_bitrev8x4(__x) : \ + __bitrev8x4(__x); \ +}) +#define bitrev8(x) \ +({ \ + u8 __x = x; \ + __builtin_constant_p(__x) ? \ + __constant_bitrev8(__x) : \ + __bitrev8(__x) ; \ +}) #endif /* _LINUX_BITREV_H */ diff --git a/lib/bitrev.c b/lib/bitrev.c index 4d494e1..08231c0 100644 --- a/lib/bitrev.c +++ b/lib/bitrev.c @@ -1,13 +1,14 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * - * Based on bitrev from the Linux kernel, by Akinobu Mita - */ - +// SPDX-License-Identifier: GPL-2.0 +#ifndef CONFIG_HAVE_ARCH_BITREVERSE #include +#include #include +MODULE_AUTHOR("Akinobu Mita "); +MODULE_DESCRIPTION("Bit ordering reversal functions"); +MODULE_LICENSE("GPL"); + const u8 byte_rev_table[256] = { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, @@ -42,17 +43,6 @@ const u8 byte_rev_table[256] = { 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, }; +EXPORT_SYMBOL_GPL(byte_rev_table); -u16 bitrev16(u16 x) -{ - return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8); -} - -/** - * bitrev32 - reverse the order of bits in a u32 value - * @x: value to be bit-reversed - */ -u32 bitrev32(u32 x) -{ - return (bitrev16(x & 0xffff) << 16) | bitrev16(x >> 16); -} +#endif /* CONFIG_HAVE_ARCH_BITREVERSE */