Commit c9dfb92d authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files
Tariq Toukan says:

====================
mlx5-next updates 2025-11-13

The following pull-request contains common mlx5 updates

* 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux:
  net/mlx5: Expose definition for 1600Gbps link mode
  net/mlx5: fs, set non default device per namespace
  net/mlx5: fs, Add other_eswitch support for steering tables
  net/mlx5: Add OTHER_ESWITCH HW capabilities
  net/mlx5: Add direct ST mode support for RDMA
  PCI/TPH: Expose pcie_tph_get_st_table_loc()
  {rdma,net}/mlx5: Query vports mac address from device
====================

Link: https://patch.msgid.link/1763027252-1168760-1-git-send-email-tariqt@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents c7b6dd2a 5422318e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -842,7 +842,7 @@ static int mlx5_query_node_guid(struct mlx5_ib_dev *dev,
		break;

	case MLX5_VPORT_ACCESS_METHOD_NIC:
		err = mlx5_query_nic_vport_node_guid(dev->mdev, &tmp);
		err = mlx5_query_nic_vport_node_guid(dev->mdev, 0, false, &tmp);
		break;

	default:
+7 −13
Original line number Diff line number Diff line
@@ -875,13 +875,10 @@ static int esw_vport_setup(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
				      vport_num, 1,
				      vport->info.link_state);

	/* Host PF has its own mac/guid. */
	if (vport_num) {
		mlx5_modify_nic_vport_mac_address(esw->dev, vport_num,
	mlx5_query_nic_vport_mac_address(esw->dev, vport_num, true,
					 vport->info.mac);
		mlx5_modify_nic_vport_node_guid(esw->dev, vport_num,
						vport->info.node_guid);
	}
	mlx5_query_nic_vport_node_guid(esw->dev, vport_num, true,
				       &vport->info.node_guid);

	flags = (vport->info.vlan || vport->info.qos) ?
		SET_VLAN_STRIP | SET_VLAN_INSERT : 0;
@@ -947,12 +944,6 @@ int mlx5_esw_vport_enable(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
			goto err_vhca_mapping;
	}

	/* External controller host PF has factory programmed MAC.
	 * Read it from the device.
	 */
	if (mlx5_core_is_ecpf(esw->dev) && vport_num == MLX5_VPORT_PF)
		mlx5_query_nic_vport_mac_address(esw->dev, vport_num, true, vport->info.mac);

	esw_vport_change_handle_locked(vport);

	esw->enabled_vports++;
@@ -2235,6 +2226,9 @@ int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw,
	ivi->vf = vport - 1;

	mutex_lock(&esw->state_lock);

	mlx5_query_nic_vport_mac_address(esw->dev, vport, true,
					 evport->info.mac);
	ether_addr_copy(ivi->mac, evport->info.mac);
	ivi->linkstate = evport->info.link_state;
	ivi->vlan = evport->info.vlan;
+3 −0
Original line number Diff line number Diff line
@@ -4491,6 +4491,9 @@ int mlx5_devlink_port_fn_hw_addr_get(struct devlink_port *port,
	struct mlx5_vport *vport = mlx5_devlink_port_vport_get(port);

	mutex_lock(&esw->state_lock);

	mlx5_query_nic_vport_mac_address(esw->dev, vport->vport, true,
					 vport->info.mac);
	ether_addr_copy(hw_addr, vport->info.mac);
	*hw_addr_len = ETH_ALEN;
	mutex_unlock(&esw->state_lock);
+31 −0
Original line number Diff line number Diff line
@@ -239,6 +239,10 @@ static int mlx5_cmd_update_root_ft(struct mlx5_flow_root_namespace *ns,
	MLX5_SET(set_flow_table_root_in, in, vport_number, ft->vport);
	MLX5_SET(set_flow_table_root_in, in, other_vport,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_VPORT));
	MLX5_SET(set_flow_table_root_in, in, eswitch_owner_vhca_id,
		 ft->esw_owner_vhca_id);
	MLX5_SET(set_flow_table_root_in, in, other_eswitch,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_ESWITCH));

	err = mlx5_cmd_exec_in(dev, set_flow_table_root, in);
	if (!err &&
@@ -302,6 +306,10 @@ static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
	MLX5_SET(create_flow_table_in, in, vport_number, ft->vport);
	MLX5_SET(create_flow_table_in, in, other_vport,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_VPORT));
	MLX5_SET(create_flow_table_in, in, eswitch_owner_vhca_id,
		 ft->esw_owner_vhca_id);
	MLX5_SET(create_flow_table_in, in, other_eswitch,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_ESWITCH));

	MLX5_SET(create_flow_table_in, in, flow_table_context.decap_en,
		 en_decap);
