From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from dpdk.org (dpdk.org [92.243.14.124])
	by inbox.dpdk.org (Postfix) with ESMTP id D38CDA034E;
	Thu,  7 May 2020 00:03:03 +0200 (CEST)
Received: from [92.243.14.124] (localhost [127.0.0.1])
	by dpdk.org (Postfix) with ESMTP id A46D71DB44;
	Thu,  7 May 2020 00:03:03 +0200 (CEST)
Received: from mga02.intel.com (mga02.intel.com [134.134.136.20])
 by dpdk.org (Postfix) with ESMTP id 342151DB43
 for <dev@dpdk.org>; Thu,  7 May 2020 00:03:02 +0200 (CEST)
IronPort-SDR: aqrlkINEpLmGe/VUuK39+MdgAav0pIStoqPR0ug9g115842KtnAQtqxOcH5SFumSwQU6SRa8D5
 rB14rDfJbZoA==
X-Amp-Result: SKIPPED(no attachment in message)
X-Amp-File-Uploaded: False
Received: from fmsmga007.fm.intel.com ([10.253.24.52])
 by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;
 06 May 2020 15:03:01 -0700
IronPort-SDR: HDfbMksV3Colz+8mSp+3u2nTlqGpMQrQ3qJC91MKJkK3OaNGJV3f5nHmK6ty2PU4CEJLyL8uIf
 T8Ov9j1qrWsw==
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="5.73,360,1583222400"; d="scan'208";a="249906134"
Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205])
 by fmsmga007.fm.intel.com with ESMTP; 06 May 2020 15:03:00 -0700
Received: from fmsmsx123.amr.corp.intel.com (10.18.125.38) by
 fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS)
 id 14.3.439.0; Wed, 6 May 2020 15:03:01 -0700
Received: from FMSEDG002.ED.cps.intel.com (10.1.192.134) by
 fmsmsx123.amr.corp.intel.com (10.18.125.38) with Microsoft SMTP Server (TLS)
 id 14.3.439.0; Wed, 6 May 2020 15:03:00 -0700
Received: from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.170)
 by edgegateway.intel.com (192.55.55.69) with Microsoft SMTP Server (TLS) id
 14.3.439.0; Wed, 6 May 2020 15:03:00 -0700
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=jU2wT2UU98orNRwPatbPXOXRoldiitUYurw/TMCUq7EAGggk4xBd+kA7Mvb6Fn3wG8uWugiEMSj01/IL+0JOQrwb+U5OAgkMyHXsaG8jQP7VWGGzgDvwMufOH6hHeJGvDoPEIQV2sifqgHwGPm36IuBLPPX6AprFkCKNFwuzdxKG0UlQj51Mo5RKExccBbYD1aa+XnyaDvfI1PYcOmOXXuYE/bPCyMf1CP8KJDAQGYvxRmbiLmuUob7Siw19Csob5W7gMfzv+bJL9kaC5vw5phYIfTZuGtAJTf89k4iBQ85Dk2JyWNYXk47wnqxbbsh9ODZ2kkx+ZhH7KXwmre12uw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; 
 s=arcselector9901;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=33xwfsP2E7YOK0SeUq6QVhMfRbiDlh59EGoeWPONa0g=;
 b=S51U4OAo+ew/PCtZSu0Nx00mg6SEAh7qrcSsnmgF9IkmI9OuOoSi/v/6VxOMa5igIrg7GxYN51+B41I5Jm9rVg1N9ZU/hZOewtNCaz0t7XLXHNRNbqROTe8IaEK29lioR+nL++fYFysQoAcoUaofqCBxLMt+kB+2Xi1mGKGXTeStDG1ZvkfXkQHJbSmHatsyMccgyAQ9ED6B4kh9D1Mst4asV7fEp5A+Xp6BJXUD4JMbrixqmyEkhoyI/fbZU0A6+BrHC4pksrAqnkAIldMgGb9oJ0oR+XWkgE6U+Cf2q01fPr7uDysD1w3B61IYpfK95+R1Oyisj5LcD4BKKbt8aw==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
 smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com;
 dkim=pass header.d=intel.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; 
 s=selector2-intel-onmicrosoft-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=33xwfsP2E7YOK0SeUq6QVhMfRbiDlh59EGoeWPONa0g=;
 b=xVYZBWdsYcLm3Se2vtc9Fo4guAIvBQ6UUkGQPjDcxAGMqxRcIuAM0a/45E/aVEKm12WS9ZnJGOgSozd/HBQ2Tg7qDdO04uZjdL3elL64TfoGCr5RZgdoyeT2BZQwpwpCUjpazuWYVTrBPe6r9QSgX0jaHSyQ0d9r7YIOmnYofUc=
Received: from BYAPR11MB3174.namprd11.prod.outlook.com (2603:10b6:a03:76::27)
 by BYAPR11MB3061.namprd11.prod.outlook.com (2603:10b6:a03:83::21)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2958.20; Wed, 6 May
 2020 22:02:58 +0000
