From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 16ABAA034F; Mon, 11 Oct 2021 16:52:55 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E073A411D5; Mon, 11 Oct 2021 16:50:11 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id ADA43411C3 for ; Mon, 11 Oct 2021 16:50:08 +0200 (CEST) Received: by shelob.oktetlabs.ru (Postfix, from userid 122) id 7751C7F703; Mon, 11 Oct 2021 17:50:08 +0300 (MSK) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=ALL_TRUSTED, DKIM_ADSP_DISCARD, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17]) by shelob.oktetlabs.ru (Postfix) with ESMTP id 6FB477F718; Mon, 11 Oct 2021 17:49:10 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 6FB477F718 Authentication-Results: shelob.oktetlabs.ru/6FB477F718; dkim=none; dkim-atps=neutral From: Andrew Rybchenko To: dev@dpdk.org Cc: Viacheslav Galaktionov , Andy Moreton Date: Mon, 11 Oct 2021 17:48:52 +0300 Message-Id: <20211011144857.446802-34-andrew.rybchenko@oktetlabs.ru> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211011144857.446802-1-andrew.rybchenko@oktetlabs.ru> References: <20210827065717.1838258-1-andrew.rybchenko@oktetlabs.ru> <20211011144857.446802-1-andrew.rybchenko@oktetlabs.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v2 33/38] net/sfc: store PCI address for represented entities X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Viacheslav Galaktionov This information will be useful when representor info API is implemented. Signed-off-by: Viacheslav Galaktionov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc_ethdev.c | 11 +++++++++-- drivers/net/sfc/sfc_repr.c | 20 +++++++++++++++----- drivers/net/sfc/sfc_repr.h | 10 +++++++++- drivers/net/sfc/sfc_switch.c | 14 ++++++++++++++ drivers/net/sfc/sfc_switch.h | 11 +++++++++++ 5 files changed, 58 insertions(+), 8 deletions(-) diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index f93b9cc921..53008f477f 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -2688,6 +2688,7 @@ sfc_eth_dev_create_representors(struct rte_eth_dev *dev, 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, @@ -2700,8 +2701,14 @@ sfc_eth_dev_create_representors(struct rte_eth_dev *dev, continue; } - rc = sfc_repr_create(dev, eth_da->representor_ports[i], - sa->mae.switch_domain_id, &mport_sel); + 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], diff --git a/drivers/net/sfc/sfc_repr.c b/drivers/net/sfc/sfc_repr.c index 87f10092c3..f87188ed7a 100644 --- a/drivers/net/sfc/sfc_repr.c +++ b/drivers/net/sfc/sfc_repr.c @@ -902,6 +902,9 @@ struct sfc_repr_init_data { uint16_t repr_id; uint16_t switch_domain_id; efx_mport_sel_t mport_sel; + efx_pcie_interface_t intf; + uint16_t pf; + uint16_t vf; }; static int @@ -939,6 +942,9 @@ sfc_repr_eth_dev_init(struct rte_eth_dev *dev, void *init_params) switch_port_request.ethdev_mportp = ðdev_mport_sel; switch_port_request.entity_mportp = &repr_data->mport_sel; switch_port_request.ethdev_port_id = dev->data->port_id; + switch_port_request.port_data.repr.intf = repr_data->intf; + switch_port_request.port_data.repr.pf = repr_data->pf; + switch_port_request.port_data.repr.vf = repr_data->vf; ret = sfc_repr_assign_mae_switch_port(repr_data->switch_domain_id, &switch_port_request, @@ -1015,8 +1021,10 @@ sfc_repr_eth_dev_init(struct rte_eth_dev *dev, void *init_params) } int -sfc_repr_create(struct rte_eth_dev *parent, uint16_t representor_id, - uint16_t switch_domain_id, const efx_mport_sel_t *mport_sel) +sfc_repr_create(struct rte_eth_dev *parent, + struct sfc_repr_entity_info *entity, + uint16_t switch_domain_id, + const efx_mport_sel_t *mport_sel) { struct sfc_repr_init_data repr_data; char name[RTE_ETH_NAME_MAX_LEN]; @@ -1024,8 +1032,7 @@ sfc_repr_create(struct rte_eth_dev *parent, uint16_t representor_id, struct rte_eth_dev *dev; if (snprintf(name, sizeof(name), "net_%s_representor_%u", - parent->device->name, representor_id) >= - (int)sizeof(name)) { + parent->device->name, entity->vf) >= (int)sizeof(name)) { SFC_GENERIC_LOG(ERR, "%s() failed name too long", __func__); return -ENAMETOOLONG; } @@ -1034,9 +1041,12 @@ sfc_repr_create(struct rte_eth_dev *parent, uint16_t representor_id, if (dev == NULL) { memset(&repr_data, 0, sizeof(repr_data)); repr_data.pf_port_id = parent->data->port_id; - repr_data.repr_id = representor_id; + repr_data.repr_id = entity->vf; repr_data.switch_domain_id = switch_domain_id; repr_data.mport_sel = *mport_sel; + repr_data.intf = entity->intf; + repr_data.pf = entity->pf; + repr_data.vf = entity->vf; ret = rte_eth_dev_create(parent->device, name, sizeof(struct sfc_repr_shared), diff --git a/drivers/net/sfc/sfc_repr.h b/drivers/net/sfc/sfc_repr.h index 1347206006..2093973761 100644 --- a/drivers/net/sfc/sfc_repr.h +++ b/drivers/net/sfc/sfc_repr.h @@ -26,7 +26,15 @@ extern "C" { /** Max count of the representor Tx queues */ #define SFC_REPR_TXQ_MAX 1 -int sfc_repr_create(struct rte_eth_dev *parent, uint16_t representor_id, +struct sfc_repr_entity_info { + enum rte_eth_representor_type type; + efx_pcie_interface_t intf; + uint16_t pf; + uint16_t vf; +}; + +int sfc_repr_create(struct rte_eth_dev *parent, + struct sfc_repr_entity_info *entity, uint16_t switch_domain_id, const efx_mport_sel_t *mport_sel); diff --git a/drivers/net/sfc/sfc_switch.c b/drivers/net/sfc/sfc_switch.c index f72f6648b8..7a0b332f33 100644 --- a/drivers/net/sfc/sfc_switch.c +++ b/drivers/net/sfc/sfc_switch.c @@ -63,6 +63,8 @@ struct sfc_mae_switch_port { enum sfc_mae_switch_port_type type; /** RTE switch port ID */ uint16_t id; + + union sfc_mae_switch_port_data data; }; TAILQ_HEAD(sfc_mae_switch_ports, sfc_mae_switch_port); @@ -335,6 +337,18 @@ sfc_mae_assign_switch_port(uint16_t switch_domain_id, port->ethdev_mport = *req->ethdev_mportp; port->ethdev_port_id = req->ethdev_port_id; + switch (req->type) { + case SFC_MAE_SWITCH_PORT_INDEPENDENT: + /* No data */ + break; + case SFC_MAE_SWITCH_PORT_REPRESENTOR: + memcpy(&port->data.repr, &req->port_data, + sizeof(port->data.repr)); + break; + default: + SFC_ASSERT(B_FALSE); + } + *switch_port_id = port->id; rte_spinlock_unlock(&sfc_mae_switch.lock); diff --git a/drivers/net/sfc/sfc_switch.h b/drivers/net/sfc/sfc_switch.h index 1eee5fc0b6..a072507375 100644 --- a/drivers/net/sfc/sfc_switch.h +++ b/drivers/net/sfc/sfc_switch.h @@ -34,11 +34,22 @@ enum sfc_mae_switch_port_type { SFC_MAE_SWITCH_PORT_REPRESENTOR, }; +struct sfc_mae_switch_port_repr_data { + efx_pcie_interface_t intf; + uint16_t pf; + uint16_t vf; +}; + +union sfc_mae_switch_port_data { + struct sfc_mae_switch_port_repr_data repr; +}; + struct sfc_mae_switch_port_request { enum sfc_mae_switch_port_type type; const efx_mport_sel_t *entity_mportp; const efx_mport_sel_t *ethdev_mportp; uint16_t ethdev_port_id; + union sfc_mae_switch_port_data port_data; }; int sfc_mae_assign_switch_domain(struct sfc_adapter *sa, -- 2.30.2