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