> -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Monday, December 21, 2020 5:14 AM > To: dev@dpdk.org; Xia, Chenbo <chenbo....@intel.com>; olivier.m...@6wind.com; > amore...@redhat.com; david.march...@redhat.com > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > Subject: [PATCH 06/40] net/virtio: move PCI specific dev init to PCI ethdev > init > > This patch moves the PCI specific initialization from > eth_virtio_dev_init() to eth_virtio_pci_init(). > > Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com> > --- > drivers/net/virtio/virtio_ethdev.c | 63 +---------------------- > drivers/net/virtio/virtio_pci_ethdev.c | 71 +++++++++++++++++++++++++- > 2 files changed, 71 insertions(+), 63 deletions(-) > > diff --git a/drivers/net/virtio/virtio_ethdev.c > b/drivers/net/virtio/virtio_ethdev.c > index ca21a019e5..4032a89396 100644 > --- a/drivers/net/virtio/virtio_ethdev.c > +++ b/drivers/net/virtio/virtio_ethdev.c > @@ -1676,7 +1676,6 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t > req_features) > struct virtio_hw *hw = eth_dev->data->dev_private; > struct virtio_net_config *config; > struct virtio_net_config local_config; > - struct rte_pci_device *pci_dev = NULL; > int ret; > > /* Reset the device although not necessary at startup */ > @@ -1697,9 +1696,6 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t > req_features) > > hw->weak_barriers = !vtpci_with_feature(hw, VIRTIO_F_ORDER_PLATFORM); > > - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == > VIRTIO_BUS_PCI_MODERN) > - pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); > - > /* If host does not support both status and MSI-X then disable LSC */ > if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS) && > hw->use_msix != VIRTIO_MSIX_NONE) > @@ -1828,45 +1824,9 @@ virtio_init_device(struct rte_eth_dev *eth_dev, > uint64_t req_features) > > vtpci_reinit_complete(hw); > > - if (pci_dev) > - PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x", > - eth_dev->data->port_id, pci_dev->id.vendor_id, > - pci_dev->id.device_id); > - > return 0; > } > > -/* > - * Remap the PCI device again (IO port map for legacy device and > - * memory map for modern device), so that the secondary process > - * could have the PCI initiated correctly. > - */ > -static int > -virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw) > -{ > - if (hw->bus_type == VIRTIO_BUS_PCI_MODERN) { > - /* > - * We don't have to re-parse the PCI config space, since > - * rte_pci_map_device() makes sure the mapped address > - * in secondary process would equal to the one mapped in > - * the primary process: error will be returned if that > - * requirement is not met. > - * > - * That said, we could simply reuse all cap pointers > - * (such as dev_cfg, common_cfg, etc.) parsed from the > - * primary process, which is stored in shared memory. > - */ > - if (rte_pci_map_device(pci_dev)) { > - PMD_INIT_LOG(DEBUG, "failed to map pci device!"); > - return -1; > - } > - } else if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) { > - if (rte_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0) > - return -1; > - } > - > - return 0; > -} > > static void > virtio_set_vtpci_ops(struct virtio_hw *hw) > @@ -1906,17 +1866,11 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) > eth_dev->rx_descriptor_done = virtio_dev_rx_queue_done; > > if (rte_eal_process_type() == RTE_PROC_SECONDARY) { > - if (hw->bus_type != VIRTIO_BUS_USER) { > - ret = virtio_remap_pci(RTE_ETH_DEV_TO_PCI(eth_dev), hw); > - if (ret) > - return ret; > - } > - > virtio_set_vtpci_ops(hw); > set_rxtx_funcs(eth_dev); > - > return 0; > } > + > ret = virtio_dev_devargs_parse(eth_dev->device->devargs, &speed, > &vectorized); > if (ret < 0) > return ret; > @@ -1933,15 +1887,6 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) > } > > hw->port_id = eth_dev->data->port_id; > - /* For virtio_user case the hw->virtio_user_dev is populated by > - * virtio_user_eth_dev_alloc() before eth_virtio_dev_init() is called. > - */ > - if (hw->bus_type != VIRTIO_BUS_USER) { > - ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw); > - if (ret) > - goto err_vtpci_init; > - } > - > rte_spinlock_init(&hw->state_lock); > > /* reset device and negotiate default features */ > @@ -1968,12 +1913,6 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) > return 0; > > err_virtio_init: > - if (hw->bus_type == VIRTIO_BUS_PCI_MODERN || hw->bus_type == > VIRTIO_BUS_PCI_LEGACY) { > - rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(eth_dev)); > - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) > - rte_pci_ioport_unmap(VTPCI_IO(hw)); > - } > -err_vtpci_init: > rte_free(eth_dev->data->mac_addrs); > eth_dev->data->mac_addrs = NULL; > return ret; > diff --git a/drivers/net/virtio/virtio_pci_ethdev.c > b/drivers/net/virtio/virtio_pci_ethdev.c > index 9c0935068e..d6cbe582d2 100644 > --- a/drivers/net/virtio/virtio_pci_ethdev.c > +++ b/drivers/net/virtio/virtio_pci_ethdev.c > @@ -32,10 +32,79 @@ static const struct rte_pci_id pci_id_virtio_map[] = { > { .vendor_id = 0, /* sentinel */ }, > }; > > + > +/* > + * Remap the PCI device again (IO port map for legacy device and > + * memory map for modern device), so that the secondary process > + * could have the PCI initiated correctly. > + */ > +static int > +virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw) > +{ > + if (hw->bus_type == VIRTIO_BUS_PCI_MODERN) { > + /* > + * We don't have to re-parse the PCI config space, since > + * rte_pci_map_device() makes sure the mapped address > + * in secondary process would equal to the one mapped in > + * the primary process: error will be returned if that > + * requirement is not met. > + * > + * That said, we could simply reuse all cap pointers > + * (such as dev_cfg, common_cfg, etc.) parsed from the > + * primary process, which is stored in shared memory. > + */ > + if (rte_pci_map_device(pci_dev)) { > + PMD_INIT_LOG(DEBUG, "failed to map pci device!"); > + return -1; > + } > + } else if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) { > + if (rte_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0) > + return -1; > + } > + > + return 0; > +} > + > static int > eth_virtio_pci_init(struct rte_eth_dev *eth_dev) > { > - return eth_virtio_dev_init(eth_dev); > + struct virtio_pci_dev *dev = eth_dev->data->dev_private; > + struct virtio_hw *hw = &dev->hw; > + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); > + int ret; > + > + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { > + ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw); > + if (ret) { > + PMD_INIT_LOG(ERR, "Failed to init PCI device\n"); > + return -1; > + } > + } else { > + ret = virtio_remap_pci(RTE_ETH_DEV_TO_PCI(eth_dev), hw); > + if (ret < 0) { > + PMD_INIT_LOG(ERR, "Failed to remap PCI device\n"); > + return -1; > + } > + } > + > + ret = eth_virtio_dev_init(eth_dev); > + if (ret < 0) { > + PMD_INIT_LOG(ERR, "Failed to init virtio device\n"); > + goto err_unmap; > + } > + > + PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x", > + eth_dev->data->port_id, pci_dev->id.vendor_id, > + pci_dev->id.device_id); > + > + return 0; > + > +err_unmap: > + rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(eth_dev)); > + if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) > + rte_pci_ioport_unmap(VTPCI_IO(hw)); > + > + return ret; > } > > static int > -- > 2.29.2
Reviewed-by: Chenbo Xia <chenbo....@intel.com>