1 /* SPDX-License-Identifier: BSD-3-Clause */ 2 /* Copyright (c) 2016-2018, NXP Semiconductors 3 * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com> 4 */ 5 #ifndef _SJA1105_STATIC_CONFIG_H 6 #define _SJA1105_STATIC_CONFIG_H 7 8 #include <linux/packing.h> 9 #include <linux/types.h> 10 #include <asm/types.h> 11 12 #define SJA1105_SIZE_DEVICE_ID 4 13 #define SJA1105_SIZE_TABLE_HEADER 12 14 #define SJA1105_SIZE_SCHEDULE_ENTRY 8 15 #define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY 4 16 #define SJA1105_SIZE_L2_POLICING_ENTRY 8 17 #define SJA1105_SIZE_VLAN_LOOKUP_ENTRY 8 18 #define SJA1105_SIZE_L2_FORWARDING_ENTRY 8 19 #define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY 12 20 #define SJA1105_SIZE_XMII_PARAMS_ENTRY 4 21 #define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY 12 22 #define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY 4 23 #define SJA1105ET_SIZE_L2_LOOKUP_ENTRY 12 24 #define SJA1105ET_SIZE_MAC_CONFIG_ENTRY 28 25 #define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY 4 26 #define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY 40 27 #define SJA1105ET_SIZE_AVB_PARAMS_ENTRY 12 28 #define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY 20 29 #define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY 32 30 #define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY 16 31 #define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY 44 32 #define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY 16 33 34 /* UM10944.pdf Page 11, Table 2. Configuration Blocks */ 35 enum { 36 BLKID_SCHEDULE = 0x00, 37 BLKID_SCHEDULE_ENTRY_POINTS = 0x01, 38 BLKID_L2_LOOKUP = 0x05, 39 BLKID_L2_POLICING = 0x06, 40 BLKID_VLAN_LOOKUP = 0x07, 41 BLKID_L2_FORWARDING = 0x08, 42 BLKID_MAC_CONFIG = 0x09, 43 BLKID_SCHEDULE_PARAMS = 0x0A, 44 BLKID_SCHEDULE_ENTRY_POINTS_PARAMS = 0x0B, 45 BLKID_L2_LOOKUP_PARAMS = 0x0D, 46 BLKID_L2_FORWARDING_PARAMS = 0x0E, 47 BLKID_AVB_PARAMS = 0x10, 48 BLKID_GENERAL_PARAMS = 0x11, 49 BLKID_XMII_PARAMS = 0x4E, 50 }; 51 52 enum sja1105_blk_idx { 53 BLK_IDX_SCHEDULE = 0, 54 BLK_IDX_SCHEDULE_ENTRY_POINTS, 55 BLK_IDX_L2_LOOKUP, 56 BLK_IDX_L2_POLICING, 57 BLK_IDX_VLAN_LOOKUP, 58 BLK_IDX_L2_FORWARDING, 59 BLK_IDX_MAC_CONFIG, 60 BLK_IDX_SCHEDULE_PARAMS, 61 BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS, 62 BLK_IDX_L2_LOOKUP_PARAMS, 63 BLK_IDX_L2_FORWARDING_PARAMS, 64 BLK_IDX_AVB_PARAMS, 65 BLK_IDX_GENERAL_PARAMS, 66 BLK_IDX_XMII_PARAMS, 67 BLK_IDX_MAX, 68 /* Fake block indices that are only valid for dynamic access */ 69 BLK_IDX_MGMT_ROUTE, 70 BLK_IDX_MAX_DYN, 71 BLK_IDX_INVAL = -1, 72 }; 73 74 #define SJA1105_MAX_SCHEDULE_COUNT 1024 75 #define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT 2048 76 #define SJA1105_MAX_L2_LOOKUP_COUNT 1024 77 #define SJA1105_MAX_L2_POLICING_COUNT 45 78 #define SJA1105_MAX_VLAN_LOOKUP_COUNT 4096 79 #define SJA1105_MAX_L2_FORWARDING_COUNT 13 80 #define SJA1105_MAX_MAC_CONFIG_COUNT 5 81 #define SJA1105_MAX_SCHEDULE_PARAMS_COUNT 1 82 #define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT 1 83 #define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT 1 84 #define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT 1 85 #define SJA1105_MAX_GENERAL_PARAMS_COUNT 1 86 #define SJA1105_MAX_XMII_PARAMS_COUNT 1 87 #define SJA1105_MAX_AVB_PARAMS_COUNT 1 88 89 #define SJA1105_MAX_FRAME_MEMORY 929 90 91 #define SJA1105E_DEVICE_ID 0x9C00000Cull 92 #define SJA1105T_DEVICE_ID 0x9E00030Eull 93 #define SJA1105PR_DEVICE_ID 0xAF00030Eull 94 #define SJA1105QS_DEVICE_ID 0xAE00030Eull 95 96 #define SJA1105ET_PART_NO 0x9A83 97 #define SJA1105P_PART_NO 0x9A84 98 #define SJA1105Q_PART_NO 0x9A85 99 #define SJA1105R_PART_NO 0x9A86 100 #define SJA1105S_PART_NO 0x9A87 101 102 struct sja1105_schedule_entry { 103 u64 winstindex; 104 u64 winend; 105 u64 winst; 106 u64 destports; 107 u64 setvalid; 108 u64 txen; 109 u64 resmedia_en; 110 u64 resmedia; 111 u64 vlindex; 112 u64 delta; 113 }; 114 115 struct sja1105_schedule_params_entry { 116 u64 subscheind[8]; 117 }; 118 119 struct sja1105_general_params_entry { 120 u64 vllupformat; 121 u64 mirr_ptacu; 122 u64 switchid; 123 u64 hostprio; 124 u64 mac_fltres1; 125 u64 mac_fltres0; 126 u64 mac_flt1; 127 u64 mac_flt0; 128 u64 incl_srcpt1; 129 u64 incl_srcpt0; 130 u64 send_meta1; 131 u64 send_meta0; 132 u64 casc_port; 133 u64 host_port; 134 u64 mirr_port; 135 u64 vlmarker; 136 u64 vlmask; 137 u64 tpid; 138 u64 ignore2stf; 139 u64 tpid2; 140 /* P/Q/R/S only */ 141 u64 queue_ts; 142 u64 egrmirrvid; 143 u64 egrmirrpcp; 144 u64 egrmirrdei; 145 u64 replay_port; 146 }; 147 148 struct sja1105_schedule_entry_points_entry { 149 u64 subschindx; 150 u64 delta; 151 u64 address; 152 }; 153 154 struct sja1105_schedule_entry_points_params_entry { 155 u64 clksrc; 156 u64 actsubsch; 157 }; 158 159 struct sja1105_vlan_lookup_entry { 160 u64 ving_mirr; 161 u64 vegr_mirr; 162 u64 vmemb_port; 163 u64 vlan_bc; 164 u64 tag_port; 165 u64 vlanid; 166 }; 167 168 struct sja1105_l2_lookup_entry { 169 u64 vlanid; 170 u64 macaddr; 171 u64 destports; 172 u64 enfport; 173 u64 index; 174 /* P/Q/R/S only */ 175 u64 mask_iotag; 176 u64 mask_vlanid; 177 u64 mask_macaddr; 178 u64 iotag; 179 u64 lockeds; 180 union { 181 /* LOCKEDS=1: Static FDB entries */ 182 struct { 183 u64 tsreg; 184 u64 mirrvlan; 185 u64 takets; 186 u64 mirr; 187 u64 retag; 188 }; 189 /* LOCKEDS=0: Dynamically learned FDB entries */ 190 struct { 191 u64 touched; 192 u64 age; 193 }; 194 }; 195 }; 196 197 struct sja1105_l2_lookup_params_entry { 198 u64 maxaddrp[5]; /* P/Q/R/S only */ 199 u64 start_dynspc; /* P/Q/R/S only */ 200 u64 drpnolearn; /* P/Q/R/S only */ 201 u64 use_static; /* P/Q/R/S only */ 202 u64 owr_dyn; /* P/Q/R/S only */ 203 u64 learn_once; /* P/Q/R/S only */ 204 u64 maxage; /* Shared */ 205 u64 dyn_tbsz; /* E/T only */ 206 u64 poly; /* E/T only */ 207 u64 shared_learn; /* Shared */ 208 u64 no_enf_hostprt; /* Shared */ 209 u64 no_mgmt_learn; /* Shared */ 210 }; 211 212 struct sja1105_l2_forwarding_entry { 213 u64 bc_domain; 214 u64 reach_port; 215 u64 fl_domain; 216 u64 vlan_pmap[8]; 217 }; 218 219 struct sja1105_l2_forwarding_params_entry { 220 u64 max_dynp; 221 u64 part_spc[8]; 222 }; 223 224 struct sja1105_l2_policing_entry { 225 u64 sharindx; 226 u64 smax; 227 u64 rate; 228 u64 maxlen; 229 u64 partition; 230 }; 231 232 struct sja1105_avb_params_entry { 233 u64 cas_master; 234 u64 destmeta; 235 u64 srcmeta; 236 }; 237 238 struct sja1105_mac_config_entry { 239 u64 top[8]; 240 u64 base[8]; 241 u64 enabled[8]; 242 u64 ifg; 243 u64 speed; 244 u64 tp_delin; 245 u64 tp_delout; 246 u64 maxage; 247 u64 vlanprio; 248 u64 vlanid; 249 u64 ing_mirr; 250 u64 egr_mirr; 251 u64 drpnona664; 252 u64 drpdtag; 253 u64 drpuntag; 254 u64 retag; 255 u64 dyn_learn; 256 u64 egress; 257 u64 ingress; 258 }; 259 260 struct sja1105_xmii_params_entry { 261 u64 phy_mac[5]; 262 u64 xmii_mode[5]; 263 }; 264 265 struct sja1105_table_header { 266 u64 block_id; 267 u64 len; 268 u64 crc; 269 }; 270 271 struct sja1105_table_ops { 272 size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op); 273 size_t unpacked_entry_size; 274 size_t packed_entry_size; 275 size_t max_entry_count; 276 }; 277 278 struct sja1105_table { 279 const struct sja1105_table_ops *ops; 280 size_t entry_count; 281 void *entries; 282 }; 283 284 struct sja1105_static_config { 285 u64 device_id; 286 struct sja1105_table tables[BLK_IDX_MAX]; 287 }; 288 289 extern struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX]; 290 extern struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX]; 291 extern struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX]; 292 extern struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX]; 293 extern struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX]; 294 extern struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX]; 295 296 size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op); 297 void 298 sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr); 299 size_t 300 sja1105_static_config_get_length(const struct sja1105_static_config *config); 301 302 typedef enum { 303 SJA1105_CONFIG_OK = 0, 304 SJA1105_TTETHERNET_NOT_SUPPORTED, 305 SJA1105_INCORRECT_TTETHERNET_CONFIGURATION, 306 SJA1105_MISSING_L2_POLICING_TABLE, 307 SJA1105_MISSING_L2_FORWARDING_TABLE, 308 SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE, 309 SJA1105_MISSING_GENERAL_PARAMS_TABLE, 310 SJA1105_MISSING_VLAN_TABLE, 311 SJA1105_MISSING_XMII_TABLE, 312 SJA1105_MISSING_MAC_TABLE, 313 SJA1105_OVERCOMMITTED_FRAME_MEMORY, 314 } sja1105_config_valid_t; 315 316 extern const char *sja1105_static_config_error_msg[]; 317 318 sja1105_config_valid_t 319 sja1105_static_config_check_valid(const struct sja1105_static_config *config); 320 void 321 sja1105_static_config_pack(void *buf, struct sja1105_static_config *config); 322 int sja1105_static_config_init(struct sja1105_static_config *config, 323 const struct sja1105_table_ops *static_ops, 324 u64 device_id); 325 void sja1105_static_config_free(struct sja1105_static_config *config); 326 327 int sja1105_table_delete_entry(struct sja1105_table *table, int i); 328 int sja1105_table_resize(struct sja1105_table *table, size_t new_count); 329 330 u32 sja1105_crc32(const void *buf, size_t len); 331 332 void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len); 333 void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len); 334 void sja1105_packing(void *buf, u64 *val, int start, int end, 335 size_t len, enum packing_op op); 336 337 #endif 338