@@ -360,6 +368,10 @@ static int mlx5_cmd_destroy_flow_table(struct mlx5_flow_root_namespace *ns,
	MLX5_SET(destroy_flow_table_in, in, vport_number, ft->vport);
	MLX5_SET(destroy_flow_table_in, in, other_vport,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_VPORT));
	MLX5_SET(destroy_flow_table_in, in, eswitch_owner_vhca_id,
		 ft->esw_owner_vhca_id);
	MLX5_SET(destroy_flow_table_in, in, other_eswitch,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_ESWITCH));

	err = mlx5_cmd_exec_in(dev, destroy_flow_table, in);
	if (!err)
@@ -394,6 +406,10 @@ static int mlx5_cmd_modify_flow_table(struct mlx5_flow_root_namespace *ns,
		MLX5_SET(modify_flow_table_in, in, vport_number, ft->vport);
		MLX5_SET(modify_flow_table_in, in, other_vport,
			 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_VPORT));
		MLX5_SET(modify_flow_table_in, in, eswitch_owner_vhca_id,
			 ft->esw_owner_vhca_id);
		MLX5_SET(modify_flow_table_in, in, other_eswitch,
			 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_ESWITCH));
		MLX5_SET(modify_flow_table_in, in, modify_field_select,
			 MLX5_MODIFY_FLOW_TABLE_MISS_TABLE_ID);
		if (next_ft) {
@@ -429,6 +445,10 @@ static int mlx5_cmd_create_flow_group(struct mlx5_flow_root_namespace *ns,
	MLX5_SET(create_flow_group_in, in, vport_number, ft->vport);
	MLX5_SET(create_flow_group_in, in, other_vport,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_VPORT));
	MLX5_SET(create_flow_group_in, in, eswitch_owner_vhca_id,
		 ft->esw_owner_vhca_id);
	MLX5_SET(create_flow_group_in, in, other_eswitch,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_ESWITCH));
	err = mlx5_cmd_exec_inout(dev, create_flow_group, in, out);
	if (!err)
		fg->id = MLX5_GET(create_flow_group_out, out,
@@ -451,6 +471,10 @@ static int mlx5_cmd_destroy_flow_group(struct mlx5_flow_root_namespace *ns,
	MLX5_SET(destroy_flow_group_in, in, vport_number, ft->vport);
	MLX5_SET(destroy_flow_group_in, in, other_vport,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_VPORT));
	MLX5_SET(destroy_flow_group_in, in, eswitch_owner_vhca_id,
		 ft->esw_owner_vhca_id);
	MLX5_SET(destroy_flow_group_in, in, other_eswitch,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_ESWITCH));
	return mlx5_cmd_exec_in(dev, destroy_flow_group, in);
}

@@ -559,6 +583,9 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
	MLX5_SET(set_fte_in, in, vport_number, ft->vport);
	MLX5_SET(set_fte_in, in, other_vport,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_VPORT));
	MLX5_SET(set_fte_in, in, eswitch_owner_vhca_id, ft->esw_owner_vhca_id);
	MLX5_SET(set_fte_in, in, other_eswitch,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_ESWITCH));

	in_flow_context = MLX5_ADDR_OF(set_fte_in, in, flow_context);
	MLX5_SET(flow_context, in_flow_context, group_id, group_id);
