0001
0002
0003
0004 #ifndef _MLXSW_CMD_H
0005 #define _MLXSW_CMD_H
0006
0007 #include "item.h"
0008
0009 #define MLXSW_CMD_MBOX_SIZE 4096
0010
0011 static inline char *mlxsw_cmd_mbox_alloc(void)
0012 {
0013 return kzalloc(MLXSW_CMD_MBOX_SIZE, GFP_KERNEL);
0014 }
0015
0016 static inline void mlxsw_cmd_mbox_free(char *mbox)
0017 {
0018 kfree(mbox);
0019 }
0020
0021 static inline void mlxsw_cmd_mbox_zero(char *mbox)
0022 {
0023 memset(mbox, 0, MLXSW_CMD_MBOX_SIZE);
0024 }
0025
0026 struct mlxsw_core;
0027
0028 int mlxsw_cmd_exec(struct mlxsw_core *mlxsw_core, u16 opcode, u8 opcode_mod,
0029 u32 in_mod, bool out_mbox_direct, bool reset_ok,
0030 char *in_mbox, size_t in_mbox_size,
0031 char *out_mbox, size_t out_mbox_size);
0032
0033 static inline int mlxsw_cmd_exec_in(struct mlxsw_core *mlxsw_core, u16 opcode,
0034 u8 opcode_mod, u32 in_mod, char *in_mbox,
0035 size_t in_mbox_size)
0036 {
0037 return mlxsw_cmd_exec(mlxsw_core, opcode, opcode_mod, in_mod, false,
0038 false, in_mbox, in_mbox_size, NULL, 0);
0039 }
0040
0041 static inline int mlxsw_cmd_exec_out(struct mlxsw_core *mlxsw_core, u16 opcode,
0042 u8 opcode_mod, u32 in_mod,
0043 bool out_mbox_direct,
0044 char *out_mbox, size_t out_mbox_size)
0045 {
0046 return mlxsw_cmd_exec(mlxsw_core, opcode, opcode_mod, in_mod,
0047 out_mbox_direct, false, NULL, 0,
0048 out_mbox, out_mbox_size);
0049 }
0050
0051 static inline int mlxsw_cmd_exec_none(struct mlxsw_core *mlxsw_core, u16 opcode,
0052 u8 opcode_mod, u32 in_mod)
0053 {
0054 return mlxsw_cmd_exec(mlxsw_core, opcode, opcode_mod, in_mod, false,
0055 false, NULL, 0, NULL, 0);
0056 }
0057
0058 enum mlxsw_cmd_opcode {
0059 MLXSW_CMD_OPCODE_QUERY_FW = 0x004,
0060 MLXSW_CMD_OPCODE_QUERY_BOARDINFO = 0x006,
0061 MLXSW_CMD_OPCODE_QUERY_AQ_CAP = 0x003,
0062 MLXSW_CMD_OPCODE_MAP_FA = 0xFFF,
0063 MLXSW_CMD_OPCODE_UNMAP_FA = 0xFFE,
0064 MLXSW_CMD_OPCODE_CONFIG_PROFILE = 0x100,
0065 MLXSW_CMD_OPCODE_ACCESS_REG = 0x040,
0066 MLXSW_CMD_OPCODE_SW2HW_DQ = 0x201,
0067 MLXSW_CMD_OPCODE_HW2SW_DQ = 0x202,
0068 MLXSW_CMD_OPCODE_2ERR_DQ = 0x01E,
0069 MLXSW_CMD_OPCODE_QUERY_DQ = 0x022,
0070 MLXSW_CMD_OPCODE_SW2HW_CQ = 0x016,
0071 MLXSW_CMD_OPCODE_HW2SW_CQ = 0x017,
0072 MLXSW_CMD_OPCODE_QUERY_CQ = 0x018,
0073 MLXSW_CMD_OPCODE_SW2HW_EQ = 0x013,
0074 MLXSW_CMD_OPCODE_HW2SW_EQ = 0x014,
0075 MLXSW_CMD_OPCODE_QUERY_EQ = 0x015,
0076 MLXSW_CMD_OPCODE_QUERY_RESOURCES = 0x101,
0077 };
0078
0079 static inline const char *mlxsw_cmd_opcode_str(u16 opcode)
0080 {
0081 switch (opcode) {
0082 case MLXSW_CMD_OPCODE_QUERY_FW:
0083 return "QUERY_FW";
0084 case MLXSW_CMD_OPCODE_QUERY_BOARDINFO:
0085 return "QUERY_BOARDINFO";
0086 case MLXSW_CMD_OPCODE_QUERY_AQ_CAP:
0087 return "QUERY_AQ_CAP";
0088 case MLXSW_CMD_OPCODE_MAP_FA:
0089 return "MAP_FA";
0090 case MLXSW_CMD_OPCODE_UNMAP_FA:
0091 return "UNMAP_FA";
0092 case MLXSW_CMD_OPCODE_CONFIG_PROFILE:
0093 return "CONFIG_PROFILE";
0094 case MLXSW_CMD_OPCODE_ACCESS_REG:
0095 return "ACCESS_REG";
0096 case MLXSW_CMD_OPCODE_SW2HW_DQ:
0097 return "SW2HW_DQ";
0098 case MLXSW_CMD_OPCODE_HW2SW_DQ:
0099 return "HW2SW_DQ";
0100 case MLXSW_CMD_OPCODE_2ERR_DQ:
0101 return "2ERR_DQ";
0102 case MLXSW_CMD_OPCODE_QUERY_DQ:
0103 return "QUERY_DQ";
0104 case MLXSW_CMD_OPCODE_SW2HW_CQ:
0105 return "SW2HW_CQ";
0106 case MLXSW_CMD_OPCODE_HW2SW_CQ:
0107 return "HW2SW_CQ";
0108 case MLXSW_CMD_OPCODE_QUERY_CQ:
0109 return "QUERY_CQ";
0110 case MLXSW_CMD_OPCODE_SW2HW_EQ:
0111 return "SW2HW_EQ";
0112 case MLXSW_CMD_OPCODE_HW2SW_EQ:
0113 return "HW2SW_EQ";
0114 case MLXSW_CMD_OPCODE_QUERY_EQ:
0115 return "QUERY_EQ";
0116 case MLXSW_CMD_OPCODE_QUERY_RESOURCES:
0117 return "QUERY_RESOURCES";
0118 default:
0119 return "*UNKNOWN*";
0120 }
0121 }
0122
0123 enum mlxsw_cmd_status {
0124
0125 MLXSW_CMD_STATUS_OK = 0x00,
0126
0127 MLXSW_CMD_STATUS_INTERNAL_ERR = 0x01,
0128
0129 MLXSW_CMD_STATUS_BAD_OP = 0x02,
0130
0131 MLXSW_CMD_STATUS_BAD_PARAM = 0x03,
0132
0133 MLXSW_CMD_STATUS_BAD_SYS_STATE = 0x04,
0134
0135
0136
0137 MLXSW_CMD_STATUS_BAD_RESOURCE = 0x05,
0138
0139 MLXSW_CMD_STATUS_RESOURCE_BUSY = 0x06,
0140
0141 MLXSW_CMD_STATUS_EXCEED_LIM = 0x08,
0142
0143 MLXSW_CMD_STATUS_BAD_RES_STATE = 0x09,
0144
0145
0146
0147 MLXSW_CMD_STATUS_BAD_INDEX = 0x0A,
0148
0149 MLXSW_CMD_STATUS_BAD_NVMEM = 0x0B,
0150
0151 MLXSW_CMD_STATUS_RUNNING_RESET = 0x26,
0152
0153 MLXSW_CMD_STATUS_BAD_PKT = 0x30,
0154 };
0155
0156 static inline const char *mlxsw_cmd_status_str(u8 status)
0157 {
0158 switch (status) {
0159 case MLXSW_CMD_STATUS_OK:
0160 return "OK";
0161 case MLXSW_CMD_STATUS_INTERNAL_ERR:
0162 return "INTERNAL_ERR";
0163 case MLXSW_CMD_STATUS_BAD_OP:
0164 return "BAD_OP";
0165 case MLXSW_CMD_STATUS_BAD_PARAM:
0166 return "BAD_PARAM";
0167 case MLXSW_CMD_STATUS_BAD_SYS_STATE:
0168 return "BAD_SYS_STATE";
0169 case MLXSW_CMD_STATUS_BAD_RESOURCE:
0170 return "BAD_RESOURCE";
0171 case MLXSW_CMD_STATUS_RESOURCE_BUSY:
0172 return "RESOURCE_BUSY";
0173 case MLXSW_CMD_STATUS_EXCEED_LIM:
0174 return "EXCEED_LIM";
0175 case MLXSW_CMD_STATUS_BAD_RES_STATE:
0176 return "BAD_RES_STATE";
0177 case MLXSW_CMD_STATUS_BAD_INDEX:
0178 return "BAD_INDEX";
0179 case MLXSW_CMD_STATUS_BAD_NVMEM:
0180 return "BAD_NVMEM";
0181 case MLXSW_CMD_STATUS_RUNNING_RESET:
0182 return "RUNNING_RESET";
0183 case MLXSW_CMD_STATUS_BAD_PKT:
0184 return "BAD_PKT";
0185 default:
0186 return "*UNKNOWN*";
0187 }
0188 }
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199 static inline int mlxsw_cmd_query_fw(struct mlxsw_core *mlxsw_core,
0200 char *out_mbox)
0201 {
0202 return mlxsw_cmd_exec_out(mlxsw_core, MLXSW_CMD_OPCODE_QUERY_FW,
0203 0, 0, false, out_mbox, MLXSW_CMD_MBOX_SIZE);
0204 }
0205
0206
0207
0208
0209 MLXSW_ITEM32(cmd_mbox, query_fw, fw_pages, 0x00, 16, 16);
0210
0211
0212
0213
0214 MLXSW_ITEM32(cmd_mbox, query_fw, fw_rev_major, 0x00, 0, 16);
0215
0216
0217
0218
0219 MLXSW_ITEM32(cmd_mbox, query_fw, fw_rev_subminor, 0x04, 16, 16);
0220
0221
0222
0223
0224 MLXSW_ITEM32(cmd_mbox, query_fw, fw_rev_minor, 0x04, 0, 16);
0225
0226
0227
0228
0229 MLXSW_ITEM32(cmd_mbox, query_fw, core_clk, 0x08, 16, 16);
0230
0231
0232
0233
0234
0235
0236 MLXSW_ITEM32(cmd_mbox, query_fw, cmd_interface_rev, 0x08, 0, 16);
0237
0238
0239
0240
0241 MLXSW_ITEM32(cmd_mbox, query_fw, dt, 0x0C, 31, 1);
0242
0243
0244
0245
0246
0247 MLXSW_ITEM32(cmd_mbox, query_fw, api_version, 0x0C, 0, 16);
0248
0249
0250
0251
0252 MLXSW_ITEM32(cmd_mbox, query_fw, fw_hour, 0x10, 24, 8);
0253
0254
0255
0256
0257 MLXSW_ITEM32(cmd_mbox, query_fw, fw_minutes, 0x10, 16, 8);
0258
0259
0260
0261
0262 MLXSW_ITEM32(cmd_mbox, query_fw, fw_seconds, 0x10, 8, 8);
0263
0264
0265
0266
0267 MLXSW_ITEM32(cmd_mbox, query_fw, fw_year, 0x14, 16, 16);
0268
0269
0270
0271
0272 MLXSW_ITEM32(cmd_mbox, query_fw, fw_month, 0x14, 8, 8);
0273
0274
0275
0276
0277 MLXSW_ITEM32(cmd_mbox, query_fw, fw_day, 0x14, 0, 8);
0278
0279
0280
0281
0282
0283 MLXSW_ITEM64(cmd_mbox, query_fw, clr_int_base_offset, 0x20, 0, 64);
0284
0285
0286
0287
0288
0289 MLXSW_ITEM32(cmd_mbox, query_fw, clr_int_bar, 0x28, 30, 2);
0290
0291
0292
0293
0294
0295 MLXSW_ITEM64(cmd_mbox, query_fw, error_buf_offset, 0x30, 0, 64);
0296
0297
0298
0299
0300 MLXSW_ITEM32(cmd_mbox, query_fw, error_buf_size, 0x38, 0, 32);
0301
0302
0303
0304
0305
0306
0307 MLXSW_ITEM32(cmd_mbox, query_fw, error_int_bar, 0x3C, 30, 2);
0308
0309
0310
0311
0312 MLXSW_ITEM64(cmd_mbox, query_fw, doorbell_page_offset, 0x40, 0, 64);
0313
0314
0315
0316
0317
0318 MLXSW_ITEM32(cmd_mbox, query_fw, doorbell_page_bar, 0x48, 30, 2);
0319
0320
0321
0322
0323 MLXSW_ITEM64(cmd_mbox, query_fw, free_running_clock_offset, 0x50, 0, 64);
0324
0325
0326
0327
0328
0329
0330 MLXSW_ITEM32(cmd_mbox, query_fw, fr_rn_clk_bar, 0x58, 30, 2);
0331
0332
0333
0334
0335 MLXSW_ITEM64(cmd_mbox, query_fw, utc_sec_offset, 0x70, 0, 64);
0336
0337
0338
0339
0340
0341
0342
0343 MLXSW_ITEM32(cmd_mbox, query_fw, utc_sec_bar, 0x78, 30, 2);
0344
0345
0346
0347
0348 MLXSW_ITEM64(cmd_mbox, query_fw, utc_nsec_offset, 0x80, 0, 64);
0349
0350
0351
0352
0353
0354
0355
0356 MLXSW_ITEM32(cmd_mbox, query_fw, utc_nsec_bar, 0x88, 30, 2);
0357
0358
0359
0360
0361
0362
0363
0364
0365 static inline int mlxsw_cmd_boardinfo(struct mlxsw_core *mlxsw_core,
0366 char *out_mbox)
0367 {
0368 return mlxsw_cmd_exec_out(mlxsw_core, MLXSW_CMD_OPCODE_QUERY_BOARDINFO,
0369 0, 0, false, out_mbox, MLXSW_CMD_MBOX_SIZE);
0370 }
0371
0372
0373
0374
0375
0376 MLXSW_ITEM32(cmd_mbox, boardinfo, intapin, 0x10, 24, 8);
0377
0378
0379
0380
0381
0382
0383
0384 MLXSW_ITEM32(cmd_mbox, boardinfo, vsd_vendor_id, 0x1C, 0, 16);
0385
0386
0387
0388
0389
0390 #define MLXSW_CMD_BOARDINFO_VSD_LEN 208
0391 MLXSW_ITEM_BUF(cmd_mbox, boardinfo, vsd, 0x20, MLXSW_CMD_BOARDINFO_VSD_LEN);
0392
0393
0394
0395
0396
0397
0398 #define MLXSW_CMD_BOARDINFO_PSID_LEN 16
0399 MLXSW_ITEM_BUF(cmd_mbox, boardinfo, psid, 0xF0, MLXSW_CMD_BOARDINFO_PSID_LEN);
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409 static inline int mlxsw_cmd_query_aq_cap(struct mlxsw_core *mlxsw_core,
0410 char *out_mbox)
0411 {
0412 return mlxsw_cmd_exec_out(mlxsw_core, MLXSW_CMD_OPCODE_QUERY_AQ_CAP,
0413 0, 0, false, out_mbox, MLXSW_CMD_MBOX_SIZE);
0414 }
0415
0416
0417
0418
0419 MLXSW_ITEM32(cmd_mbox, query_aq_cap, log_max_sdq_sz, 0x00, 24, 8);
0420
0421
0422
0423
0424 MLXSW_ITEM32(cmd_mbox, query_aq_cap, max_num_sdqs, 0x00, 0, 8);
0425
0426
0427
0428
0429 MLXSW_ITEM32(cmd_mbox, query_aq_cap, log_max_rdq_sz, 0x04, 24, 8);
0430
0431
0432
0433
0434 MLXSW_ITEM32(cmd_mbox, query_aq_cap, max_num_rdqs, 0x04, 0, 8);
0435
0436
0437
0438
0439 MLXSW_ITEM32(cmd_mbox, query_aq_cap, log_max_cq_sz, 0x08, 24, 8);
0440
0441
0442
0443
0444 MLXSW_ITEM32(cmd_mbox, query_aq_cap, log_max_cqv2_sz, 0x08, 16, 8);
0445
0446
0447
0448
0449 MLXSW_ITEM32(cmd_mbox, query_aq_cap, max_num_cqs, 0x08, 0, 8);
0450
0451
0452
0453
0454 MLXSW_ITEM32(cmd_mbox, query_aq_cap, log_max_eq_sz, 0x0C, 24, 8);
0455
0456
0457
0458
0459 MLXSW_ITEM32(cmd_mbox, query_aq_cap, max_num_eqs, 0x0C, 0, 8);
0460
0461
0462
0463
0464
0465 MLXSW_ITEM32(cmd_mbox, query_aq_cap, max_sg_sq, 0x10, 8, 8);
0466
0467
0468
0469
0470
0471 MLXSW_ITEM32(cmd_mbox, query_aq_cap, max_sg_rq, 0x10, 0, 8);
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485 #define MLXSW_CMD_MAP_FA_VPM_ENTRIES_MAX 32
0486
0487 static inline int mlxsw_cmd_map_fa(struct mlxsw_core *mlxsw_core,
0488 char *in_mbox, u32 vpm_entries_count)
0489 {
0490 return mlxsw_cmd_exec_in(mlxsw_core, MLXSW_CMD_OPCODE_MAP_FA,
0491 0, vpm_entries_count,
0492 in_mbox, MLXSW_CMD_MBOX_SIZE);
0493 }
0494
0495
0496
0497
0498 MLXSW_ITEM64_INDEXED(cmd_mbox, map_fa, pa, 0x00, 12, 52, 0x08, 0x00, true);
0499
0500
0501
0502
0503
0504 MLXSW_ITEM32_INDEXED(cmd_mbox, map_fa, log2size, 0x00, 0, 5, 0x08, 0x04, false);
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516 static inline int mlxsw_cmd_unmap_fa(struct mlxsw_core *mlxsw_core)
0517 {
0518 return mlxsw_cmd_exec_none(mlxsw_core, MLXSW_CMD_OPCODE_UNMAP_FA, 0, 0);
0519 }
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532 #define MLXSW_CMD_QUERY_RESOURCES_TABLE_END_ID 0xffff
0533 #define MLXSW_CMD_QUERY_RESOURCES_MAX_QUERIES 100
0534 #define MLXSW_CMD_QUERY_RESOURCES_PER_QUERY 32
0535
0536 static inline int mlxsw_cmd_query_resources(struct mlxsw_core *mlxsw_core,
0537 char *out_mbox, int index)
0538 {
0539 return mlxsw_cmd_exec_out(mlxsw_core, MLXSW_CMD_OPCODE_QUERY_RESOURCES,
0540 0, index, false, out_mbox,
0541 MLXSW_CMD_MBOX_SIZE);
0542 }
0543
0544
0545
0546
0547 MLXSW_ITEM32_INDEXED(cmd_mbox, query_resource, id, 0x00, 16, 16, 0x8, 0, false);
0548
0549
0550
0551
0552 MLXSW_ITEM64_INDEXED(cmd_mbox, query_resource, data,
0553 0x00, 0, 40, 0x8, 0, false);
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570 static inline int mlxsw_cmd_config_profile_set(struct mlxsw_core *mlxsw_core,
0571 char *in_mbox)
0572 {
0573 return mlxsw_cmd_exec_in(mlxsw_core, MLXSW_CMD_OPCODE_CONFIG_PROFILE,
0574 1, 0, in_mbox, MLXSW_CMD_MBOX_SIZE);
0575 }
0576
0577
0578
0579
0580
0581 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_vepa_channels, 0x0C, 0, 1);
0582
0583
0584
0585
0586
0587 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_lag, 0x0C, 1, 1);
0588
0589
0590
0591
0592
0593 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_port_per_lag, 0x0C, 2, 1);
0594
0595
0596
0597
0598
0599 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_mid, 0x0C, 3, 1);
0600
0601
0602
0603
0604
0605 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_pgt, 0x0C, 4, 1);
0606
0607
0608
0609
0610
0611 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_system_port, 0x0C, 5, 1);
0612
0613
0614
0615
0616
0617 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_vlan_groups, 0x0C, 6, 1);
0618
0619
0620
0621
0622
0623 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_regions, 0x0C, 7, 1);
0624
0625
0626
0627
0628
0629 MLXSW_ITEM32(cmd_mbox, config_profile, set_flood_mode, 0x0C, 8, 1);
0630
0631
0632
0633
0634
0635 MLXSW_ITEM32(cmd_mbox, config_profile, set_flood_tables, 0x0C, 9, 1);
0636
0637
0638
0639
0640
0641 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_ib_mc, 0x0C, 12, 1);
0642
0643
0644
0645
0646
0647 MLXSW_ITEM32(cmd_mbox, config_profile, set_max_pkey, 0x0C, 13, 1);
0648
0649
0650
0651
0652
0653 MLXSW_ITEM32(cmd_mbox, config_profile,
0654 set_adaptive_routing_group_cap, 0x0C, 14, 1);
0655
0656
0657
0658
0659
0660 MLXSW_ITEM32(cmd_mbox, config_profile, set_ar_sec, 0x0C, 15, 1);
0661
0662
0663
0664
0665
0666 MLXSW_ITEM32(cmd_mbox, config_profile, set_ubridge, 0x0C, 22, 1);
0667
0668
0669
0670
0671
0672 MLXSW_ITEM32(cmd_mbox, config_profile, set_kvd_linear_size, 0x0C, 24, 1);
0673
0674
0675
0676
0677
0678 MLXSW_ITEM32(cmd_mbox, config_profile, set_kvd_hash_single_size, 0x0C, 25, 1);
0679
0680
0681
0682
0683
0684 MLXSW_ITEM32(cmd_mbox, config_profile, set_kvd_hash_double_size, 0x0C, 26, 1);
0685
0686
0687
0688
0689
0690 MLXSW_ITEM32(cmd_mbox, config_profile, set_cqe_version, 0x08, 0, 1);
0691
0692
0693
0694
0695
0696 MLXSW_ITEM32(cmd_mbox, config_profile, set_cqe_time_stamp_type, 0x08, 2, 1);
0697
0698
0699
0700
0701
0702 MLXSW_ITEM32(cmd_mbox, config_profile, max_vepa_channels, 0x10, 0, 8);
0703
0704
0705
0706
0707 MLXSW_ITEM32(cmd_mbox, config_profile, max_lag, 0x14, 0, 16);
0708
0709
0710
0711
0712 MLXSW_ITEM32(cmd_mbox, config_profile, max_port_per_lag, 0x18, 0, 16);
0713
0714
0715
0716
0717
0718 MLXSW_ITEM32(cmd_mbox, config_profile, max_mid, 0x1C, 0, 16);
0719
0720
0721
0722
0723
0724 MLXSW_ITEM32(cmd_mbox, config_profile, max_pgt, 0x20, 0, 16);
0725
0726
0727
0728
0729 MLXSW_ITEM32(cmd_mbox, config_profile, max_system_port, 0x24, 0, 16);
0730
0731
0732
0733
0734 MLXSW_ITEM32(cmd_mbox, config_profile, max_vlan_groups, 0x28, 0, 12);
0735
0736
0737
0738
0739 MLXSW_ITEM32(cmd_mbox, config_profile, max_regions, 0x2C, 0, 16);
0740
0741
0742
0743
0744
0745 MLXSW_ITEM32(cmd_mbox, config_profile, max_flood_tables, 0x30, 16, 4);
0746
0747
0748
0749
0750
0751
0752 MLXSW_ITEM32(cmd_mbox, config_profile, max_vid_flood_tables, 0x30, 8, 4);
0753
0754 enum mlxsw_cmd_mbox_config_profile_flood_mode {
0755
0756
0757
0758
0759
0760
0761
0762 MLXSW_CMD_MBOX_CONFIG_PROFILE_FLOOD_MODE_MIXED = 3,
0763
0764
0765
0766 MLXSW_CMD_MBOX_CONFIG_PROFILE_FLOOD_MODE_CONTROLLED = 4,
0767 };
0768
0769
0770
0771
0772 MLXSW_ITEM32(cmd_mbox, config_profile, flood_mode, 0x30, 0, 3);
0773
0774
0775
0776
0777 MLXSW_ITEM32(cmd_mbox, config_profile,
0778 max_fid_offset_flood_tables, 0x34, 24, 4);
0779
0780
0781
0782
0783 MLXSW_ITEM32(cmd_mbox, config_profile,
0784 fid_offset_flood_table_size, 0x34, 0, 16);
0785
0786
0787
0788
0789
0790
0791
0792 MLXSW_ITEM32(cmd_mbox, config_profile, max_fid_flood_tables, 0x38, 24, 4);
0793
0794
0795
0796
0797 MLXSW_ITEM32(cmd_mbox, config_profile, fid_flood_table_size, 0x38, 0, 16);
0798
0799
0800
0801
0802
0803 MLXSW_ITEM32(cmd_mbox, config_profile, max_ib_mc, 0x40, 0, 15);
0804
0805
0806
0807
0808 MLXSW_ITEM32(cmd_mbox, config_profile, max_pkey, 0x44, 0, 15);
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818 MLXSW_ITEM32(cmd_mbox, config_profile, ar_sec, 0x4C, 24, 2);
0819
0820
0821
0822
0823
0824
0825 MLXSW_ITEM32(cmd_mbox, config_profile, adaptive_routing_group_cap, 0x4C, 0, 16);
0826
0827
0828
0829
0830
0831 MLXSW_ITEM32(cmd_mbox, config_profile, arn, 0x50, 31, 1);
0832
0833
0834
0835
0836
0837
0838 MLXSW_ITEM32(cmd_mbox, config_profile, ubridge, 0x50, 4, 1);
0839
0840
0841
0842
0843
0844
0845 MLXSW_ITEM32(cmd_mbox, config_profile, kvd_linear_size, 0x54, 0, 24);
0846
0847
0848
0849
0850
0851
0852
0853
0854 MLXSW_ITEM32(cmd_mbox, config_profile, kvd_hash_single_size, 0x58, 0, 24);
0855
0856
0857
0858
0859
0860
0861
0862
0863 MLXSW_ITEM32(cmd_mbox, config_profile, kvd_hash_double_size, 0x5C, 0, 24);
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873 MLXSW_ITEM32_INDEXED(cmd_mbox, config_profile, swid_config_mask,
0874 0x60, 24, 8, 0x08, 0x00, false);
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884 MLXSW_ITEM32_INDEXED(cmd_mbox, config_profile, swid_config_type,
0885 0x60, 20, 4, 0x08, 0x00, false);
0886
0887
0888
0889
0890 MLXSW_ITEM32_INDEXED(cmd_mbox, config_profile, swid_config_properties,
0891 0x60, 0, 8, 0x08, 0x00, false);
0892
0893 enum mlxsw_cmd_mbox_config_profile_cqe_time_stamp_type {
0894
0895 MLXSW_CMD_MBOX_CONFIG_PROFILE_CQE_TIME_STAMP_TYPE_USEC,
0896
0897
0898
0899 MLXSW_CMD_MBOX_CONFIG_PROFILE_CQE_TIME_STAMP_TYPE_FRC,
0900
0901
0902
0903 MLXSW_CMD_MBOX_CONFIG_PROFILE_CQE_TIME_STAMP_TYPE_UTC,
0904 };
0905
0906
0907
0908
0909
0910
0911 MLXSW_ITEM32(cmd_mbox, config_profile, cqe_time_stamp_type, 0xB0, 8, 2);
0912
0913
0914
0915
0916
0917
0918
0919 MLXSW_ITEM32(cmd_mbox, config_profile, cqe_version, 0xB0, 0, 8);
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929 static inline int mlxsw_cmd_access_reg(struct mlxsw_core *mlxsw_core,
0930 bool reset_ok,
0931 char *in_mbox, char *out_mbox)
0932 {
0933 return mlxsw_cmd_exec(mlxsw_core, MLXSW_CMD_OPCODE_ACCESS_REG,
0934 0, 0, false, reset_ok,
0935 in_mbox, MLXSW_CMD_MBOX_SIZE,
0936 out_mbox, MLXSW_CMD_MBOX_SIZE);
0937 }
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949 static inline int __mlxsw_cmd_sw2hw_dq(struct mlxsw_core *mlxsw_core,
0950 char *in_mbox, u32 dq_number,
0951 u8 opcode_mod)
0952 {
0953 return mlxsw_cmd_exec_in(mlxsw_core, MLXSW_CMD_OPCODE_SW2HW_DQ,
0954 opcode_mod, dq_number,
0955 in_mbox, MLXSW_CMD_MBOX_SIZE);
0956 }
0957
0958 enum {
0959 MLXSW_CMD_OPCODE_MOD_SDQ = 0,
0960 MLXSW_CMD_OPCODE_MOD_RDQ = 1,
0961 };
0962
0963 static inline int mlxsw_cmd_sw2hw_sdq(struct mlxsw_core *mlxsw_core,
0964 char *in_mbox, u32 dq_number)
0965 {
0966 return __mlxsw_cmd_sw2hw_dq(mlxsw_core, in_mbox, dq_number,
0967 MLXSW_CMD_OPCODE_MOD_SDQ);
0968 }
0969
0970 static inline int mlxsw_cmd_sw2hw_rdq(struct mlxsw_core *mlxsw_core,
0971 char *in_mbox, u32 dq_number)
0972 {
0973 return __mlxsw_cmd_sw2hw_dq(mlxsw_core, in_mbox, dq_number,
0974 MLXSW_CMD_OPCODE_MOD_RDQ);
0975 }
0976
0977
0978
0979
0980 MLXSW_ITEM32(cmd_mbox, sw2hw_dq, cq, 0x00, 24, 8);
0981
0982 enum mlxsw_cmd_mbox_sw2hw_dq_sdq_lp {
0983 MLXSW_CMD_MBOX_SW2HW_DQ_SDQ_LP_WQE,
0984 MLXSW_CMD_MBOX_SW2HW_DQ_SDQ_LP_IGNORE_WQE,
0985 };
0986
0987
0988
0989
0990
0991
0992 MLXSW_ITEM32(cmd_mbox, sw2hw_dq, sdq_lp, 0x00, 23, 1);
0993
0994
0995
0996
0997
0998 MLXSW_ITEM32(cmd_mbox, sw2hw_dq, sdq_tclass, 0x00, 16, 6);
0999
1000
1001
1002
1003 MLXSW_ITEM32(cmd_mbox, sw2hw_dq, log2_dq_sz, 0x00, 0, 6);
1004
1005
1006
1007
1008 MLXSW_ITEM64_INDEXED(cmd_mbox, sw2hw_dq, pa, 0x10, 12, 52, 0x08, 0x00, true);
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020 static inline int __mlxsw_cmd_hw2sw_dq(struct mlxsw_core *mlxsw_core,
1021 u32 dq_number, u8 opcode_mod)
1022 {
1023 return mlxsw_cmd_exec_none(mlxsw_core, MLXSW_CMD_OPCODE_HW2SW_DQ,
1024 opcode_mod, dq_number);
1025 }
1026
1027 static inline int mlxsw_cmd_hw2sw_sdq(struct mlxsw_core *mlxsw_core,
1028 u32 dq_number)
1029 {
1030 return __mlxsw_cmd_hw2sw_dq(mlxsw_core, dq_number,
1031 MLXSW_CMD_OPCODE_MOD_SDQ);
1032 }
1033
1034 static inline int mlxsw_cmd_hw2sw_rdq(struct mlxsw_core *mlxsw_core,
1035 u32 dq_number)
1036 {
1037 return __mlxsw_cmd_hw2sw_dq(mlxsw_core, dq_number,
1038 MLXSW_CMD_OPCODE_MOD_RDQ);
1039 }
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055 static inline int __mlxsw_cmd_2err_dq(struct mlxsw_core *mlxsw_core,
1056 u32 dq_number, u8 opcode_mod)
1057 {
1058 return mlxsw_cmd_exec_none(mlxsw_core, MLXSW_CMD_OPCODE_2ERR_DQ,
1059 opcode_mod, dq_number);
1060 }
1061
1062 static inline int mlxsw_cmd_2err_sdq(struct mlxsw_core *mlxsw_core,
1063 u32 dq_number)
1064 {
1065 return __mlxsw_cmd_2err_dq(mlxsw_core, dq_number,
1066 MLXSW_CMD_OPCODE_MOD_SDQ);
1067 }
1068
1069 static inline int mlxsw_cmd_2err_rdq(struct mlxsw_core *mlxsw_core,
1070 u32 dq_number)
1071 {
1072 return __mlxsw_cmd_2err_dq(mlxsw_core, dq_number,
1073 MLXSW_CMD_OPCODE_MOD_RDQ);
1074 }
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086 static inline int __mlxsw_cmd_query_dq(struct mlxsw_core *mlxsw_core,
1087 char *out_mbox, u32 dq_number,
1088 u8 opcode_mod)
1089 {
1090 return mlxsw_cmd_exec_out(mlxsw_core, MLXSW_CMD_OPCODE_2ERR_DQ,
1091 opcode_mod, dq_number, false,
1092 out_mbox, MLXSW_CMD_MBOX_SIZE);
1093 }
1094
1095 static inline int mlxsw_cmd_query_sdq(struct mlxsw_core *mlxsw_core,
1096 char *out_mbox, u32 dq_number)
1097 {
1098 return __mlxsw_cmd_query_dq(mlxsw_core, out_mbox, dq_number,
1099 MLXSW_CMD_OPCODE_MOD_SDQ);
1100 }
1101
1102 static inline int mlxsw_cmd_query_rdq(struct mlxsw_core *mlxsw_core,
1103 char *out_mbox, u32 dq_number)
1104 {
1105 return __mlxsw_cmd_query_dq(mlxsw_core, out_mbox, dq_number,
1106 MLXSW_CMD_OPCODE_MOD_RDQ);
1107 }
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119 static inline int mlxsw_cmd_sw2hw_cq(struct mlxsw_core *mlxsw_core,
1120 char *in_mbox, u32 cq_number)
1121 {
1122 return mlxsw_cmd_exec_in(mlxsw_core, MLXSW_CMD_OPCODE_SW2HW_CQ,
1123 0, cq_number, in_mbox, MLXSW_CMD_MBOX_SIZE);
1124 }
1125
1126 enum mlxsw_cmd_mbox_sw2hw_cq_cqe_ver {
1127 MLXSW_CMD_MBOX_SW2HW_CQ_CQE_VER_1,
1128 MLXSW_CMD_MBOX_SW2HW_CQ_CQE_VER_2,
1129 };
1130
1131
1132
1133
1134 MLXSW_ITEM32(cmd_mbox, sw2hw_cq, cqe_ver, 0x00, 28, 4);
1135
1136
1137
1138
1139 MLXSW_ITEM32(cmd_mbox, sw2hw_cq, c_eqn, 0x00, 24, 1);
1140
1141
1142
1143
1144
1145
1146 MLXSW_ITEM32(cmd_mbox, sw2hw_cq, st, 0x00, 8, 1);
1147
1148
1149
1150
1151 MLXSW_ITEM32(cmd_mbox, sw2hw_cq, log_cq_size, 0x00, 0, 4);
1152
1153
1154
1155
1156
1157
1158 MLXSW_ITEM32(cmd_mbox, sw2hw_cq, producer_counter, 0x04, 0, 16);
1159
1160
1161
1162
1163 MLXSW_ITEM64_INDEXED(cmd_mbox, sw2hw_cq, pa, 0x10, 11, 53, 0x08, 0x00, true);
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173 static inline int mlxsw_cmd_hw2sw_cq(struct mlxsw_core *mlxsw_core,
1174 u32 cq_number)
1175 {
1176 return mlxsw_cmd_exec_none(mlxsw_core, MLXSW_CMD_OPCODE_HW2SW_CQ,
1177 0, cq_number);
1178 }
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192 static inline int mlxsw_cmd_query_cq(struct mlxsw_core *mlxsw_core,
1193 char *out_mbox, u32 cq_number)
1194 {
1195 return mlxsw_cmd_exec_out(mlxsw_core, MLXSW_CMD_OPCODE_QUERY_CQ,
1196 0, cq_number, false,
1197 out_mbox, MLXSW_CMD_MBOX_SIZE);
1198 }
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210 static inline int mlxsw_cmd_sw2hw_eq(struct mlxsw_core *mlxsw_core,
1211 char *in_mbox, u32 eq_number)
1212 {
1213 return mlxsw_cmd_exec_in(mlxsw_core, MLXSW_CMD_OPCODE_SW2HW_EQ,
1214 0, eq_number, in_mbox, MLXSW_CMD_MBOX_SIZE);
1215 }
1216
1217
1218
1219
1220
1221 MLXSW_ITEM32(cmd_mbox, sw2hw_eq, int_msix, 0x00, 24, 1);
1222
1223
1224
1225
1226
1227
1228
1229
1230 MLXSW_ITEM32(cmd_mbox, sw2hw_eq, st, 0x00, 8, 2);
1231
1232
1233
1234
1235 MLXSW_ITEM32(cmd_mbox, sw2hw_eq, log_eq_size, 0x00, 0, 4);
1236
1237
1238
1239
1240
1241
1242 MLXSW_ITEM32(cmd_mbox, sw2hw_eq, producer_counter, 0x04, 0, 16);
1243
1244
1245
1246
1247 MLXSW_ITEM64_INDEXED(cmd_mbox, sw2hw_eq, pa, 0x10, 11, 53, 0x08, 0x00, true);
1248
1249
1250
1251
1252
1253
1254
1255 static inline int mlxsw_cmd_hw2sw_eq(struct mlxsw_core *mlxsw_core,
1256 u32 eq_number)
1257 {
1258 return mlxsw_cmd_exec_none(mlxsw_core, MLXSW_CMD_OPCODE_HW2SW_EQ,
1259 0, eq_number);
1260 }
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270 static inline int mlxsw_cmd_query_eq(struct mlxsw_core *mlxsw_core,
1271 char *out_mbox, u32 eq_number)
1272 {
1273 return mlxsw_cmd_exec_out(mlxsw_core, MLXSW_CMD_OPCODE_QUERY_EQ,
1274 0, eq_number, false,
1275 out_mbox, MLXSW_CMD_MBOX_SIZE);
1276 }
1277
1278 #endif