Received: from BYAPR11MB3174.namprd11.prod.outlook.com
 ([fe80::85ee:c86:a45c:d0f5]) by BYAPR11MB3174.namprd11.prod.outlook.com
 ([fe80::85ee:c86:a45c:d0f5%6]) with mapi id 15.20.2958.029; Wed, 6 May 2020
 22:02:58 +0000
From: "Wang, Yipeng1" <yipeng1.wang@intel.com>
To: Pavan Nikhilesh Bhagavatula <pbhagavatula@marvell.com>, "Van Haaren,
 Harry" <harry.van.haaren@intel.com>, Jerin Jacob Kollanukkaran
 <jerinj@marvell.com>, "thomas@monjalon.net" <thomas@monjalon.net>, "Gobriel,
 Sameh" <sameh.gobriel@intel.com>, "Richardson, Bruce"
 <bruce.richardson@intel.com>, Ruifeng Wang <ruifeng.wang@arm.com>
CC: "dev@dpdk.org" <dev@dpdk.org>
Thread-Topic: [dpdk-dev] [RFC] hash: unify crc32 API header for x86 and ARM
Thread-Index: AQHWHlDjGnQe65gCoEGlQg3mQXDnEqibfhpw
Date: Wed, 6 May 2020 22:02:58 +0000
Message-ID: <BYAPR11MB3174DA81F9E4CEEB3756AF78C3A40@BYAPR11MB3174.namprd11.prod.outlook.com>
References: <20200429180515.5704-1-pbhagavatula@marvell.com>
In-Reply-To: <20200429180515.5704-1-pbhagavatula@marvell.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
dlp-reaction: no-action
dlp-version: 11.2.0.6
dlp-product: dlpe-windows
authentication-results: marvell.com; dkim=none (message not signed)
 header.d=none;marvell.com; dmarc=none action=none header.from=intel.com;
x-originating-ip: [192.55.52.197]
x-ms-publictraffictype: Email
x-ms-office365-filtering-correlation-id: 95e35a38-4710-435f-4d86-08d7f2093cb4
x-ms-traffictypediagnostic: BYAPR11MB3061:
x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr
x-ms-exchange-transport-forked: True
x-microsoft-antispam-prvs: <BYAPR11MB3061690731273A11697E4D42C3A40@BYAPR11MB3061.namprd11.prod.outlook.com>
x-ms-oob-tlc-oobclassifiers: OLM:5797;
x-forefront-prvs: 03950F25EC
x-ms-exchange-senderadcheck: 1
x-microsoft-antispam: BCL:0;
x-microsoft-antispam-message-info: jLNnKrxrvSq6Z7A2cQ/K6irlxPRCsqjNHt6w/BKVlKC1k6kzQLjznxk+IhoR4sGFbWMNKzLaiLyblJrSQlrGcRbnOcwmYdvMGP0Le4wZruyI1NHYfA8RWTIIoxO2DAxFaA7HS25lvo3w+VsjdyRHLfnHc69+BqZ9qkPBN1JMEyR5YNB6JQf8Cnzha5o2Cpu3twDV5lPMYZa0tDzZMc8N5cRYr2RcqFRRgYZ/moXtB9VK4qJfbBURERIGqkpRaMBK8f9/0OLr7A/OVPTp8nEbLQ0TmkWnAjwERKznu1l6a2lCk6E6fxFT9GDjPuGGl3feMaN5ZpiZf3OQ38nrJtT8ssF3nfU2s8D1wwS4zRLUb9jGuy0J2sruDtMv0Lw0fON1u2UJkJWgBQ2jrL8euwd5CVyMOP+w1OL4oN9nJC0t5KqgKr1g8sUcGJPpQFIXWTftARz68Z98occ5f07tFhZGFo6p5O5Pwj+NuEqdpcO1s0qafc48XR3Oix0N6lKNFsZhKrXNHvkBukxe0WHoIxOgZnR5NUJIvElfg0BLdQMSVYI=
x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;
 IPV:NLI; SFV:NSPM; H:BYAPR11MB3174.namprd11.prod.outlook.com; PTR:; CAT:NONE;
 SFTY:;
 SFS:(396003)(136003)(376002)(39860400002)(366004)(346002)(33430700001)(478600001)(4326008)(86362001)(5660300002)(6506007)(2906002)(53546011)(9686003)(55016002)(7696005)(186003)(66446008)(316002)(66556008)(66476007)(8936002)(64756008)(66946007)(76116006)(52536014)(71200400001)(8676002)(110136005)(33440700001)(33656002)(30864003)(26005)(921003)(579004);
 DIR:OUT; SFP:1102; 
