From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> To: dev@dpdk.org Cc: Viacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru>, Andy Moreton <amoreton@xilinx.com> Subject: [dpdk-dev] [PATCH 35/38] net/sfc: support new representor parameter syntax Date: Fri, 27 Aug 2021 09:57:14 +0300 Message-ID: <20210827065717.1838258-36-andrew.rybchenko@oktetlabs.ru> (raw) In-Reply-To: <20210827065717.1838258-1-andrew.rybchenko@oktetlabs.ru> From: Viacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru> Allow the user to specify representor entities using the structured parameter values. Signed-off-by: Viacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru> Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru> Reviewed-by: Andy Moreton <amoreton@xilinx.com> --- drivers/net/sfc/sfc_ethdev.c | 181 ++++++++++++++++++++++++++++------- drivers/net/sfc/sfc_switch.c | 24 +++++ drivers/net/sfc/sfc_switch.h | 4 + 3 files changed, 176 insertions(+), 33 deletions(-) diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 49ba820501..29c8d220a2 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -2642,18 +2642,143 @@ sfc_eth_dev_find_or_create(struct rte_pci_device *pci_dev, return 0; } +static int +sfc_eth_dev_create_repr(struct sfc_adapter *sa, + efx_pcie_interface_t controller, + uint16_t port, + uint16_t repr_port, + enum rte_eth_representor_type type) +{ + struct sfc_repr_entity_info entity; + efx_mport_sel_t mport_sel; + int rc; + + switch (type) { + case RTE_ETH_REPRESENTOR_NONE: + return 0; + case RTE_ETH_REPRESENTOR_VF: + case RTE_ETH_REPRESENTOR_PF: + break; + case RTE_ETH_REPRESENTOR_SF: + sfc_err(sa, "SF representors are not supported"); + return ENOTSUP; + default: + sfc_err(sa, "unknown representor type: %d", type); + return ENOTSUP; + } + + rc = efx_mae_mport_by_pcie_mh_function(controller, + port, + repr_port, + &mport_sel); + if (rc != 0) { + sfc_err(sa, + "failed to get m-port selector for controller %u port %u repr_port %u: %s", + controller, port, repr_port, rte_strerror(-rc)); + return rc; + } + + memset(&entity, 0, sizeof(entity)); + entity.type = type; + entity.intf = controller; + entity.pf = port; + entity.vf = repr_port; + + rc = sfc_repr_create(sa->eth_dev, &entity, sa->mae.switch_domain_id, + &mport_sel); + if (rc != 0) { + sfc_err(sa, + "failed to create representor for controller %u port %u repr_port %u: %s", + controller, port, repr_port, rte_strerror(-rc)); + return rc; + } + + return 0; +} + +static int +sfc_eth_dev_create_repr_port(struct sfc_adapter *sa, + const struct rte_eth_devargs *eth_da, + efx_pcie_interface_t controller, + uint16_t port) +{ + int first_error = 0; + uint16_t i; + int rc; + + if (eth_da->type == RTE_ETH_REPRESENTOR_PF) { + return sfc_eth_dev_create_repr(sa, controller, port, + EFX_PCI_VF_INVALID, + eth_da->type); + } + + for (i = 0; i < eth_da->nb_representor_ports; i++) { + rc = sfc_eth_dev_create_repr(sa, controller, port, + eth_da->representor_ports[i], + eth_da->type); + if (rc != 0 && first_error == 0) + first_error = rc; + } + + return first_error; +} + +static int +sfc_eth_dev_create_repr_controller(struct sfc_adapter *sa, + const struct rte_eth_devargs *eth_da, + efx_pcie_interface_t controller) +{ + const efx_nic_cfg_t *encp; + int first_error = 0; + uint16_t default_port; + uint16_t i; + int rc; + + if (eth_da->nb_ports == 0) { + encp = efx_nic_cfg_get(sa->nic); + default_port = encp->enc_intf == controller ? encp->enc_pf : 0; + return sfc_eth_dev_create_repr_port(sa, eth_da, controller, + default_port); + } + + for (i = 0; i < eth_da->nb_ports; i++) { + rc = sfc_eth_dev_create_repr_port(sa, eth_da, controller, + eth_da->ports[i]); + if (rc != 0 && first_error == 0) + first_error = rc; + } + + return first_error; +} + static int sfc_eth_dev_create_representors(struct rte_eth_dev *dev, const struct rte_eth_devargs *eth_da) { + efx_pcie_interface_t intf; + const efx_nic_cfg_t *encp; struct sfc_adapter *sa; - unsigned int i; + uint16_t switch_domain_id; + uint16_t i; int rc; - if (eth_da->nb_representor_ports == 0) - return 0; - sa = sfc_adapter_by_eth_dev(dev); + switch_domain_id = sa->mae.switch_domain_id; + + switch (eth_da->type) { + case RTE_ETH_REPRESENTOR_NONE: + return 0; + case RTE_ETH_REPRESENTOR_PF: + case RTE_ETH_REPRESENTOR_VF: + break; + case RTE_ETH_REPRESENTOR_SF: + sfc_err(sa, "SF representors are not supported"); + return -ENOTSUP; + default: + sfc_err(sa, "unknown representor type: %d", + eth_da->type); + return -ENOTSUP; + } if (!sa->switchdev) { sfc_err(sa, "cannot create representors in non-switchdev mode"); @@ -2678,34 +2803,20 @@ sfc_eth_dev_create_representors(struct rte_eth_dev *dev, return -rc; } - for (i = 0; i < eth_da->nb_representor_ports; ++i) { - const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); - struct sfc_repr_entity_info entity; - efx_mport_sel_t mport_sel; - - rc = efx_mae_mport_by_pcie_function(encp->enc_pf, - eth_da->representor_ports[i], &mport_sel); - if (rc != 0) { - sfc_err(sa, - "failed to get representor %u m-port: %s - ignore", - eth_da->representor_ports[i], - rte_strerror(-rc)); - continue; - } - - memset(&entity, 0, sizeof(entity)); - entity.type = eth_da->type; - entity.intf = encp->enc_intf; - entity.pf = encp->enc_pf; - entity.vf = eth_da->representor_ports[i]; - - rc = sfc_repr_create(dev, &entity, sa->mae.switch_domain_id, - &mport_sel); - if (rc != 0) { - sfc_err(sa, "cannot create representor %u: %s - ignore", - eth_da->representor_ports[i], - rte_strerror(-rc)); + if (eth_da->nb_mh_controllers > 0) { + for (i = 0; i < eth_da->nb_mh_controllers; i++) { + rc = sfc_mae_switch_domain_get_intf(switch_domain_id, + eth_da->mh_controllers[i], + &intf); + if (rc != 0) { + sfc_err(sa, "failed to get representor"); + continue; + } + sfc_eth_dev_create_repr_controller(sa, eth_da, intf); } + } else { + encp = efx_nic_cfg_get(sa->nic); + sfc_eth_dev_create_repr_controller(sa, eth_da, encp->enc_intf); } return 0; @@ -2729,9 +2840,13 @@ static int sfc_eth_dev_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, memset(ð_da, 0, sizeof(eth_da)); } - init_data.nb_representors = eth_da.nb_representor_ports; + /* If no VF representors specified, check for PF ones */ + if (eth_da.nb_representor_ports > 0) + init_data.nb_representors = eth_da.nb_representor_ports; + else + init_data.nb_representors = eth_da.nb_ports; - if (eth_da.nb_representor_ports > 0 && + if (init_data.nb_representors > 0 && rte_eal_process_type() != RTE_PROC_PRIMARY) { SFC_GENERIC_LOG(ERR, "Create representors from secondary process not supported, dev '%s'", diff --git a/drivers/net/sfc/sfc_switch.c b/drivers/net/sfc/sfc_switch.c index 225d07fa15..5cd9b46d26 100644 --- a/drivers/net/sfc/sfc_switch.c +++ b/drivers/net/sfc/sfc_switch.c @@ -307,6 +307,30 @@ sfc_mae_switch_domain_get_controller(uint16_t switch_domain_id, return ENOENT; } +int sfc_mae_switch_domain_get_intf(uint16_t switch_domain_id, + int controller, + efx_pcie_interface_t *intf) +{ + const efx_pcie_interface_t *controllers; + size_t nb_controllers; + int rc; + + rc = sfc_mae_switch_domain_controllers(switch_domain_id, &controllers, + &nb_controllers); + if (rc != 0) + return rc; + + if (controllers == NULL) + return ENOENT; + + if ((size_t)controller > nb_controllers) + return EINVAL; + + *intf = controllers[controller]; + + return 0; +} + /* This function expects to be called only when the lock is held */ static struct sfc_mae_switch_port * sfc_mae_find_switch_port_by_entity(const struct sfc_mae_switch_domain *domain, diff --git a/drivers/net/sfc/sfc_switch.h b/drivers/net/sfc/sfc_switch.h index 294baae9a2..d187c6dbbb 100644 --- a/drivers/net/sfc/sfc_switch.h +++ b/drivers/net/sfc/sfc_switch.h @@ -67,6 +67,10 @@ int sfc_mae_switch_domain_get_controller(uint16_t switch_domain_id, efx_pcie_interface_t intf, int *controller); +int sfc_mae_switch_domain_get_intf(uint16_t switch_domain_id, + int controller, + efx_pcie_interface_t *intf); + int sfc_mae_assign_switch_port(uint16_t switch_domain_id, const struct sfc_mae_switch_port_request *req, uint16_t *switch_port_id); -- 2.30.2
next prev parent reply other threads:[~2021-08-27 7:01 UTC|newest] Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-08-27 6:56 [dpdk-dev] [PATCH 00/38] net/sfc: support port representors Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 01/38] common/sfc_efx/base: update MCDI headers Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 02/38] common/sfc_efx/base: update EF100 registers definitions Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 03/38] net/sfc: add switch mode device argument Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 04/38] net/sfc: insert switchdev mode MAE rules Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 05/38] common/sfc_efx/base: add an API to get mport ID by selector Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 06/38] net/sfc: support EF100 Tx override prefix Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 07/38] net/sfc: add representors proxy infrastructure Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 08/38] net/sfc: reserve TxQ and RxQ for port representors Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 09/38] net/sfc: move adapter state enum to separate header Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 10/38] common/sfc_efx/base: allow creating invalid mport selectors Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 11/38] net/sfc: add port representors infrastructure Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 12/38] common/sfc_efx/base: add filter ingress mport matching field Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 13/38] common/sfc_efx/base: add API to get mport selector by ID Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 14/38] common/sfc_efx/base: add mport alias MCDI wrappers Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 15/38] net/sfc: add representor proxy port API Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 16/38] net/sfc: implement representor queue setup and release Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 17/38] net/sfc: implement representor RxQ start/stop Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 18/38] net/sfc: implement representor TxQ start/stop Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 19/38] net/sfc: implement port representor start and stop Andrew Rybchenko 2021-08-27 6:56 ` [dpdk-dev] [PATCH 20/38] net/sfc: implement port representor link update Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 21/38] net/sfc: support multiple device probe Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 22/38] net/sfc: implement representor Tx routine Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 23/38] net/sfc: use xword type for EF100 Rx prefix Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 24/38] net/sfc: handle ingress m-port in " Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 25/38] net/sfc: implement representor Rx routine Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 26/38] net/sfc: add simple port representor statistics Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 27/38] net/sfc: free MAE lock once switch domain is assigned Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 28/38] common/sfc_efx/base: add multi-host function M-port selector Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 29/38] common/sfc_efx/base: retrieve function interfaces for VNICs Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 30/38] common/sfc_efx/base: add a means to read MAE mport journal Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 31/38] common/sfc_efx/base: allow getting VNIC MCDI client handles Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 32/38] net/sfc: maintain controller to EFX interface mapping Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 33/38] net/sfc: store PCI address for represented entities Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 34/38] net/sfc: include controller and port in representor name Andrew Rybchenko 2021-08-27 6:57 ` Andrew Rybchenko [this message] 2021-08-27 6:57 ` [dpdk-dev] [PATCH 36/38] net/sfc: use switch port ID as representor ID Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 37/38] net/sfc: implement the representor info API Andrew Rybchenko 2021-08-27 6:57 ` [dpdk-dev] [PATCH 38/38] net/sfc: update comment about representor support Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 00/38] net/sfc: support port representors Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 01/38] common/sfc_efx/base: update MCDI headers Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 02/38] common/sfc_efx/base: update EF100 registers definitions Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 03/38] net/sfc: add switch mode device argument Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 04/38] net/sfc: insert switchdev mode MAE rules Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 05/38] common/sfc_efx/base: add an API to get mport ID by selector Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 06/38] net/sfc: support EF100 Tx override prefix Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 07/38] net/sfc: add representors proxy infrastructure Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 08/38] net/sfc: reserve TxQ and RxQ for port representors Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 09/38] net/sfc: move adapter state enum to separate header Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 10/38] common/sfc_efx/base: allow creating invalid mport selectors Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 11/38] net/sfc: add port representors infrastructure Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 12/38] common/sfc_efx/base: add filter ingress mport matching field Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 13/38] common/sfc_efx/base: add API to get mport selector by ID Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 14/38] common/sfc_efx/base: add mport alias MCDI wrappers Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 15/38] net/sfc: add representor proxy port API Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 16/38] net/sfc: implement representor queue setup and release Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 17/38] net/sfc: implement representor RxQ start/stop Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 18/38] net/sfc: implement representor TxQ start/stop Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 19/38] net/sfc: implement port representor start and stop Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 20/38] net/sfc: implement port representor link update Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 21/38] net/sfc: support multiple device probe Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 22/38] net/sfc: implement representor Tx routine Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 23/38] net/sfc: use xword type for EF100 Rx prefix Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 24/38] net/sfc: handle ingress m-port in " Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 25/38] net/sfc: implement representor Rx routine Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 26/38] net/sfc: add simple port representor statistics Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 27/38] net/sfc: free MAE lock once switch domain is assigned Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 28/38] common/sfc_efx/base: add multi-host function M-port selector Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 29/38] common/sfc_efx/base: retrieve function interfaces for VNICs Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 30/38] common/sfc_efx/base: add a means to read MAE mport journal Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 31/38] common/sfc_efx/base: allow getting VNIC MCDI client handles Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 32/38] net/sfc: maintain controller to EFX interface mapping Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 33/38] net/sfc: store PCI address for represented entities Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 34/38] net/sfc: include controller and port in representor name Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 35/38] net/sfc: support new representor parameter syntax Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 36/38] net/sfc: use switch port ID as representor ID Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 37/38] net/sfc: implement the representor info API Andrew Rybchenko 2021-10-11 14:48 ` [dpdk-dev] [PATCH v2 38/38] net/sfc: update comment about representor support Andrew Rybchenko 2021-10-12 16:45 ` [dpdk-dev] [PATCH v2 00/38] net/sfc: support port representors Ferruh Yigit
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210827065717.1838258-36-andrew.rybchenko@oktetlabs.ru \ --to=andrew.rybchenko@oktetlabs.ru \ --cc=amoreton@xilinx.com \ --cc=dev@dpdk.org \ --cc=viacheslav.galaktionov@oktetlabs.ru \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
DPDK patches and discussions This inbox may be cloned and mirrored by anyone: git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \ dev@dpdk.org public-inbox-index dev Example config snippet for mirrors. Newsgroup available over NNTP: nntp://inbox.dpdk.org/inbox.dpdk.dev AGPL code for this site: git clone https://public-inbox.org/public-inbox.git