1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause */ 2*4882a593Smuzhiyun /* Copyright (c) 2016-2018, NXP Semiconductors 3*4882a593Smuzhiyun * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com> 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef _SJA1105_STATIC_CONFIG_H 6*4882a593Smuzhiyun #define _SJA1105_STATIC_CONFIG_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/packing.h> 9*4882a593Smuzhiyun #include <linux/types.h> 10*4882a593Smuzhiyun #include <asm/types.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define SJA1105_SIZE_DEVICE_ID 4 13*4882a593Smuzhiyun #define SJA1105_SIZE_TABLE_HEADER 12 14*4882a593Smuzhiyun #define SJA1105_SIZE_SCHEDULE_ENTRY 8 15*4882a593Smuzhiyun #define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY 4 16*4882a593Smuzhiyun #define SJA1105_SIZE_VL_LOOKUP_ENTRY 12 17*4882a593Smuzhiyun #define SJA1105_SIZE_VL_POLICING_ENTRY 8 18*4882a593Smuzhiyun #define SJA1105_SIZE_VL_FORWARDING_ENTRY 4 19*4882a593Smuzhiyun #define SJA1105_SIZE_L2_POLICING_ENTRY 8 20*4882a593Smuzhiyun #define SJA1105_SIZE_VLAN_LOOKUP_ENTRY 8 21*4882a593Smuzhiyun #define SJA1105_SIZE_L2_FORWARDING_ENTRY 8 22*4882a593Smuzhiyun #define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY 12 23*4882a593Smuzhiyun #define SJA1105_SIZE_RETAGGING_ENTRY 8 24*4882a593Smuzhiyun #define SJA1105_SIZE_XMII_PARAMS_ENTRY 4 25*4882a593Smuzhiyun #define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY 12 26*4882a593Smuzhiyun #define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY 4 27*4882a593Smuzhiyun #define SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY 12 28*4882a593Smuzhiyun #define SJA1105ET_SIZE_L2_LOOKUP_ENTRY 12 29*4882a593Smuzhiyun #define SJA1105ET_SIZE_MAC_CONFIG_ENTRY 28 30*4882a593Smuzhiyun #define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY 4 31*4882a593Smuzhiyun #define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY 40 32*4882a593Smuzhiyun #define SJA1105ET_SIZE_AVB_PARAMS_ENTRY 12 33*4882a593Smuzhiyun #define SJA1105ET_SIZE_CBS_ENTRY 16 34*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY 20 35*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY 32 36*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY 16 37*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY 44 38*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY 16 39*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_CBS_ENTRY 20 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* UM10944.pdf Page 11, Table 2. Configuration Blocks */ 42*4882a593Smuzhiyun enum { 43*4882a593Smuzhiyun BLKID_SCHEDULE = 0x00, 44*4882a593Smuzhiyun BLKID_SCHEDULE_ENTRY_POINTS = 0x01, 45*4882a593Smuzhiyun BLKID_VL_LOOKUP = 0x02, 46*4882a593Smuzhiyun BLKID_VL_POLICING = 0x03, 47*4882a593Smuzhiyun BLKID_VL_FORWARDING = 0x04, 48*4882a593Smuzhiyun BLKID_L2_LOOKUP = 0x05, 49*4882a593Smuzhiyun BLKID_L2_POLICING = 0x06, 50*4882a593Smuzhiyun BLKID_VLAN_LOOKUP = 0x07, 51*4882a593Smuzhiyun BLKID_L2_FORWARDING = 0x08, 52*4882a593Smuzhiyun BLKID_MAC_CONFIG = 0x09, 53*4882a593Smuzhiyun BLKID_SCHEDULE_PARAMS = 0x0A, 54*4882a593Smuzhiyun BLKID_SCHEDULE_ENTRY_POINTS_PARAMS = 0x0B, 55*4882a593Smuzhiyun BLKID_VL_FORWARDING_PARAMS = 0x0C, 56*4882a593Smuzhiyun BLKID_L2_LOOKUP_PARAMS = 0x0D, 57*4882a593Smuzhiyun BLKID_L2_FORWARDING_PARAMS = 0x0E, 58*4882a593Smuzhiyun BLKID_AVB_PARAMS = 0x10, 59*4882a593Smuzhiyun BLKID_GENERAL_PARAMS = 0x11, 60*4882a593Smuzhiyun BLKID_RETAGGING = 0x12, 61*4882a593Smuzhiyun BLKID_CBS = 0x13, 62*4882a593Smuzhiyun BLKID_XMII_PARAMS = 0x4E, 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun enum sja1105_blk_idx { 66*4882a593Smuzhiyun BLK_IDX_SCHEDULE = 0, 67*4882a593Smuzhiyun BLK_IDX_SCHEDULE_ENTRY_POINTS, 68*4882a593Smuzhiyun BLK_IDX_VL_LOOKUP, 69*4882a593Smuzhiyun BLK_IDX_VL_POLICING, 70*4882a593Smuzhiyun BLK_IDX_VL_FORWARDING, 71*4882a593Smuzhiyun BLK_IDX_L2_LOOKUP, 72*4882a593Smuzhiyun BLK_IDX_L2_POLICING, 73*4882a593Smuzhiyun BLK_IDX_VLAN_LOOKUP, 74*4882a593Smuzhiyun BLK_IDX_L2_FORWARDING, 75*4882a593Smuzhiyun BLK_IDX_MAC_CONFIG, 76*4882a593Smuzhiyun BLK_IDX_SCHEDULE_PARAMS, 77*4882a593Smuzhiyun BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS, 78*4882a593Smuzhiyun BLK_IDX_VL_FORWARDING_PARAMS, 79*4882a593Smuzhiyun BLK_IDX_L2_LOOKUP_PARAMS, 80*4882a593Smuzhiyun BLK_IDX_L2_FORWARDING_PARAMS, 81*4882a593Smuzhiyun BLK_IDX_AVB_PARAMS, 82*4882a593Smuzhiyun BLK_IDX_GENERAL_PARAMS, 83*4882a593Smuzhiyun BLK_IDX_RETAGGING, 84*4882a593Smuzhiyun BLK_IDX_CBS, 85*4882a593Smuzhiyun BLK_IDX_XMII_PARAMS, 86*4882a593Smuzhiyun BLK_IDX_MAX, 87*4882a593Smuzhiyun /* Fake block indices that are only valid for dynamic access */ 88*4882a593Smuzhiyun BLK_IDX_MGMT_ROUTE, 89*4882a593Smuzhiyun BLK_IDX_MAX_DYN, 90*4882a593Smuzhiyun BLK_IDX_INVAL = -1, 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #define SJA1105_MAX_SCHEDULE_COUNT 1024 94*4882a593Smuzhiyun #define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT 2048 95*4882a593Smuzhiyun #define SJA1105_MAX_VL_LOOKUP_COUNT 1024 96*4882a593Smuzhiyun #define SJA1105_MAX_VL_POLICING_COUNT 1024 97*4882a593Smuzhiyun #define SJA1105_MAX_VL_FORWARDING_COUNT 1024 98*4882a593Smuzhiyun #define SJA1105_MAX_L2_LOOKUP_COUNT 1024 99*4882a593Smuzhiyun #define SJA1105_MAX_L2_POLICING_COUNT 45 100*4882a593Smuzhiyun #define SJA1105_MAX_VLAN_LOOKUP_COUNT 4096 101*4882a593Smuzhiyun #define SJA1105_MAX_L2_FORWARDING_COUNT 13 102*4882a593Smuzhiyun #define SJA1105_MAX_MAC_CONFIG_COUNT 5 103*4882a593Smuzhiyun #define SJA1105_MAX_SCHEDULE_PARAMS_COUNT 1 104*4882a593Smuzhiyun #define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT 1 105*4882a593Smuzhiyun #define SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT 1 106*4882a593Smuzhiyun #define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT 1 107*4882a593Smuzhiyun #define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT 1 108*4882a593Smuzhiyun #define SJA1105_MAX_GENERAL_PARAMS_COUNT 1 109*4882a593Smuzhiyun #define SJA1105_MAX_RETAGGING_COUNT 32 110*4882a593Smuzhiyun #define SJA1105_MAX_XMII_PARAMS_COUNT 1 111*4882a593Smuzhiyun #define SJA1105_MAX_AVB_PARAMS_COUNT 1 112*4882a593Smuzhiyun #define SJA1105ET_MAX_CBS_COUNT 10 113*4882a593Smuzhiyun #define SJA1105PQRS_MAX_CBS_COUNT 16 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun #define SJA1105_MAX_FRAME_MEMORY 929 116*4882a593Smuzhiyun #define SJA1105_MAX_FRAME_MEMORY_RETAGGING 910 117*4882a593Smuzhiyun #define SJA1105_VL_FRAME_MEMORY 100 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #define SJA1105E_DEVICE_ID 0x9C00000Cull 120*4882a593Smuzhiyun #define SJA1105T_DEVICE_ID 0x9E00030Eull 121*4882a593Smuzhiyun #define SJA1105PR_DEVICE_ID 0xAF00030Eull 122*4882a593Smuzhiyun #define SJA1105QS_DEVICE_ID 0xAE00030Eull 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define SJA1105ET_PART_NO 0x9A83 125*4882a593Smuzhiyun #define SJA1105P_PART_NO 0x9A84 126*4882a593Smuzhiyun #define SJA1105Q_PART_NO 0x9A85 127*4882a593Smuzhiyun #define SJA1105R_PART_NO 0x9A86 128*4882a593Smuzhiyun #define SJA1105S_PART_NO 0x9A87 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun struct sja1105_schedule_entry { 131*4882a593Smuzhiyun u64 winstindex; 132*4882a593Smuzhiyun u64 winend; 133*4882a593Smuzhiyun u64 winst; 134*4882a593Smuzhiyun u64 destports; 135*4882a593Smuzhiyun u64 setvalid; 136*4882a593Smuzhiyun u64 txen; 137*4882a593Smuzhiyun u64 resmedia_en; 138*4882a593Smuzhiyun u64 resmedia; 139*4882a593Smuzhiyun u64 vlindex; 140*4882a593Smuzhiyun u64 delta; 141*4882a593Smuzhiyun }; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun struct sja1105_schedule_params_entry { 144*4882a593Smuzhiyun u64 subscheind[8]; 145*4882a593Smuzhiyun }; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun struct sja1105_general_params_entry { 148*4882a593Smuzhiyun u64 vllupformat; 149*4882a593Smuzhiyun u64 mirr_ptacu; 150*4882a593Smuzhiyun u64 switchid; 151*4882a593Smuzhiyun u64 hostprio; 152*4882a593Smuzhiyun u64 mac_fltres1; 153*4882a593Smuzhiyun u64 mac_fltres0; 154*4882a593Smuzhiyun u64 mac_flt1; 155*4882a593Smuzhiyun u64 mac_flt0; 156*4882a593Smuzhiyun u64 incl_srcpt1; 157*4882a593Smuzhiyun u64 incl_srcpt0; 158*4882a593Smuzhiyun u64 send_meta1; 159*4882a593Smuzhiyun u64 send_meta0; 160*4882a593Smuzhiyun u64 casc_port; 161*4882a593Smuzhiyun u64 host_port; 162*4882a593Smuzhiyun u64 mirr_port; 163*4882a593Smuzhiyun u64 vlmarker; 164*4882a593Smuzhiyun u64 vlmask; 165*4882a593Smuzhiyun u64 tpid; 166*4882a593Smuzhiyun u64 ignore2stf; 167*4882a593Smuzhiyun u64 tpid2; 168*4882a593Smuzhiyun /* P/Q/R/S only */ 169*4882a593Smuzhiyun u64 queue_ts; 170*4882a593Smuzhiyun u64 egrmirrvid; 171*4882a593Smuzhiyun u64 egrmirrpcp; 172*4882a593Smuzhiyun u64 egrmirrdei; 173*4882a593Smuzhiyun u64 replay_port; 174*4882a593Smuzhiyun }; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun struct sja1105_schedule_entry_points_entry { 177*4882a593Smuzhiyun u64 subschindx; 178*4882a593Smuzhiyun u64 delta; 179*4882a593Smuzhiyun u64 address; 180*4882a593Smuzhiyun }; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun struct sja1105_schedule_entry_points_params_entry { 183*4882a593Smuzhiyun u64 clksrc; 184*4882a593Smuzhiyun u64 actsubsch; 185*4882a593Smuzhiyun }; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun struct sja1105_vlan_lookup_entry { 188*4882a593Smuzhiyun u64 ving_mirr; 189*4882a593Smuzhiyun u64 vegr_mirr; 190*4882a593Smuzhiyun u64 vmemb_port; 191*4882a593Smuzhiyun u64 vlan_bc; 192*4882a593Smuzhiyun u64 tag_port; 193*4882a593Smuzhiyun u64 vlanid; 194*4882a593Smuzhiyun }; 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun struct sja1105_l2_lookup_entry { 197*4882a593Smuzhiyun u64 vlanid; 198*4882a593Smuzhiyun u64 macaddr; 199*4882a593Smuzhiyun u64 destports; 200*4882a593Smuzhiyun u64 enfport; 201*4882a593Smuzhiyun u64 index; 202*4882a593Smuzhiyun /* P/Q/R/S only */ 203*4882a593Smuzhiyun u64 mask_iotag; 204*4882a593Smuzhiyun u64 mask_vlanid; 205*4882a593Smuzhiyun u64 mask_macaddr; 206*4882a593Smuzhiyun u64 iotag; 207*4882a593Smuzhiyun u64 lockeds; 208*4882a593Smuzhiyun union { 209*4882a593Smuzhiyun /* LOCKEDS=1: Static FDB entries */ 210*4882a593Smuzhiyun struct { 211*4882a593Smuzhiyun u64 tsreg; 212*4882a593Smuzhiyun u64 mirrvlan; 213*4882a593Smuzhiyun u64 takets; 214*4882a593Smuzhiyun u64 mirr; 215*4882a593Smuzhiyun u64 retag; 216*4882a593Smuzhiyun }; 217*4882a593Smuzhiyun /* LOCKEDS=0: Dynamically learned FDB entries */ 218*4882a593Smuzhiyun struct { 219*4882a593Smuzhiyun u64 touched; 220*4882a593Smuzhiyun u64 age; 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun }; 223*4882a593Smuzhiyun }; 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun struct sja1105_l2_lookup_params_entry { 226*4882a593Smuzhiyun u64 maxaddrp[5]; /* P/Q/R/S only */ 227*4882a593Smuzhiyun u64 start_dynspc; /* P/Q/R/S only */ 228*4882a593Smuzhiyun u64 drpnolearn; /* P/Q/R/S only */ 229*4882a593Smuzhiyun u64 use_static; /* P/Q/R/S only */ 230*4882a593Smuzhiyun u64 owr_dyn; /* P/Q/R/S only */ 231*4882a593Smuzhiyun u64 learn_once; /* P/Q/R/S only */ 232*4882a593Smuzhiyun u64 maxage; /* Shared */ 233*4882a593Smuzhiyun u64 dyn_tbsz; /* E/T only */ 234*4882a593Smuzhiyun u64 poly; /* E/T only */ 235*4882a593Smuzhiyun u64 shared_learn; /* Shared */ 236*4882a593Smuzhiyun u64 no_enf_hostprt; /* Shared */ 237*4882a593Smuzhiyun u64 no_mgmt_learn; /* Shared */ 238*4882a593Smuzhiyun }; 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun struct sja1105_l2_forwarding_entry { 241*4882a593Smuzhiyun u64 bc_domain; 242*4882a593Smuzhiyun u64 reach_port; 243*4882a593Smuzhiyun u64 fl_domain; 244*4882a593Smuzhiyun u64 vlan_pmap[8]; 245*4882a593Smuzhiyun }; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun struct sja1105_l2_forwarding_params_entry { 248*4882a593Smuzhiyun u64 max_dynp; 249*4882a593Smuzhiyun u64 part_spc[8]; 250*4882a593Smuzhiyun }; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun struct sja1105_l2_policing_entry { 253*4882a593Smuzhiyun u64 sharindx; 254*4882a593Smuzhiyun u64 smax; 255*4882a593Smuzhiyun u64 rate; 256*4882a593Smuzhiyun u64 maxlen; 257*4882a593Smuzhiyun u64 partition; 258*4882a593Smuzhiyun }; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun struct sja1105_avb_params_entry { 261*4882a593Smuzhiyun u64 cas_master; 262*4882a593Smuzhiyun u64 destmeta; 263*4882a593Smuzhiyun u64 srcmeta; 264*4882a593Smuzhiyun }; 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun struct sja1105_mac_config_entry { 267*4882a593Smuzhiyun u64 top[8]; 268*4882a593Smuzhiyun u64 base[8]; 269*4882a593Smuzhiyun u64 enabled[8]; 270*4882a593Smuzhiyun u64 ifg; 271*4882a593Smuzhiyun u64 speed; 272*4882a593Smuzhiyun u64 tp_delin; 273*4882a593Smuzhiyun u64 tp_delout; 274*4882a593Smuzhiyun u64 maxage; 275*4882a593Smuzhiyun u64 vlanprio; 276*4882a593Smuzhiyun u64 vlanid; 277*4882a593Smuzhiyun u64 ing_mirr; 278*4882a593Smuzhiyun u64 egr_mirr; 279*4882a593Smuzhiyun u64 drpnona664; 280*4882a593Smuzhiyun u64 drpdtag; 281*4882a593Smuzhiyun u64 drpuntag; 282*4882a593Smuzhiyun u64 retag; 283*4882a593Smuzhiyun u64 dyn_learn; 284*4882a593Smuzhiyun u64 egress; 285*4882a593Smuzhiyun u64 ingress; 286*4882a593Smuzhiyun }; 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun struct sja1105_retagging_entry { 289*4882a593Smuzhiyun u64 egr_port; 290*4882a593Smuzhiyun u64 ing_port; 291*4882a593Smuzhiyun u64 vlan_ing; 292*4882a593Smuzhiyun u64 vlan_egr; 293*4882a593Smuzhiyun u64 do_not_learn; 294*4882a593Smuzhiyun u64 use_dest_ports; 295*4882a593Smuzhiyun u64 destports; 296*4882a593Smuzhiyun }; 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun struct sja1105_cbs_entry { 299*4882a593Smuzhiyun u64 port; 300*4882a593Smuzhiyun u64 prio; 301*4882a593Smuzhiyun u64 credit_hi; 302*4882a593Smuzhiyun u64 credit_lo; 303*4882a593Smuzhiyun u64 send_slope; 304*4882a593Smuzhiyun u64 idle_slope; 305*4882a593Smuzhiyun }; 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun struct sja1105_xmii_params_entry { 308*4882a593Smuzhiyun u64 phy_mac[5]; 309*4882a593Smuzhiyun u64 xmii_mode[5]; 310*4882a593Smuzhiyun }; 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun enum { 313*4882a593Smuzhiyun SJA1105_VL_FORMAT_PSFP = 0, 314*4882a593Smuzhiyun SJA1105_VL_FORMAT_ARINC664 = 1, 315*4882a593Smuzhiyun }; 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun struct sja1105_vl_lookup_entry { 318*4882a593Smuzhiyun u64 format; 319*4882a593Smuzhiyun u64 port; 320*4882a593Smuzhiyun union { 321*4882a593Smuzhiyun /* SJA1105_VL_FORMAT_PSFP */ 322*4882a593Smuzhiyun struct { 323*4882a593Smuzhiyun u64 destports; 324*4882a593Smuzhiyun u64 iscritical; 325*4882a593Smuzhiyun u64 macaddr; 326*4882a593Smuzhiyun u64 vlanid; 327*4882a593Smuzhiyun u64 vlanprior; 328*4882a593Smuzhiyun }; 329*4882a593Smuzhiyun /* SJA1105_VL_FORMAT_ARINC664 */ 330*4882a593Smuzhiyun struct { 331*4882a593Smuzhiyun u64 egrmirr; 332*4882a593Smuzhiyun u64 ingrmirr; 333*4882a593Smuzhiyun u64 vlid; 334*4882a593Smuzhiyun }; 335*4882a593Smuzhiyun }; 336*4882a593Smuzhiyun /* Not part of hardware structure */ 337*4882a593Smuzhiyun unsigned long flow_cookie; 338*4882a593Smuzhiyun }; 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun struct sja1105_vl_policing_entry { 341*4882a593Smuzhiyun u64 type; 342*4882a593Smuzhiyun u64 maxlen; 343*4882a593Smuzhiyun u64 sharindx; 344*4882a593Smuzhiyun u64 bag; 345*4882a593Smuzhiyun u64 jitter; 346*4882a593Smuzhiyun }; 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun struct sja1105_vl_forwarding_entry { 349*4882a593Smuzhiyun u64 type; 350*4882a593Smuzhiyun u64 priority; 351*4882a593Smuzhiyun u64 partition; 352*4882a593Smuzhiyun u64 destports; 353*4882a593Smuzhiyun }; 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun struct sja1105_vl_forwarding_params_entry { 356*4882a593Smuzhiyun u64 partspc[8]; 357*4882a593Smuzhiyun u64 debugen; 358*4882a593Smuzhiyun }; 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun struct sja1105_table_header { 361*4882a593Smuzhiyun u64 block_id; 362*4882a593Smuzhiyun u64 len; 363*4882a593Smuzhiyun u64 crc; 364*4882a593Smuzhiyun }; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun struct sja1105_table_ops { 367*4882a593Smuzhiyun size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op); 368*4882a593Smuzhiyun size_t unpacked_entry_size; 369*4882a593Smuzhiyun size_t packed_entry_size; 370*4882a593Smuzhiyun size_t max_entry_count; 371*4882a593Smuzhiyun }; 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun struct sja1105_table { 374*4882a593Smuzhiyun const struct sja1105_table_ops *ops; 375*4882a593Smuzhiyun size_t entry_count; 376*4882a593Smuzhiyun void *entries; 377*4882a593Smuzhiyun }; 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun struct sja1105_static_config { 380*4882a593Smuzhiyun u64 device_id; 381*4882a593Smuzhiyun struct sja1105_table tables[BLK_IDX_MAX]; 382*4882a593Smuzhiyun }; 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX]; 385*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX]; 386*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX]; 387*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX]; 388*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX]; 389*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX]; 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op); 392*4882a593Smuzhiyun void 393*4882a593Smuzhiyun sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr); 394*4882a593Smuzhiyun size_t 395*4882a593Smuzhiyun sja1105_static_config_get_length(const struct sja1105_static_config *config); 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun typedef enum { 398*4882a593Smuzhiyun SJA1105_CONFIG_OK = 0, 399*4882a593Smuzhiyun SJA1105_TTETHERNET_NOT_SUPPORTED, 400*4882a593Smuzhiyun SJA1105_INCORRECT_TTETHERNET_CONFIGURATION, 401*4882a593Smuzhiyun SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION, 402*4882a593Smuzhiyun SJA1105_MISSING_L2_POLICING_TABLE, 403*4882a593Smuzhiyun SJA1105_MISSING_L2_FORWARDING_TABLE, 404*4882a593Smuzhiyun SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE, 405*4882a593Smuzhiyun SJA1105_MISSING_GENERAL_PARAMS_TABLE, 406*4882a593Smuzhiyun SJA1105_MISSING_VLAN_TABLE, 407*4882a593Smuzhiyun SJA1105_MISSING_XMII_TABLE, 408*4882a593Smuzhiyun SJA1105_MISSING_MAC_TABLE, 409*4882a593Smuzhiyun SJA1105_OVERCOMMITTED_FRAME_MEMORY, 410*4882a593Smuzhiyun } sja1105_config_valid_t; 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun extern const char *sja1105_static_config_error_msg[]; 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun sja1105_config_valid_t 415*4882a593Smuzhiyun sja1105_static_config_check_valid(const struct sja1105_static_config *config); 416*4882a593Smuzhiyun void 417*4882a593Smuzhiyun sja1105_static_config_pack(void *buf, struct sja1105_static_config *config); 418*4882a593Smuzhiyun int sja1105_static_config_init(struct sja1105_static_config *config, 419*4882a593Smuzhiyun const struct sja1105_table_ops *static_ops, 420*4882a593Smuzhiyun u64 device_id); 421*4882a593Smuzhiyun void sja1105_static_config_free(struct sja1105_static_config *config); 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun int sja1105_table_delete_entry(struct sja1105_table *table, int i); 424*4882a593Smuzhiyun int sja1105_table_resize(struct sja1105_table *table, size_t new_count); 425*4882a593Smuzhiyun 426*4882a593Smuzhiyun u32 sja1105_crc32(const void *buf, size_t len); 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len); 429*4882a593Smuzhiyun void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len); 430*4882a593Smuzhiyun void sja1105_packing(void *buf, u64 *val, int start, int end, 431*4882a593Smuzhiyun size_t len, enum packing_op op); 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun /* Common implementations for the static and dynamic configs */ 434*4882a593Smuzhiyun size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr, 435*4882a593Smuzhiyun enum packing_op op); 436*4882a593Smuzhiyun size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr, 437*4882a593Smuzhiyun enum packing_op op); 438*4882a593Smuzhiyun size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr, 439*4882a593Smuzhiyun enum packing_op op); 440*4882a593Smuzhiyun size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr, 441*4882a593Smuzhiyun enum packing_op op); 442*4882a593Smuzhiyun size_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr, 443*4882a593Smuzhiyun enum packing_op op); 444*4882a593Smuzhiyun size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr, 445*4882a593Smuzhiyun enum packing_op op); 446*4882a593Smuzhiyun size_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr, 447*4882a593Smuzhiyun enum packing_op op); 448*4882a593Smuzhiyun size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr, 449*4882a593Smuzhiyun enum packing_op op); 450*4882a593Smuzhiyun size_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr, 451*4882a593Smuzhiyun enum packing_op op); 452*4882a593Smuzhiyun size_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr, 453*4882a593Smuzhiyun enum packing_op op); 454*4882a593Smuzhiyun 455*4882a593Smuzhiyun #endif 456