xref: /dpdk/drivers/net/cnxk/cnxk_eswitch_devargs.c (revision f665790a5dbad7b645ff46f31d65e977324e7bfc)
16c3906e3SHarman Kalra /* SPDX-License-Identifier: BSD-3-Clause
26c3906e3SHarman Kalra  * Copyright(C) 2024 Marvell.
36c3906e3SHarman Kalra  */
46c3906e3SHarman Kalra 
56c3906e3SHarman Kalra #include <cnxk_eswitch.h>
66c3906e3SHarman Kalra 
76c3906e3SHarman Kalra #define PF_SHIFT 10
86c3906e3SHarman Kalra static inline int
96c3906e3SHarman Kalra get_hw_func(uint16_t pf, uint16_t vf)
106c3906e3SHarman Kalra {
116c3906e3SHarman Kalra 	return (pf << PF_SHIFT) | vf;
126c3906e3SHarman Kalra }
136c3906e3SHarman Kalra 
146c3906e3SHarman Kalra static int
156c3906e3SHarman Kalra populate_repr_hw_info(struct cnxk_eswitch_dev *eswitch_dev, struct rte_eth_devargs *eth_da,
166c3906e3SHarman Kalra 		      uint16_t idx)
176c3906e3SHarman Kalra {
186c3906e3SHarman Kalra 	struct cnxk_eswitch_devargs *esw_da = &eswitch_dev->esw_da[idx];
196c3906e3SHarman Kalra 	uint16_t nb_repr_ports, hw_func;
206c3906e3SHarman Kalra 	int rc, i, j;
216c3906e3SHarman Kalra 
226c3906e3SHarman Kalra 	if (eth_da->type == RTE_ETH_REPRESENTOR_NONE) {
236c3906e3SHarman Kalra 		plt_err("No representor type found");
246c3906e3SHarman Kalra 		return -EINVAL;
256c3906e3SHarman Kalra 	}
266c3906e3SHarman Kalra 
276c3906e3SHarman Kalra 	if (eth_da->type != RTE_ETH_REPRESENTOR_VF && eth_da->type != RTE_ETH_REPRESENTOR_PF &&
286c3906e3SHarman Kalra 	    eth_da->type != RTE_ETH_REPRESENTOR_SF) {
29*f665790aSDavid Marchand 		plt_err("unsupported representor type %d", eth_da->type);
306c3906e3SHarman Kalra 		return -ENOTSUP;
316c3906e3SHarman Kalra 	}
326c3906e3SHarman Kalra 
336c3906e3SHarman Kalra 	nb_repr_ports = (eth_da->type == RTE_ETH_REPRESENTOR_PF) ? eth_da->nb_ports :
346c3906e3SHarman Kalra 								   eth_da->nb_representor_ports;
356c3906e3SHarman Kalra 	esw_da->nb_repr_ports = nb_repr_ports;
366c3906e3SHarman Kalra 	/* If plain list is provided as representor pattern */
376c3906e3SHarman Kalra 	if (eth_da->nb_ports == 0)
386c3906e3SHarman Kalra 		return 0;
396c3906e3SHarman Kalra 
406c3906e3SHarman Kalra 	esw_da->repr_hw_info = plt_zmalloc(nb_repr_ports * sizeof(struct cnxk_esw_repr_hw_info), 0);
416c3906e3SHarman Kalra 	if (!esw_da->repr_hw_info) {
426c3906e3SHarman Kalra 		plt_err("Failed to allocate memory");
436c3906e3SHarman Kalra 		rc = -ENOMEM;
446c3906e3SHarman Kalra 		goto fail;
456c3906e3SHarman Kalra 	}
466c3906e3SHarman Kalra 
476c3906e3SHarman Kalra 	plt_esw_dbg("Representor param %d has %d pfvf", idx, nb_repr_ports);
486c3906e3SHarman Kalra 	/* Check if representor can be created for PFVF and populating HW func list */
496c3906e3SHarman Kalra 	for (i = 0; i < nb_repr_ports; i++) {
506c3906e3SHarman Kalra 		if (eth_da->type == RTE_ETH_REPRESENTOR_PF)
516c3906e3SHarman Kalra 			hw_func = get_hw_func(eth_da->ports[i], 0);
526c3906e3SHarman Kalra 		else
536c3906e3SHarman Kalra 			hw_func = get_hw_func(eth_da->ports[0], eth_da->representor_ports[i] + 1);
546c3906e3SHarman Kalra 
556c3906e3SHarman Kalra 		for (j = 0; j < eswitch_dev->repr_cnt.max_repr; j++) {
566c3906e3SHarman Kalra 			if (eswitch_dev->nix.rep_pfvf_map[j] == hw_func)
576c3906e3SHarman Kalra 				break;
586c3906e3SHarman Kalra 		}
596c3906e3SHarman Kalra 
606c3906e3SHarman Kalra 		/* HW func which doesn not match the map table received from AF, no
616c3906e3SHarman Kalra 		 * representor port is assigned.
626c3906e3SHarman Kalra 		 */
636c3906e3SHarman Kalra 		if (j == eswitch_dev->repr_cnt.max_repr) {
646c3906e3SHarman Kalra 			plt_err("Representor port can't be created for PF%dVF%d", eth_da->ports[0],
656c3906e3SHarman Kalra 				eth_da->representor_ports[i]);
666c3906e3SHarman Kalra 			rc = -EINVAL;
676c3906e3SHarman Kalra 			goto fail;
686c3906e3SHarman Kalra 		}
696c3906e3SHarman Kalra 
706c3906e3SHarman Kalra 		esw_da->repr_hw_info[i].hw_func = hw_func;
716c3906e3SHarman Kalra 		esw_da->repr_hw_info[i].rep_id = j;
726c3906e3SHarman Kalra 		esw_da->repr_hw_info[i].pfvf = (eth_da->type == RTE_ETH_REPRESENTOR_PF) ?
736c3906e3SHarman Kalra 						       eth_da->ports[0] :
746c3906e3SHarman Kalra 						       eth_da->representor_ports[i];
7545ae8f47SHarman Kalra 		TAILQ_INIT(&esw_da->repr_hw_info[i].repr_flow_list);
766c3906e3SHarman Kalra 		plt_esw_dbg("	HW func %x index %d type %d", hw_func, j, eth_da->type);
776c3906e3SHarman Kalra 	}
786c3906e3SHarman Kalra 
796c3906e3SHarman Kalra 	esw_da->type = CNXK_ESW_DA_TYPE_PFVF;
806c3906e3SHarman Kalra 
816c3906e3SHarman Kalra 	return 0;
826c3906e3SHarman Kalra fail:
836c3906e3SHarman Kalra 	return rc;
846c3906e3SHarman Kalra }
856c3906e3SHarman Kalra 
866c3906e3SHarman Kalra int
876c3906e3SHarman Kalra cnxk_eswitch_repr_devargs(struct rte_pci_device *pci_dev, struct cnxk_eswitch_dev *eswitch_dev)
886c3906e3SHarman Kalra {
896c3906e3SHarman Kalra 	struct rte_devargs *devargs = pci_dev->device.devargs;
906c3906e3SHarman Kalra 	struct rte_eth_devargs eth_da[RTE_MAX_ETHPORTS];
916c3906e3SHarman Kalra 	int rc, i, j, count;
926c3906e3SHarman Kalra 
936c3906e3SHarman Kalra 	if (devargs == NULL) {
946c3906e3SHarman Kalra 		plt_err("No devargs passed");
956c3906e3SHarman Kalra 		rc = -EINVAL;
966c3906e3SHarman Kalra 		goto fail;
976c3906e3SHarman Kalra 	}
986c3906e3SHarman Kalra 
996c3906e3SHarman Kalra 	/* Parse devargs passed to ESW device */
1006c3906e3SHarman Kalra 	rc = rte_eth_devargs_parse(devargs->args, eth_da, RTE_MAX_ETHPORTS);
1016c3906e3SHarman Kalra 	if (rc < 0) {
1026c3906e3SHarman Kalra 		plt_err("Failed to parse devargs, err %d", rc);
1036c3906e3SHarman Kalra 		goto fail;
1046c3906e3SHarman Kalra 	}
1056c3906e3SHarman Kalra 
1066c3906e3SHarman Kalra 	count = rc;
1076c3906e3SHarman Kalra 	j = eswitch_dev->nb_esw_da;
1086c3906e3SHarman Kalra 	for (i = 0; i < count; i++) {
1096c3906e3SHarman Kalra 		rc = populate_repr_hw_info(eswitch_dev, &eth_da[i], j);
1106c3906e3SHarman Kalra 		if (rc) {
1116c3906e3SHarman Kalra 			plt_err("Failed to populate representer hw funcs, err %d", rc);
1126c3906e3SHarman Kalra 			goto fail;
1136c3906e3SHarman Kalra 		}
1146c3906e3SHarman Kalra 
1156c3906e3SHarman Kalra 		rte_memcpy(&eswitch_dev->esw_da[j].da, &eth_da[i], sizeof(struct rte_eth_devargs));
1166c3906e3SHarman Kalra 		/* No of representor ports to be created */
1176c3906e3SHarman Kalra 		eswitch_dev->repr_cnt.nb_repr_created += eswitch_dev->esw_da[j].nb_repr_ports;
1186c3906e3SHarman Kalra 		j++;
1196c3906e3SHarman Kalra 	}
1206c3906e3SHarman Kalra 	eswitch_dev->nb_esw_da += count;
1216c3906e3SHarman Kalra 
1226c3906e3SHarman Kalra 	return 0;
1236c3906e3SHarman Kalra fail:
1246c3906e3SHarman Kalra 	return rc;
1256c3906e3SHarman Kalra }
126