From patchwork Fri Dec 20 11:33:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wolfram Sang X-Patchwork-Id: 13916640 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 407AAE7718B for ; Fri, 20 Dec 2024 11:33:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=tw5h6rXmBE6DzwemmJ/aKA2rPmnVHj0Tqpck1dEzZMc=; b=PJJX0Af8TOOrRi 9u9HMbAdn6npxJWPDeMCfQnynNuN2FtB4f33LrGltwycSd9QWQswVNF/CtPWNgjzp/CU165YtV+pW 8bXyn7YpDyJNGwUQf5BO/me3x79D7R//d38xj9yIFmNN1lxiCDJsglCu9jAy4cvTfMuBvCyTP5iB1 w9os7Qcw6r1BtOIdEY+Tyj16Jv4Q0U0YhcfxreESctSYL9QUhLpzF3Amc5JBpvXlaUAcyJj5/Jqw6 y05efLKOafh2lOZr/n1B2pMNQInMYSQuGo/xnV+3TjlCS24/aCrdlZag/kXgg3yEScyUWjIQS9Z5g ju6zrR3bjsO2gAJ3HEyw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tObGH-00000004mwh-02K0; Fri, 20 Dec 2024 11:33:41 +0000 Received: from zeus03.de ([194.117.254.33] helo=mail.zeus03.de) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tObGE-00000004mue-022b for linux-i3c@lists.infradead.org; Fri, 20 Dec 2024 11:33:39 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= sang-engineering.com; h=from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; s=k1; bh=uWx7Khj94+L0maCjBS9mNDc9rvpKoRkC0PwJFVrpB/4=; b=Mk5lMc bBigG6RSFglZ1BJGbzzc1v4XUGxS3lCHnMfYERPbnXJ6Qoq2xaZmAXjDo/m/Ph4r EEi3DUP5uBH6cF1FjK9cslyAx6V4Uu3b9BvDjEHMTakEMF72MmkAjSnJ9QFUTvQO T7UJ+zlyRZZ8E+kLdLQwj2jxEL8TZNM6EEd0AdRYQ6t3xYpa+u+a50zwHmtrNyXA V2lPtbcc9w9k/9nx6tJqcKBlB/63FtLVPkfdMLl3UHqclIZDgvpfeJccCelkuL1/ gJiuZ3cU9lv8rZZVJY86eHLXXD8UdchTRVT6xK6Qa6QXxCdPazGKOEUk1DhWoDui o/o2UkWLM9hu2K8w== Received: (qmail 990887 invoked from network); 20 Dec 2024 12:33:36 +0100 Received: by mail.zeus03.de with ESMTPSA (TLS_AES_256_GCM_SHA384 encrypted, authenticated); 20 Dec 2024 12:33:36 +0100 X-UD-Smtp-Session: l3s3148p1@q194BLIptOIujnsY From: Wolfram Sang To: linux-renesas-soc@vger.kernel.org Cc: Yury Norov , linux-i3c@lists.infradead.org, Wolfram Sang , Guenter Roeck , Geert Uytterhoeven , Kuan-Wei Chiu , Rasmus Villemoes Subject: [PATCH RFT RESEND 1/5] bitops: add generic parity calculation for u8 Date: Fri, 20 Dec 2024 12:33:29 +0100 Message-Id: <20241220113335.17937-2-wsa+renesas@sang-engineering.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20241220113335.17937-1-wsa+renesas@sang-engineering.com> References: <20241220113335.17937-1-wsa+renesas@sang-engineering.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241220_033338_319664_0615BE6B X-CRM114-Status: GOOD ( 14.47 ) X-BeenThere: linux-i3c@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-i3c" Errors-To: linux-i3c-bounces+linux-i3c=archiver.kernel.org@lists.infradead.org There are multiple open coded implementations for getting the parity of a byte in the kernel, even using different approaches. Take the pretty efficient version from SPD5118 driver and make it generally available by putting it into the bitops header. As long as there is just one parity calculation helper, the creation of a distinct 'parity.h' header was discarded. Also, the usage of hweight8() for architectures having a popcnt instruction is postponed until a use case within hot paths is desired. The motivation for this patch is the frequent use of odd parity in the I3C specification and to simplify drivers there. Changes compared to the original SPD5118 version are the addition of kernel documentation, switching the return type from bool to int, and renaming the argument of the function. Signed-off-by: Wolfram Sang Tested-by: Guenter Roeck Reviewed-by: Geert Uytterhoeven Acked-by: Yury Norov Reviewed-by: Kuan-Wei Chiu Tested-by: Kuan-Wei Chiu --- include/linux/bitops.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/include/linux/bitops.h b/include/linux/bitops.h index ba35bbf07798..4ed430934ffc 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h @@ -229,6 +229,37 @@ static inline int get_count_order_long(unsigned long l) return (int)fls_long(--l); } +/** + * get_parity8 - get the parity of an u8 value + * @value: the value to be examined + * + * Determine the parity of the u8 argument. + * + * Returns: + * 0 for even parity, 1 for odd parity + * + * Note: This function informs you about the current parity. Example to bail + * out when parity is odd: + * + * if (get_parity8(val) == 1) + * return -EBADMSG; + * + * If you need to calculate a parity bit, you need to draw the conclusion from + * this result yourself. Example to enforce odd parity, parity bit is bit 7: + * + * if (get_parity8(val) == 0) + * val |= BIT(7); + */ +static inline int get_parity8(u8 val) +{ + /* + * One explanation of this algorithm: + * https://funloop.org/codex/problem/parity/README.html + */ + val ^= val >> 4; + return (0x6996 >> (val & 0xf)) & 1; +} + /** * __ffs64 - find first set bit in a 64 bit word * @word: The 64 bit word