@@ -788,6 +815,10 @@ static int mlx5_cmd_delete_fte(struct mlx5_flow_root_namespace *ns,
	MLX5_SET(delete_fte_in, in, vport_number, ft->vport);
	MLX5_SET(delete_fte_in, in, other_vport,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_VPORT));
	MLX5_SET(delete_fte_in, in, eswitch_owner_vhca_id,
		 ft->esw_owner_vhca_id);
	MLX5_SET(delete_fte_in, in, other_eswitch,
		 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_ESWITCH));

	return mlx5_cmd_exec_in(dev, delete_fte, in);
}
+64 −10
Original line number Diff line number Diff line
@@ -939,10 +939,10 @@ static struct mlx5_flow_group *alloc_insert_flow_group(struct mlx5_flow_table *f
	return fg;
}

static struct mlx5_flow_table *alloc_flow_table(int level, u16 vport,
static struct mlx5_flow_table *
alloc_flow_table(struct mlx5_flow_table_attr *ft_attr, u16 vport,
		 enum fs_flow_table_type table_type,
						enum fs_flow_table_op_mod op_mod,
						u32 flags)
		 enum fs_flow_table_op_mod op_mod)
{
	struct mlx5_flow_table *ft;
	int ret;
@@ -957,12 +957,13 @@ static struct mlx5_flow_table *alloc_flow_table(int level, u16 vport,
		return ERR_PTR(ret);
	}

	ft->level = level;
	ft->level = ft_attr->level;
	ft->node.type = FS_TYPE_FLOW_TABLE;
	ft->op_mod = op_mod;
	ft->type = table_type;
	ft->vport = vport;
	ft->flags = flags;
	ft->esw_owner_vhca_id = ft_attr->esw_owner_vhca_id;
	ft->flags = ft_attr->flags;
	INIT_LIST_HEAD(&ft->fwd_rules);
	mutex_init(&ft->lock);

@@ -1370,10 +1371,7 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa
	/* The level is related to the
	 * priority level range.
	 */
	ft = alloc_flow_table(ft_attr->level,
			      vport,
			      root->table_type,
			      op_mod, ft_attr->flags);
	ft = alloc_flow_table(ft_attr, vport, root->table_type, op_mod);
	if (IS_ERR(ft)) {
		err = PTR_ERR(ft);
		goto unlock_root;
@@ -3310,6 +3308,62 @@ init_rdma_transport_tx_root_ns_one(struct mlx5_flow_steering *steering,
	return ret;
}

static bool mlx5_fs_ns_is_empty(struct mlx5_flow_namespace *ns)
{
	struct fs_prio *iter_prio;

	fs_for_each_prio(iter_prio, ns) {
		if (iter_prio->num_ft)
			return false;
	}

	return true;
}

int mlx5_fs_set_root_dev(struct mlx5_core_dev *dev,
			 struct mlx5_core_dev *new_dev,
			 enum fs_flow_table_type table_type)
{
	struct mlx5_flow_root_namespace	**root;
	int total_vports;
	int i;

	switch (table_type) {
	case FS_FT_RDMA_TRANSPORT_TX:
		root = dev->priv.steering->rdma_transport_tx_root_ns;
		total_vports = dev->priv.steering->rdma_transport_tx_vports;
		break;
	case FS_FT_RDMA_TRANSPORT_RX:
		root = dev->priv.steering->rdma_transport_rx_root_ns;
		total_vports = dev->priv.steering->rdma_transport_rx_vports;
		break;
	default:
		WARN_ON_ONCE(true);
		return -EINVAL;
	}

	for (i = 0; i < total_vports; i++) {
		mutex_lock(&root[i]->chain_lock);
		if (!mlx5_fs_ns_is_empty(&root[i]->ns)) {
			mutex_unlock(&root[i]->chain_lock);
			goto err;
		}
		root[i]->dev = new_dev;
		mutex_unlock(&root[i]->chain_lock);
	}
	return 0;
err:
	while (i--) {
		mutex_lock(&root[i]->chain_lock);
		root[i]->dev = dev;
		mutex_unlock(&root[i]->chain_lock);
	}
	/* If you hit this error try destroying all flow tables and try again */
	mlx5_core_err(dev, "Failed to set root device for RDMA TRANSPORT\n");
	return -EINVAL;
}
EXPORT_SYMBOL(mlx5_fs_set_root_dev);

static int init_rdma_transport_rx_root_ns(struct mlx5_flow_steering *steering)
{
	struct mlx5_core_dev *dev = steering->dev;
Loading