0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __FSL_DPSW_H
0009 #define __FSL_DPSW_H
0010
0011
0012
0013
0014
0015 struct fsl_mc_io;
0016
0017
0018
0019 #define DPSW_MAX_PRIORITIES 8
0020
0021 #define DPSW_MAX_IF 64
0022
0023 int dpsw_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpsw_id, u16 *token);
0024
0025 int dpsw_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
0026
0027
0028
0029
0030
0031
0032 #define DPSW_OPT_FLOODING_DIS 0x0000000000000001ULL
0033
0034
0035
0036 #define DPSW_OPT_MULTICAST_DIS 0x0000000000000004ULL
0037
0038
0039
0040 #define DPSW_OPT_CTRL_IF_DIS 0x0000000000000010ULL
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 enum dpsw_component_type {
0052 DPSW_COMPONENT_TYPE_C_VLAN = 0,
0053 DPSW_COMPONENT_TYPE_S_VLAN
0054 };
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067 enum dpsw_flooding_cfg {
0068 DPSW_FLOODING_PER_VLAN = 0,
0069 DPSW_FLOODING_PER_FDB,
0070 };
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080 enum dpsw_broadcast_cfg {
0081 DPSW_BROADCAST_PER_OBJECT = 0,
0082 DPSW_BROADCAST_PER_FDB,
0083 };
0084
0085 int dpsw_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
0086
0087 int dpsw_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
0088
0089 int dpsw_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
0090
0091
0092
0093 #define DPSW_IRQ_INDEX_IF 0x0000
0094 #define DPSW_IRQ_INDEX_L2SW 0x0001
0095
0096
0097
0098
0099 #define DPSW_IRQ_EVENT_LINK_CHANGED 0x0001
0100
0101
0102
0103
0104 #define DPSW_IRQ_EVENT_ENDPOINT_CHANGED 0x0002
0105
0106
0107
0108
0109
0110
0111
0112 struct dpsw_irq_cfg {
0113 u64 addr;
0114 u32 val;
0115 int irq_num;
0116 };
0117
0118 int dpsw_set_irq_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0119 u8 irq_index, u8 en);
0120
0121 int dpsw_set_irq_mask(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0122 u8 irq_index, u32 mask);
0123
0124 int dpsw_get_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0125 u8 irq_index, u32 *status);
0126
0127 int dpsw_clear_irq_status(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0128 u8 irq_index, u32 status);
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151 struct dpsw_attr {
0152 int id;
0153 u64 options;
0154 u16 max_vlans;
0155 u8 max_meters_per_if;
0156 u8 max_fdbs;
0157 u16 max_fdb_entries;
0158 u16 fdb_aging_time;
0159 u16 max_fdb_mc_groups;
0160 u16 num_ifs;
0161 u16 mem_size;
0162 u16 num_vlans;
0163 u8 num_fdbs;
0164 enum dpsw_component_type component_type;
0165 enum dpsw_flooding_cfg flooding_cfg;
0166 enum dpsw_broadcast_cfg broadcast_cfg;
0167 };
0168
0169 int dpsw_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0170 struct dpsw_attr *attr);
0171
0172
0173
0174
0175
0176
0177
0178 struct dpsw_ctrl_if_attr {
0179 u32 rx_fqid;
0180 u32 rx_err_fqid;
0181 u32 tx_err_conf_fqid;
0182 };
0183
0184 int dpsw_ctrl_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags,
0185 u16 token, struct dpsw_ctrl_if_attr *attr);
0186
0187 enum dpsw_queue_type {
0188 DPSW_QUEUE_RX,
0189 DPSW_QUEUE_TX_ERR_CONF,
0190 DPSW_QUEUE_RX_ERR,
0191 };
0192
0193 #define DPSW_MAX_DPBP 8
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204 struct dpsw_ctrl_if_pools_cfg {
0205 u8 num_dpbp;
0206 struct {
0207 int dpbp_id;
0208 u16 buffer_size;
0209 int backup_pool;
0210 } pools[DPSW_MAX_DPBP];
0211 };
0212
0213 int dpsw_ctrl_if_set_pools(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0214 const struct dpsw_ctrl_if_pools_cfg *cfg);
0215
0216 #define DPSW_CTRL_IF_QUEUE_OPT_USER_CTX 0x00000001
0217 #define DPSW_CTRL_IF_QUEUE_OPT_DEST 0x00000002
0218
0219 enum dpsw_ctrl_if_dest {
0220 DPSW_CTRL_IF_DEST_NONE = 0,
0221 DPSW_CTRL_IF_DEST_DPIO = 1,
0222 };
0223
0224 struct dpsw_ctrl_if_dest_cfg {
0225 enum dpsw_ctrl_if_dest dest_type;
0226 int dest_id;
0227 u8 priority;
0228 };
0229
0230 struct dpsw_ctrl_if_queue_cfg {
0231 u32 options;
0232 u64 user_ctx;
0233 struct dpsw_ctrl_if_dest_cfg dest_cfg;
0234 };
0235
0236 int dpsw_ctrl_if_set_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0237 enum dpsw_queue_type qtype,
0238 const struct dpsw_ctrl_if_queue_cfg *cfg);
0239
0240 int dpsw_ctrl_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
0241
0242 int dpsw_ctrl_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
0243
0244
0245
0246
0247
0248
0249 enum dpsw_action {
0250 DPSW_ACTION_DROP = 0,
0251 DPSW_ACTION_REDIRECT = 1
0252 };
0253
0254 #define DPSW_LINK_OPT_AUTONEG 0x0000000000000001ULL
0255 #define DPSW_LINK_OPT_HALF_DUPLEX 0x0000000000000002ULL
0256 #define DPSW_LINK_OPT_PAUSE 0x0000000000000004ULL
0257 #define DPSW_LINK_OPT_ASYM_PAUSE 0x0000000000000008ULL
0258
0259
0260
0261
0262
0263
0264 struct dpsw_link_cfg {
0265 u32 rate;
0266 u64 options;
0267 };
0268
0269 int dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
0270 struct dpsw_link_cfg *cfg);
0271
0272
0273
0274
0275
0276
0277
0278 struct dpsw_link_state {
0279 u32 rate;
0280 u64 options;
0281 u8 up;
0282 };
0283
0284 int dpsw_if_get_link_state(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0285 u16 if_id, struct dpsw_link_state *state);
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300 struct dpsw_tci_cfg {
0301 u8 pcp;
0302 u8 dei;
0303 u16 vlan_id;
0304 };
0305
0306 int dpsw_if_set_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
0307 const struct dpsw_tci_cfg *cfg);
0308
0309 int dpsw_if_get_tci(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
0310 struct dpsw_tci_cfg *cfg);
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321 enum dpsw_stp_state {
0322 DPSW_STP_STATE_DISABLED = 0,
0323 DPSW_STP_STATE_LISTENING = 1,
0324 DPSW_STP_STATE_LEARNING = 2,
0325 DPSW_STP_STATE_FORWARDING = 3,
0326 DPSW_STP_STATE_BLOCKING = 0
0327 };
0328
0329
0330
0331
0332
0333
0334 struct dpsw_stp_cfg {
0335 u16 vlan_id;
0336 enum dpsw_stp_state state;
0337 };
0338
0339 int dpsw_if_set_stp(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id,
0340 const struct dpsw_stp_cfg *cfg);
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350 enum dpsw_accepted_frames {
0351 DPSW_ADMIT_ALL = 1,
0352 DPSW_ADMIT_ONLY_VLAN_TAGGED = 3
0353 };
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371 enum dpsw_counter {
0372 DPSW_CNT_ING_FRAME = 0x0,
0373 DPSW_CNT_ING_BYTE = 0x1,
0374 DPSW_CNT_ING_FLTR_FRAME = 0x2,
0375 DPSW_CNT_ING_FRAME_DISCARD = 0x3,
0376 DPSW_CNT_ING_MCAST_FRAME = 0x4,
0377 DPSW_CNT_ING_MCAST_BYTE = 0x5,
0378 DPSW_CNT_ING_BCAST_FRAME = 0x6,
0379 DPSW_CNT_ING_BCAST_BYTES = 0x7,
0380 DPSW_CNT_EGR_FRAME = 0x8,
0381 DPSW_CNT_EGR_BYTE = 0x9,
0382 DPSW_CNT_EGR_FRAME_DISCARD = 0xa,
0383 DPSW_CNT_EGR_STP_FRAME_DISCARD = 0xb,
0384 DPSW_CNT_ING_NO_BUFF_DISCARD = 0xc,
0385 };
0386
0387 int dpsw_if_get_counter(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0388 u16 if_id, enum dpsw_counter type, u64 *counter);
0389
0390 int dpsw_if_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id);
0391
0392 int dpsw_if_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 if_id);
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409 struct dpsw_if_attr {
0410 u8 num_tcs;
0411 u32 rate;
0412 u32 options;
0413 int enabled;
0414 int accept_all_vlan;
0415 enum dpsw_accepted_frames admit_untagged;
0416 u16 qdid;
0417 };
0418
0419 int dpsw_if_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0420 u16 if_id, struct dpsw_if_attr *attr);
0421
0422 int dpsw_if_set_max_frame_length(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0423 u16 if_id, u16 frame_length);
0424
0425
0426
0427
0428
0429 struct dpsw_vlan_cfg {
0430 u16 fdb_id;
0431 };
0432
0433 int dpsw_vlan_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0434 u16 vlan_id, const struct dpsw_vlan_cfg *cfg);
0435
0436 #define DPSW_VLAN_ADD_IF_OPT_FDB_ID 0x0001
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449 struct dpsw_vlan_if_cfg {
0450 u16 num_ifs;
0451 u16 options;
0452 u16 if_id[DPSW_MAX_IF];
0453 u16 fdb_id;
0454 };
0455
0456 int dpsw_vlan_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0457 u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
0458
0459 int dpsw_vlan_add_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0460 u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
0461
0462 int dpsw_vlan_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0463 u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
0464
0465 int dpsw_vlan_remove_if_untagged(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0466 u16 vlan_id, const struct dpsw_vlan_if_cfg *cfg);
0467
0468 int dpsw_vlan_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0469 u16 vlan_id);
0470
0471
0472
0473
0474
0475
0476 enum dpsw_fdb_entry_type {
0477 DPSW_FDB_ENTRY_STATIC = 0,
0478 DPSW_FDB_ENTRY_DINAMIC = 1
0479 };
0480
0481
0482
0483
0484
0485
0486
0487 struct dpsw_fdb_unicast_cfg {
0488 enum dpsw_fdb_entry_type type;
0489 u8 mac_addr[6];
0490 u16 if_egress;
0491 };
0492
0493 int dpsw_fdb_add_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0494 u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg);
0495
0496 int dpsw_fdb_remove_unicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0497 u16 fdb_id, const struct dpsw_fdb_unicast_cfg *cfg);
0498
0499 #define DPSW_FDB_ENTRY_TYPE_DYNAMIC BIT(0)
0500 #define DPSW_FDB_ENTRY_TYPE_UNICAST BIT(1)
0501
0502
0503
0504
0505
0506
0507
0508
0509 struct fdb_dump_entry {
0510 u8 mac_addr[6];
0511 u8 type;
0512 u8 if_info;
0513 u8 if_mask[8];
0514 };
0515
0516 int dpsw_fdb_dump(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id,
0517 u64 iova_addr, u32 iova_size, u16 *num_entries);
0518
0519
0520
0521
0522
0523
0524
0525
0526 struct dpsw_fdb_multicast_cfg {
0527 enum dpsw_fdb_entry_type type;
0528 u8 mac_addr[6];
0529 u16 num_ifs;
0530 u16 if_id[DPSW_MAX_IF];
0531 };
0532
0533 int dpsw_fdb_add_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0534 u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg);
0535
0536 int dpsw_fdb_remove_multicast(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0537 u16 fdb_id, const struct dpsw_fdb_multicast_cfg *cfg);
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569 enum dpsw_learning_mode {
0570 DPSW_LEARNING_MODE_DIS = 0,
0571 DPSW_LEARNING_MODE_HW = 1,
0572 DPSW_LEARNING_MODE_NON_SECURE = 2,
0573 DPSW_LEARNING_MODE_SECURE = 3
0574 };
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584 struct dpsw_fdb_attr {
0585 u16 max_fdb_entries;
0586 u16 fdb_ageing_time;
0587 enum dpsw_learning_mode learning_mode;
0588 u16 num_fdb_mc_groups;
0589 u16 max_fdb_mc_groups;
0590 };
0591
0592 int dpsw_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags,
0593 u16 *major_ver, u16 *minor_ver);
0594
0595 int dpsw_if_get_port_mac_addr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0596 u16 if_id, u8 mac_addr[6]);
0597
0598
0599
0600
0601
0602
0603 struct dpsw_fdb_cfg {
0604 u16 num_fdb_entries;
0605 u16 fdb_ageing_time;
0606 };
0607
0608 int dpsw_fdb_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *fdb_id,
0609 const struct dpsw_fdb_cfg *cfg);
0610
0611 int dpsw_fdb_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 fdb_id);
0612
0613
0614
0615
0616
0617
0618 enum dpsw_flood_type {
0619 DPSW_BROADCAST = 0,
0620 DPSW_FLOODING,
0621 };
0622
0623 struct dpsw_egress_flood_cfg {
0624 u16 fdb_id;
0625 enum dpsw_flood_type flood_type;
0626 u16 num_ifs;
0627 u16 if_id[DPSW_MAX_IF];
0628 };
0629
0630 int dpsw_set_egress_flood(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0631 const struct dpsw_egress_flood_cfg *cfg);
0632
0633 int dpsw_if_set_learning_mode(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0634 u16 if_id, enum dpsw_learning_mode mode);
0635
0636
0637
0638
0639
0640 struct dpsw_acl_cfg {
0641 u16 max_entries;
0642 };
0643
0644 int dpsw_acl_add(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u16 *acl_id,
0645 const struct dpsw_acl_cfg *cfg);
0646
0647 int dpsw_acl_remove(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0648 u16 acl_id);
0649
0650
0651
0652
0653
0654
0655 struct dpsw_acl_if_cfg {
0656 u16 num_ifs;
0657 u16 if_id[DPSW_MAX_IF];
0658 };
0659
0660 int dpsw_acl_add_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0661 u16 acl_id, const struct dpsw_acl_if_cfg *cfg);
0662
0663 int dpsw_acl_remove_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0664 u16 acl_id, const struct dpsw_acl_if_cfg *cfg);
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687 struct dpsw_acl_fields {
0688 u8 l2_dest_mac[6];
0689 u8 l2_source_mac[6];
0690 u16 l2_tpid;
0691 u8 l2_pcp_dei;
0692 u16 l2_vlan_id;
0693 u16 l2_ether_type;
0694 u8 l3_dscp;
0695 u8 l3_protocol;
0696 u32 l3_source_ip;
0697 u32 l3_dest_ip;
0698 u16 l4_source_port;
0699 u16 l4_dest_port;
0700 };
0701
0702
0703
0704
0705
0706
0707 struct dpsw_acl_key {
0708 struct dpsw_acl_fields match;
0709 struct dpsw_acl_fields mask;
0710 };
0711
0712
0713
0714
0715
0716
0717
0718
0719 enum dpsw_acl_action {
0720 DPSW_ACL_ACTION_DROP,
0721 DPSW_ACL_ACTION_REDIRECT,
0722 DPSW_ACL_ACTION_ACCEPT,
0723 DPSW_ACL_ACTION_REDIRECT_TO_CTRL_IF
0724 };
0725
0726
0727
0728
0729
0730
0731
0732 struct dpsw_acl_result {
0733 enum dpsw_acl_action action;
0734 u16 if_id;
0735 };
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746 struct dpsw_acl_entry_cfg {
0747 u64 key_iova;
0748 struct dpsw_acl_result result;
0749 int precedence;
0750 };
0751
0752 void dpsw_acl_prepare_entry_cfg(const struct dpsw_acl_key *key,
0753 u8 *entry_cfg_buf);
0754
0755 int dpsw_acl_add_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0756 u16 acl_id, const struct dpsw_acl_entry_cfg *cfg);
0757
0758 int dpsw_acl_remove_entry(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0759 u16 acl_id, const struct dpsw_acl_entry_cfg *cfg);
0760
0761
0762
0763
0764
0765
0766
0767
0768 enum dpsw_reflection_filter {
0769 DPSW_REFLECTION_FILTER_INGRESS_ALL = 0,
0770 DPSW_REFLECTION_FILTER_INGRESS_VLAN = 1
0771 };
0772
0773
0774
0775
0776
0777
0778 struct dpsw_reflection_cfg {
0779 enum dpsw_reflection_filter filter;
0780 u16 vlan_id;
0781 };
0782
0783 int dpsw_set_reflection_if(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0784 u16 if_id);
0785
0786 int dpsw_if_add_reflection(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0787 u16 if_id, const struct dpsw_reflection_cfg *cfg);
0788
0789 int dpsw_if_remove_reflection(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
0790 u16 if_id, const struct dpsw_reflection_cfg *cfg);
0791 #endif