1*732115ceSRahul Bhansali /* SPDX-License-Identifier: BSD-3-Clause 2*732115ceSRahul Bhansali * Copyright(c) 2016-2018 Intel Corporation. 3*732115ceSRahul Bhansali * Copyright(c) 2017-2018 Linaro Limited. 4*732115ceSRahul Bhansali * Copyright(C) 2022 Marvell. 5*732115ceSRahul Bhansali */ 6*732115ceSRahul Bhansali 7*732115ceSRahul Bhansali #ifndef PKT_GROUP_H 8*732115ceSRahul Bhansali #define PKT_GROUP_H 9*732115ceSRahul Bhansali 10*732115ceSRahul Bhansali #define FWDSTEP 4 11*732115ceSRahul Bhansali 12*732115ceSRahul Bhansali /* 13*732115ceSRahul Bhansali * Group consecutive packets with the same destination port into one burst. 14*732115ceSRahul Bhansali * To avoid extra latency this is done together with some other packet 15*732115ceSRahul Bhansali * processing, but after we made a final decision about packet's destination. 16*732115ceSRahul Bhansali * To do this we maintain: 17*732115ceSRahul Bhansali * pnum - array of number of consecutive packets with the same dest port for 18*732115ceSRahul Bhansali * each packet in the input burst. 19*732115ceSRahul Bhansali * lp - pointer to the last updated element in the pnum. 20*732115ceSRahul Bhansali * dlp - dest port value lp corresponds to. 21*732115ceSRahul Bhansali */ 22*732115ceSRahul Bhansali 23*732115ceSRahul Bhansali #define GRPSZ (1 << FWDSTEP) 24*732115ceSRahul Bhansali #define GRPMSK (GRPSZ - 1) 25*732115ceSRahul Bhansali 26*732115ceSRahul Bhansali #define GROUP_PORT_STEP(dlp, dcp, lp, pn, idx) do { \ 27*732115ceSRahul Bhansali if (likely((dlp) == (dcp)[(idx)])) { \ 28*732115ceSRahul Bhansali (lp)[0]++; \ 29*732115ceSRahul Bhansali } else { \ 30*732115ceSRahul Bhansali (dlp) = (dcp)[idx]; \ 31*732115ceSRahul Bhansali (lp) = (pn) + (idx); \ 32*732115ceSRahul Bhansali (lp)[0] = 1; \ 33*732115ceSRahul Bhansali } \ 34*732115ceSRahul Bhansali } while (0) 35*732115ceSRahul Bhansali 36*732115ceSRahul Bhansali static const struct { 37*732115ceSRahul Bhansali uint64_t pnum; /* prebuild 4 values for pnum[]. */ 38*732115ceSRahul Bhansali int32_t idx; /* index for new last updated elemnet. */ 39*732115ceSRahul Bhansali uint16_t lpv; /* add value to the last updated element. */ 40*732115ceSRahul Bhansali } gptbl[GRPSZ] = { 41*732115ceSRahul Bhansali { 42*732115ceSRahul Bhansali /* 0: a != b, b != c, c != d, d != e */ 43*732115ceSRahul Bhansali .pnum = UINT64_C(0x0001000100010001), 44*732115ceSRahul Bhansali .idx = 4, 45*732115ceSRahul Bhansali .lpv = 0, 46*732115ceSRahul Bhansali }, 47*732115ceSRahul Bhansali { 48*732115ceSRahul Bhansali /* 1: a == b, b != c, c != d, d != e */ 49*732115ceSRahul Bhansali .pnum = UINT64_C(0x0001000100010002), 50*732115ceSRahul Bhansali .idx = 4, 51*732115ceSRahul Bhansali .lpv = 1, 52*732115ceSRahul Bhansali }, 53*732115ceSRahul Bhansali { 54*732115ceSRahul Bhansali /* 2: a != b, b == c, c != d, d != e */ 55*732115ceSRahul Bhansali .pnum = UINT64_C(0x0001000100020001), 56*732115ceSRahul Bhansali .idx = 4, 57*732115ceSRahul Bhansali .lpv = 0, 58*732115ceSRahul Bhansali }, 59*732115ceSRahul Bhansali { 60*732115ceSRahul Bhansali /* 3: a == b, b == c, c != d, d != e */ 61*732115ceSRahul Bhansali .pnum = UINT64_C(0x0001000100020003), 62*732115ceSRahul Bhansali .idx = 4, 63*732115ceSRahul Bhansali .lpv = 2, 64*732115ceSRahul Bhansali }, 65*732115ceSRahul Bhansali { 66*732115ceSRahul Bhansali /* 4: a != b, b != c, c == d, d != e */ 67*732115ceSRahul Bhansali .pnum = UINT64_C(0x0001000200010001), 68*732115ceSRahul Bhansali .idx = 4, 69*732115ceSRahul Bhansali .lpv = 0, 70*732115ceSRahul Bhansali }, 71*732115ceSRahul Bhansali { 72*732115ceSRahul Bhansali /* 5: a == b, b != c, c == d, d != e */ 73*732115ceSRahul Bhansali .pnum = UINT64_C(0x0001000200010002), 74*732115ceSRahul Bhansali .idx = 4, 75*732115ceSRahul Bhansali .lpv = 1, 76*732115ceSRahul Bhansali }, 77*732115ceSRahul Bhansali { 78*732115ceSRahul Bhansali /* 6: a != b, b == c, c == d, d != e */ 79*732115ceSRahul Bhansali .pnum = UINT64_C(0x0001000200030001), 80*732115ceSRahul Bhansali .idx = 4, 81*732115ceSRahul Bhansali .lpv = 0, 82*732115ceSRahul Bhansali }, 83*732115ceSRahul Bhansali { 84*732115ceSRahul Bhansali /* 7: a == b, b == c, c == d, d != e */ 85*732115ceSRahul Bhansali .pnum = UINT64_C(0x0001000200030004), 86*732115ceSRahul Bhansali .idx = 4, 87*732115ceSRahul Bhansali .lpv = 3, 88*732115ceSRahul Bhansali }, 89*732115ceSRahul Bhansali { 90*732115ceSRahul Bhansali /* 8: a != b, b != c, c != d, d == e */ 91*732115ceSRahul Bhansali .pnum = UINT64_C(0x0002000100010001), 92*732115ceSRahul Bhansali .idx = 3, 93*732115ceSRahul Bhansali .lpv = 0, 94*732115ceSRahul Bhansali }, 95*732115ceSRahul Bhansali { 96*732115ceSRahul Bhansali /* 9: a == b, b != c, c != d, d == e */ 97*732115ceSRahul Bhansali .pnum = UINT64_C(0x0002000100010002), 98*732115ceSRahul Bhansali .idx = 3, 99*732115ceSRahul Bhansali .lpv = 1, 100*732115ceSRahul Bhansali }, 101*732115ceSRahul Bhansali { 102*732115ceSRahul Bhansali /* 0xa: a != b, b == c, c != d, d == e */ 103*732115ceSRahul Bhansali .pnum = UINT64_C(0x0002000100020001), 104*732115ceSRahul Bhansali .idx = 3, 105*732115ceSRahul Bhansali .lpv = 0, 106*732115ceSRahul Bhansali }, 107*732115ceSRahul Bhansali { 108*732115ceSRahul Bhansali /* 0xb: a == b, b == c, c != d, d == e */ 109*732115ceSRahul Bhansali .pnum = UINT64_C(0x0002000100020003), 110*732115ceSRahul Bhansali .idx = 3, 111*732115ceSRahul Bhansali .lpv = 2, 112*732115ceSRahul Bhansali }, 113*732115ceSRahul Bhansali { 114*732115ceSRahul Bhansali /* 0xc: a != b, b != c, c == d, d == e */ 115*732115ceSRahul Bhansali .pnum = UINT64_C(0x0002000300010001), 116*732115ceSRahul Bhansali .idx = 2, 117*732115ceSRahul Bhansali .lpv = 0, 118*732115ceSRahul Bhansali }, 119*732115ceSRahul Bhansali { 120*732115ceSRahul Bhansali /* 0xd: a == b, b != c, c == d, d == e */ 121*732115ceSRahul Bhansali .pnum = UINT64_C(0x0002000300010002), 122*732115ceSRahul Bhansali .idx = 2, 123*732115ceSRahul Bhansali .lpv = 1, 124*732115ceSRahul Bhansali }, 125*732115ceSRahul Bhansali { 126*732115ceSRahul Bhansali /* 0xe: a != b, b == c, c == d, d == e */ 127*732115ceSRahul Bhansali .pnum = UINT64_C(0x0002000300040001), 128*732115ceSRahul Bhansali .idx = 1, 129*732115ceSRahul Bhansali .lpv = 0, 130*732115ceSRahul Bhansali }, 131*732115ceSRahul Bhansali { 132*732115ceSRahul Bhansali /* 0xf: a == b, b == c, c == d, d == e */ 133*732115ceSRahul Bhansali .pnum = UINT64_C(0x0002000300040005), 134*732115ceSRahul Bhansali .idx = 0, 135*732115ceSRahul Bhansali .lpv = 4, 136*732115ceSRahul Bhansali }, 137*732115ceSRahul Bhansali }; 138*732115ceSRahul Bhansali 139*732115ceSRahul Bhansali #endif /* PKT_GROUP_H */ 140