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 99413A0C41; Fri, 27 Aug 2021 09:01:24 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8C21441293; Fri, 27 Aug 2021 08:59:14 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id EB94241269 for ; Fri, 27 Aug 2021 08:59:11 +0200 (CEST) Received: by shelob.oktetlabs.ru (Postfix, from userid 122) id C1AEC7F6E7; Fri, 27 Aug 2021 09:59:11 +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 769167F6F4; Fri, 27 Aug 2021 09:57:36 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 769167F6F4 Authentication-Results: shelob.oktetlabs.ru/769167F6F4; dkim=none; dkim-atps=neutral From: Andrew Rybchenko To: dev@dpdk.org Cc: Viacheslav Galaktionov , Andy Moreton Date: Fri, 27 Aug 2021 09:57:12 +0300 Message-Id: <20210827065717.1838258-34-andrew.rybchenko@oktetlabs.ru> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210827065717.1838258-1-andrew.rybchenko@oktetlabs.ru> References: <20210827065717.1838258-1-andrew.rybchenko@oktetlabs.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH 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 8536a2b111..49ba820501 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -2680,6 +2680,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, @@ -2692,8 +2693,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 4fd81c3f6b..a42e70c92c 100644 --- a/drivers/net/sfc/sfc_repr.c +++ b/drivers/net/sfc/sfc_repr.c @@ -924,6 +924,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 @@ -961,6 +964,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, @@ -1037,8 +1043,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]; @@ -1046,8 +1054,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; } @@ -1056,9 +1063,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