From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E27B1A0C41; Wed, 6 Oct 2021 19:02:19 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 27713411C2; Wed, 6 Oct 2021 19:01:41 +0200 (CEST) Received: from inva021.nxp.com (inva021.nxp.com [92.121.34.21]) by mails.dpdk.org (Postfix) with ESMTP id 3F8A24115E for ; Wed, 6 Oct 2021 19:01:36 +0200 (CEST) Received: from inva021.nxp.com (localhost [127.0.0.1]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 20162201138; Wed, 6 Oct 2021 19:01:36 +0200 (CEST) Received: from aprdc01srsp001v.ap-rdc01.nxp.com (aprdc01srsp001v.ap-rdc01.nxp.com [165.114.16.16]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id B12AB20115E; Wed, 6 Oct 2021 19:01:35 +0200 (CEST) Received: from lsv03274.swis.in-blr01.nxp.com (lsv03274.swis.in-blr01.nxp.com [92.120.147.114]) by aprdc01srsp001v.ap-rdc01.nxp.com (Postfix) with ESMTP id 23C29183AD2A; Thu, 7 Oct 2021 01:01:35 +0800 (+08) From: nipun.gupta@nxp.com To: dev@dpdk.org Cc: thomas@monjalon.net, ferruh.yigit@intel.com, hemant.agrawal@nxp.com, sachin.saxena@nxp.com Date: Wed, 6 Oct 2021 22:31:26 +0530 Message-Id: <20211006170131.32616-6-nipun.gupta@nxp.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211006170131.32616-1-nipun.gupta@nxp.com> References: <20210927122650.30881-1-nipun.gupta@nxp.com> <20211006170131.32616-1-nipun.gupta@nxp.com> X-Virus-Scanned: ClamAV using ClamSMTP Subject: [dpdk-dev] [PATCH v3 05/10] net/dpaa2: add function to generate HW hash key X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Hemant Agrawal This patch add support to generate the hash key in software equivalent to WRIOP key generation. Signed-off-by: Hemant Agrawal --- drivers/net/dpaa2/base/dpaa2_tlu_hash.c | 153 ++++++++++++++++++++++++ drivers/net/dpaa2/meson.build | 1 + drivers/net/dpaa2/rte_pmd_dpaa2.h | 19 +++ drivers/net/dpaa2/version.map | 2 + 4 files changed, 175 insertions(+) create mode 100644 drivers/net/dpaa2/base/dpaa2_tlu_hash.c diff --git a/drivers/net/dpaa2/base/dpaa2_tlu_hash.c b/drivers/net/dpaa2/base/dpaa2_tlu_hash.c new file mode 100644 index 0000000000..9eb127c07c --- /dev/null +++ b/drivers/net/dpaa2/base/dpaa2_tlu_hash.c @@ -0,0 +1,153 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2021 NXP + */ +#include +#include +#include +#include + +static unsigned int sbox(unsigned int x) +{ + unsigned int a, b, c, d; + unsigned int oa, ob, oc, od; + + a = x & 0x1; + b = (x >> 1) & 0x1; + c = (x >> 2) & 0x1; + d = (x >> 3) & 0x1; + + oa = ((a & ~b & ~c & d) | (~a & b) | (~a & ~c & ~d) | (b & c)) & 0x1; + ob = ((a & ~b & d) | (~a & c & ~d) | (b & ~c)) & 0x1; + oc = ((a & ~b & c) | (a & ~b & ~d) | (~a & b & ~d) | (~a & c & ~d) | + (b & c & d)) & 0x1; + od = ((a & ~b & c) | (~a & b & ~c) | (a & b & ~d) | (~a & c & d)) & 0x1; + + return ((od << 3) | (oc << 2) | (ob << 1) | oa); +} + +static unsigned int sbox_tbl[16]; + +static int pbox_tbl[16] = {5, 9, 0, 13, + 7, 2, 11, 14, + 1, 4, 12, 8, + 3, 15, 6, 10 }; + +static unsigned int mix_tbl[8][16]; + +static unsigned int stage(unsigned int input) +{ + int sbox_out = 0; + int pbox_out = 0; + int i; + + /* mix */ + input ^= input >> 16; /* xor lower */ + input ^= input << 16; /* move original lower to upper */ + + for (i = 0; i < 32; i += 4) /* sbox stage */ + sbox_out |= (sbox_tbl[(input >> i) & 0xf]) << i; + + /* permutation */ + for (i = 0; i < 16; i++) + pbox_out |= ((sbox_out >> i) & 0x10001) << pbox_tbl[i]; + + return pbox_out; +} + +static unsigned int fast_stage(unsigned int input) +{ + int pbox_out = 0; + int i; + + /* mix */ + input ^= input >> 16; /* xor lower */ + input ^= input << 16; /* move original lower to upper */ + + for (i = 0; i < 32; i += 4) /* sbox stage */ + pbox_out |= mix_tbl[i >> 2][(input >> i) & 0xf]; + + return pbox_out; +} + +static unsigned int fast_hash32(unsigned int x) +{ + int i; + + for (i = 0; i < 4; i++) + x = fast_stage(x); + return x; +} + +static unsigned int +byte_crc32(unsigned char data /* new byte for the crc calculation */, + unsigned old_crc /* crc result of the last iteration */) +{ + int i; + unsigned int crc, polynom = 0xedb88320; + /* the polynomial is built on the reversed version of + * the CRC polynomial with out the x64 element. + */ + + crc = old_crc; + for (i = 0; i < 8; i++, data >>= 1) + crc = (crc >> 1) ^ (((crc ^ data) & 0x1) ? polynom : 0); + /* xor with polynomial is lsb of crc^data is 1 */ + + return crc; +} + +static unsigned int crc32_table[256]; + +static void init_crc32_table(void) +{ + int i; + + for (i = 0; i < 256; i++) + crc32_table[i] = byte_crc32((unsigned char)i, 0LL); +} + +static unsigned int +crc32_string(unsigned char *data, + int size, unsigned int old_crc) +{ + unsigned int crc; + int i; + + crc = old_crc; + for (i = 0; i < size; i++) + crc = (crc >> 8) ^ crc32_table[(crc ^ data[i]) & 0xff]; + + return crc; +} + +static void hash_init(void) +{ + init_crc32_table(); + int i, j; + + for (i = 0; i < 16; i++) + sbox_tbl[i] = sbox(i); + + for (i = 0; i < 32; i += 4) + for (j = 0; j < 16; j++) { + /* (a,b) + * (b,a^b)=(X,Y) + * (X^Y,X) + */ + unsigned int input = (0x88888888 ^ (8 << i)) | (j << i); + + input ^= input << 16; /* (X^Y,Y) */ + input ^= input >> 16; /* (X^Y,X) */ + mix_tbl[i >> 2][j] = stage(input); + } +} + +uint32_t rte_pmd_dpaa2_get_tlu_hash(uint8_t *data, int size) +{ + static int init; + + if (~init) + hash_init(); + init = 1; + return fast_hash32(crc32_string(data, size, 0x0)); +} diff --git a/drivers/net/dpaa2/meson.build b/drivers/net/dpaa2/meson.build index 20eaf0b8e4..4a6397d09e 100644 --- a/drivers/net/dpaa2/meson.build +++ b/drivers/net/dpaa2/meson.build @@ -20,6 +20,7 @@ sources = files( 'mc/dpkg.c', 'mc/dpdmux.c', 'mc/dpni.c', + 'base/dpaa2_tlu_hash.c', ) includes += include_directories('base', 'mc') diff --git a/drivers/net/dpaa2/rte_pmd_dpaa2.h b/drivers/net/dpaa2/rte_pmd_dpaa2.h index a68244c974..8ea42ee130 100644 --- a/drivers/net/dpaa2/rte_pmd_dpaa2.h +++ b/drivers/net/dpaa2/rte_pmd_dpaa2.h @@ -82,4 +82,23 @@ __rte_experimental void rte_pmd_dpaa2_thread_init(void); +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Generate the DPAA2 WRIOP based hash value + * + * @param key + * Array of key data + * @param size + * Size of the hash input key in bytes + * + * @return + * - 0 if successful. + * - Negative in case of failure. + */ + +__rte_experimental +uint32_t +rte_pmd_dpaa2_get_tlu_hash(uint8_t *key, int size); #endif /* _RTE_PMD_DPAA2_H */ diff --git a/drivers/net/dpaa2/version.map b/drivers/net/dpaa2/version.map index 3ab96344c4..24b2a6382d 100644 --- a/drivers/net/dpaa2/version.map +++ b/drivers/net/dpaa2/version.map @@ -10,6 +10,8 @@ DPDK_22 { EXPERIMENTAL { global: + # added in 21.11 + rte_pmd_dpaa2_get_tlu_hash; # added in 21.05 rte_pmd_dpaa2_mux_rx_frame_len; # added in 21.08 -- 2.17.1