x-ms-exchange-antispam-messagedata: Fb2VgFjGkSQjAdypsSjNb+cDAdqbdPvPTH5mXLt++0yFs/qJptwX0SJJJqekU73o9P4E8mjMNTMyxVxNB09F/DeGdBMT82Sj8OHkTdANo/tzEBi53boHKj/7Wxq7Ub0Rp/LeSJC9mmaOG7wHDTYOsWdf0KF140ciQdu+0lY8iVu5el1DkFyGERDXLJQrTzMzJUpNEDYHxd/u+5whah6pRL4MRmTLAU5QSvpaAMKO5+FaToYDl6XWW4WPsn0hw5XqMOOwEo6XXKcoLMZo/lm0Z4VvGmZuNDYzJCkeFcfRVfdjB/80Ma8awHjbsqNRlaMctVY3tBG0hZu1vzqoCV+Q/Wp6c52mupw1YoLuTMT4D8mIdCT1kBTKftOb0moefMm7+tJG96Ih6vPSPKxDB5Q5iZndp5Ak9RP4J/HF7F2zw6+BJGz/b7WOVXhGJgPpUYUdBTjgqpocnagUmWYgRMFfv2b18TEN7GieV3vuRzRBN5ll4bshGIjzpD/2l+BQZORLTtrCA+rsfRXcTkndvTyOxff8ctrB//Vjj2ulrrHzQcK2fV1jDDi8U647pmyI7fa3/nGe0YiDSdyv1b7+KcqxcJjh4IOCOSGCf18m9EGD0WZ1z8DHWCzm5W+gb4hKvvhd7iRps9bPJc7kVpnAB3rOG5FGHbXP7yJrh4uhi3n8HSTmKE9UbGcq3uNXOOtcQ9a66MLYLNKK/uNcU/PtAmdVQPSxbV9XZ9SgttCaK84jFRDZZN16BhfaaSy9Tj6AzVyTsUJp4pyFGiDFTSm9C+agBQI81YGHHTiOsYk+gxryDI8=
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-MS-Exchange-CrossTenant-Network-Message-Id: 95e35a38-4710-435f-4d86-08d7f2093cb4
X-MS-Exchange-CrossTenant-originalarrivaltime: 06 May 2020 22:02:58.1872 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: 1orSF7tWDNJtnEIuae6RHA0hUM+TfAp/TCWERGhoFaOMP7vIlh5Korh1cwnHQ95Jr42lNWO2JWhK0uPh1BlQIg==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR11MB3061
X-OriginatorOrg: intel.com
Subject: Re: [dpdk-dev] [RFC] hash: unify crc32 API header for x86 and ARM
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>

> -----Original Message-----
> From: pbhagavatula@marvell.com <pbhagavatula@marvell.com>
> Sent: Wednesday, April 29, 2020 11:05 AM
> To: jerinj@marvell.com; thomas@monjalon.net; Wang, Yipeng1
> <yipeng1.wang@intel.com>; Gobriel, Sameh <sameh.gobriel@intel.com>;
> Richardson, Bruce <bruce.richardson@intel.com>; Ruifeng Wang
> <ruifeng.wang@arm.com>
> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com>
> Subject: [dpdk-dev] [RFC] hash: unify crc32 API header for x86 and ARM
>=20
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>=20
> Merge crc32 hash calculation public API headers for x86 and ARM, split
> implementations of x86 and ARM into their respective private headers.
> This reduces the ifdef code clutter while keeping current ABI intact.
>=20
> Although we install `rte_crc_arm64.h` it is not used in any of the lib or=
 drivers
> layers. All the libs and drivers use `rte_hash_crc.h` which falls back to=
 SW
> crc32 calculation for ARM platform.
>=20
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
>=20
>  Currently, if application incorrectly sets CRC32_ARM64 as crc32 algorith=
m
> through `rte_hash_crc_set_alg()` on x86 or vice-versa we fallback to
> algorithm  set previously via `rte_hash_crc_set_alg()` instead of setting=
 the
> best  available.
>  This behaviour should probably change to setting the best available
> algorithm  and is up for discussion.

