Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'mlx5-updates-2023-11-13' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux

mlx5-updates-2023-11-13

1) Cleanup patches, leftovers from previous cycle

2) Allow sync reset flow when BF MGT interface device is present

3) Trivial ptp refactorings and improvements

4) Add local loopback counter to vport rep stats

Signed-off-by: David S. Miller <davem@davemloft.net>

+139 -77
+4 -1
drivers/net/ethernet/mellanox/mlx5/core/diag/crdump.c
··· 55 55 ret = mlx5_vsc_sem_set_space(dev, MLX5_SEMAPHORE_SW_RESET, 56 56 MLX5_VSC_LOCK); 57 57 if (ret) { 58 - mlx5_core_warn(dev, "Failed to lock SW reset semaphore\n"); 58 + if (ret == -EBUSY) 59 + mlx5_core_info(dev, "SW reset semaphore is already in use\n"); 60 + else 61 + mlx5_core_warn(dev, "Failed to lock SW reset semaphore\n"); 59 62 goto unlock_gw; 60 63 } 61 64
+14
drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c
··· 147 147 } 148 148 } 149 149 150 + static void mlx5e_tc_stats_matchall(struct mlx5e_priv *priv, 151 + struct tc_cls_matchall_offload *ma) 152 + { 153 + struct mlx5e_rep_priv *rpriv = priv->ppriv; 154 + u64 dbytes; 155 + u64 dpkts; 156 + 157 + dpkts = priv->stats.rep_stats.vport_rx_packets - rpriv->prev_vf_vport_stats.rx_packets; 158 + dbytes = priv->stats.rep_stats.vport_rx_bytes - rpriv->prev_vf_vport_stats.rx_bytes; 159 + mlx5e_stats_copy_rep_stats(&rpriv->prev_vf_vport_stats, &priv->stats.rep_stats); 160 + flow_stats_update(&ma->stats, dbytes, dpkts, 0, jiffies, 161 + FLOW_ACTION_HW_STATS_DELAYED); 162 + } 163 + 150 164 static 151 165 int mlx5e_rep_setup_tc_cls_matchall(struct mlx5e_priv *priv, 152 166 struct tc_cls_matchall_offload *ma)
+2 -1
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/pedit.c
··· 48 48 struct pedit_headers_action *hdrs, 49 49 struct netlink_ext_ack *extack) 50 50 { 51 - u8 cmd = (act->id == FLOW_ACTION_MANGLE) ? 0 : 1; 51 + u8 cmd = (act->id == FLOW_ACTION_MANGLE) ? TCA_PEDIT_KEY_EX_CMD_SET : 52 + TCA_PEDIT_KEY_EX_CMD_ADD; 52 53 u8 htype = act->mangle.htype; 53 54 int err = -EOPNOTSUPP; 54 55 u32 mask, val, offset;
-1
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
··· 5244 5244 5245 5245 netdev->gso_partial_features |= NETIF_F_GSO_UDP_L4; 5246 5246 netdev->hw_features |= NETIF_F_GSO_UDP_L4; 5247 - netdev->features |= NETIF_F_GSO_UDP_L4; 5248 5247 5249 5248 mlx5_query_port_fcs(mdev, &fcs_supported, &fcs_enabled); 5250 5249
+25 -1
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
··· 112 112 tx_vport_rdma_multicast_bytes) }, 113 113 }; 114 114 115 + static const struct counter_desc vport_rep_loopback_stats_desc[] = { 116 + { MLX5E_DECLARE_STAT(struct mlx5e_rep_stats, 117 + vport_loopback_packets) }, 118 + { MLX5E_DECLARE_STAT(struct mlx5e_rep_stats, 119 + vport_loopback_bytes) }, 120 + }; 121 + 115 122 #define NUM_VPORT_REP_SW_COUNTERS ARRAY_SIZE(sw_rep_stats_desc) 116 123 #define NUM_VPORT_REP_HW_COUNTERS ARRAY_SIZE(vport_rep_stats_desc) 124 + #define NUM_VPORT_REP_LOOPBACK_COUNTERS(dev) \ 125 + (MLX5_CAP_GEN(dev, vport_counter_local_loopback) ? \ 126 + ARRAY_SIZE(vport_rep_loopback_stats_desc) : 0) 117 127 118 128 static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(sw_rep) 119 129 { ··· 167 157 168 158 static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vport_rep) 169 159 { 170 - return NUM_VPORT_REP_HW_COUNTERS; 160 + return NUM_VPORT_REP_HW_COUNTERS + 161 + NUM_VPORT_REP_LOOPBACK_COUNTERS(priv->mdev); 171 162 } 172 163 173 164 static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport_rep) ··· 177 166 178 167 for (i = 0; i < NUM_VPORT_REP_HW_COUNTERS; i++) 179 168 strcpy(data + (idx++) * ETH_GSTRING_LEN, vport_rep_stats_desc[i].format); 169 + for (i = 0; i < NUM_VPORT_REP_LOOPBACK_COUNTERS(priv->mdev); i++) 170 + strcpy(data + (idx++) * ETH_GSTRING_LEN, 171 + vport_rep_loopback_stats_desc[i].format); 180 172 return idx; 181 173 } 182 174 ··· 190 176 for (i = 0; i < NUM_VPORT_REP_HW_COUNTERS; i++) 191 177 data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.rep_stats, 192 178 vport_rep_stats_desc, i); 179 + for (i = 0; i < NUM_VPORT_REP_LOOPBACK_COUNTERS(priv->mdev); i++) 180 + data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.rep_stats, 181 + vport_rep_loopback_stats_desc, i); 193 182 return idx; 194 183 } 195 184 ··· 263 246 MLX5_GET_CTR(out, transmitted_ib_multicast.octets); 264 247 rep_stats->tx_vport_rdma_multicast_bytes = 265 248 MLX5_GET_CTR(out, received_ib_multicast.octets); 249 + 250 + if (MLX5_CAP_GEN(priv->mdev, vport_counter_local_loopback)) { 251 + rep_stats->vport_loopback_packets = 252 + MLX5_GET_CTR(out, local_loopback.packets); 253 + rep_stats->vport_loopback_bytes = 254 + MLX5_GET_CTR(out, local_loopback.octets); 255 + } 266 256 267 257 out: 268 258 kvfree(out);
+2
drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
··· 476 476 u64 tx_vport_rdma_multicast_packets; 477 477 u64 rx_vport_rdma_multicast_bytes; 478 478 u64 tx_vport_rdma_multicast_bytes; 479 + u64 vport_loopback_packets; 480 + u64 vport_loopback_bytes; 479 481 }; 480 482 481 483 struct mlx5e_stats {
+4 -20
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
··· 3206 3206 headers_c = mlx5e_get_match_headers_criteria(*action_flags, &parse_attr->spec); 3207 3207 headers_v = mlx5e_get_match_headers_value(*action_flags, &parse_attr->spec); 3208 3208 3209 - set_masks = &hdrs[0].masks; 3210 - add_masks = &hdrs[1].masks; 3211 - set_vals = &hdrs[0].vals; 3212 - add_vals = &hdrs[1].vals; 3209 + set_masks = &hdrs[TCA_PEDIT_KEY_EX_CMD_SET].masks; 3210 + add_masks = &hdrs[TCA_PEDIT_KEY_EX_CMD_ADD].masks; 3211 + set_vals = &hdrs[TCA_PEDIT_KEY_EX_CMD_SET].vals; 3212 + add_vals = &hdrs[TCA_PEDIT_KEY_EX_CMD_ADD].vals; 3213 3213 3214 3214 for (i = 0; i < ARRAY_SIZE(fields); i++) { 3215 3215 bool skip; ··· 5009 5009 struct netlink_ext_ack *extack = ma->common.extack; 5010 5010 5011 5011 return apply_police_params(priv, 0, extack); 5012 - } 5013 - 5014 - void mlx5e_tc_stats_matchall(struct mlx5e_priv *priv, 5015 - struct tc_cls_matchall_offload *ma) 5016 - { 5017 - struct mlx5e_rep_priv *rpriv = priv->ppriv; 5018 - struct rtnl_link_stats64 cur_stats; 5019 - u64 dbytes; 5020 - u64 dpkts; 5021 - 5022 - mlx5e_stats_copy_rep_stats(&cur_stats, &priv->stats.rep_stats); 5023 - dpkts = cur_stats.rx_packets - rpriv->prev_vf_vport_stats.rx_packets; 5024 - dbytes = cur_stats.rx_bytes - rpriv->prev_vf_vport_stats.rx_bytes; 5025 - rpriv->prev_vf_vport_stats = cur_stats; 5026 - flow_stats_update(&ma->stats, dbytes, dpkts, 0, jiffies, 5027 - FLOW_ACTION_HW_STATS_DELAYED); 5028 5012 } 5029 5013 5030 5014 static void mlx5e_tc_hairpin_update_dead_peer(struct mlx5e_priv *priv,
-2
drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
··· 203 203 struct tc_cls_matchall_offload *f); 204 204 int mlx5e_tc_delete_matchall(struct mlx5e_priv *priv, 205 205 struct tc_cls_matchall_offload *f); 206 - void mlx5e_tc_stats_matchall(struct mlx5e_priv *priv, 207 - struct tc_cls_matchall_offload *ma); 208 206 209 207 struct mlx5e_encap_entry; 210 208 void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
··· 181 181 182 182 struct mlx5_flow_handle { 183 183 int num_rules; 184 - struct mlx5_flow_rule *rule[]; 184 + struct mlx5_flow_rule *rule[] __counted_by(num_rules); 185 185 }; 186 186 187 187 /* Type of children is mlx5_flow_group */
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c
··· 539 539 u32 base_id; 540 540 int bulk_len; 541 541 unsigned long *bitmask; 542 - struct mlx5_fc fcs[]; 542 + struct mlx5_fc fcs[] __counted_by(bulk_len); 543 543 }; 544 544 545 545 static void mlx5_fc_init(struct mlx5_fc *counter, struct mlx5_fc_bulk *bulk,
+28 -4
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
··· 325 325 mlx5_core_err(dev, "Failed to reload FW tracer\n"); 326 326 } 327 327 328 + static const struct pci_device_id mgt_ifc_device_ids[] = { 329 + { PCI_VDEVICE(MELLANOX, 0xc2d2) }, /* BlueField1 MGT interface device ID */ 330 + { PCI_VDEVICE(MELLANOX, 0xc2d3) }, /* BlueField2 MGT interface device ID */ 331 + { PCI_VDEVICE(MELLANOX, 0xc2d4) }, /* BlueField3-Lx MGT interface device ID */ 332 + { PCI_VDEVICE(MELLANOX, 0xc2d5) }, /* BlueField3 MGT interface device ID */ 333 + { PCI_VDEVICE(MELLANOX, 0xc2d6) }, /* BlueField4 MGT interface device ID */ 334 + }; 335 + 336 + static bool mlx5_is_mgt_ifc_pci_device(struct mlx5_core_dev *dev, u16 dev_id) 337 + { 338 + int i; 339 + 340 + for (i = 0; i < ARRAY_SIZE(mgt_ifc_device_ids); ++i) 341 + if (mgt_ifc_device_ids[i].device == dev_id) 342 + return true; 343 + 344 + return false; 345 + } 346 + 328 347 static int mlx5_check_dev_ids(struct mlx5_core_dev *dev, u16 dev_id) 329 348 { 330 349 struct pci_bus *bridge_bus = dev->pdev->bus; ··· 358 339 err = pci_read_config_word(sdev, PCI_DEVICE_ID, &sdev_id); 359 340 if (err) 360 341 return pcibios_err_to_errno(err); 361 - if (sdev_id != dev_id) { 362 - mlx5_core_warn(dev, "unrecognized dev_id (0x%x)\n", sdev_id); 363 - return -EPERM; 364 - } 342 + 343 + if (sdev_id == dev_id) 344 + continue; 345 + 346 + if (mlx5_is_mgt_ifc_pci_device(dev, sdev_id)) 347 + continue; 348 + 349 + mlx5_core_warn(dev, "unrecognized dev_id (0x%x)\n", sdev_id); 350 + return -EPERM; 365 351 } 366 352 return 0; 367 353 }
+51 -27
drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c
··· 266 266 { 267 267 u32 in[MLX5_ST_SZ_DW(mtutc_reg)] = {}; 268 268 269 - if (!mlx5_modify_mtutc_allowed(mdev)) 270 - return 0; 271 - 272 269 if (ts->tv_sec < 0 || ts->tv_sec > U32_MAX || 273 270 ts->tv_nsec < 0 || ts->tv_nsec > NSEC_PER_SEC) 274 271 return -EINVAL; ··· 283 286 struct mlx5_timer *timer = &clock->timer; 284 287 struct mlx5_core_dev *mdev; 285 288 unsigned long flags; 286 - int err; 287 289 288 290 mdev = container_of(clock, struct mlx5_core_dev, clock); 289 - err = mlx5_ptp_settime_real_time(mdev, ts); 290 - if (err) 291 - return err; 291 + 292 + if (mlx5_modify_mtutc_allowed(mdev)) { 293 + int err = mlx5_ptp_settime_real_time(mdev, ts); 294 + 295 + if (err) 296 + return err; 297 + } 292 298 293 299 write_seqlock_irqsave(&clock->lock, flags); 294 300 timecounter_init(&timer->tc, &timer->cycles, timespec64_to_ns(ts)); ··· 341 341 { 342 342 u32 in[MLX5_ST_SZ_DW(mtutc_reg)] = {}; 343 343 344 - if (!mlx5_modify_mtutc_allowed(mdev)) 345 - return 0; 346 - 347 344 /* HW time adjustment range is checked. If out of range, settime instead */ 348 345 if (!mlx5_is_mtutc_time_adj_cap(mdev, delta)) { 349 346 struct timespec64 ts; ··· 364 367 struct mlx5_timer *timer = &clock->timer; 365 368 struct mlx5_core_dev *mdev; 366 369 unsigned long flags; 367 - int err; 368 370 369 371 mdev = container_of(clock, struct mlx5_core_dev, clock); 370 372 371 - err = mlx5_ptp_adjtime_real_time(mdev, delta); 372 - if (err) 373 - return err; 373 + if (mlx5_modify_mtutc_allowed(mdev)) { 374 + int err = mlx5_ptp_adjtime_real_time(mdev, delta); 375 + 376 + if (err) 377 + return err; 378 + } 379 + 374 380 write_seqlock_irqsave(&clock->lock, flags); 375 381 timecounter_adjtime(&timer->tc, delta); 376 382 mlx5_update_clock_info_page(mdev); ··· 396 396 { 397 397 u32 in[MLX5_ST_SZ_DW(mtutc_reg)] = {}; 398 398 399 - if (!mlx5_modify_mtutc_allowed(mdev)) 400 - return 0; 401 - 402 399 MLX5_SET(mtutc_reg, in, operation, MLX5_MTUTC_OPERATION_ADJUST_FREQ_UTC); 403 400 404 - if (MLX5_CAP_MCAM_FEATURE(mdev, mtutc_freq_adj_units)) { 401 + if (MLX5_CAP_MCAM_FEATURE(mdev, mtutc_freq_adj_units) && 402 + scaled_ppm <= S32_MAX && scaled_ppm >= S32_MIN) { 403 + /* HW scaled_ppm support on mlx5 devices only supports a 32-bit value */ 405 404 MLX5_SET(mtutc_reg, in, freq_adj_units, 406 405 MLX5_MTUTC_FREQ_ADJ_UNITS_SCALED_PPM); 407 - MLX5_SET(mtutc_reg, in, freq_adjustment, scaled_ppm); 406 + MLX5_SET(mtutc_reg, in, freq_adjustment, (s32)scaled_ppm); 408 407 } else { 409 408 MLX5_SET(mtutc_reg, in, freq_adj_units, MLX5_MTUTC_FREQ_ADJ_UNITS_PPB); 410 409 MLX5_SET(mtutc_reg, in, freq_adjustment, scaled_ppm_to_ppb(scaled_ppm)); ··· 419 420 struct mlx5_core_dev *mdev; 420 421 unsigned long flags; 421 422 u32 mult; 422 - int err; 423 423 424 424 mdev = container_of(clock, struct mlx5_core_dev, clock); 425 425 426 - err = mlx5_ptp_freq_adj_real_time(mdev, scaled_ppm); 427 - if (err) 428 - return err; 426 + if (mlx5_modify_mtutc_allowed(mdev)) { 427 + int err = mlx5_ptp_freq_adj_real_time(mdev, scaled_ppm); 428 + 429 + if (err) 430 + return err; 431 + } 429 432 430 433 mult = (u32)adjust_by_scaled_ppm(timer->nominal_c_mult, scaled_ppm); 431 434 ··· 1005 1004 info->frac = timer->tc.frac; 1006 1005 } 1007 1006 1007 + static void mlx5_init_timer_max_freq_adjustment(struct mlx5_core_dev *mdev) 1008 + { 1009 + struct mlx5_clock *clock = &mdev->clock; 1010 + u32 out[MLX5_ST_SZ_DW(mtutc_reg)] = {}; 1011 + u32 in[MLX5_ST_SZ_DW(mtutc_reg)] = {}; 1012 + u8 log_max_freq_adjustment = 0; 1013 + int err; 1014 + 1015 + err = mlx5_core_access_reg(mdev, in, sizeof(in), out, sizeof(out), 1016 + MLX5_REG_MTUTC, 0, 0); 1017 + if (!err) 1018 + log_max_freq_adjustment = 1019 + MLX5_GET(mtutc_reg, out, log_max_freq_adjustment); 1020 + 1021 + if (log_max_freq_adjustment) 1022 + clock->ptp_info.max_adj = 1023 + min(S32_MAX, 1 << log_max_freq_adjustment); 1024 + } 1025 + 1008 1026 static void mlx5_init_timer_clock(struct mlx5_core_dev *mdev) 1009 1027 { 1010 1028 struct mlx5_clock *clock = &mdev->clock; 1011 1029 1030 + /* Configure the PHC */ 1031 + clock->ptp_info = mlx5_ptp_clock_info; 1032 + 1033 + if (MLX5_CAP_MCAM_REG(mdev, mtutc)) 1034 + mlx5_init_timer_max_freq_adjustment(mdev); 1035 + 1012 1036 mlx5_timecounter_init(mdev); 1013 1037 mlx5_init_clock_info(mdev); 1014 1038 mlx5_init_overflow_period(clock); 1015 - clock->ptp_info = mlx5_ptp_clock_info; 1016 1039 1017 1040 if (mlx5_real_time_mode(mdev)) { 1018 1041 struct timespec64 ts; ··· 1067 1042 } 1068 1043 1069 1044 seqlock_init(&clock->lock); 1070 - mlx5_init_timer_clock(mdev); 1071 1045 INIT_WORK(&clock->pps_info.out_work, mlx5_pps_out); 1072 1046 1073 - /* Configure the PHC */ 1074 - clock->ptp_info = mlx5_ptp_clock_info; 1047 + /* Initialize the device clock */ 1048 + mlx5_init_timer_clock(mdev); 1075 1049 1076 1050 /* Initialize 1PPS data structures */ 1077 1051 mlx5_init_pps(mdev);
+3 -17
drivers/net/ethernet/mellanox/mlx5/core/main.c
··· 219 219 int driver_ver_sz = MLX5_FLD_SZ_BYTES(set_driver_version_in, 220 220 driver_version); 221 221 u8 in[MLX5_ST_SZ_BYTES(set_driver_version_in)] = {}; 222 - int remaining_size = driver_ver_sz; 223 222 char *string; 224 223 225 224 if (!MLX5_CAP_GEN(dev, driver_version)) ··· 226 227 227 228 string = MLX5_ADDR_OF(set_driver_version_in, in, driver_version); 228 229 229 - strncpy(string, "Linux", remaining_size); 230 - 231 - remaining_size = max_t(int, 0, driver_ver_sz - strlen(string)); 232 - strncat(string, ",", remaining_size); 233 - 234 - remaining_size = max_t(int, 0, driver_ver_sz - strlen(string)); 235 - strncat(string, KBUILD_MODNAME, remaining_size); 236 - 237 - remaining_size = max_t(int, 0, driver_ver_sz - strlen(string)); 238 - strncat(string, ",", remaining_size); 239 - 240 - remaining_size = max_t(int, 0, driver_ver_sz - strlen(string)); 241 - 242 - snprintf(string + strlen(string), remaining_size, "%u.%u.%u", 243 - LINUX_VERSION_MAJOR, LINUX_VERSION_PATCHLEVEL, 244 - LINUX_VERSION_SUBLEVEL); 230 + snprintf(string, driver_ver_sz, "Linux,%s,%u.%u.%u", 231 + KBUILD_MODNAME, LINUX_VERSION_MAJOR, 232 + LINUX_VERSION_PATCHLEVEL, LINUX_VERSION_SUBLEVEL); 245 233 246 234 /*Send the command*/ 247 235 MLX5_SET(set_driver_version_in, in, opcode,
+4 -1
include/linux/mlx5/mlx5_ifc.h
··· 10103 10103 struct mlx5_ifc_mtutc_reg_bits { 10104 10104 u8 reserved_at_0[0x5]; 10105 10105 u8 freq_adj_units[0x3]; 10106 - u8 reserved_at_8[0x14]; 10106 + u8 reserved_at_8[0x3]; 10107 + u8 log_max_freq_adjustment[0x5]; 10108 + 10109 + u8 reserved_at_10[0xc]; 10107 10110 u8 operation[0x4]; 10108 10111 10109 10112 u8 freq_adjustment[0x20];