1732115ceSRahul Bhansali /* SPDX-License-Identifier: BSD-3-Clause
2732115ceSRahul Bhansali * Copyright(c) 2016 Intel Corporation.
3732115ceSRahul Bhansali * Copyright(c) 2017 IBM Corporation.
4732115ceSRahul Bhansali * Copyright(C) 2022 Marvell.
5732115ceSRahul Bhansali */
6732115ceSRahul Bhansali
7732115ceSRahul Bhansali #ifndef PORT_GROUP_H
8732115ceSRahul Bhansali #define PORT_GROUP_H
9732115ceSRahul Bhansali
10732115ceSRahul Bhansali #include "pkt_group.h"
11732115ceSRahul Bhansali
12732115ceSRahul Bhansali /*
13732115ceSRahul Bhansali * Group consecutive packets with the same destination port in bursts of 4.
14732115ceSRahul Bhansali * Suppose we have array of destination ports:
15732115ceSRahul Bhansali * dst_port[] = {a, b, c, d,, e, ... }
16732115ceSRahul Bhansali * dp1 should contain: <a, b, c, d>, dp2: <b, c, d, e>.
17732115ceSRahul Bhansali * We doing 4 comparisons at once and the result is 4 bit mask.
18732115ceSRahul Bhansali * This mask is used as an index into prebuild array of pnum values.
19732115ceSRahul Bhansali */
20732115ceSRahul Bhansali static inline uint16_t *
port_groupx4(uint16_t pn[FWDSTEP+1],uint16_t * lp,__vector unsigned short dp1,__vector unsigned short dp2)21732115ceSRahul Bhansali port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp,
22732115ceSRahul Bhansali __vector unsigned short dp1,
23732115ceSRahul Bhansali __vector unsigned short dp2)
24732115ceSRahul Bhansali {
25732115ceSRahul Bhansali union {
26732115ceSRahul Bhansali uint16_t u16[FWDSTEP + 1];
27732115ceSRahul Bhansali uint64_t u64;
28732115ceSRahul Bhansali } *pnum = (void *)pn;
29*927cb43fSPavan Nikhilesh __vector unsigned long long result;
30*927cb43fSPavan Nikhilesh const __vector unsigned int perm_mask = {0x00204060, 0x80808080,
31*927cb43fSPavan Nikhilesh 0x80808080, 0x80808080};
32732115ceSRahul Bhansali int32_t v;
33732115ceSRahul Bhansali
34*927cb43fSPavan Nikhilesh dp1 = (__vector unsigned short)vec_cmpeq(dp1, dp2);
35*927cb43fSPavan Nikhilesh dp1 = vec_mergeh(dp1, dp1);
36*927cb43fSPavan Nikhilesh result = (__vector unsigned long long)vec_vbpermq(
37*927cb43fSPavan Nikhilesh (__vector unsigned char)dp1, (__vector unsigned char)perm_mask);
38732115ceSRahul Bhansali
39*927cb43fSPavan Nikhilesh v = result[1];
40732115ceSRahul Bhansali /* update last port counter. */
41732115ceSRahul Bhansali lp[0] += gptbl[v].lpv;
42732115ceSRahul Bhansali
43732115ceSRahul Bhansali /* if dest port value has changed. */
44732115ceSRahul Bhansali if (v != GRPMSK) {
45732115ceSRahul Bhansali pnum->u64 = gptbl[v].pnum;
46732115ceSRahul Bhansali pnum->u16[FWDSTEP] = 1;
47732115ceSRahul Bhansali lp = pnum->u16 + gptbl[v].idx;
48732115ceSRahul Bhansali }
49732115ceSRahul Bhansali
50732115ceSRahul Bhansali return lp;
51732115ceSRahul Bhansali }
52732115ceSRahul Bhansali
53732115ceSRahul Bhansali #endif /* PORT_GROUP_H */
54