From 768d1e44dfa50a5c26d04e362d46773dde5932be Mon Sep 17 00:00:00 2001 From: Viacheslav Galaktionov Date: Mon, 11 Oct 2021 17:48:52 +0300 Subject: [PATCH] net/sfc: store PCI address for represented entities 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 a6294e2fc0..e8c67c9173 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -2741,6 +2741,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, @@ -2753,8 +2754,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 412799f830..04415d1b79 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 @@ fail_mae_assign_switch_port: } 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 @@ done: 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.20.1