0001
0002
0003
0004
0005 #ifndef _SJA1105_STATIC_CONFIG_H
0006 #define _SJA1105_STATIC_CONFIG_H
0007
0008 #include <linux/packing.h>
0009 #include <linux/types.h>
0010 #include <asm/types.h>
0011
0012 #define SJA1105_NUM_PORTS 5
0013 #define SJA1110_NUM_PORTS 11
0014 #define SJA1105_MAX_NUM_PORTS SJA1110_NUM_PORTS
0015 #define SJA1105_NUM_TC 8
0016
0017 #define SJA1105_SIZE_SPI_MSG_HEADER 4
0018 #define SJA1105_SIZE_SPI_MSG_MAXLEN (64 * 4)
0019 #define SJA1105_SIZE_DEVICE_ID 4
0020 #define SJA1105_SIZE_TABLE_HEADER 12
0021 #define SJA1105_SIZE_SCHEDULE_ENTRY 8
0022 #define SJA1110_SIZE_SCHEDULE_ENTRY 12
0023 #define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY 4
0024 #define SJA1110_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY 8
0025 #define SJA1105_SIZE_VL_LOOKUP_ENTRY 12
0026 #define SJA1105_SIZE_VL_POLICING_ENTRY 8
0027 #define SJA1105_SIZE_VL_FORWARDING_ENTRY 4
0028 #define SJA1105_SIZE_L2_POLICING_ENTRY 8
0029 #define SJA1105_SIZE_VLAN_LOOKUP_ENTRY 8
0030 #define SJA1110_SIZE_VLAN_LOOKUP_ENTRY 12
0031 #define SJA1105_SIZE_L2_FORWARDING_ENTRY 8
0032 #define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY 12
0033 #define SJA1105_SIZE_RETAGGING_ENTRY 8
0034 #define SJA1105_SIZE_XMII_PARAMS_ENTRY 4
0035 #define SJA1110_SIZE_XMII_PARAMS_ENTRY 8
0036 #define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY 12
0037 #define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY 4
0038 #define SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY 12
0039 #define SJA1105ET_SIZE_L2_LOOKUP_ENTRY 12
0040 #define SJA1105ET_SIZE_MAC_CONFIG_ENTRY 28
0041 #define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY 4
0042 #define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY 40
0043 #define SJA1105ET_SIZE_AVB_PARAMS_ENTRY 12
0044 #define SJA1105ET_SIZE_CBS_ENTRY 16
0045 #define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY 20
0046 #define SJA1110_SIZE_L2_LOOKUP_ENTRY 24
0047 #define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY 32
0048 #define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY 16
0049 #define SJA1110_SIZE_L2_LOOKUP_PARAMS_ENTRY 28
0050 #define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY 44
0051 #define SJA1110_SIZE_GENERAL_PARAMS_ENTRY 56
0052 #define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY 16
0053 #define SJA1105PQRS_SIZE_CBS_ENTRY 20
0054 #define SJA1110_SIZE_PCP_REMAPPING_ENTRY 4
0055
0056
0057 enum {
0058 BLKID_SCHEDULE = 0x00,
0059 BLKID_SCHEDULE_ENTRY_POINTS = 0x01,
0060 BLKID_VL_LOOKUP = 0x02,
0061 BLKID_VL_POLICING = 0x03,
0062 BLKID_VL_FORWARDING = 0x04,
0063 BLKID_L2_LOOKUP = 0x05,
0064 BLKID_L2_POLICING = 0x06,
0065 BLKID_VLAN_LOOKUP = 0x07,
0066 BLKID_L2_FORWARDING = 0x08,
0067 BLKID_MAC_CONFIG = 0x09,
0068 BLKID_SCHEDULE_PARAMS = 0x0A,
0069 BLKID_SCHEDULE_ENTRY_POINTS_PARAMS = 0x0B,
0070 BLKID_VL_FORWARDING_PARAMS = 0x0C,
0071 BLKID_L2_LOOKUP_PARAMS = 0x0D,
0072 BLKID_L2_FORWARDING_PARAMS = 0x0E,
0073 BLKID_AVB_PARAMS = 0x10,
0074 BLKID_GENERAL_PARAMS = 0x11,
0075 BLKID_RETAGGING = 0x12,
0076 BLKID_CBS = 0x13,
0077 BLKID_PCP_REMAPPING = 0x1C,
0078 BLKID_XMII_PARAMS = 0x4E,
0079 };
0080
0081 enum sja1105_blk_idx {
0082 BLK_IDX_SCHEDULE = 0,
0083 BLK_IDX_SCHEDULE_ENTRY_POINTS,
0084 BLK_IDX_VL_LOOKUP,
0085 BLK_IDX_VL_POLICING,
0086 BLK_IDX_VL_FORWARDING,
0087 BLK_IDX_L2_LOOKUP,
0088 BLK_IDX_L2_POLICING,
0089 BLK_IDX_VLAN_LOOKUP,
0090 BLK_IDX_L2_FORWARDING,
0091 BLK_IDX_MAC_CONFIG,
0092 BLK_IDX_SCHEDULE_PARAMS,
0093 BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS,
0094 BLK_IDX_VL_FORWARDING_PARAMS,
0095 BLK_IDX_L2_LOOKUP_PARAMS,
0096 BLK_IDX_L2_FORWARDING_PARAMS,
0097 BLK_IDX_AVB_PARAMS,
0098 BLK_IDX_GENERAL_PARAMS,
0099 BLK_IDX_RETAGGING,
0100 BLK_IDX_CBS,
0101 BLK_IDX_XMII_PARAMS,
0102 BLK_IDX_PCP_REMAPPING,
0103 BLK_IDX_MAX,
0104
0105 BLK_IDX_MGMT_ROUTE,
0106 BLK_IDX_MAX_DYN,
0107 BLK_IDX_INVAL = -1,
0108 };
0109
0110 #define SJA1105_MAX_SCHEDULE_COUNT 1024
0111 #define SJA1110_MAX_SCHEDULE_COUNT 4096
0112 #define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT 2048
0113 #define SJA1105_MAX_VL_LOOKUP_COUNT 1024
0114 #define SJA1110_MAX_VL_LOOKUP_COUNT 4096
0115 #define SJA1105_MAX_VL_POLICING_COUNT 1024
0116 #define SJA1110_MAX_VL_POLICING_COUNT 4096
0117 #define SJA1105_MAX_VL_FORWARDING_COUNT 1024
0118 #define SJA1110_MAX_VL_FORWARDING_COUNT 4096
0119 #define SJA1105_MAX_L2_LOOKUP_COUNT 1024
0120 #define SJA1105_MAX_L2_POLICING_COUNT 45
0121 #define SJA1110_MAX_L2_POLICING_COUNT 110
0122 #define SJA1105_MAX_VLAN_LOOKUP_COUNT 4096
0123 #define SJA1105_MAX_L2_FORWARDING_COUNT 13
0124 #define SJA1110_MAX_L2_FORWARDING_COUNT 19
0125 #define SJA1105_MAX_MAC_CONFIG_COUNT 5
0126 #define SJA1110_MAX_MAC_CONFIG_COUNT 11
0127 #define SJA1105_MAX_SCHEDULE_PARAMS_COUNT 1
0128 #define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT 1
0129 #define SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT 1
0130 #define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT 1
0131 #define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT 1
0132 #define SJA1105_MAX_GENERAL_PARAMS_COUNT 1
0133 #define SJA1105_MAX_RETAGGING_COUNT 32
0134 #define SJA1105_MAX_XMII_PARAMS_COUNT 1
0135 #define SJA1105_MAX_AVB_PARAMS_COUNT 1
0136 #define SJA1105ET_MAX_CBS_COUNT 10
0137 #define SJA1105PQRS_MAX_CBS_COUNT 16
0138 #define SJA1110_MAX_CBS_COUNT 80
0139 #define SJA1110_MAX_PCP_REMAPPING_COUNT 11
0140
0141 #define SJA1105_MAX_FRAME_MEMORY 929
0142 #define SJA1110_MAX_FRAME_MEMORY 1820
0143 #define SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD 19
0144 #define SJA1105_VL_FRAME_MEMORY 100
0145
0146 #define SJA1105E_DEVICE_ID 0x9C00000Cull
0147 #define SJA1105T_DEVICE_ID 0x9E00030Eull
0148 #define SJA1105PR_DEVICE_ID 0xAF00030Eull
0149 #define SJA1105QS_DEVICE_ID 0xAE00030Eull
0150 #define SJA1110_DEVICE_ID 0xB700030Full
0151
0152 #define SJA1105ET_PART_NO 0x9A83
0153 #define SJA1105P_PART_NO 0x9A84
0154 #define SJA1105Q_PART_NO 0x9A85
0155 #define SJA1105R_PART_NO 0x9A86
0156 #define SJA1105S_PART_NO 0x9A87
0157 #define SJA1110A_PART_NO 0x1110
0158 #define SJA1110B_PART_NO 0x1111
0159 #define SJA1110C_PART_NO 0x1112
0160 #define SJA1110D_PART_NO 0x1113
0161
0162 #define SJA1110_ACU 0x1c4400
0163 #define SJA1110_RGU 0x1c6000
0164 #define SJA1110_CGU 0x1c6400
0165
0166 #define SJA1110_SPI_ADDR(x) ((x) / 4)
0167 #define SJA1110_ACU_ADDR(x) (SJA1110_ACU + SJA1110_SPI_ADDR(x))
0168 #define SJA1110_CGU_ADDR(x) (SJA1110_CGU + SJA1110_SPI_ADDR(x))
0169 #define SJA1110_RGU_ADDR(x) (SJA1110_RGU + SJA1110_SPI_ADDR(x))
0170
0171 #define SJA1105_RSV_ADDR 0xffffffffffffffffull
0172
0173 struct sja1105_schedule_entry {
0174 u64 winstindex;
0175 u64 winend;
0176 u64 winst;
0177 u64 destports;
0178 u64 setvalid;
0179 u64 txen;
0180 u64 resmedia_en;
0181 u64 resmedia;
0182 u64 vlindex;
0183 u64 delta;
0184 };
0185
0186 struct sja1105_schedule_params_entry {
0187 u64 subscheind[8];
0188 };
0189
0190 struct sja1105_general_params_entry {
0191 u64 vllupformat;
0192 u64 mirr_ptacu;
0193 u64 switchid;
0194 u64 hostprio;
0195 u64 mac_fltres1;
0196 u64 mac_fltres0;
0197 u64 mac_flt1;
0198 u64 mac_flt0;
0199 u64 incl_srcpt1;
0200 u64 incl_srcpt0;
0201 u64 send_meta1;
0202 u64 send_meta0;
0203 u64 casc_port;
0204 u64 host_port;
0205 u64 mirr_port;
0206 u64 vlmarker;
0207 u64 vlmask;
0208 u64 tpid;
0209 u64 ignore2stf;
0210 u64 tpid2;
0211
0212 u64 queue_ts;
0213 u64 egrmirrvid;
0214 u64 egrmirrpcp;
0215 u64 egrmirrdei;
0216 u64 replay_port;
0217
0218 u64 tte_en;
0219 u64 tdmaconfigidx;
0220 u64 header_type;
0221 };
0222
0223 struct sja1105_schedule_entry_points_entry {
0224 u64 subschindx;
0225 u64 delta;
0226 u64 address;
0227 };
0228
0229 struct sja1105_schedule_entry_points_params_entry {
0230 u64 clksrc;
0231 u64 actsubsch;
0232 };
0233
0234 struct sja1105_vlan_lookup_entry {
0235 u64 ving_mirr;
0236 u64 vegr_mirr;
0237 u64 vmemb_port;
0238 u64 vlan_bc;
0239 u64 tag_port;
0240 u64 vlanid;
0241 u64 type_entry;
0242 };
0243
0244 struct sja1105_l2_lookup_entry {
0245 u64 vlanid;
0246 u64 macaddr;
0247 u64 destports;
0248 u64 enfport;
0249 u64 index;
0250
0251 u64 mask_iotag;
0252 u64 mask_vlanid;
0253 u64 mask_macaddr;
0254 u64 mask_srcport;
0255 u64 iotag;
0256 u64 srcport;
0257 u64 lockeds;
0258 union {
0259
0260 struct {
0261
0262
0263
0264 u64 trap;
0265 u64 tsreg;
0266 u64 mirrvlan;
0267 u64 takets;
0268 u64 mirr;
0269 u64 retag;
0270 };
0271
0272 struct {
0273 u64 touched;
0274 u64 age;
0275 };
0276 };
0277 };
0278
0279 struct sja1105_l2_lookup_params_entry {
0280 u64 maxaddrp[SJA1105_MAX_NUM_PORTS];
0281 u64 start_dynspc;
0282 u64 drpnolearn;
0283 u64 use_static;
0284 u64 owr_dyn;
0285 u64 learn_once;
0286 u64 maxage;
0287 u64 dyn_tbsz;
0288 u64 poly;
0289 u64 shared_learn;
0290 u64 no_enf_hostprt;
0291 u64 no_mgmt_learn;
0292 };
0293
0294 struct sja1105_l2_forwarding_entry {
0295 u64 bc_domain;
0296 u64 reach_port;
0297 u64 fl_domain;
0298
0299 u64 vlan_pmap[SJA1105_MAX_NUM_PORTS];
0300 bool type_egrpcp2outputq;
0301 };
0302
0303 struct sja1105_l2_forwarding_params_entry {
0304 u64 max_dynp;
0305 u64 part_spc[8];
0306 };
0307
0308 struct sja1105_l2_policing_entry {
0309 u64 sharindx;
0310 u64 smax;
0311 u64 rate;
0312 u64 maxlen;
0313 u64 partition;
0314 };
0315
0316 struct sja1105_avb_params_entry {
0317 u64 cas_master;
0318 u64 destmeta;
0319 u64 srcmeta;
0320 };
0321
0322 struct sja1105_mac_config_entry {
0323 u64 top[8];
0324 u64 base[8];
0325 u64 enabled[8];
0326 u64 ifg;
0327 u64 speed;
0328 u64 tp_delin;
0329 u64 tp_delout;
0330 u64 maxage;
0331 u64 vlanprio;
0332 u64 vlanid;
0333 u64 ing_mirr;
0334 u64 egr_mirr;
0335 u64 drpnona664;
0336 u64 drpdtag;
0337 u64 drpuntag;
0338 u64 retag;
0339 u64 dyn_learn;
0340 u64 egress;
0341 u64 ingress;
0342 };
0343
0344 struct sja1105_retagging_entry {
0345 u64 egr_port;
0346 u64 ing_port;
0347 u64 vlan_ing;
0348 u64 vlan_egr;
0349 u64 do_not_learn;
0350 u64 use_dest_ports;
0351 u64 destports;
0352 };
0353
0354 struct sja1105_cbs_entry {
0355 u64 port;
0356 u64 prio;
0357 u64 credit_hi;
0358 u64 credit_lo;
0359 u64 send_slope;
0360 u64 idle_slope;
0361 };
0362
0363 struct sja1105_xmii_params_entry {
0364 u64 phy_mac[SJA1105_MAX_NUM_PORTS];
0365 u64 xmii_mode[SJA1105_MAX_NUM_PORTS];
0366
0367
0368
0369
0370
0371
0372 u64 special[SJA1105_MAX_NUM_PORTS];
0373 };
0374
0375 struct sja1110_pcp_remapping_entry {
0376 u64 egrpcp[SJA1105_NUM_TC];
0377 };
0378
0379 enum {
0380 SJA1105_VL_FORMAT_PSFP = 0,
0381 SJA1105_VL_FORMAT_ARINC664 = 1,
0382 };
0383
0384 struct sja1105_vl_lookup_entry {
0385 u64 format;
0386 u64 port;
0387 union {
0388
0389 struct {
0390 u64 destports;
0391 u64 iscritical;
0392 u64 macaddr;
0393 u64 vlanid;
0394 u64 vlanprior;
0395 };
0396
0397 struct {
0398 u64 egrmirr;
0399 u64 ingrmirr;
0400 u64 vlid;
0401 };
0402 };
0403
0404 unsigned long flow_cookie;
0405 };
0406
0407 struct sja1105_vl_policing_entry {
0408 u64 type;
0409 u64 maxlen;
0410 u64 sharindx;
0411 u64 bag;
0412 u64 jitter;
0413 };
0414
0415 struct sja1105_vl_forwarding_entry {
0416 u64 type;
0417 u64 priority;
0418 u64 partition;
0419 u64 destports;
0420 };
0421
0422 struct sja1105_vl_forwarding_params_entry {
0423 u64 partspc[8];
0424 u64 debugen;
0425 };
0426
0427 struct sja1105_table_header {
0428 u64 block_id;
0429 u64 len;
0430 u64 crc;
0431 };
0432
0433 struct sja1105_table_ops {
0434 size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
0435 size_t unpacked_entry_size;
0436 size_t packed_entry_size;
0437 size_t max_entry_count;
0438 };
0439
0440 struct sja1105_table {
0441 const struct sja1105_table_ops *ops;
0442 size_t entry_count;
0443 void *entries;
0444 };
0445
0446 struct sja1105_static_config {
0447 u64 device_id;
0448 struct sja1105_table tables[BLK_IDX_MAX];
0449 };
0450
0451 extern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
0452 extern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
0453 extern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
0454 extern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
0455 extern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
0456 extern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
0457 extern const struct sja1105_table_ops sja1110_table_ops[BLK_IDX_MAX];
0458
0459 size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
0460 void
0461 sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
0462 size_t
0463 sja1105_static_config_get_length(const struct sja1105_static_config *config);
0464
0465 typedef enum {
0466 SJA1105_CONFIG_OK = 0,
0467 SJA1105_TTETHERNET_NOT_SUPPORTED,
0468 SJA1105_INCORRECT_TTETHERNET_CONFIGURATION,
0469 SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION,
0470 SJA1105_MISSING_L2_POLICING_TABLE,
0471 SJA1105_MISSING_L2_FORWARDING_TABLE,
0472 SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,
0473 SJA1105_MISSING_GENERAL_PARAMS_TABLE,
0474 SJA1105_MISSING_VLAN_TABLE,
0475 SJA1105_MISSING_XMII_TABLE,
0476 SJA1105_MISSING_MAC_TABLE,
0477 SJA1105_OVERCOMMITTED_FRAME_MEMORY,
0478 } sja1105_config_valid_t;
0479
0480 extern const char *sja1105_static_config_error_msg[];
0481
0482 sja1105_config_valid_t
0483 sja1105_static_config_check_valid(const struct sja1105_static_config *config,
0484 int max_mem);
0485 void
0486 sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
0487 int sja1105_static_config_init(struct sja1105_static_config *config,
0488 const struct sja1105_table_ops *static_ops,
0489 u64 device_id);
0490 void sja1105_static_config_free(struct sja1105_static_config *config);
0491
0492 int sja1105_table_delete_entry(struct sja1105_table *table, int i);
0493 int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
0494
0495 u32 sja1105_crc32(const void *buf, size_t len);
0496
0497 void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
0498 void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
0499 void sja1105_packing(void *buf, u64 *val, int start, int end,
0500 size_t len, enum packing_op op);
0501
0502
0503 size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
0504 enum packing_op op);
0505 size_t sja1110_general_params_entry_packing(void *buf, void *entry_ptr,
0506 enum packing_op op);
0507 size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
0508 enum packing_op op);
0509 size_t sja1110_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
0510 enum packing_op op);
0511 size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
0512 enum packing_op op);
0513 size_t sja1110_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
0514 enum packing_op op);
0515 size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
0516 enum packing_op op);
0517 size_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
0518 enum packing_op op);
0519 size_t sja1110_l2_lookup_entry_packing(void *buf, void *entry_ptr,
0520 enum packing_op op);
0521 size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
0522 enum packing_op op);
0523 size_t sja1110_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
0524 enum packing_op op);
0525 size_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
0526 enum packing_op op);
0527 size_t sja1110_retagging_entry_packing(void *buf, void *entry_ptr,
0528 enum packing_op op);
0529 size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
0530 enum packing_op op);
0531 size_t sja1110_mac_config_entry_packing(void *buf, void *entry_ptr,
0532 enum packing_op op);
0533 size_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
0534 enum packing_op op);
0535 size_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,
0536 enum packing_op op);
0537 size_t sja1110_vl_lookup_entry_packing(void *buf, void *entry_ptr,
0538 enum packing_op op);
0539 size_t sja1110_vl_policing_entry_packing(void *buf, void *entry_ptr,
0540 enum packing_op op);
0541 size_t sja1110_xmii_params_entry_packing(void *buf, void *entry_ptr,
0542 enum packing_op op);
0543 size_t sja1110_l2_policing_entry_packing(void *buf, void *entry_ptr,
0544 enum packing_op op);
0545 size_t sja1110_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,
0546 enum packing_op op);
0547
0548 #endif