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, ð_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, ð_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