^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * PCE microcode extracted from UGW 7.1.1 switch api
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2012, 2014, 2015 Lantiq Deutschland GmbH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2012 John Crispin <john@phrozen.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2017 - 2018 Hauke Mehrtens <hauke@hauke-m.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) OUT_MAC0 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) OUT_MAC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) OUT_MAC2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) OUT_MAC3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) OUT_MAC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) OUT_MAC5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) OUT_ETHTYP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) OUT_VTAG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) OUT_VTAG1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) OUT_ITAG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) OUT_ITAG1, /*10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) OUT_ITAG2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) OUT_ITAG3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) OUT_IP0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) OUT_IP1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) OUT_IP2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) OUT_IP3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) OUT_SIP0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) OUT_SIP1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) OUT_SIP2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) OUT_SIP3, /*20*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) OUT_SIP4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) OUT_SIP5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) OUT_SIP6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) OUT_SIP7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) OUT_DIP0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) OUT_DIP1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) OUT_DIP2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) OUT_DIP3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) OUT_DIP4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) OUT_DIP5, /*30*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) OUT_DIP6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) OUT_DIP7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) OUT_SESID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) OUT_PROT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) OUT_APP0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) OUT_APP1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) OUT_IGMP0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) OUT_IGMP1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) OUT_IPOFF, /*39*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) OUT_NONE = 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* parser's microcode length type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define INSTR 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define IPV6 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define LENACCU 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* parser's microcode flag type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) FLAG_ITAG = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) FLAG_VLAN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) FLAG_SNAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) FLAG_PPPOE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) FLAG_IPV6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) FLAG_IPV6FL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) FLAG_IPV4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) FLAG_IGMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) FLAG_TU,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) FLAG_HOP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) FLAG_NN1, /*10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) FLAG_NN2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) FLAG_END,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) FLAG_NO, /*13*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct gswip_pce_microcode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u16 val_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u16 val_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) u16 val_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u16 val_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define MC_ENTRY(val, msk, ns, out, len, type, flags, ipv4_len) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) { val, msk, ((ns) << 10 | (out) << 4 | (len) >> 1),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) ((len) & 1) << 15 | (type) << 13 | (flags) << 9 | (ipv4_len) << 8 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) static const struct gswip_pce_microcode gswip_pce_microcode[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* value mask ns fields L type flags ipv4_len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) MC_ENTRY(0x88c3, 0xFFFF, 1, OUT_ITAG0, 4, INSTR, FLAG_ITAG, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) MC_ENTRY(0x8100, 0xFFFF, 2, OUT_VTAG0, 2, INSTR, FLAG_VLAN, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) MC_ENTRY(0x88A8, 0xFFFF, 1, OUT_VTAG0, 2, INSTR, FLAG_VLAN, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) MC_ENTRY(0x8100, 0xFFFF, 1, OUT_VTAG0, 2, INSTR, FLAG_VLAN, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) MC_ENTRY(0x8864, 0xFFFF, 17, OUT_ETHTYP, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) MC_ENTRY(0x0800, 0xFFFF, 21, OUT_ETHTYP, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) MC_ENTRY(0x86DD, 0xFFFF, 22, OUT_ETHTYP, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) MC_ENTRY(0x8863, 0xFFFF, 16, OUT_ETHTYP, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) MC_ENTRY(0x0000, 0xF800, 10, OUT_NONE, 0, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) MC_ENTRY(0x0000, 0x0000, 40, OUT_ETHTYP, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) MC_ENTRY(0x0600, 0x0600, 40, OUT_ETHTYP, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) MC_ENTRY(0x0000, 0x0000, 12, OUT_NONE, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) MC_ENTRY(0xAAAA, 0xFFFF, 14, OUT_NONE, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) MC_ENTRY(0x0300, 0xFF00, 41, OUT_NONE, 0, INSTR, FLAG_SNAP, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) MC_ENTRY(0x0000, 0x0000, 41, OUT_DIP7, 3, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) MC_ENTRY(0x0000, 0x0000, 18, OUT_DIP7, 3, INSTR, FLAG_PPPOE, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) MC_ENTRY(0x0021, 0xFFFF, 21, OUT_NONE, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) MC_ENTRY(0x0057, 0xFFFF, 22, OUT_NONE, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) MC_ENTRY(0x0000, 0x0000, 40, OUT_NONE, 0, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) MC_ENTRY(0x4000, 0xF000, 24, OUT_IP0, 4, INSTR, FLAG_IPV4, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) MC_ENTRY(0x6000, 0xF000, 27, OUT_IP0, 3, INSTR, FLAG_IPV6, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) MC_ENTRY(0x0000, 0x0000, 25, OUT_IP3, 2, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) MC_ENTRY(0x0000, 0x0000, 26, OUT_SIP0, 4, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) MC_ENTRY(0x0000, 0x0000, 40, OUT_NONE, 0, LENACCU, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) MC_ENTRY(0x1100, 0xFF00, 39, OUT_PROT, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) MC_ENTRY(0x0600, 0xFF00, 39, OUT_PROT, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) MC_ENTRY(0x0000, 0xFF00, 33, OUT_IP3, 17, INSTR, FLAG_HOP, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) MC_ENTRY(0x2B00, 0xFF00, 33, OUT_IP3, 17, INSTR, FLAG_NN1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) MC_ENTRY(0x3C00, 0xFF00, 33, OUT_IP3, 17, INSTR, FLAG_NN2, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) MC_ENTRY(0x0000, 0x0000, 39, OUT_PROT, 1, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) MC_ENTRY(0x0000, 0x00E0, 35, OUT_NONE, 0, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) MC_ENTRY(0x0000, 0x0000, 40, OUT_NONE, 0, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) MC_ENTRY(0x0000, 0xFF00, 33, OUT_NONE, 0, IPV6, FLAG_HOP, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) MC_ENTRY(0x2B00, 0xFF00, 33, OUT_NONE, 0, IPV6, FLAG_NN1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) MC_ENTRY(0x3C00, 0xFF00, 33, OUT_NONE, 0, IPV6, FLAG_NN2, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) MC_ENTRY(0x0000, 0x0000, 40, OUT_PROT, 1, IPV6, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) MC_ENTRY(0x0000, 0x0000, 40, OUT_SIP0, 16, INSTR, FLAG_NO, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) MC_ENTRY(0x0000, 0x0000, 41, OUT_APP0, 4, INSTR, FLAG_IGMP, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) MC_ENTRY(0x0000, 0x0000, 41, OUT_NONE, 0, INSTR, FLAG_END, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) };