[Wang, Yipeng] Should it be an illegal flag if I set ARM64
On x86? I am thinking we should generate a warning message into logs if thi=
s happens.
>=20
>  app/test/test_hash.c            |   6 +
>  lib/librte_hash/Makefile        |   5 -
>  lib/librte_hash/crc_arm64.h     |  67 +++++++++++
>  lib/librte_hash/crc_x86.h       |  68 +++++++++++
>  lib/librte_hash/meson.build     |   3 +-
>  lib/librte_hash/rte_crc_arm64.h | 183 ------------------------------
> lib/librte_hash/rte_hash_crc.h  | 193 +++++++++++++-------------------
>  7 files changed, 219 insertions(+), 306 deletions(-)  create mode 100644
> lib/librte_hash/crc_arm64.h  create mode 100644 lib/librte_hash/crc_x86.h
> delete mode 100644 lib/librte_hash/rte_crc_arm64.h
>=20
> diff --git a/app/test/test_hash.c b/app/test/test_hash.c index
> afa3a1a3c..7bd457dac 100644
> --- a/app/test/test_hash.c
> +++ b/app/test/test_hash.c
> @@ -195,7 +195,13 @@ test_crc32_hash_alg_equiv(void)
>  	}
>=20
>  	/* Resetting to best available algorithm */
> +#if defined RTE_ARCH_X86
>  	rte_hash_crc_set_alg(CRC32_SSE42_x64);
> +#elif defined RTE_ARCH_ARM64
> +	rte_hash_crc_set_alg(CRC32_ARM64);
> +#else
> +	rte_hash_crc_set_alg(CRC32_SW);
> +#endif
>=20
>  	if (i =3D=3D CRC32_ITERATIONS)
>  		return 0;
> diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile index
> ec9f86499..f640afc42 100644
> --- a/lib/librte_hash/Makefile
> +++ b/lib/librte_hash/Makefile
> @@ -19,11 +19,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_HASH) +=3D rte_fbk_hash.c
> # install this header file  SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include :=
=3D
> rte_hash.h  SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include +=3D
> rte_hash_crc.h -ifeq ($(CONFIG_RTE_ARCH_ARM64),y) -ifneq ($(findstring
> RTE_MACHINE_CPUFLAG_CRC32,$(CFLAGS)),)
> -SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include +=3D rte_crc_arm64.h -endif
> -endif  SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include +=3D rte_jhash.h
> SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include +=3D rte_thash.h  SYMLINK-
> $(CONFIG_RTE_LIBRTE_HASH)-include +=3D rte_fbk_hash.h diff --git
> a/lib/librte_hash/crc_arm64.h b/lib/librte_hash/crc_arm64.h new file mode
> 100644 index 000000000..8e75f8297
> --- /dev/null
> +++ b/lib/librte_hash/crc_arm64.h
> @@ -0,0 +1,67 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2015 Cavium, Inc
> + */
> +
> +#ifndef _CRC_ARM64_H_
> +#define _CRC_ARM64_H_
> +
> +/**
> + * @file
> + *
> + * CRC arm64 Hash
> + */
[Wang, Yipeng] It is hidden now so do we still need this doxygen region abo=
ve?
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include <stdint.h>
> +#include <rte_cpuflags.h>
> +#include <rte_branch_prediction.h>
> +#include <rte_common.h>
[Wang, Yipeng] I don't think we need all these headers in this file.
> +
> +static inline uint32_t
> +crc32c_arm64_u8(uint8_t data, uint32_t init_val) {
> +	__asm__ volatile(
> +			"crc32cb %w[crc], %w[crc], %w[value]"
> +			: [crc] "+r" (init_val)
> +			: [value] "r" (data));
> +	return init_val;
> +}
> +
> +static inline uint32_t
> +crc32c_arm64_u16(uint16_t data, uint32_t init_val) {
> +	__asm__ volatile(
> +			"crc32ch %w[crc], %w[crc], %w[value]"
> +			: [crc] "+r" (init_val)
> +			: [value] "r" (data));
> +	return init_val;
> +}
> +
> +static inline uint32_t
> +crc32c_arm64_u32(uint32_t data, uint32_t init_val) {
> +	__asm__ volatile(
> +			"crc32cw %w[crc], %w[crc], %w[value]"
> +			: [crc] "+r" (init_val)
> +			: [value] "r" (data));
> +	return init_val;
> +}
> +
> +static inline uint32_t
> +crc32c_arm64_u64(uint64_t data, uint32_t init_val) {
> +	__asm__ volatile(
> +			"crc32cx %w[crc], %w[crc], %x[value]"
> +			: [crc] "+r" (init_val)
> +			: [value] "r" (data));
> +	return init_val;
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* _CRC_ARM64_H_ */
> diff --git a/lib/librte_hash/crc_x86.h b/lib/librte_hash/crc_x86.h new fi=
le
> mode 100644 index 000000000..fb45f2e98
> --- /dev/null
> +++ b/lib/librte_hash/crc_x86.h
> @@ -0,0 +1,68 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2010-2014 Intel Corporation  */
> +
> +#ifndef _CRC_X86_H_
> +#define _CRC_X86_H_
> +
> +#if defined(RTE_ARCH_X86)
> +static inline uint32_t
> +crc32c_sse42_u8(uint8_t data, uint32_t init_val) {
> +	__asm__ volatile(
> +			"crc32b %[data], %[init_val];"
> +			: [init_val] "+r" (init_val)
> +			: [data] "rm" (data));
> +	return init_val;
> +}
> +
> +static inline uint32_t
> +crc32c_sse42_u16(uint16_t data, uint32_t init_val) {
> +	__asm__ volatile(
> +			"crc32w %[data], %[init_val];"
> +			: [init_val] "+r" (init_val)
> +			: [data] "rm" (data));
> +	return init_val;
> +}
> +
> +static inline uint32_t
> +crc32c_sse42_u32(uint32_t data, uint32_t init_val) {
> +	__asm__ volatile(
> +			"crc32l %[data], %[init_val];"
> +			: [init_val] "+r" (init_val)
> +			: [data] "rm" (data));
> +	return init_val;
> +}
> +
> +static inline uint32_t
> +crc32c_sse42_u64_mimic(uint64_t data, uint32_t init_val) {
> +	union {
> +		uint32_t u32[2];
> +		uint64_t u64;
> +	} d;
> +
> +	d.u64 =3D data;
> +	init_val =3D crc32c_sse42_u32(d.u32[0], init_val);
> +	init_val =3D crc32c_sse42_u32(d.u32[1], init_val);
> +	return init_val;
> +}
> +#endif
> +
> +#ifdef RTE_ARCH_X86_64
> +static inline uint32_t
> +crc32c_sse42_u64(uint64_t data, uint32_t init_val) {
> +	uint64_t val =3D init_val;
> +
> +	__asm__ volatile(
> +			"crc32q %[data], %[init_val];"
> +			: [init_val] "+r" (val)
> +			: [data] "rm" (data));
> +	return (uint32_t)val;
> +}
> +#endif
> +
> +#endif
> diff --git a/lib/librte_hash/meson.build b/lib/librte_hash/meson.build in=
dex
> 6ab46ae9d..90a180bc8 100644
> --- a/lib/librte_hash/meson.build
> +++ b/lib/librte_hash/meson.build
> @@ -1,8 +1,7 @@
>  # SPDX-License-Identifier: BSD-3-Clause  # Copyright(c) 2017 Intel
> Corporation
>=20
> -headers =3D files('rte_crc_arm64.h',
> -	'rte_fbk_hash.h',
> +headers =3D files('rte_fbk_hash.h',
>  	'rte_hash_crc.h',
>  	'rte_hash.h',
>  	'rte_jhash.h',
> diff --git a/lib/librte_hash/rte_crc_arm64.h
> b/lib/librte_hash/rte_crc_arm64.h deleted file mode 100644 index
> b4628cfc0..000000000
> --- a/lib/librte_hash/rte_crc_arm64.h
> +++ /dev/null
> @@ -1,183 +0,0 @@
> -/* SPDX-License-Identifier: BSD-3-Clause
> - * Copyright(c) 2015 Cavium, Inc
> - */
> -
> -#ifndef _RTE_CRC_ARM64_H_
> -#define _RTE_CRC_ARM64_H_
> -
> -/**
> - * @file
> - *
> - * RTE CRC arm64 Hash
> - */
> -
> -#ifdef __cplusplus
> -extern "C" {
> -#endif
> -
> -#include <stdint.h>
> -#include <rte_cpuflags.h>
> -#include <rte_branch_prediction.h>
> -#include <rte_common.h>
> -
> -static inline uint32_t
> -crc32c_arm64_u8(uint8_t data, uint32_t init_val) -{
> -	__asm__ volatile(
> -			"crc32cb %w[crc], %w[crc], %w[value]"
> -			: [crc] "+r" (init_val)
> -			: [value] "r" (data));
> -	return init_val;
> -}
> -
> -static inline uint32_t
> -crc32c_arm64_u16(uint16_t data, uint32_t init_val) -{
> -	__asm__ volatile(
> -			"crc32ch %w[crc], %w[crc], %w[value]"
> -			: [crc] "+r" (init_val)
> -			: [value] "r" (data));
> -	return init_val;
> -}
> -
> -static inline uint32_t
> -crc32c_arm64_u32(uint32_t data, uint32_t init_val) -{
> -	__asm__ volatile(
> -			"crc32cw %w[crc], %w[crc], %w[value]"
> -			: [crc] "+r" (init_val)
> -			: [value] "r" (data));
> -	return init_val;
> -}
> -
> -static inline uint32_t
> -crc32c_arm64_u64(uint64_t data, uint32_t init_val) -{
> -	__asm__ volatile(
> -			"crc32cx %w[crc], %w[crc], %x[value]"
> -			: [crc] "+r" (init_val)
> -			: [value] "r" (data));
> -	return init_val;
> -}
> -
> -/**
> - * Allow or disallow use of arm64 SIMD instrinsics for CRC32 hash
> - * calculation.
> - *
> - * @param alg
> - *   An OR of following flags:
> - *   - (CRC32_SW) Don't use arm64 crc intrinsics
> - *   - (CRC32_ARM64) Use ARMv8 CRC intrinsic if available
> - *
> - */
> -static inline void
> -rte_hash_crc_set_alg(uint8_t alg)
> -{
> -	switch (alg) {
> -	case CRC32_ARM64:
> -		if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_CRC32))
> -			alg =3D CRC32_SW;
> -		/* fall-through */
> -	case CRC32_SW:
> -		crc32_alg =3D alg;
> -		/* fall-through */
> -	default:
> -		break;
> -	}
> -}
> -
> -/* Setting the best available algorithm */
> -RTE_INIT(rte_hash_crc_init_alg)
> -{
> -	rte_hash_crc_set_alg(CRC32_ARM64);
> -}
> -
> -/**
> - * Use single crc32 instruction to perform a hash on a 1 byte value.
> - * Fall back to software crc32 implementation in case arm64 crc intrinsi=
cs is
> - * not supported
> - *
> - * @param data
> - *   Data to perform hash on.
> - * @param init_val
> - *   Value to initialise hash generator.
> - * @return
> - *   32bit calculated hash value.
> - */
> -static inline uint32_t
> -rte_hash_crc_1byte(uint8_t data, uint32_t init_val) -{
> -	if (likely(crc32_alg & CRC32_ARM64))
> -		return crc32c_arm64_u8(data, init_val);
> -
> -	return crc32c_1byte(data, init_val);
> -}
> -
> -/**
> - * Use single crc32 instruction to perform a hash on a 2 bytes value.
> - * Fall back to software crc32 implementation in case arm64 crc intrinsi=
cs is
> - * not supported
> - *
> - * @param data
> - *   Data to perform hash on.
> - * @param init_val
> - *   Value to initialise hash generator.
> - * @return
> - *   32bit calculated hash value.
> - */
> -static inline uint32_t
> -rte_hash_crc_2byte(uint16_t data, uint32_t init_val) -{
> -	if (likely(crc32_alg & CRC32_ARM64))
> -		return crc32c_arm64_u16(data, init_val);
> -
> -	return crc32c_2bytes(data, init_val);
> -}
> -
> -/**
> - * Use single crc32 instruction to perform a hash on a 4 byte value.
> - * Fall back to software crc32 implementation in case arm64 crc intrinsi=
cs is
> - * not supported
> - *
> - * @param data
> - *   Data to perform hash on.
> - * @param init_val
> - *   Value to initialise hash generator.
> - * @return
> - *   32bit calculated hash value.
> - */
> -static inline uint32_t
> -rte_hash_crc_4byte(uint32_t data, uint32_t init_val) -{
> -	if (likely(crc32_alg & CRC32_ARM64))
> -		return crc32c_arm64_u32(data, init_val);
> -
> -	return crc32c_1word(data, init_val);
> -}
> -
> -/**
> - * Use single crc32 instruction to perform a hash on a 8 byte value.
> - * Fall back to software crc32 implementation in case arm64 crc intrinsi=
cs is
> - * not supported
> - *
> - * @param data
> - *   Data to perform hash on.
> - * @param init_val
> - *   Value to initialise hash generator.
> - * @return
> - *   32bit calculated hash value.
> - */
> -static inline uint32_t
> -rte_hash_crc_8byte(uint64_t data, uint32_t init_val) -{
> -	if (likely(crc32_alg =3D=3D CRC32_ARM64))
> -		return crc32c_arm64_u64(data, init_val);
> -
> -	return crc32c_2words(data, init_val);
> -}
> -
> -#ifdef __cplusplus
> -}
> -#endif
> -
> -#endif /* _RTE_CRC_ARM64_H_ */
> diff --git a/lib/librte_hash/rte_hash_crc.h b/lib/librte_hash/rte_hash_cr=
c.h
> index cf28031b3..292697db1 100644
> --- a/lib/librte_hash/rte_hash_crc.h
> +++ b/lib/librte_hash/rte_hash_crc.h
> @@ -21,6 +21,15 @@ extern "C" {
>  #include <rte_branch_prediction.h>
>  #include <rte_common.h>
>=20
> +typedef uint32_t
> +(*crc32_handler_1b)(uint8_t data, uint32_t init_val); typedef uint32_t
> +(*crc32_handler_2b)(uint16_t data, uint32_t init_val); typedef uint32_t
> +(*crc32_handler_4b)(uint32_t data, uint32_t init_val); typedef uint32_t
> +(*crc32_handler_8b)(uint64_t data, uint32_t init_val);

[Wang, Yipeng] I guess functions pointers makes the code cleaner.
I am just not sure on performance implications for indirect call.
@Harry for his comment.

> +
>  /* Lookup tables for software implementation of CRC32C */  static const
> uint32_t crc32c_tables[8][256] =3D {{
>   0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, 0xC79A971F, 0x35F1141C,
> 0x26A1E7E8, 0xD4CA64EB, @@ -322,7 +331,7 @@ crc32c_2bytes(uint16_t
> data, uint32_t init_val)  }
>=20
>  static inline uint32_t
> -crc32c_1word(uint32_t data, uint32_t init_val)
> +crc32c_4bytes(uint32_t data, uint32_t init_val)
>  {
>  	uint32_t crc, term1, term2;
>  	crc =3D init_val;
> @@ -336,7 +345,7 @@ crc32c_1word(uint32_t data, uint32_t init_val)  }
>=20
>  static inline uint32_t
> -crc32c_2words(uint64_t data, uint32_t init_val)
> +crc32c_8bytes(uint64_t data, uint32_t init_val)
>  {
>  	uint32_t crc, term1, term2;
>  	union {
> @@ -357,109 +366,94 @@ crc32c_2words(uint64_t data, uint32_t init_val)
>=20
>  	return crc;
>  }
> -
> -#if defined(RTE_ARCH_X86)
> -static inline uint32_t
> -crc32c_sse42_u8(uint8_t data, uint32_t init_val) -{
> -	__asm__ volatile(
> -			"crc32b %[data], %[init_val];"
> -			: [init_val] "+r" (init_val)
> -			: [data] "rm" (data));
> -	return init_val;
> -}
> -
> -static inline uint32_t
> -crc32c_sse42_u16(uint16_t data, uint32_t init_val) -{
> -	__asm__ volatile(
> -			"crc32w %[data], %[init_val];"
> -			: [init_val] "+r" (init_val)
> -			: [data] "rm" (data));
> -	return init_val;
> -}
> -
> -static inline uint32_t
> -crc32c_sse42_u32(uint32_t data, uint32_t init_val) -{
> -	__asm__ volatile(
> -			"crc32l %[data], %[init_val];"
> -			: [init_val] "+r" (init_val)
> -			: [data] "rm" (data));
> -	return init_val;
> -}
> -
> -static inline uint32_t
> -crc32c_sse42_u64_mimic(uint64_t data, uint64_t init_val) -{
> -	union {
> -		uint32_t u32[2];
> -		uint64_t u64;
> -	} d;
> -
> -	d.u64 =3D data;
> -	init_val =3D crc32c_sse42_u32(d.u32[0], (uint32_t)init_val);
> -	init_val =3D crc32c_sse42_u32(d.u32[1], (uint32_t)init_val);
> -	return (uint32_t)init_val;
> -}
> -#endif
> -
> -#ifdef RTE_ARCH_X86_64
> -static inline uint32_t
> -crc32c_sse42_u64(uint64_t data, uint64_t init_val) -{
> -	__asm__ volatile(
> -			"crc32q %[data], %[init_val];"
> -			: [init_val] "+r" (init_val)
> -			: [data] "rm" (data));
> -	return (uint32_t)init_val;
> -}
> -#endif
> -
[Wang, Yipeng] keep the blank line before define.
>  #define CRC32_SW            (1U << 0)
>  #define CRC32_SSE42         (1U << 1)
>  #define CRC32_x64           (1U << 2)
>  #define CRC32_SSE42_x64     (CRC32_x64|CRC32_SSE42)
>  #define CRC32_ARM64         (1U << 3)
>=20
> -static uint8_t crc32_alg =3D CRC32_SW;
> +static crc32_handler_1b crc32_1b =3D crc32c_1byte; static
> +crc32_handler_2b crc32_2b =3D crc32c_2bytes; static crc32_handler_4b
> +crc32_4b =3D crc32c_4bytes; static crc32_handler_8b crc32_8b =3D
> +crc32c_8bytes;
>=20
>  #if defined(RTE_ARCH_ARM64) &&
> defined(RTE_MACHINE_CPUFLAG_CRC32)
> -#include "rte_crc_arm64.h"
> -#else
> +#include "crc_arm64.h"
> +#endif
> +
> +#if defined(RTE_ARCH_X86)
> +#include "crc_x86.h"
> +#endif
>=20
>  /**
> - * Allow or disallow use of SSE4.2 instrinsics for CRC32 hash
> + * Allow or disallow use of SSE4.2/ARMv8 instrinsics for CRC32 hash
>   * calculation.
>   *
>   * @param alg
>   *   An OR of following flags:
> - *   - (CRC32_SW) Don't use SSE4.2 intrinsics
> + *   - (CRC32_SW) Don't use SSE4.2 intrinsics (default non-[x86/ARMv8])
>   *   - (CRC32_SSE42) Use SSE4.2 intrinsics if available
> - *   - (CRC32_SSE42_x64) Use 64-bit SSE4.2 intrinsic if available (defau=
lt)
> - *
> + *   - (CRC32_SSE42_x64) Use 64-bit SSE4.2 intrinsic if available (defau=
lt x86)
> + *   - (CRC32_ARM64) Use ARMv8 CRC intrinsic if available
>   */
>  static inline void
>  rte_hash_crc_set_alg(uint8_t alg)
>  {
> -#if defined(RTE_ARCH_X86)
> -	if (alg =3D=3D CRC32_SSE42_x64 &&
> -			!rte_cpu_get_flag_enabled(RTE_CPUFLAG_EM64T))
> -		alg =3D CRC32_SSE42;
> +	switch (alg) {
> +	case CRC32_SSE42_x64:
> +#if defined RTE_ARCH_X86
> +		crc32_1b =3D crc32c_sse42_u8;
> +		crc32_2b =3D crc32c_sse42_u16;
> +		crc32_4b =3D crc32c_sse42_u32;
> +
> +	if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_EM64T))
> +		crc32_8b =3D crc32c_sse42_u64_mimic;
> +	else
> +		crc32_8b =3D crc32c_sse42_u64;
>  #endif
> -	crc32_alg =3D alg;
> +		break;
> +	case CRC32_SSE42:
> +#if defined RTE_ARCH_X86
> +		crc32_1b =3D crc32c_sse42_u8;
> +		crc32_2b =3D crc32c_sse42_u16;
> +		crc32_4b =3D crc32c_sse42_u32;
> +		crc32_8b =3D crc32c_sse42_u64_mimic;
> +#endif
> +		break;
> +	case CRC32_ARM64:
> +#if defined RTE_ARCH_ARM64
> +	if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_CRC32)) {
> +		crc32_1b =3D crc32c_arm64_u8;
> +		crc32_2b =3D crc32c_arm64_u16;
> +		crc32_4b =3D crc32c_arm64_u32;
> +		crc32_8b =3D crc32c_arm64_u64;
> +	}
> +#endif
> +		break;
> +	case CRC32_SW:
> +	default:
> +		crc32_1b =3D crc32c_1byte;
> +		crc32_2b =3D crc32c_2bytes;
> +		crc32_4b =3D crc32c_4bytes;
> +		crc32_8b =3D crc32c_8bytes;
> +	break;
> +	}
>  }
>=20
>  /* Setting the best available algorithm */
>  RTE_INIT(rte_hash_crc_init_alg)
>  {
> +#if defined RTE_ARCH_X86
>  	rte_hash_crc_set_alg(CRC32_SSE42_x64);
> +#elif defined RTE_ARCH_ARM64
> +	rte_hash_crc_set_alg(CRC32_ARM64);
> +#else
> +	rte_hash_crc_set_alg(CRC32_SW);
> +#endif
>  }
>=20
>  /**
> - * Use single crc32 instruction to perform a hash on a byte value.
> - * Fall back to software crc32 implementation in case SSE4.2 is
> - * not supported
> + * Calculate crc32 hash value of 1bytes.
>   *
>   * @param data
>   *   Data to perform hash on.
> @@ -471,18 +465,11 @@ RTE_INIT(rte_hash_crc_init_alg)  static inline
> uint32_t  rte_hash_crc_1byte(uint8_t data, uint32_t init_val)  { -#if def=
ined
> RTE_ARCH_X86
> -	if (likely(crc32_alg & CRC32_SSE42))
> -		return crc32c_sse42_u8(data, init_val);
> -#endif
> -
> -	return crc32c_1byte(data, init_val);
> +	return (crc32_1b)(data, init_val);
>  }
>=20
>  /**
> - * Use single crc32 instruction to perform a hash on a 2 bytes value.
> - * Fall back to software crc32 implementation in case SSE4.2 is
> - * not supported
> + * Calculate crc32 hash value of 2bytes.
>   *
>   * @param data
>   *   Data to perform hash on.
> @@ -494,18 +481,11 @@ rte_hash_crc_1byte(uint8_t data, uint32_t init_val)
> static inline uint32_t  rte_hash_crc_2byte(uint16_t data, uint32_t init_v=
al)  { -
> #if defined RTE_ARCH_X86
> -	if (likely(crc32_alg & CRC32_SSE42))
> -		return crc32c_sse42_u16(data, init_val);
> -#endif
> -
> -	return crc32c_2bytes(data, init_val);
> +	return (crc32_2b)(data, init_val);
>  }
>=20
>  /**
> - * Use single crc32 instruction to perform a hash on a 4 byte value.
> - * Fall back to software crc32 implementation in case SSE4.2 is
> - * not supported
> + * Calculate crc32 hash value of 4bytes.
>   *
>   * @param data
>   *   Data to perform hash on.
> @@ -517,18 +497,11 @@ rte_hash_crc_2byte(uint16_t data, uint32_t init_val=
)
> static inline uint32_t  rte_hash_crc_4byte(uint32_t data, uint32_t init_v=
al)  { -
> #if defined RTE_ARCH_X86
> -	if (likely(crc32_alg & CRC32_SSE42))
> -		return crc32c_sse42_u32(data, init_val);
> -#endif
> -
> -	return crc32c_1word(data, init_val);
> +	return (crc32_4b)(data, init_val);
>  }
>=20
>  /**
> - * Use single crc32 instruction to perform a hash on a 8 byte value.
> - * Fall back to software crc32 implementation in case SSE4.2 is
> - * not supported
> + * Calculate crc32 hash value of 8bytes.
>   *
>   * @param data
>   *   Data to perform hash on.
> @@ -540,21 +513,9 @@ rte_hash_crc_4byte(uint32_t data, uint32_t init_val)
> static inline uint32_t  rte_hash_crc_8byte(uint64_t data, uint32_t init_v=
al)  { -
> #ifdef RTE_ARCH_X86_64
> -	if (likely(crc32_alg =3D=3D CRC32_SSE42_x64))
> -		return crc32c_sse42_u64(data, init_val);
> -#endif
> -
> -#if defined RTE_ARCH_X86
> -	if (likely(crc32_alg & CRC32_SSE42))
> -		return crc32c_sse42_u64_mimic(data, init_val);
> -#endif
> -
> -	return crc32c_2words(data, init_val);
> +	return (crc32_8b)(data, init_val);
>  }
>=20
> -#endif
> -
>  /**
>   * Calculate CRC32 hash on user-supplied byte array.
>   *
> --
> 2.17.1
[Wang, Yipeng]=20
Thanks for the patch, please see my comment inlined.

I think it is good to hide the architecture specific headers.
And I agree with Harry that we shouldn't silently remove a public header.
I don't know the best practice on handling this though (e.g. symlink or dum=
myfile), either way looks fine to me.
Bruce/Thomas may comment.