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