struct mlx5_switch_info *switch_info = &spawn->info;
unsigned int p, f;
uint16_t id;
- uint16_t repr_id = mlx5_representor_id_encode(switch_info);
+ uint16_t repr_id = mlx5_representor_id_encode(switch_info,
+ eth_da->type);
switch (eth_da->type) {
case RTE_ETH_REPRESENTOR_SF:
- if (switch_info->name_type != MLX5_PHYS_PORT_NAME_TYPE_PFSF) {
+ if (!(spawn->info.port_name == -1 &&
+ switch_info->name_type ==
+ MLX5_PHYS_PORT_NAME_TYPE_PFHPF) &&
+ switch_info->name_type != MLX5_PHYS_PORT_NAME_TYPE_PFSF) {
rte_errno = EBUSY;
return false;
}
if (spawn->pf_bond < 0) {
/* For non-LAG mode, allow and ignore pf. */
switch_info->pf_num = eth_da->ports[p];
- repr_id = mlx5_representor_id_encode(switch_info);
+ repr_id = mlx5_representor_id_encode(switch_info,
+ eth_da->type);
}
for (f = 0; f < eth_da->nb_representor_ports; ++f) {
id = MLX5_REPRESENTOR_ID
priv->vport_id = switch_info->representor ?
switch_info->port_name + 1 : -1;
#endif
- priv->representor_id = mlx5_representor_id_encode(switch_info);
+ priv->representor_id = mlx5_representor_id_encode(switch_info,
+ eth_da->type);
/*
* Look for sibling devices in order to reuse their switch domain
* if any, otherwise allocate one.
((repr_id) & 0xfff)
#define MLX5_REPRESENTOR_TYPE(repr_id) \
(((repr_id) >> 12) & 3)
-uint16_t mlx5_representor_id_encode(const struct mlx5_switch_info *info);
+uint16_t mlx5_representor_id_encode(const struct mlx5_switch_info *info,
+ enum rte_eth_representor_type hpf_type);
int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver,
size_t fw_size);
int mlx5_dev_infos_get(struct rte_eth_dev *dev,
*
* @param info
* Port switch info.
+ * @param hpf_type
+ * Use this type if port is HPF.
*
* @return
* Encoded representor ID.
*/
uint16_t
-mlx5_representor_id_encode(const struct mlx5_switch_info *info)
+mlx5_representor_id_encode(const struct mlx5_switch_info *info,
+ enum rte_eth_representor_type hpf_type)
{
enum rte_eth_representor_type type = RTE_ETH_REPRESENTOR_VF;
uint16_t repr = info->port_name;
return UINT16_MAX;
if (info->name_type == MLX5_PHYS_PORT_NAME_TYPE_PFSF)
type = RTE_ETH_REPRESENTOR_SF;
- if (info->name_type == MLX5_PHYS_PORT_NAME_TYPE_PFHPF)
+ if (info->name_type == MLX5_PHYS_PORT_NAME_TYPE_PFHPF) {
+ type = hpf_type;
repr = UINT16_MAX;
+ }
return MLX5_REPRESENTOR_ID(info->pf_num, type, repr);
}
struct rte_eth_representor_info *info)
{
struct mlx5_priv *priv = dev->data->dev_private;
- int n_type = 3; /* Number of representor types, VF, HPF and SF. */
+ int n_type = 4; /* Representor types, VF, HPF@VF, SF and HPF@SF. */
int n_pf = 2; /* Number of PFs. */
int i = 0, pf;
snprintf(info->ranges[i].name,
sizeof(info->ranges[i].name), "pf%dvf", pf);
i++;
- /* HPF range. */
+ /* HPF range of VF type. */
info->ranges[i].type = RTE_ETH_REPRESENTOR_VF;
info->ranges[i].controller = 0;
info->ranges[i].pf = pf;
snprintf(info->ranges[i].name,
sizeof(info->ranges[i].name), "pf%dsf", pf);
i++;
+ /* HPF range of SF type. */
+ info->ranges[i].type = RTE_ETH_REPRESENTOR_SF;
+ info->ranges[i].controller = 0;
+ info->ranges[i].pf = pf;
+ info->ranges[i].vf = UINT16_MAX;
+ info->ranges[i].id_base =
+ MLX5_REPRESENTOR_ID(pf, info->ranges[i].type, -1);
+ info->ranges[i].id_end =
+ MLX5_REPRESENTOR_ID(pf, info->ranges[i].type, -1);
+ snprintf(info->ranges[i].name,
+ sizeof(info->ranges[i].name), "pf%dsf", pf);
+ i++;
}
out:
return n_type * n_pf;