All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/9] Decouple ethdev from PCI device
@ 2016-12-20 11:11 Jan Blunck
  2016-12-20 11:11 ` [PATCH v3 1/9] eal: define container_of macro Jan Blunck
                   ` (9 more replies)
  0 siblings, 10 replies; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen

This is a repost of the series I sent in November. I've addressed Shreyansh's
review comments about the PCI device users I've missed.

Jan Blunck (9):
  eal: define container_of macro
  ethdev: Helper to convert to struct rte_pci_device
  drivers: Use ETH_DEV_PCI_DEV() helper
  virtio: Don't fill dev_info->driver_name
  virtio: Add vtpci_intr_handle() helper to get rte_intr_handle
  virtio: Don't depend on struct rte_eth_dev's pci_dev
  ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get()
  ethdev: Decouple interrupt handling from PCI device
  ethdev: Decouple struct rte_eth_dev from struct rte_pci_device

 app/test/virtual_pmd.c                     |  4 +-
 drivers/net/bnx2x/bnx2x_ethdev.c           | 13 +++---
 drivers/net/bnxt/bnxt_ethdev.c             | 21 ++++++----
 drivers/net/bnxt/bnxt_ring.c               | 11 ++---
 drivers/net/bonding/rte_eth_bond_args.c    | 12 +++++-
 drivers/net/cxgbe/cxgbe_ethdev.c           |  4 +-
 drivers/net/cxgbe/cxgbe_main.c             |  4 +-
 drivers/net/e1000/em_ethdev.c              | 21 ++++++----
 drivers/net/e1000/igb_ethdev.c             | 52 +++++++++++++----------
 drivers/net/e1000/igb_pf.c                 |  3 +-
 drivers/net/ena/ena_ethdev.c               |  4 +-
 drivers/net/enic/enic_ethdev.c             |  3 +-
 drivers/net/fm10k/fm10k_ethdev.c           | 56 +++++++++++++------------
 drivers/net/i40e/i40e_ethdev.c             | 45 ++++++++++----------
 drivers/net/i40e/i40e_ethdev.h             |  4 ++
 drivers/net/i40e/i40e_ethdev_vf.c          | 39 ++++++++---------
 drivers/net/ixgbe/ixgbe_ethdev.c           | 67 ++++++++++++++++++------------
 drivers/net/ixgbe/ixgbe_pf.c               |  2 +-
 drivers/net/mlx4/mlx4.c                    |  2 +
 drivers/net/mlx5/mlx5_ethdev.c             |  2 +
 drivers/net/nfp/nfp_net.c                  | 17 ++++----
 drivers/net/qede/qede_ethdev.c             | 18 ++++----
 drivers/net/szedata2/rte_eth_szedata2.c    | 28 +++++++------
 drivers/net/szedata2/rte_eth_szedata2.h    | 34 +++++++--------
 drivers/net/thunderx/nicvf_ethdev.c        |  7 +++-
 drivers/net/virtio/virtio_ethdev.c         | 38 ++++++++---------
 drivers/net/virtio/virtio_pci.h            |  6 +++
 drivers/net/virtio/virtio_user_ethdev.c    |  1 -
 drivers/net/vmxnet3/vmxnet3_ethdev.c       |  6 ++-
 lib/librte_eal/common/include/rte_common.h | 20 +++++++++
 lib/librte_eal/common/include/rte_pci.h    |  6 +++
 lib/librte_ether/rte_ethdev.c              | 25 ++++++++---
 lib/librte_ether/rte_ethdev.h              |  9 +++-
 33 files changed, 355 insertions(+), 229 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 1/9] eal: define container_of macro
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
@ 2016-12-20 11:11 ` Jan Blunck
  2016-12-20 11:11 ` [PATCH v3 2/9] ethdev: Helper to convert to struct rte_pci_device Jan Blunck
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen, Jan Viktorin

This macro is based on Jan Viktorin's original patch but also checks the
type of the passed pointer against the type of the member.

Signed-off-by: Jan Viktorin <viktorin@rehivetech.com>
Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
[jblunck@infradead.org: add type checking and __extension__]
Signed-off-by: Jan Blunck <jblunck@infradead.org>
---
 lib/librte_eal/common/include/rte_common.h | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/lib/librte_eal/common/include/rte_common.h b/lib/librte_eal/common/include/rte_common.h
index db5ac91..8dda3e2 100644
--- a/lib/librte_eal/common/include/rte_common.h
+++ b/lib/librte_eal/common/include/rte_common.h
@@ -331,6 +331,26 @@ rte_bsf32(uint32_t v)
 #define offsetof(TYPE, MEMBER)  __builtin_offsetof (TYPE, MEMBER)
 #endif
 
+/**
+ * Return pointer to the wrapping struct instance.
+ *
+ * Example:
+ *
+ *  struct wrapper {
+ *      ...
+ *      struct child c;
+ *      ...
+ *  };
+ *
+ *  struct child *x = obtain(...);
+ *  struct wrapper *w = container_of(x, struct wrapper, c);
+ */
+#ifndef container_of
+#define container_of(ptr, type, member)	__extension__ ({		\
+			typeof(((type *)0)->member) *_ptr = (ptr);	\
+			(type *)(((char *)_ptr) - offsetof(type, member)); })
+#endif
+
 #define _RTE_STR(x) #x
 /** Take a macro value and get a string version of it */
 #define RTE_STR(x) _RTE_STR(x)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v3 2/9] ethdev: Helper to convert to struct rte_pci_device
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
  2016-12-20 11:11 ` [PATCH v3 1/9] eal: define container_of macro Jan Blunck
@ 2016-12-20 11:11 ` Jan Blunck
  2016-12-20 15:38   ` Stephen Hemminger
  2016-12-20 11:11 ` [PATCH v3 3/9] drivers: Use ETH_DEV_PCI_DEV() helper Jan Blunck
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen

Signed-off-by: Jan Blunck <jblunck@infradead.org>
Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 lib/librte_ether/rte_ethdev.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 9678179..3adbb2b 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1644,6 +1644,12 @@ struct rte_eth_dev {
 	uint8_t attached; /**< Flag indicating the port is attached */
 } __rte_cache_aligned;
 
+/**
+ * @internal
+ * Helper for drivers that need to convert from rte_eth_dev to rte_pci_device.
+ */
+#define ETH_DEV_PCI_DEV(ptr) ((ptr)->pci_dev)
+
 struct rte_eth_dev_sriov {
 	uint8_t active;               /**< SRIOV is active with 16, 32 or 64 pools */
 	uint8_t nb_q_per_pool;        /**< rx queue number per pool */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v3 3/9] drivers: Use ETH_DEV_PCI_DEV() helper
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
  2016-12-20 11:11 ` [PATCH v3 1/9] eal: define container_of macro Jan Blunck
  2016-12-20 11:11 ` [PATCH v3 2/9] ethdev: Helper to convert to struct rte_pci_device Jan Blunck
@ 2016-12-20 11:11 ` Jan Blunck
  2016-12-21  9:50   ` Shreyansh Jain
  2016-12-20 11:11 ` [PATCH v3 4/9] virtio: Don't fill dev_info->driver_name Jan Blunck
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen

The drivers should not directly access the rte_eth_dev->pci_dev but use
a macro instead. This is a preparation for replacing the pci_dev with
a struct rte_device member in the future.

Signed-off-by: Jan Blunck <jblunck@infradead.org>
---
 drivers/net/bnx2x/bnx2x_ethdev.c        | 12 +++---
 drivers/net/bnxt/bnxt_ethdev.c          | 19 ++++++----
 drivers/net/bnxt/bnxt_ring.c            | 11 +++---
 drivers/net/cxgbe/cxgbe_ethdev.c        |  2 +-
 drivers/net/e1000/em_ethdev.c           | 20 ++++++----
 drivers/net/e1000/igb_ethdev.c          | 50 ++++++++++++++-----------
 drivers/net/e1000/igb_pf.c              |  3 +-
 drivers/net/ena/ena_ethdev.c            |  2 +-
 drivers/net/enic/enic_ethdev.c          |  2 +-
 drivers/net/fm10k/fm10k_ethdev.c        | 49 +++++++++++++------------
 drivers/net/i40e/i40e_ethdev.c          | 44 +++++++++++-----------
 drivers/net/i40e/i40e_ethdev.h          |  4 ++
 drivers/net/i40e/i40e_ethdev_vf.c       | 38 +++++++++----------
 drivers/net/ixgbe/ixgbe_ethdev.c        | 65 ++++++++++++++++++++-------------
 drivers/net/ixgbe/ixgbe_pf.c            |  2 +-
 drivers/net/nfp/nfp_net.c               | 16 ++++----
 drivers/net/qede/qede_ethdev.c          | 17 +++++----
 drivers/net/szedata2/rte_eth_szedata2.c | 27 +++++++-------
 drivers/net/szedata2/rte_eth_szedata2.h | 34 ++++++++---------
 drivers/net/thunderx/nicvf_ethdev.c     |  5 ++-
 drivers/net/vmxnet3/vmxnet3_ethdev.c    |  4 +-
 21 files changed, 234 insertions(+), 192 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index 0eae433..c331ccd 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -124,7 +124,7 @@ bnx2x_interrupt_handler(__rte_unused struct rte_intr_handle *handle, void *param
 	struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
 
 	bnx2x_interrupt_action(dev);
-	rte_intr_enable(&(dev->pci_dev->intr_handle));
+	rte_intr_enable(&(ETH_DEV_PCI_DEV(dev)->intr_handle));
 }
 
 /*
@@ -187,10 +187,10 @@ bnx2x_dev_start(struct rte_eth_dev *dev)
 	}
 
 	if (IS_PF(sc)) {
-		rte_intr_callback_register(&(dev->pci_dev->intr_handle),
+		rte_intr_callback_register(&sc->pci_dev->intr_handle,
 				bnx2x_interrupt_handler, (void *)dev);
 
-		if(rte_intr_enable(&(dev->pci_dev->intr_handle)))
+		if (rte_intr_enable(&sc->pci_dev->intr_handle))
 			PMD_DRV_LOG(ERR, "rte_intr_enable failed");
 	}
 
@@ -215,8 +215,8 @@ bnx2x_dev_stop(struct rte_eth_dev *dev)
 	PMD_INIT_FUNC_TRACE();
 
 	if (IS_PF(sc)) {
-		rte_intr_disable(&(dev->pci_dev->intr_handle));
-		rte_intr_callback_unregister(&(dev->pci_dev->intr_handle),
+		rte_intr_disable(&sc->pci_dev->intr_handle);
+		rte_intr_callback_unregister(&sc->pci_dev->intr_handle,
 				bnx2x_interrupt_handler, (void *)dev);
 	}
 
@@ -516,7 +516,7 @@ bnx2x_common_dev_init(struct rte_eth_dev *eth_dev, int is_vf)
 	PMD_INIT_FUNC_TRACE();
 
 	eth_dev->dev_ops = is_vf ? &bnx2xvf_eth_dev_ops : &bnx2x_eth_dev_ops;
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 035fe07..cd50f11 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -743,6 +743,7 @@ static int bnxt_reta_query_op(struct rte_eth_dev *eth_dev,
 {
 	struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
 	struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	/* Retrieve from the default VNIC */
 	if (!vnic)
@@ -759,7 +760,7 @@ static int bnxt_reta_query_op(struct rte_eth_dev *eth_dev,
 	/* EW - need to revisit here copying from u64 to u16 */
 	memcpy(reta_conf, vnic->rss_table, reta_size);
 
-	if (rte_intr_allow_others(&eth_dev->pci_dev->intr_handle)) {
+	if (rte_intr_allow_others(&pci_dev->intr_handle)) {
 		if (eth_dev->data->dev_conf.intr_conf.lsc != 0)
 			bnxt_dev_lsc_intr_setup(eth_dev);
 	}
@@ -1011,9 +1012,10 @@ static int bnxt_init_board(struct rte_eth_dev *eth_dev)
 {
 	int rc;
 	struct bnxt *bp = eth_dev->data->dev_private;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	/* enable device (incl. PCI PM wakeup), and bus-mastering */
-	if (!eth_dev->pci_dev->mem_resource[0].addr) {
+	if (!pci_dev->mem_resource[0].addr) {
 		RTE_LOG(ERR, PMD,
 			"Cannot find PCI device base address, aborting\n");
 		rc = -ENODEV;
@@ -1021,9 +1023,9 @@ static int bnxt_init_board(struct rte_eth_dev *eth_dev)
 	}
 
 	bp->eth_dev = eth_dev;
-	bp->pdev = eth_dev->pci_dev;
+	bp->pdev = pci_dev;
 
-	bp->bar0 = (void *)eth_dev->pci_dev->mem_resource[0].addr;
+	bp->bar0 = (void *)pci_dev->mem_resource[0].addr;
 	if (!bp->bar0) {
 		RTE_LOG(ERR, PMD, "Cannot map device registers, aborting\n");
 		rc = -ENOMEM;
@@ -1043,6 +1045,7 @@ static int bnxt_init_board(struct rte_eth_dev *eth_dev)
 static int
 bnxt_dev_init(struct rte_eth_dev *eth_dev)
 {
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 	static int version_printed;
 	struct bnxt *bp;
 	int rc;
@@ -1050,10 +1053,10 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
 	if (version_printed++ == 0)
 		RTE_LOG(INFO, PMD, "%s", bnxt_version);
 
-	rte_eth_copy_pci_info(eth_dev, eth_dev->pci_dev);
+	rte_eth_copy_pci_info(eth_dev, pci_dev);
 	bp = eth_dev->data->dev_private;
 
-	if (bnxt_vf_pciid(eth_dev->pci_dev->id.device_id))
+	if (bnxt_vf_pciid(pci_dev->id.device_id))
 		bp->flags |= BNXT_FLAG_VF;
 
 	rc = bnxt_init_board(eth_dev);
@@ -1121,8 +1124,8 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
 
 	RTE_LOG(INFO, PMD,
 		DRV_MODULE_NAME " found at mem %" PRIx64 ", node addr %pM\n",
-		eth_dev->pci_dev->mem_resource[0].phys_addr,
-		eth_dev->pci_dev->mem_resource[0].addr);
+		pci_dev->mem_resource[0].phys_addr,
+		pci_dev->mem_resource[0].addr);
 
 	bp->dev_stopped = 0;
 
diff --git a/drivers/net/bnxt/bnxt_ring.c b/drivers/net/bnxt/bnxt_ring.c
index 3f81ffc..6793d75 100644
--- a/drivers/net/bnxt/bnxt_ring.c
+++ b/drivers/net/bnxt/bnxt_ring.c
@@ -209,6 +209,7 @@ int bnxt_alloc_rings(struct bnxt *bp, uint16_t qidx,
  */
 int bnxt_alloc_hwrm_rings(struct bnxt *bp)
 {
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(bp->eth_dev);
 	unsigned int i;
 	int rc = 0;
 
@@ -223,7 +224,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *bp)
 		if (rc)
 			goto err_out;
 		cpr->cp_doorbell =
-		    (char *)bp->eth_dev->pci_dev->mem_resource[2].addr;
+		    (char *)pci_dev->mem_resource[2].addr;
 		B_CP_DIS_DB(cpr, cpr->cp_raw_cons);
 		bp->grp_info[0].cp_fw_ring_id = cp_ring->fw_ring_id;
 	}
@@ -243,7 +244,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *bp)
 		if (rc)
 			goto err_out;
 		cpr->cp_doorbell =
-		    (char *)bp->eth_dev->pci_dev->mem_resource[2].addr +
+		    (char *)pci_dev->mem_resource[2].addr +
 		    idx * 0x80;
 		bp->grp_info[idx].cp_fw_ring_id = cp_ring->fw_ring_id;
 		B_CP_DIS_DB(cpr, cpr->cp_raw_cons);
@@ -256,7 +257,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *bp)
 			goto err_out;
 		rxr->rx_prod = 0;
 		rxr->rx_doorbell =
-		    (char *)bp->eth_dev->pci_dev->mem_resource[2].addr +
+		    (char *)pci_dev->mem_resource[2].addr +
 		    idx * 0x80;
 		bp->grp_info[idx].rx_fw_ring_id = ring->fw_ring_id;
 		B_RX_DB(rxr->rx_doorbell, rxr->rx_prod);
@@ -284,7 +285,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *bp)
 			goto err_out;
 
 		cpr->cp_doorbell =
-		    (char *)bp->eth_dev->pci_dev->mem_resource[2].addr +
+		    (char *)pci_dev->mem_resource[2].addr +
 		    idx * 0x80;
 		bp->grp_info[idx].cp_fw_ring_id = cp_ring->fw_ring_id;
 		B_CP_DIS_DB(cpr, cpr->cp_raw_cons);
@@ -297,7 +298,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *bp)
 			goto err_out;
 
 		txr->tx_doorbell =
-		    (char *)bp->eth_dev->pci_dev->mem_resource[2].addr +
+		    (char *)pci_dev->mem_resource[2].addr +
 		    idx * 0x80;
 	}
 
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index b7f28eb..8bfdda8 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -1005,7 +1005,7 @@ static int eth_cxgbe_dev_init(struct rte_eth_dev *eth_dev)
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	snprintf(name, sizeof(name), "cxgbeadapter%d", eth_dev->data->port_id);
 	adapter = rte_zmalloc(name, sizeof(*adapter), 0);
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index aee3d34..7f2f521 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -295,7 +295,7 @@ eth_em_dev_init(struct rte_eth_dev *eth_dev)
 	struct e1000_vfta * shadow_vfta =
 		E1000_DEV_PRIVATE_TO_VFTA(eth_dev->data->dev_private);
 
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	eth_dev->dev_ops = &eth_em_ops;
 	eth_dev->rx_pkt_burst = (eth_rx_burst_t)&eth_em_recv_pkts;
@@ -369,7 +369,7 @@ eth_em_dev_uninit(struct rte_eth_dev *eth_dev)
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return -EPERM;
 
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	if (adapter->stopped == 0)
 		eth_em_close(eth_dev);
@@ -556,7 +556,8 @@ eth_em_start(struct rte_eth_dev *dev)
 		E1000_DEV_PRIVATE(dev->data->dev_private);
 	struct e1000_hw *hw =
 		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
+	struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 	int ret, mask;
 	uint32_t intr_vector = 0;
 	uint32_t *speeds;
@@ -738,7 +739,8 @@ eth_em_stop(struct rte_eth_dev *dev)
 {
 	struct rte_eth_link link;
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
+	struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 
 	em_rxq_intr_disable(hw);
 	em_lsc_intr_disable(hw);
@@ -999,9 +1001,10 @@ static int
 eth_em_rx_queue_intr_enable(struct rte_eth_dev *dev, __rte_unused uint16_t queue_id)
 {
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	em_rxq_intr_enable(hw);
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(&pci_dev->intr_handle);
 
 	return 0;
 }
@@ -1542,6 +1545,7 @@ eth_em_interrupt_action(struct rte_eth_dev *dev)
 		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct e1000_interrupt *intr =
 		E1000_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 	uint32_t tctl, rctl;
 	struct rte_eth_link link;
 	int ret;
@@ -1550,7 +1554,7 @@ eth_em_interrupt_action(struct rte_eth_dev *dev)
 		return -1;
 
 	intr->flags &= ~E1000_FLAG_NEED_LINK_UPDATE;
-	rte_intr_enable(&(dev->pci_dev->intr_handle));
+	rte_intr_enable(&pci_dev->intr_handle);
 
 	/* set get_link_status to check register later */
 	hw->mac.get_link_status = 1;
@@ -1571,8 +1575,8 @@ eth_em_interrupt_action(struct rte_eth_dev *dev)
 		PMD_INIT_LOG(INFO, " Port %d: Link Down", dev->data->port_id);
 	}
 	PMD_INIT_LOG(DEBUG, "PCI Address: %04d:%02d:%02d:%d",
-		     dev->pci_dev->addr.domain, dev->pci_dev->addr.bus,
-		     dev->pci_dev->addr.devid, dev->pci_dev->addr.function);
+		     pci_dev->addr.domain, pci_dev->addr.bus,
+		     pci_dev->addr.devid, pci_dev->addr.function);
 
 	tctl = E1000_READ_REG(hw, E1000_TCTL);
 	rctl = E1000_READ_REG(hw, E1000_RCTL);
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index 2fddf0c..b25c66e 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -672,11 +672,11 @@ igb_identify_hardware(struct rte_eth_dev *dev)
 {
 	struct e1000_hw *hw =
 		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-	hw->vendor_id = dev->pci_dev->id.vendor_id;
-	hw->device_id = dev->pci_dev->id.device_id;
-	hw->subsystem_vendor_id = dev->pci_dev->id.subsystem_vendor_id;
-	hw->subsystem_device_id = dev->pci_dev->id.subsystem_device_id;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
+	hw->vendor_id = pci_dev->id.vendor_id;
+	hw->device_id = pci_dev->id.device_id;
+	hw->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id;
+	hw->subsystem_device_id = pci_dev->id.subsystem_device_id;
 
 	e1000_set_mac_type(hw);
 
@@ -755,7 +755,7 @@ eth_igb_dev_init(struct rte_eth_dev *eth_dev)
 
 	uint32_t ctrl_ext;
 
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	eth_dev->dev_ops = &eth_igb_ops;
 	eth_dev->rx_pkt_burst = &eth_igb_recv_pkts;
@@ -918,7 +918,7 @@ eth_igb_dev_uninit(struct rte_eth_dev *eth_dev)
 		return -EPERM;
 
 	hw = E1000_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	if (adapter->stopped == 0)
 		eth_igb_close(eth_dev);
@@ -973,7 +973,7 @@ eth_igbvf_dev_init(struct rte_eth_dev *eth_dev)
 		return 0;
 	}
 
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 
@@ -1050,7 +1050,7 @@ eth_igbvf_dev_uninit(struct rte_eth_dev *eth_dev)
 {
 	struct e1000_adapter *adapter =
 		E1000_DEV_PRIVATE(eth_dev->data->dev_private);
-	struct rte_pci_device *pci_dev = eth_dev->pci_dev;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -1217,7 +1217,8 @@ eth_igb_start(struct rte_eth_dev *dev)
 		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct e1000_adapter *adapter =
 		E1000_DEV_PRIVATE(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle =
+		&ETH_DEV_PCI_DEV(dev)->intr_handle;
 	int ret, mask;
 	uint32_t intr_vector = 0;
 	uint32_t ctrl_ext;
@@ -1429,7 +1430,8 @@ eth_igb_stop(struct rte_eth_dev *dev)
 	struct e1000_flex_filter *p_flex;
 	struct e1000_5tuple_filter *p_5tuple, *p_5tuple_next;
 	struct e1000_2tuple_filter *p_2tuple, *p_2tuple_next;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle =
+		&ETH_DEV_PCI_DEV(dev)->intr_handle;
 
 	igb_intr_disable(hw);
 
@@ -1549,7 +1551,7 @@ eth_igb_close(struct rte_eth_dev *dev)
 
 	igb_dev_free_queues(dev);
 
-	pci_dev = dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(dev);
 	if (pci_dev->intr_handle.intr_vec) {
 		rte_free(pci_dev->intr_handle.intr_vec);
 		pci_dev->intr_handle.intr_vec = NULL;
@@ -2639,6 +2641,7 @@ eth_igb_interrupt_action(struct rte_eth_dev *dev)
 		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct e1000_interrupt *intr =
 		E1000_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 	uint32_t tctl, rctl;
 	struct rte_eth_link link;
 	int ret;
@@ -2649,7 +2652,7 @@ eth_igb_interrupt_action(struct rte_eth_dev *dev)
 	}
 
 	igb_intr_enable(dev);
-	rte_intr_enable(&(dev->pci_dev->intr_handle));
+	rte_intr_enable(&pci_dev->intr_handle);
 
 	if (intr->flags & E1000_FLAG_NEED_LINK_UPDATE) {
 		intr->flags &= ~E1000_FLAG_NEED_LINK_UPDATE;
@@ -2677,10 +2680,10 @@ eth_igb_interrupt_action(struct rte_eth_dev *dev)
 		}
 
 		PMD_INIT_LOG(DEBUG, "PCI Address: %04d:%02d:%02d:%d",
-			     dev->pci_dev->addr.domain,
-			     dev->pci_dev->addr.bus,
-			     dev->pci_dev->addr.devid,
-			     dev->pci_dev->addr.function);
+			     pci_dev->addr.domain,
+			     pci_dev->addr.bus,
+			     pci_dev->addr.devid,
+			     pci_dev->addr.function);
 		tctl = E1000_READ_REG(hw, E1000_TCTL);
 		rctl = E1000_READ_REG(hw, E1000_RCTL);
 		if (link.link_status) {
@@ -2770,7 +2773,7 @@ eth_igbvf_interrupt_action(struct rte_eth_dev *dev)
 	}
 
 	igbvf_intr_enable(dev);
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(&ETH_DEV_PCI_DEV(dev)->intr_handle);
 
 	return 0;
 }
@@ -3056,7 +3059,8 @@ igbvf_dev_start(struct rte_eth_dev *dev)
 	struct e1000_adapter *adapter =
 		E1000_DEV_PRIVATE(dev->data->dev_private);
 	int ret;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle =
+		&ETH_DEV_PCI_DEV(dev)->intr_handle;
 	uint32_t intr_vector = 0;
 
 	PMD_INIT_FUNC_TRACE();
@@ -3110,7 +3114,8 @@ igbvf_dev_start(struct rte_eth_dev *dev)
 static void
 igbvf_dev_stop(struct rte_eth_dev *dev)
 {
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle =
+		&ETH_DEV_PCI_DEV(dev)->intr_handle;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -5102,7 +5107,7 @@ eth_igb_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 	E1000_WRITE_REG(hw, E1000_EIMS, regval | mask);
 	E1000_WRITE_FLUSH(hw);
 
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(&ETH_DEV_PCI_DEV(dev)->intr_handle);
 
 	return 0;
 }
@@ -5167,7 +5172,8 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
 	uint32_t base = E1000_MISC_VEC_ID;
 	uint32_t misc_shift = 0;
 
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle =
+		&ETH_DEV_PCI_DEV(dev)->intr_handle;
 
 	/* won't configure msix register if no mapping is done
 	 * between intr vector and event fd
diff --git a/drivers/net/e1000/igb_pf.c b/drivers/net/e1000/igb_pf.c
index 5845bc2..6a72ee1 100644
--- a/drivers/net/e1000/igb_pf.c
+++ b/drivers/net/e1000/igb_pf.c
@@ -57,7 +57,8 @@
 static inline uint16_t
 dev_num_vf(struct rte_eth_dev *eth_dev)
 {
-	return eth_dev->pci_dev->max_vfs;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(eth_dev);
+	return pci_dev->max_vfs;
 }
 
 static inline
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index ab9a178..c17d969 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -1278,7 +1278,7 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 	adapter->pdev = pci_dev;
 
 	PMD_INIT_LOG(INFO, "Initializing %x:%x:%x.%d\n",
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index 2b154ec..553a88e 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -621,7 +621,7 @@ static int eth_enicpmd_dev_init(struct rte_eth_dev *eth_dev)
 	eth_dev->rx_pkt_burst = &enic_recv_pkts;
 	eth_dev->tx_pkt_burst = &enic_xmit_pkts;
 
-	pdev = eth_dev->pci_dev;
+	pdev = ETH_DEV_PCI_DEV(eth_dev);
 	rte_eth_copy_pci_info(eth_dev, pdev);
 	enic->pdev = pdev;
 	addr = &pdev->addr;
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index 923690c..e1250f6 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -59,7 +59,8 @@
 #define BIT_MASK_PER_UINT32 ((1 << CHARS_PER_UINT32) - 1)
 
 /* default 1:1 map from queue ID to interrupt vector ID */
-#define Q2V(dev, queue_id) (dev->pci_dev->intr_handle.intr_vec[queue_id])
+#define D2IH(dev) (&ETH_DEV_PCI_DEV(dev)->intr_handle)
+#define Q2V(dev, queue_id) (D2IH(dev)->intr_vec[queue_id])
 
 /* First 64 Logical ports for PF/VMDQ, second 64 for Flow director */
 #define MAX_LPORT_NUM    128
@@ -711,7 +712,7 @@ fm10k_dev_rx_init(struct rte_eth_dev *dev)
 {
 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct fm10k_macvlan_filter_info *macvlan;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = D2IH(dev);
 	int i, ret;
 	struct fm10k_rx_queue *rxq;
 	uint64_t base_addr;
@@ -1171,7 +1172,7 @@ static void
 fm10k_dev_stop(struct rte_eth_dev *dev)
 {
 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = D2IH(dev);
 	int i;
 
 	PMD_INIT_FUNC_TRACE();
@@ -1387,6 +1388,7 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,
 	struct rte_eth_dev_info *dev_info)
 {
 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -1396,7 +1398,7 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,
 	dev_info->max_tx_queues      = hw->mac.max_queues;
 	dev_info->max_mac_addrs      = FM10K_MAX_MACADDR_NUM;
 	dev_info->max_hash_mac_addrs = 0;
-	dev_info->max_vfs            = dev->pci_dev->max_vfs;
+	dev_info->max_vfs            = pci_dev->max_vfs;
 	dev_info->vmdq_pool_base     = 0;
 	dev_info->vmdq_queue_base    = 0;
 	dev_info->max_vmdq_pools     = ETH_32_POOLS;
@@ -2341,7 +2343,7 @@ fm10k_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 	else
 		FM10K_WRITE_REG(hw, FM10K_VFITR(Q2V(dev, queue_id)),
 			FM10K_ITR_AUTOMASK | FM10K_ITR_MASK_CLEAR);
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(D2IH(dev));
 	return 0;
 }
 
@@ -2364,7 +2366,7 @@ static int
 fm10k_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
 {
 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = D2IH(dev);
 	uint32_t intr_vector, vec;
 	uint16_t queue_id;
 	int result = 0;
@@ -2380,7 +2382,7 @@ fm10k_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
 	intr_vector = dev->data->nb_rx_queues;
 
 	/* disable interrupt first */
-	rte_intr_disable(&dev->pci_dev->intr_handle);
+	rte_intr_disable(intr_handle);
 	if (hw->mac.type == fm10k_mac_pf)
 		fm10k_dev_disable_intr_pf(dev);
 	else
@@ -2415,7 +2417,7 @@ fm10k_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
 		fm10k_dev_enable_intr_pf(dev);
 	else
 		fm10k_dev_enable_intr_vf(dev);
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(intr_handle);
 	hw->mac.ops.update_int_moderator(hw);
 	return result;
 }
@@ -2581,7 +2583,7 @@ fm10k_dev_interrupt_handler_pf(
 	FM10K_WRITE_REG(hw, FM10K_ITR(0), FM10K_ITR_AUTOMASK |
 					FM10K_ITR_MASK_CLEAR);
 	/* Re-enable interrupt from host side */
-	rte_intr_enable(&(dev->pci_dev->intr_handle));
+	rte_intr_enable(D2IH(dev));
 }
 
 /**
@@ -2615,7 +2617,7 @@ fm10k_dev_interrupt_handler_vf(
 	FM10K_WRITE_REG(hw, FM10K_VFITR(0), FM10K_ITR_AUTOMASK |
 					FM10K_ITR_MASK_CLEAR);
 	/* Re-enable interrupt from host side */
-	rte_intr_enable(&(dev->pci_dev->intr_handle));
+	rte_intr_enable(D2IH(dev));
 }
 
 /* Mailbox message handler in VF */
@@ -2827,6 +2829,7 @@ static int
 eth_fm10k_dev_init(struct rte_eth_dev *dev)
 {
 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 	int diag, i;
 	struct fm10k_macvlan_filter_info *macvlan;
 
@@ -2840,18 +2843,18 @@ eth_fm10k_dev_init(struct rte_eth_dev *dev)
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
-	rte_eth_copy_pci_info(dev, dev->pci_dev);
+	rte_eth_copy_pci_info(dev, pci_dev);
 
 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
 	memset(macvlan, 0, sizeof(*macvlan));
 	/* Vendor and Device ID need to be set before init of shared code */
 	memset(hw, 0, sizeof(*hw));
-	hw->device_id = dev->pci_dev->id.device_id;
-	hw->vendor_id = dev->pci_dev->id.vendor_id;
-	hw->subsystem_device_id = dev->pci_dev->id.subsystem_device_id;
-	hw->subsystem_vendor_id = dev->pci_dev->id.subsystem_vendor_id;
+	hw->device_id = pci_dev->id.device_id;
+	hw->vendor_id = pci_dev->id.vendor_id;
+	hw->subsystem_device_id = pci_dev->id.subsystem_device_id;
+	hw->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id;
 	hw->revision_id = 0;
-	hw->hw_addr = (void *)dev->pci_dev->mem_resource[0].addr;
+	hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
 	if (hw->hw_addr == NULL) {
 		PMD_INIT_LOG(ERR, "Bad mem resource."
 			" Try to blacklist unused devices.");
@@ -2921,20 +2924,20 @@ eth_fm10k_dev_init(struct rte_eth_dev *dev)
 	/*PF/VF has different interrupt handling mechanism */
 	if (hw->mac.type == fm10k_mac_pf) {
 		/* register callback func to eal lib */
-		rte_intr_callback_register(&(dev->pci_dev->intr_handle),
+		rte_intr_callback_register(D2IH(dev),
 			fm10k_dev_interrupt_handler_pf, (void *)dev);
 
 		/* enable MISC interrupt */
 		fm10k_dev_enable_intr_pf(dev);
 	} else { /* VF */
-		rte_intr_callback_register(&(dev->pci_dev->intr_handle),
+		rte_intr_callback_register(D2IH(dev),
 			fm10k_dev_interrupt_handler_vf, (void *)dev);
 
 		fm10k_dev_enable_intr_vf(dev);
 	}
 
 	/* Enable intr after callback registered */
-	rte_intr_enable(&(dev->pci_dev->intr_handle));
+	rte_intr_enable(D2IH(dev));
 
 	hw->mac.ops.update_int_moderator(hw);
 
@@ -3004,7 +3007,7 @@ static int
 eth_fm10k_dev_uninit(struct rte_eth_dev *dev)
 {
 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
+	struct rte_intr_handle *intr_handle = D2IH(dev);
 	PMD_INIT_FUNC_TRACE();
 
 	/* only uninitialize in the primary process */
@@ -3019,7 +3022,7 @@ eth_fm10k_dev_uninit(struct rte_eth_dev *dev)
 	dev->tx_pkt_burst = NULL;
 
 	/* disable uio/vfio intr */
-	rte_intr_disable(&(dev->pci_dev->intr_handle));
+	rte_intr_disable(intr_handle);
 
 	/*PF/VF has different interrupt handling mechanism */
 	if (hw->mac.type == fm10k_mac_pf) {
@@ -3027,13 +3030,13 @@ eth_fm10k_dev_uninit(struct rte_eth_dev *dev)
 		fm10k_dev_disable_intr_pf(dev);
 
 		/* unregister callback func to eal lib */
-		rte_intr_callback_unregister(&(dev->pci_dev->intr_handle),
+		rte_intr_callback_unregister(intr_handle,
 			fm10k_dev_interrupt_handler_pf, (void *)dev);
 	} else {
 		/* disable interrupt */
 		fm10k_dev_disable_intr_vf(dev);
 
-		rte_intr_callback_unregister(&(dev->pci_dev->intr_handle),
+		rte_intr_callback_unregister(intr_handle,
 			fm10k_dev_interrupt_handler_vf, (void *)dev);
 	}
 
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 67778ba..8a63a8c 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -907,7 +907,7 @@ is_floating_veb_supported(struct rte_devargs *devargs)
 static void
 config_floating_veb(struct rte_eth_dev *dev)
 {
-	struct rte_pci_device *pci_dev = dev->pci_dev;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
@@ -952,7 +952,7 @@ eth_i40e_dev_init(struct rte_eth_dev *dev)
 		i40e_set_tx_function(dev);
 		return 0;
 	}
-	pci_dev = dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	rte_eth_copy_pci_info(dev, pci_dev);
 
@@ -1215,7 +1215,7 @@ eth_i40e_dev_uninit(struct rte_eth_dev *dev)
 		return 0;
 
 	hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	pci_dev = dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	if (hw->adapter_stopped == 0)
 		i40e_dev_close(dev);
@@ -1335,7 +1335,7 @@ void
 i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi)
 {
 	struct rte_eth_dev *dev = vsi->adapter->eth_dev;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
 	uint16_t msix_vect = vsi->msix_intr;
 	uint16_t i;
@@ -1448,7 +1448,7 @@ void
 i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi)
 {
 	struct rte_eth_dev *dev = vsi->adapter->eth_dev;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
 	uint16_t msix_vect = vsi->msix_intr;
 	uint16_t nb_msix = RTE_MIN(vsi->nb_msix, intr_handle->nb_efd);
@@ -1519,7 +1519,7 @@ static void
 i40e_vsi_enable_queues_intr(struct i40e_vsi *vsi)
 {
 	struct rte_eth_dev *dev = vsi->adapter->eth_dev;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
 	uint16_t interval = i40e_calc_itr_interval(\
 		RTE_LIBRTE_I40E_ITR_INTERVAL);
@@ -1550,7 +1550,7 @@ static void
 i40e_vsi_disable_queues_intr(struct i40e_vsi *vsi)
 {
 	struct rte_eth_dev *dev = vsi->adapter->eth_dev;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);
 	uint16_t msix_intr, i;
 
@@ -1675,7 +1675,7 @@ i40e_dev_start(struct rte_eth_dev *dev)
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct i40e_vsi *main_vsi = pf->main_vsi;
 	int ret, i;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	uint32_t intr_vector = 0;
 
 	hw->adapter_stopped = 0;
@@ -1808,7 +1808,7 @@ i40e_dev_stop(struct rte_eth_dev *dev)
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct i40e_vsi *main_vsi = pf->main_vsi;
 	struct i40e_mirror_rule *p_mirror;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	int i;
 
 	/* Disable all queues */
@@ -1870,7 +1870,7 @@ i40e_dev_close(struct rte_eth_dev *dev)
 
 	/* Disable interrupt */
 	i40e_pf_disable_irq0(hw);
-	rte_intr_disable(&(dev->pci_dev->intr_handle));
+	rte_intr_disable(ETH_DEV_TO_INTR_HANDLE(dev));
 
 	/* shutdown and destroy the HMC */
 	i40e_shutdown_lan_hmc(hw);
@@ -2588,7 +2588,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
 	dev_info->max_rx_pktlen = I40E_FRAME_SIZE_MAX;
 	dev_info->max_mac_addrs = vsi->max_macaddrs;
-	dev_info->max_vfs = dev->pci_dev->max_vfs;
+	dev_info->max_vfs = ETH_DEV_PCI_DEV(dev)->max_vfs;
 	dev_info->rx_offload_capa =
 		DEV_RX_OFFLOAD_VLAN_STRIP |
 		DEV_RX_OFFLOAD_QINQ_STRIP |
@@ -3488,11 +3488,12 @@ i40e_get_cap(struct i40e_hw *hw)
 static int
 i40e_pf_parameter_init(struct rte_eth_dev *dev)
 {
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_PF_TO_HW(pf);
 	uint16_t qp_count = 0, vsi_count = 0;
 
-	if (dev->pci_dev->max_vfs && !hw->func_caps.sr_iov_1_1) {
+	if (pci_dev->max_vfs && !hw->func_caps.sr_iov_1_1) {
 		PMD_INIT_LOG(ERR, "HW configuration doesn't support SRIOV");
 		return -EINVAL;
 	}
@@ -3533,10 +3534,10 @@ i40e_pf_parameter_init(struct rte_eth_dev *dev)
 
 	/* VF queue/VSI allocation */
 	pf->vf_qp_offset = pf->lan_qp_offset + pf->lan_nb_qps;
-	if (hw->func_caps.sr_iov_1_1 && dev->pci_dev->max_vfs) {
+	if (hw->func_caps.sr_iov_1_1 && pci_dev->max_vfs) {
 		pf->flags |= I40E_FLAG_SRIOV;
 		pf->vf_nb_qps = RTE_LIBRTE_I40E_QUEUE_NUM_PER_VF;
-		pf->vf_num = dev->pci_dev->max_vfs;
+		pf->vf_num = pci_dev->max_vfs;
 		PMD_DRV_LOG(DEBUG, "%u VF VSIs, %u queues per VF VSI, "
 			    "in total %u queues", pf->vf_num, pf->vf_nb_qps,
 			    pf->vf_nb_qps * pf->vf_num);
@@ -5573,7 +5574,7 @@ i40e_dev_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
 done:
 	/* Enable interrupt */
 	i40e_pf_enable_irq0(hw);
-	rte_intr_enable(&(dev->pci_dev->intr_handle));
+	rte_intr_enable(ETH_DEV_TO_INTR_HANDLE(dev));
 }
 
 static int
@@ -8124,10 +8125,11 @@ i40e_dev_filter_ctrl(struct rte_eth_dev *dev,
 static void
 i40e_enable_extended_tag(struct rte_eth_dev *dev)
 {
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 	uint32_t buf = 0;
 	int ret;
 
-	ret = rte_eal_pci_read_config(dev->pci_dev, &buf, sizeof(buf),
+	ret = rte_eal_pci_read_config(pci_dev, &buf, sizeof(buf),
 				      PCI_DEV_CAP_REG);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, "Failed to read PCI offset 0x%x",
@@ -8140,7 +8142,7 @@ i40e_enable_extended_tag(struct rte_eth_dev *dev)
 	}
 
 	buf = 0;
-	ret = rte_eal_pci_read_config(dev->pci_dev, &buf, sizeof(buf),
+	ret = rte_eal_pci_read_config(pci_dev, &buf, sizeof(buf),
 				      PCI_DEV_CTRL_REG);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, "Failed to read PCI offset 0x%x",
@@ -8152,7 +8154,7 @@ i40e_enable_extended_tag(struct rte_eth_dev *dev)
 		return;
 	}
 	buf |= PCI_DEV_CTRL_EXT_TAG_MASK;
-	ret = rte_eal_pci_write_config(dev->pci_dev, &buf, sizeof(buf),
+	ret = rte_eal_pci_write_config(pci_dev, &buf, sizeof(buf),
 				       PCI_DEV_CTRL_REG);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, "Failed to write PCI offset 0x%x",
@@ -9555,7 +9557,7 @@ i40e_dev_get_dcb_info(struct rte_eth_dev *dev,
 static int
 i40e_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint16_t interval =
 		i40e_calc_itr_interval(RTE_LIBRTE_I40E_ITR_INTERVAL);
@@ -9580,7 +9582,7 @@ i40e_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 				I40E_PFINT_DYN_CTLN_INTERVAL_SHIFT));
 
 	I40E_WRITE_FLUSH(hw);
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(ETH_DEV_TO_INTR_HANDLE(dev));
 
 	return 0;
 }
@@ -9588,7 +9590,7 @@ i40e_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 static int
 i40e_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint16_t msix_intr;
 
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index 298cef4..9d4bea7 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -671,6 +671,10 @@ i40e_get_vsi_from_adapter(struct i40e_adapter *adapter)
 #define I40E_VF_TO_HW(vf) \
 	(&(((struct i40e_vf *)vf)->adapter->hw))
 
+/* ETH_DEV_TO_INTR_HANDLE */
+#define ETH_DEV_TO_INTR_HANDLE(ptr) \
+	(&(ETH_DEV_PCI_DEV(ptr)->intr_handle))
+
 static inline void
 i40e_init_adminq_parameter(struct i40e_hw *hw)
 {
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index aa306d6..781e658 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -718,7 +718,7 @@ i40evf_config_irq_map(struct rte_eth_dev *dev)
 	uint8_t cmd_buffer[sizeof(struct i40e_virtchnl_irq_map_info) + \
 		sizeof(struct i40e_virtchnl_vector_map)];
 	struct i40e_virtchnl_irq_map_info *map_info;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	uint32_t vector_id;
 	int i, err;
 
@@ -1431,7 +1431,7 @@ i40evf_dev_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
 
 done:
 	i40evf_enable_irq0(hw);
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(ETH_DEV_TO_INTR_HANDLE(dev));
 }
 
 static int
@@ -1439,7 +1439,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
 {
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(\
 			eth_dev->data->dev_private);
-	struct rte_pci_device *pci_dev = eth_dev->pci_dev;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -1458,15 +1458,15 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
 		return 0;
 	}
 
-	rte_eth_copy_pci_info(eth_dev, eth_dev->pci_dev);
+	rte_eth_copy_pci_info(eth_dev, pci_dev);
 
-	hw->vendor_id = eth_dev->pci_dev->id.vendor_id;
-	hw->device_id = eth_dev->pci_dev->id.device_id;
-	hw->subsystem_vendor_id = eth_dev->pci_dev->id.subsystem_vendor_id;
-	hw->subsystem_device_id = eth_dev->pci_dev->id.subsystem_device_id;
-	hw->bus.device = eth_dev->pci_dev->addr.devid;
-	hw->bus.func = eth_dev->pci_dev->addr.function;
-	hw->hw_addr = (void *)eth_dev->pci_dev->mem_resource[0].addr;
+	hw->vendor_id = pci_dev->id.vendor_id;
+	hw->device_id = pci_dev->id.device_id;
+	hw->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id;
+	hw->subsystem_device_id = pci_dev->id.subsystem_device_id;
+	hw->bus.device = pci_dev->addr.devid;
+	hw->bus.func = pci_dev->addr.function;
+	hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
 	hw->adapter_stopped = 0;
 
 	if(i40evf_init_vf(eth_dev) != 0) {
@@ -1853,7 +1853,7 @@ i40evf_enable_queues_intr(struct rte_eth_dev *dev)
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 
 	if (!rte_intr_allow_others(intr_handle)) {
 		I40E_WRITE_REG(hw,
@@ -1885,7 +1885,7 @@ i40evf_disable_queues_intr(struct rte_eth_dev *dev)
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 
 	if (!rte_intr_allow_others(intr_handle)) {
 		I40E_WRITE_REG(hw, I40E_VFINT_DYN_CTL01,
@@ -1911,7 +1911,7 @@ i40evf_disable_queues_intr(struct rte_eth_dev *dev)
 static int
 i40evf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint16_t interval =
 		i40e_calc_itr_interval(RTE_LIBRTE_I40E_ITR_INTERVAL);
@@ -1937,7 +1937,7 @@ i40evf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 
 	I40EVF_WRITE_FLUSH(hw);
 
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(ETH_DEV_TO_INTR_HANDLE(dev));
 
 	return 0;
 }
@@ -1945,7 +1945,7 @@ i40evf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 static int
 i40evf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint16_t msix_intr;
 
@@ -2025,7 +2025,7 @@ i40evf_dev_start(struct rte_eth_dev *dev)
 {
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	uint32_t intr_vector = 0;
 
 	PMD_INIT_FUNC_TRACE();
@@ -2090,7 +2090,7 @@ i40evf_dev_start(struct rte_eth_dev *dev)
 static void
 i40evf_dev_stop(struct rte_eth_dev *dev)
 {
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -2285,7 +2285,7 @@ static void
 i40evf_dev_close(struct rte_eth_dev *dev)
 {
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct rte_pci_device *pci_dev = dev->pci_dev;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	i40evf_dev_stop(dev);
 	hw->adapter_stopped = 1;
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index edc9b22..f17da46 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -427,6 +427,9 @@ static int ixgbe_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
 		(r) = (h)->bitmap[idx] >> bit & 1;\
 	} while (0)
 
+#define ETH_DEV_TO_INTR_HANDLE(ptr)			\
+	(&(ETH_DEV_PCI_DEV(ptr)->intr_handle))
+
 /*
  * The set of PCI devices this driver supports
  */
@@ -1127,7 +1130,7 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
 
 		return 0;
 	}
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 
@@ -1302,7 +1305,7 @@ eth_ixgbe_dev_uninit(struct rte_eth_dev *eth_dev)
 		return -EPERM;
 
 	hw = IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	if (hw->adapter_stopped == 0)
 		ixgbe_dev_close(eth_dev);
@@ -1419,7 +1422,7 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
 		return 0;
 	}
 
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 
@@ -1532,7 +1535,9 @@ static int
 eth_ixgbevf_dev_uninit(struct rte_eth_dev *eth_dev)
 {
 	struct ixgbe_hw *hw;
-	struct rte_pci_device *pci_dev = eth_dev->pci_dev;
+	struct rte_pci_device *pci_dev;
+
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -1960,7 +1965,8 @@ ixgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, uint16_t nb_rx_q)
 	}
 
 	RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = nb_rx_q;
-	RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx = dev->pci_dev->max_vfs * nb_rx_q;
+	RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx =
+		ETH_DEV_PCI_DEV(dev)->max_vfs * nb_rx_q;
 
 	return 0;
 }
@@ -2191,7 +2197,8 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct ixgbe_vf_info *vfinfo =
 		*IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
+	struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 	uint32_t intr_vector = 0;
 	int err, link_up = 0, negotiate = 0;
 	uint32_t speed = 0;
@@ -2291,7 +2298,7 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 
 	/* Restore vf rate limit */
 	if (vfinfo != NULL) {
-		for (vf = 0; vf < dev->pci_dev->max_vfs; vf++)
+		for (vf = 0; vf < pci_dev->max_vfs; vf++)
 			for (idx = 0; idx < IXGBE_MAX_QUEUE_NUM_PER_VF; idx++)
 				if (vfinfo[vf].tx_rate[idx] != 0)
 					ixgbe_set_vf_rate_limit(dev, vf,
@@ -2408,7 +2415,8 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	struct ixgbe_filter_info *filter_info =
 		IXGBE_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);
 	struct ixgbe_5tuple_filter *p_5tuple, *p_5tuple_next;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
+	struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 	int vf;
 
 	PMD_INIT_FUNC_TRACE();
@@ -2424,7 +2432,7 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	ixgbe_stop_adapter(hw);
 
 	for (vf = 0; vfinfo != NULL &&
-		     vf < dev->pci_dev->max_vfs; vf++)
+		     vf < pci_dev->max_vfs; vf++)
 		vfinfo[vf].clear_to_send = false;
 
 	if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper) {
@@ -3033,6 +3041,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
 	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
@@ -3049,7 +3058,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->max_rx_pktlen = 15872; /* includes CRC, cf MAXFRS register */
 	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
 	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
-	dev_info->max_vfs = dev->pci_dev->max_vfs;
+	dev_info->max_vfs = pci_dev->max_vfs;
 	if (hw->mac.type == ixgbe_mac_82598EB)
 		dev_info->max_vmdq_pools = ETH_16_POOLS;
 	else
@@ -3164,6 +3173,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
 		     struct rte_eth_dev_info *dev_info)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
 	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
@@ -3171,7 +3181,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
 	dev_info->max_rx_pktlen = 15872; /* includes CRC, cf MAXFRS reg */
 	dev_info->max_mac_addrs = hw->mac.num_rar_entries;
 	dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
-	dev_info->max_vfs = dev->pci_dev->max_vfs;
+	dev_info->max_vfs = pci_dev->max_vfs;
 	if (hw->mac.type == ixgbe_mac_82598EB)
 		dev_info->max_vmdq_pools = ETH_16_POOLS;
 	else
@@ -3434,6 +3444,7 @@ static void
 ixgbe_dev_link_status_print(struct rte_eth_dev *dev)
 {
 	struct rte_eth_link link;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	memset(&link, 0, sizeof(link));
 	rte_ixgbe_dev_atomic_read_link_status(dev, &link);
@@ -3448,10 +3459,10 @@ ixgbe_dev_link_status_print(struct rte_eth_dev *dev)
 				(int)(dev->data->port_id));
 	}
 	PMD_INIT_LOG(DEBUG, "PCI Address: " PCI_PRI_FMT,
-				dev->pci_dev->addr.domain,
-				dev->pci_dev->addr.bus,
-				dev->pci_dev->addr.devid,
-				dev->pci_dev->addr.function);
+				pci_dev->addr.domain,
+				pci_dev->addr.bus,
+				pci_dev->addr.devid,
+				pci_dev->addr.function);
 }
 
 /*
@@ -3515,7 +3526,7 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev)
 	} else {
 		PMD_DRV_LOG(DEBUG, "enable intr immediately");
 		ixgbe_enable_intr(dev);
-		rte_intr_enable(&(dev->pci_dev->intr_handle));
+		rte_intr_enable(ETH_DEV_TO_INTR_HANDLE(dev));
 	}
 
 
@@ -3564,7 +3575,7 @@ ixgbe_dev_interrupt_delayed_handler(void *param)
 
 	PMD_DRV_LOG(DEBUG, "enable intr in delayed handler S[%08x]", eicr);
 	ixgbe_enable_intr(dev);
-	rte_intr_enable(&(dev->pci_dev->intr_handle));
+	rte_intr_enable(ETH_DEV_TO_INTR_HANDLE(dev));
 }
 
 /**
@@ -4196,7 +4207,7 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t intr_vector = 0;
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 
 	int err, mask = 0;
 
@@ -4259,7 +4270,7 @@ static void
 ixgbevf_dev_stop(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -5070,7 +5081,7 @@ ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 	RTE_SET_USED(queue_id);
 	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
 
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(ETH_DEV_TO_INTR_HANDLE(dev));
 
 	return 0;
 }
@@ -5112,7 +5123,7 @@ ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 		mask &= (1 << (queue_id - 32));
 		IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
 	}
-	rte_intr_enable(&dev->pci_dev->intr_handle);
+	rte_intr_enable(ETH_DEV_TO_INTR_HANDLE(dev));
 
 	return 0;
 }
@@ -5216,7 +5227,7 @@ ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
 static void
 ixgbevf_configure_msix(struct rte_eth_dev *dev)
 {
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t q_idx;
@@ -5249,7 +5260,7 @@ ixgbevf_configure_msix(struct rte_eth_dev *dev)
 static void
 ixgbe_configure_msix(struct rte_eth_dev *dev)
 {
-	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	struct rte_intr_handle *intr_handle = ETH_DEV_TO_INTR_HANDLE(dev);
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t queue_id, base = IXGBE_MISC_VEC_ID;
@@ -5381,7 +5392,8 @@ static int ixgbe_set_vf_rate_limit(struct rte_eth_dev *dev, uint16_t vf,
 		return -EINVAL;
 
 	if (vfinfo != NULL) {
-		for (vf_idx = 0; vf_idx < dev->pci_dev->max_vfs; vf_idx++) {
+		for (vf_idx = 0; vf_idx < ETH_DEV_PCI_DEV(dev)->max_vfs;
+		     vf_idx++) {
 			if (vf_idx == vf)
 				continue;
 			for (idx = 0; idx < RTE_DIM(vfinfo[vf_idx].tx_rate);
@@ -7197,12 +7209,13 @@ ixgbe_e_tag_insertion_en_dis(struct rte_eth_dev *dev,
 	int ret = 0;
 	uint32_t vmtir, vmvir;
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
-	if (l2_tunnel->vf_id >= dev->pci_dev->max_vfs) {
+	if (l2_tunnel->vf_id >= pci_dev->max_vfs) {
 		PMD_DRV_LOG(ERR,
 			    "VF id %u should be less than %u",
 			    l2_tunnel->vf_id,
-			    dev->pci_dev->max_vfs);
+			    pci_dev->max_vfs);
 		return -EINVAL;
 	}
 
diff --git a/drivers/net/ixgbe/ixgbe_pf.c b/drivers/net/ixgbe/ixgbe_pf.c
index 26395e4..139d816 100644
--- a/drivers/net/ixgbe/ixgbe_pf.c
+++ b/drivers/net/ixgbe/ixgbe_pf.c
@@ -61,7 +61,7 @@
 static inline uint16_t
 dev_num_vf(struct rte_eth_dev *eth_dev)
 {
-	return eth_dev->pci_dev->max_vfs;
+	return ETH_DEV_PCI_DEV(eth_dev)->max_vfs;
 }
 
 static inline
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index c6b1587..7299fad 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -718,10 +718,12 @@ static void
 nfp_net_close(struct rte_eth_dev *dev)
 {
 	struct nfp_net_hw *hw;
+	struct rte_pci_device *pci_dev;
 
 	PMD_INIT_LOG(DEBUG, "Close\n");
 
 	hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	/*
 	 * We assume that the DPDK application is stopping all the
@@ -730,11 +732,11 @@ nfp_net_close(struct rte_eth_dev *dev)
 
 	nfp_net_stop(dev);
 
-	rte_intr_disable(&dev->pci_dev->intr_handle);
+	rte_intr_disable(&pci_dev->intr_handle);
 	nn_cfg_writeb(hw, NFP_NET_CFG_LSC, 0xff);
 
 	/* unregister callback func from eal lib */
-	rte_intr_callback_unregister(&dev->pci_dev->intr_handle,
+	rte_intr_callback_unregister(&pci_dev->intr_handle,
 				     nfp_net_dev_interrupt_handler,
 				     (void *)dev);
 
@@ -1122,6 +1124,7 @@ nfp_net_rx_queue_count(struct rte_eth_dev *dev, uint16_t queue_idx)
 static void
 nfp_net_dev_link_status_print(struct rte_eth_dev *dev)
 {
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 	struct rte_eth_link link;
 
 	memset(&link, 0, sizeof(link));
@@ -1136,8 +1139,8 @@ nfp_net_dev_link_status_print(struct rte_eth_dev *dev)
 			(int)(dev->data->port_id));
 
 	RTE_LOG(INFO, PMD, "PCI Address: %04d:%02d:%02d:%d\n",
-		dev->pci_dev->addr.domain, dev->pci_dev->addr.bus,
-		dev->pci_dev->addr.devid, dev->pci_dev->addr.function);
+		pci_dev->addr.domain, pci_dev->addr.bus,
+		pci_dev->addr.devid, pci_dev->addr.function);
 }
 
 /* Interrupt configuration and handling */
@@ -1158,7 +1161,7 @@ nfp_net_irq_unmask(struct rte_eth_dev *dev)
 	if (hw->ctrl & NFP_NET_CFG_CTRL_MSIXAUTO) {
 		/* If MSI-X auto-masking is used, clear the entry */
 		rte_wmb();
-		rte_intr_enable(&dev->pci_dev->intr_handle);
+		rte_intr_enable(&(ETH_DEV_PCI_DEV(dev)->intr_handle));
 	} else {
 		/* Make sure all updates are written before un-masking */
 		rte_wmb();
@@ -2330,7 +2333,7 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 
 	hw->device_id = pci_dev->id.device_id;
@@ -2400,7 +2403,6 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
 		     hw->cap & NFP_NET_CFG_CTRL_LSO     ? "TSO "     : "",
 		     hw->cap & NFP_NET_CFG_CTRL_RSS     ? "RSS "     : "");
 
-	pci_dev = eth_dev->pci_dev;
 	hw->ctrl = 0;
 
 	hw->stride_rx = stride;
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index d106dd0..959ff0f 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -178,11 +178,12 @@ static void
 qede_interrupt_handler(__rte_unused struct rte_intr_handle *handle, void *param)
 {
 	struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)param;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 	struct qede_dev *qdev = eth_dev->data->dev_private;
 	struct ecore_dev *edev = &qdev->edev;
 
 	qede_interrupt_action(ECORE_LEADING_HWFN(edev));
-	if (rte_intr_enable(&eth_dev->pci_dev->intr_handle))
+	if (rte_intr_enable(&pci_dev->intr_handle))
 		DP_ERR(edev, "rte_intr_enable failed\n");
 }
 
@@ -809,6 +810,7 @@ static void qede_poll_sp_sb_cb(void *param)
 
 static void qede_dev_close(struct rte_eth_dev *eth_dev)
 {
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 	struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
 	struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
 	int rc;
@@ -835,9 +837,9 @@ static void qede_dev_close(struct rte_eth_dev *eth_dev)
 
 	qdev->ops->common->remove(edev);
 
-	rte_intr_disable(&eth_dev->pci_dev->intr_handle);
+	rte_intr_disable(&pci_dev->intr_handle);
 
-	rte_intr_callback_unregister(&eth_dev->pci_dev->intr_handle,
+	rte_intr_callback_unregister(&pci_dev->intr_handle,
 				     qede_interrupt_handler, (void *)eth_dev);
 
 	if (edev->num_hwfns > 1)
@@ -1403,7 +1405,8 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
 	/* Extract key data structures */
 	adapter = eth_dev->data->dev_private;
 	edev = &adapter->edev;
-	pci_addr = eth_dev->pci_dev->addr;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
+	pci_addr = pci_dev->addr;
 
 	PMD_INIT_FUNC_TRACE(edev);
 
@@ -1420,8 +1423,6 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
 		return 0;
 	}
 
-	pci_dev = eth_dev->pci_dev;
-
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 
 	qed_ops = qed_get_eth_ops();
@@ -1442,10 +1443,10 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
 
 	qede_update_pf_params(edev);
 
-	rte_intr_callback_register(&eth_dev->pci_dev->intr_handle,
+	rte_intr_callback_register(&pci_dev->intr_handle,
 				   qede_interrupt_handler, (void *)eth_dev);
 
-	if (rte_intr_enable(&eth_dev->pci_dev->intr_handle)) {
+	if (rte_intr_enable(&pci_dev->intr_handle)) {
 		DP_ERR(edev, "rte_intr_enable() failed\n");
 		return -ENODEV;
 	}
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index f3cd52d..6d80a5b 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -1357,7 +1357,7 @@ get_szedata2_index(struct rte_eth_dev *dev, uint32_t *index)
 	uint32_t tmp_index;
 	FILE *fd;
 	char pcislot_path[PATH_MAX];
-	struct rte_pci_addr pcislot_addr = dev->pci_dev->addr;
+	struct rte_pci_addr pcislot_addr = ETH_DEV_PCI_DEV(dev)->addr;
 	uint32_t domain;
 	uint32_t bus;
 	uint32_t devid;
@@ -1415,9 +1415,10 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev)
 	struct szedata *szedata_temp;
 	int ret;
 	uint32_t szedata2_index;
-	struct rte_pci_addr *pci_addr = &dev->pci_dev->addr;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
+	struct rte_pci_addr *pci_addr = &pci_dev->addr;
 	struct rte_mem_resource *pci_rsc =
-		&dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER];
+		&pci_dev->mem_resource[PCI_RESOURCE_NUMBER];
 	char rsc_filename[PATH_MAX];
 	void *pci_resource_ptr = NULL;
 	int fd;
@@ -1471,10 +1472,10 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev)
 	/* Set function callbacks for Ethernet API */
 	dev->dev_ops = &ops;
 
-	rte_eth_copy_pci_info(dev, dev->pci_dev);
+	rte_eth_copy_pci_info(dev, pci_dev);
 
 	/* mmap pci resource0 file to rte_mem_resource structure */
-	if (dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].phys_addr ==
+	if (pci_dev->mem_resource[PCI_RESOURCE_NUMBER].phys_addr ==
 			0) {
 		RTE_LOG(ERR, PMD, "Missing resource%u file\n",
 				PCI_RESOURCE_NUMBER);
@@ -1491,7 +1492,7 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev)
 	}
 
 	pci_resource_ptr = mmap(0,
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len,
+			pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len,
 			PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
 	close(fd);
 	if (pci_resource_ptr == NULL) {
@@ -1499,8 +1500,7 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev)
 				rsc_filename, fd);
 		return -EINVAL;
 	}
-	dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr =
-		pci_resource_ptr;
+	pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr = pci_resource_ptr;
 
 	RTE_LOG(DEBUG, PMD, "resource%u phys_addr = 0x%llx len = %llu "
 			"virt addr = %llx\n", PCI_RESOURCE_NUMBER,
@@ -1516,8 +1516,8 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev)
 			RTE_CACHE_LINE_SIZE);
 	if (data->mac_addrs == NULL) {
 		RTE_LOG(ERR, PMD, "Could not alloc space for MAC address!\n");
-		munmap(dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr,
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len);
+		munmap(pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr,
+		       pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len);
 		return -EINVAL;
 	}
 
@@ -1537,12 +1537,13 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev)
 static int
 rte_szedata2_eth_dev_uninit(struct rte_eth_dev *dev)
 {
-	struct rte_pci_addr *pci_addr = &dev->pci_dev->addr;
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
+	struct rte_pci_addr *pci_addr = &pci_dev->addr;
 
 	rte_free(dev->data->mac_addrs);
 	dev->data->mac_addrs = NULL;
-	munmap(dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr,
-		dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len);
+	munmap(pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr,
+	       pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len);
 
 	RTE_LOG(INFO, PMD, "szedata2 device ("
 			PCI_PRI_FMT ") successfully uninitialized\n",
diff --git a/drivers/net/szedata2/rte_eth_szedata2.h b/drivers/net/szedata2/rte_eth_szedata2.h
index 522cf47..1c28c42 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.h
+++ b/drivers/net/szedata2/rte_eth_szedata2.h
@@ -120,8 +120,8 @@ static inline uint8_t
 pci_resource_read8(struct rte_eth_dev *dev, uint32_t offset)
 {
 	return *((uint8_t *)((uint8_t *)
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr +
-			offset));
+		ETH_DEV_PCI_DEV(dev)->mem_resource[PCI_RESOURCE_NUMBER].addr +
+		offset));
 }
 
 /*
@@ -131,8 +131,8 @@ static inline uint16_t
 pci_resource_read16(struct rte_eth_dev *dev, uint32_t offset)
 {
 	return rte_le_to_cpu_16(*((uint16_t *)((uint8_t *)
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr +
-			offset)));
+		ETH_DEV_PCI_DEV(dev)->mem_resource[PCI_RESOURCE_NUMBER].addr +
+		offset)));
 }
 
 /*
@@ -142,8 +142,8 @@ static inline uint32_t
 pci_resource_read32(struct rte_eth_dev *dev, uint32_t offset)
 {
 	return rte_le_to_cpu_32(*((uint32_t *)((uint8_t *)
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr +
-			offset)));
+		ETH_DEV_PCI_DEV(dev)->mem_resource[PCI_RESOURCE_NUMBER].addr +
+		offset)));
 }
 
 /*
@@ -153,8 +153,8 @@ static inline uint64_t
 pci_resource_read64(struct rte_eth_dev *dev, uint32_t offset)
 {
 	return rte_le_to_cpu_64(*((uint64_t *)((uint8_t *)
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr +
-			offset)));
+		ETH_DEV_PCI_DEV(dev)->mem_resource[PCI_RESOURCE_NUMBER].addr +
+		offset)));
 }
 
 /*
@@ -164,8 +164,8 @@ static inline void
 pci_resource_write8(struct rte_eth_dev *dev, uint32_t offset, uint8_t val)
 {
 	*((uint8_t *)((uint8_t *)
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr +
-			offset)) = val;
+		ETH_DEV_PCI_DEV(dev)->mem_resource[PCI_RESOURCE_NUMBER].addr +
+		offset)) = val;
 }
 
 /*
@@ -175,8 +175,8 @@ static inline void
 pci_resource_write16(struct rte_eth_dev *dev, uint32_t offset, uint16_t val)
 {
 	*((uint16_t *)((uint8_t *)
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr +
-			offset)) = rte_cpu_to_le_16(val);
+		ETH_DEV_PCI_DEV(dev)->mem_resource[PCI_RESOURCE_NUMBER].addr +
+		offset)) = rte_cpu_to_le_16(val);
 }
 
 /*
@@ -186,8 +186,8 @@ static inline void
 pci_resource_write32(struct rte_eth_dev *dev, uint32_t offset, uint32_t val)
 {
 	*((uint32_t *)((uint8_t *)
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr +
-			offset)) = rte_cpu_to_le_32(val);
+		ETH_DEV_PCI_DEV(dev)->mem_resource[PCI_RESOURCE_NUMBER].addr +
+		offset)) = rte_cpu_to_le_32(val);
 }
 
 /*
@@ -197,13 +197,13 @@ static inline void
 pci_resource_write64(struct rte_eth_dev *dev, uint32_t offset, uint64_t val)
 {
 	*((uint64_t *)((uint8_t *)
-			dev->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr +
-			offset)) = rte_cpu_to_le_64(val);
+		ETH_DEV_PCI_DEV(dev)->mem_resource[PCI_RESOURCE_NUMBER].addr +
+		offset)) = rte_cpu_to_le_64(val);
 }
 
 #define SZEDATA2_PCI_RESOURCE_PTR(dev, offset, type) \
 	((type)((uint8_t *) \
-	((dev)->pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr) \
+	(ETH_DEV_PCI_DEV(dev)->mem_resource[PCI_RESOURCE_NUMBER].addr) \
 	+ (offset)))
 
 enum szedata2_link_speed {
diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
index 466e49c..099b252 100644
--- a/drivers/net/thunderx/nicvf_ethdev.c
+++ b/drivers/net/thunderx/nicvf_ethdev.c
@@ -1335,6 +1335,7 @@ static void
 nicvf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
 	struct nicvf *nic = nicvf_pmd_priv(dev);
+	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -1345,7 +1346,7 @@ nicvf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->max_tx_queues =
 			(uint16_t)MAX_SND_QUEUES_PER_QS * (MAX_SQS_PER_VF + 1);
 	dev_info->max_mac_addrs = 1;
-	dev_info->max_vfs = dev->pci_dev->max_vfs;
+	dev_info->max_vfs = pci_dev->max_vfs;
 
 	dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP;
 	dev_info->tx_offload_capa =
@@ -1975,7 +1976,7 @@ nicvf_eth_dev_init(struct rte_eth_dev *eth_dev)
 		}
 	}
 
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 	rte_eth_copy_pci_info(eth_dev, pci_dev);
 
 	nic->device_id = pci_dev->id.device_id;
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 8bb13e5..bcb3751 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -138,7 +138,7 @@ gpa_zone_reserve(struct rte_eth_dev *dev, uint32_t size,
 	const struct rte_memzone *mz;
 
 	snprintf(z_name, sizeof(z_name), "%s_%d_%s",
-		 dev->driver->pci_drv.driver.name, dev->data->port_id, post_string);
+		 dev->data->drv_name, dev->data->port_id, post_string);
 
 	mz = rte_memzone_lookup(z_name);
 	if (!reuse) {
@@ -237,7 +237,7 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
 	eth_dev->dev_ops = &vmxnet3_eth_dev_ops;
 	eth_dev->rx_pkt_burst = &vmxnet3_recv_pkts;
 	eth_dev->tx_pkt_burst = &vmxnet3_xmit_pkts;
-	pci_dev = eth_dev->pci_dev;
+	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 
 	/*
 	 * for secondary processes, we don't initialize any further as primary
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v3 4/9] virtio: Don't fill dev_info->driver_name
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
                   ` (2 preceding siblings ...)
  2016-12-20 11:11 ` [PATCH v3 3/9] drivers: Use ETH_DEV_PCI_DEV() helper Jan Blunck
@ 2016-12-20 11:11 ` Jan Blunck
  2016-12-20 12:17   ` Ferruh Yigit
  2016-12-20 11:11 ` [PATCH v3 5/9] virtio: Add vtpci_intr_handle() helper to get rte_intr_handle Jan Blunck
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen

This is overwritten in rte_eth_dev_info_get().

Signed-off-by: Jan Blunck <jblunck@infradead.org>
Reviewed-by: David Marchand <david.marchand@6wind.com>
---
 drivers/net/virtio/virtio_ethdev.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 079fd6c..741688e 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1624,10 +1624,6 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	uint64_t tso_mask;
 	struct virtio_hw *hw = dev->data->dev_private;
 
-	if (dev->pci_dev)
-		dev_info->driver_name = dev->driver->pci_drv.driver.name;
-	else
-		dev_info->driver_name = "virtio_user PMD";
 	dev_info->max_rx_queues =
 		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
 	dev_info->max_tx_queues =
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v3 5/9] virtio: Add vtpci_intr_handle() helper to get rte_intr_handle
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
                   ` (3 preceding siblings ...)
  2016-12-20 11:11 ` [PATCH v3 4/9] virtio: Don't fill dev_info->driver_name Jan Blunck
@ 2016-12-20 11:11 ` Jan Blunck
  2016-12-20 11:11 ` [PATCH v3 6/9] virtio: Don't depend on struct rte_eth_dev's pci_dev Jan Blunck
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen

This adds a helper to get the rte_intr_handle from the virtio_hw. This is
safe to do since the usage of the helper is guarded by RTE_ETH_DEV_INTR_LSC
which is only set if we found a PCI device during initialization.

Signed-off-by: Jan Blunck <jblunck@infradead.org>
---
 drivers/net/virtio/virtio_ethdev.c | 12 +++++++-----
 drivers/net/virtio/virtio_pci.h    |  6 ++++++
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 741688e..da9668e 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1162,7 +1162,7 @@ virtio_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
 	isr = vtpci_isr(hw);
 	PMD_DRV_LOG(INFO, "interrupt status = %#x", isr);
 
-	if (rte_intr_enable(&dev->pci_dev->intr_handle) < 0)
+	if (rte_intr_enable(vtpci_intr_handle(hw)) < 0)
 		PMD_DRV_LOG(ERR, "interrupt enable failed");
 
 	if (isr & VIRTIO_PCI_ISR_CONFIG) {
@@ -1334,7 +1334,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 
 	/* Setup interrupt callback  */
 	if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
-		rte_intr_callback_register(&pci_dev->intr_handle,
+		rte_intr_callback_register(vtpci_intr_handle(hw),
 			virtio_interrupt_handler, eth_dev);
 
 	return 0;
@@ -1344,6 +1344,7 @@ static int
 eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 {
 	struct rte_pci_device *pci_dev;
+	struct virtio_hw *hw = eth_dev->data->dev_private;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -1363,7 +1364,7 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 
 	/* reset interrupt callback  */
 	if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
-		rte_intr_callback_unregister(&pci_dev->intr_handle,
+		rte_intr_callback_unregister(vtpci_intr_handle(hw),
 						virtio_interrupt_handler,
 						eth_dev);
 	rte_eal_pci_unmap_device(pci_dev);
@@ -1481,7 +1482,7 @@ virtio_dev_start(struct rte_eth_dev *dev)
 			return -ENOTSUP;
 		}
 
-		if (rte_intr_enable(&dev->pci_dev->intr_handle) < 0) {
+		if (rte_intr_enable(vtpci_intr_handle(hw)) < 0) {
 			PMD_DRV_LOG(ERR, "interrupt enable failed");
 			return -EIO;
 		}
@@ -1573,12 +1574,13 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)
 static void
 virtio_dev_stop(struct rte_eth_dev *dev)
 {
+	struct virtio_hw *hw = dev->data->dev_private;
 	struct rte_eth_link link;
 
 	PMD_INIT_LOG(DEBUG, "stop");
 
 	if (dev->data->dev_conf.intr_conf.lsc)
-		rte_intr_disable(&dev->pci_dev->intr_handle);
+		rte_intr_disable(vtpci_intr_handle(hw));
 
 	memset(&link, 0, sizeof(link));
 	virtio_dev_atomic_write_link_status(dev, &link);
diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h
index de271bf..5373e39 100644
--- a/drivers/net/virtio/virtio_pci.h
+++ b/drivers/net/virtio/virtio_pci.h
@@ -317,4 +317,10 @@ uint8_t vtpci_isr(struct virtio_hw *);
 
 uint16_t vtpci_irq_config(struct virtio_hw *, uint16_t);
 
+static inline struct rte_intr_handle *
+vtpci_intr_handle(struct virtio_hw *hw)
+{
+	return hw->dev ? &hw->dev->intr_handle : NULL;
+}
+
 #endif /* _VIRTIO_PCI_H_ */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v3 6/9] virtio: Don't depend on struct rte_eth_dev's pci_dev
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
                   ` (4 preceding siblings ...)
  2016-12-20 11:11 ` [PATCH v3 5/9] virtio: Add vtpci_intr_handle() helper to get rte_intr_handle Jan Blunck
@ 2016-12-20 11:11 ` Jan Blunck
  2016-12-20 11:11 ` [PATCH v3 7/9] ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get() Jan Blunck
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen

We don't need to depend on rte_eth_dev->pci_dev to differentiate between
the virtio_user and the virtio_pci case. Instead we can use the private
virtio_hw struct to get that information.

Signed-off-by: Jan Blunck <jblunck@infradead.org>
---
 drivers/net/virtio/virtio_ethdev.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index da9668e..023101d 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -483,11 +483,11 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
 		hw->cvq = cvq;
 	}
 
-	/* For virtio_user case (that is when dev->pci_dev is NULL), we use
+	/* For virtio_user case (that is when hw->dev is NULL), we use
 	 * virtual address. And we need properly set _offset_, please see
 	 * VIRTIO_MBUF_DATA_DMA_ADDR in virtqueue.h for more information.
 	 */
-	if (dev->pci_dev)
+	if (hw->dev)
 		vq->offset = offsetof(struct rte_mbuf, buf_physaddr);
 	else {
 		vq->vq_ring_mem = (uintptr_t)mz->addr;
@@ -1190,7 +1190,7 @@ 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 = eth_dev->pci_dev;
+	struct rte_pci_device *pci_dev = hw->dev;
 	int ret;
 
 	/* Reset the device although not necessary at startup */
@@ -1294,7 +1294,6 @@ int
 eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 {
 	struct virtio_hw *hw = eth_dev->data->dev_private;
-	struct rte_pci_device *pci_dev;
 	uint32_t dev_flags = RTE_ETH_DEV_DETACHABLE;
 	int ret;
 
@@ -1317,10 +1316,11 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 		return -ENOMEM;
 	}
 
-	pci_dev = eth_dev->pci_dev;
-
-	if (pci_dev) {
-		ret = vtpci_init(pci_dev, hw, &dev_flags);
+	/* 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->virtio_user_dev) {
+		ret = vtpci_init(ETH_DEV_PCI_DEV(eth_dev), hw, &dev_flags);
 		if (ret)
 			return ret;
 	}
@@ -1343,7 +1343,6 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 static int
 eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 {
-	struct rte_pci_device *pci_dev;
 	struct virtio_hw *hw = eth_dev->data->dev_private;
 
 	PMD_INIT_FUNC_TRACE();
@@ -1353,7 +1352,6 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 
 	virtio_dev_stop(eth_dev);
 	virtio_dev_close(eth_dev);
-	pci_dev = eth_dev->pci_dev;
 
 	eth_dev->dev_ops = NULL;
 	eth_dev->tx_pkt_burst = NULL;
@@ -1367,7 +1365,8 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 		rte_intr_callback_unregister(vtpci_intr_handle(hw),
 						virtio_interrupt_handler,
 						eth_dev);
-	rte_eal_pci_unmap_device(pci_dev);
+	if (hw->dev)
+		rte_eal_pci_unmap_device(hw->dev);
 
 	PMD_INIT_LOG(DEBUG, "dev_uninit completed");
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v3 7/9] ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get()
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
                   ` (5 preceding siblings ...)
  2016-12-20 11:11 ` [PATCH v3 6/9] virtio: Don't depend on struct rte_eth_dev's pci_dev Jan Blunck
@ 2016-12-20 11:11 ` Jan Blunck
  2016-12-20 15:41   ` Stephen Hemminger
  2016-12-21  9:54   ` Shreyansh Jain
  2016-12-20 11:11 ` [PATCH v3 8/9] ethdev: Decouple interrupt handling from PCI device Jan Blunck
                   ` (2 subsequent siblings)
  9 siblings, 2 replies; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen

Only the device itself can decide its PCI or not.

Signed-off-by: Jan Blunck <jblunck@infradead.org>
---
 drivers/net/bnx2x/bnx2x_ethdev.c        | 1 +
 drivers/net/bnxt/bnxt_ethdev.c          | 2 ++
 drivers/net/cxgbe/cxgbe_ethdev.c        | 2 ++
 drivers/net/e1000/em_ethdev.c           | 1 +
 drivers/net/e1000/igb_ethdev.c          | 2 ++
 drivers/net/ena/ena_ethdev.c            | 2 ++
 drivers/net/enic/enic_ethdev.c          | 1 +
 drivers/net/fm10k/fm10k_ethdev.c        | 1 +
 drivers/net/i40e/i40e_ethdev.c          | 1 +
 drivers/net/i40e/i40e_ethdev_vf.c       | 1 +
 drivers/net/ixgbe/ixgbe_ethdev.c        | 2 ++
 drivers/net/mlx4/mlx4.c                 | 2 ++
 drivers/net/mlx5/mlx5_ethdev.c          | 2 ++
 drivers/net/nfp/nfp_net.c               | 1 +
 drivers/net/qede/qede_ethdev.c          | 1 +
 drivers/net/szedata2/rte_eth_szedata2.c | 1 +
 drivers/net/thunderx/nicvf_ethdev.c     | 2 ++
 drivers/net/virtio/virtio_ethdev.c      | 1 +
 drivers/net/vmxnet3/vmxnet3_ethdev.c    | 2 ++
 lib/librte_ether/rte_ethdev.c           | 1 -
 20 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index c331ccd..551dbad 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -431,6 +431,7 @@ static void
 bnx2x_dev_infos_get(struct rte_eth_dev *dev, __rte_unused struct rte_eth_dev_info *dev_info)
 {
 	struct bnx2x_softc *sc = dev->data->dev_private;
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->max_rx_queues  = sc->max_rx_queues;
 	dev_info->max_tx_queues  = sc->max_tx_queues;
 	dev_info->min_rx_bufsize = BNX2X_MIN_RX_BUF_SIZE;
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index cd50f11..bf39fbe 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -303,6 +303,8 @@ static void bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
 	struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
 	uint16_t max_vnics, i, j, vpool, vrxq;
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
+
 	/* MAC Specifics */
 	dev_info->max_mac_addrs = MAX_NUM_MAC_ADDR;
 	dev_info->max_hash_mac_addrs = 0;
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index 8bfdda8..8938b08 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -147,6 +147,8 @@ static void cxgbe_dev_info_get(struct rte_eth_dev *eth_dev,
 		.nb_align = 1,
 	};
 
+	device_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
+
 	device_info->min_rx_bufsize = CXGBE_MIN_RX_BUFSIZE;
 	device_info->max_rx_pktlen = CXGBE_MAX_RX_PKTLEN;
 	device_info->max_rx_queues = max_queues;
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index 7f2f521..3d34e5b 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -1048,6 +1048,7 @@ eth_em_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->min_rx_bufsize = 256; /* See BSIZE field of RCTL register. */
 	dev_info->max_rx_pktlen = em_get_max_pktlen(hw);
 	dev_info->max_mac_addrs = hw->mac.rar_entry_count;
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index b25c66e..7d77561 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -1983,6 +1983,7 @@ eth_igb_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->min_rx_bufsize = 256; /* See BSIZE field of RCTL register. */
 	dev_info->max_rx_pktlen  = 0x3FFF; /* See RLPML register. */
 	dev_info->max_mac_addrs = hw->mac.rar_entry_count;
@@ -2111,6 +2112,7 @@ eth_igbvf_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->min_rx_bufsize = 256; /* See BSIZE field of RCTL register. */
 	dev_info->max_rx_pktlen  = 0x3FFF; /* See RLPML register. */
 	dev_info->max_mac_addrs = hw->mac.rar_entry_count;
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index c17d969..051275e 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -1436,6 +1436,8 @@ static void ena_infos_get(struct rte_eth_dev *dev,
 	ena_dev = &adapter->ena_dev;
 	ena_assert_msg(ena_dev != NULL, "Uninitialized device");
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
+
 	dev_info->speed_capa =
 			ETH_LINK_SPEED_1G   |
 			ETH_LINK_SPEED_2_5G |
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index 553a88e..bb5dfe6 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -459,6 +459,7 @@ static void enicpmd_dev_info_get(struct rte_eth_dev *eth_dev,
 	struct enic *enic = pmd_priv(eth_dev);
 
 	ENICPMD_FUNC_TRACE();
+	device_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 	/* Scattered Rx uses two receive queues per rx queue exposed to dpdk */
 	device_info->max_rx_queues = enic->conf_rq_count / 2;
 	device_info->max_tx_queues = enic->conf_wq_count;
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index e1250f6..5d0bce5 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -1392,6 +1392,7 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,
 
 	PMD_INIT_FUNC_TRACE();
 
+	dev_info->pci_dev            = ETH_DEV_PCI_DEV(dev);
 	dev_info->min_rx_bufsize     = FM10K_MIN_RX_BUF_SIZE;
 	dev_info->max_rx_pktlen      = FM10K_MAX_PKT_SIZE;
 	dev_info->max_rx_queues      = hw->mac.max_queues;
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 8a63a8c..29c0277 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2583,6 +2583,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct i40e_vsi *vsi = pf->main_vsi;
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->max_rx_queues = vsi->nb_qps;
 	dev_info->max_tx_queues = vsi->nb_qps;
 	dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 781e658..caef72c 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2217,6 +2217,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 
 	memset(dev_info, 0, sizeof(*dev_info));
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->max_rx_queues = vf->vsi_res->num_queue_pairs;
 	dev_info->max_tx_queues = vf->vsi_res->num_queue_pairs;
 	dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index f17da46..c88b7bf 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -3043,6 +3043,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
 	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
 	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
 	if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
@@ -3175,6 +3176,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
 	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
 	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL reg */
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index da61a85..5455fea 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -4421,6 +4421,8 @@ mlx4_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
 	unsigned int max;
 	char ifname[IF_NAMESIZE];
 
+	info->pci_dev = ETH_DEV_PCI_DEV(dev);
+
 	if (priv == NULL)
 		return;
 	priv_lock(priv);
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index c0f73e9..489a4f6 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -562,6 +562,8 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
 	unsigned int max;
 	char ifname[IF_NAMESIZE];
 
+	info->pci_dev = ETH_DEV_PCI_DEV(dev);
+
 	priv_lock(priv);
 	/* FIXME: we should ask the device for these values. */
 	info->min_rx_bufsize = 32;
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 7299fad..c49d38a 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -1008,6 +1008,7 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 
 	hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->driver_name = dev->driver->pci_drv.driver.name;
 	dev_info->max_rx_queues = (uint16_t)hw->max_rx_queues;
 	dev_info->max_tx_queues = (uint16_t)hw->max_tx_queues;
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index 959ff0f..2c4de92 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -652,6 +652,7 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev,
 
 	PMD_INIT_FUNC_TRACE(edev);
 
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
 	dev_info->min_rx_bufsize = (uint32_t)(ETHER_MIN_MTU +
 					      QEDE_ETH_OVERHEAD);
 	dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index 6d80a5b..6356257 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -1030,6 +1030,7 @@ eth_dev_info(struct rte_eth_dev *dev,
 		struct rte_eth_dev_info *dev_info)
 {
 	struct pmd_internals *internals = dev->data->dev_private;
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
 	dev_info->if_index = 0;
 	dev_info->max_mac_addrs = 1;
 	dev_info->max_rx_pktlen = (uint32_t)-1;
diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
index 099b252..daac853 100644
--- a/drivers/net/thunderx/nicvf_ethdev.c
+++ b/drivers/net/thunderx/nicvf_ethdev.c
@@ -1339,6 +1339,8 @@ nicvf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 
 	PMD_INIT_FUNC_TRACE();
 
+	dev_info->pci_dev = pci_dev;
+
 	dev_info->min_rx_bufsize = ETHER_MIN_MTU;
 	dev_info->max_rx_pktlen = NIC_HW_MAX_FRS;
 	dev_info->max_rx_queues =
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 023101d..2eb6a06 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1625,6 +1625,7 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	uint64_t tso_mask;
 	struct virtio_hw *hw = dev->data->dev_private;
 
+	dev_info->pci_dev = hw->dev;
 	dev_info->max_rx_queues =
 		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
 	dev_info->max_tx_queues =
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index bcb3751..f7c0382 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -709,6 +709,8 @@ static void
 vmxnet3_dev_info_get(__rte_unused struct rte_eth_dev *dev,
 		     struct rte_eth_dev_info *dev_info)
 {
+	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
+
 	dev_info->max_rx_queues = VMXNET3_MAX_RX_QUEUES;
 	dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
 	dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index fde8112..4288577 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1556,7 +1556,6 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
 
 	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
 	(*dev->dev_ops->dev_infos_get)(dev, dev_info);
-	dev_info->pci_dev = dev->pci_dev;
 	dev_info->driver_name = dev->data->drv_name;
 	dev_info->nb_rx_queues = dev->data->nb_rx_queues;
 	dev_info->nb_tx_queues = dev->data->nb_tx_queues;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v3 8/9] ethdev: Decouple interrupt handling from PCI device
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
                   ` (6 preceding siblings ...)
  2016-12-20 11:11 ` [PATCH v3 7/9] ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get() Jan Blunck
@ 2016-12-20 11:11 ` Jan Blunck
  2016-12-20 11:11 ` [PATCH v3 9/9] ethdev: Decouple struct rte_eth_dev from struct rte_pci_device Jan Blunck
  2016-12-21 10:00 ` [PATCH v3 0/9] Decouple ethdev from PCI device Shreyansh Jain
  9 siblings, 0 replies; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen

The struct rte_intr_handle is an abstraction layer for different types of
interrupt mechanisms. It is embedded in the low-level device (e.g. PCI).
On allocation of a struct rte_eth_dev a reference to the intr_handle
should be stored for devices supporting interrupts.

Signed-off-by: Jan Blunck <jblunck@infradead.org>
---
 lib/librte_ether/rte_ethdev.c | 18 ++++++++++++++++--
 lib/librte_ether/rte_ethdev.h |  1 +
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 4288577..4ecea50 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -258,6 +258,7 @@ rte_eth_dev_pci_probe(struct rte_pci_driver *pci_drv,
 			rte_panic("Cannot allocate memzone for private port data\n");
 	}
 	eth_dev->pci_dev = pci_dev;
+	eth_dev->intr_handle = &pci_dev->intr_handle;
 	eth_dev->driver = eth_drv;
 	eth_dev->data->rx_mbuf_alloc_failed = 0;
 
@@ -2543,7 +2544,13 @@ rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 
 	dev = &rte_eth_devices[port_id];
-	intr_handle = &dev->pci_dev->intr_handle;
+
+	if (!dev->intr_handle) {
+		RTE_PMD_DEBUG_TRACE("RX Intr handle unset\n");
+		return -ENOTSUP;
+	}
+
+	intr_handle = dev->intr_handle;
 	if (!intr_handle->intr_vec) {
 		RTE_PMD_DEBUG_TRACE("RX Intr vector unset\n");
 		return -EPERM;
@@ -2603,7 +2610,12 @@ rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
 		return -EINVAL;
 	}
 
-	intr_handle = &dev->pci_dev->intr_handle;
+	if (!dev->intr_handle) {
+		RTE_PMD_DEBUG_TRACE("RX Intr handle unset\n");
+		return -ENOTSUP;
+	}
+
+	intr_handle = dev->intr_handle;
 	if (!intr_handle->intr_vec) {
 		RTE_PMD_DEBUG_TRACE("RX Intr vector unset\n");
 		return -EPERM;
@@ -3205,6 +3217,8 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct rte_pci_device *pci_de
 		return;
 	}
 
+	eth_dev->intr_handle = &pci_dev->intr_handle;
+
 	eth_dev->data->dev_flags = 0;
 	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
 		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 3adbb2b..f1f656a 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1629,6 +1629,7 @@ struct rte_eth_dev {
 	const struct eth_driver *driver;/**< Driver for this device */
 	const struct eth_dev_ops *dev_ops; /**< Functions exported by PMD */
 	struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */
+	struct rte_intr_handle *intr_handle; /**< Device interrupt handle */
 	/** User application callbacks for NIC interrupts */
 	struct rte_eth_dev_cb_list link_intr_cbs;
 	/**
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH v3 9/9] ethdev: Decouple struct rte_eth_dev from struct rte_pci_device
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
                   ` (7 preceding siblings ...)
  2016-12-20 11:11 ` [PATCH v3 8/9] ethdev: Decouple interrupt handling from PCI device Jan Blunck
@ 2016-12-20 11:11 ` Jan Blunck
  2016-12-21 10:00 ` [PATCH v3 0/9] Decouple ethdev from PCI device Shreyansh Jain
  9 siblings, 0 replies; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 11:11 UTC (permalink / raw)
  To: dev; +Cc: shreyansh.jain, david.marchand, stephen

Signed-off-by: Jan Blunck <jblunck@infradead.org>
---
 app/test/virtual_pmd.c                  |  4 ++--
 drivers/net/bonding/rte_eth_bond_args.c | 12 ++++++++++--
 drivers/net/cxgbe/cxgbe_main.c          |  4 ++--
 drivers/net/fm10k/fm10k_ethdev.c        |  6 +++---
 drivers/net/virtio/virtio_user_ethdev.c |  1 -
 lib/librte_eal/common/include/rte_pci.h |  6 ++++++
 lib/librte_ether/rte_ethdev.c           |  6 +++---
 lib/librte_ether/rte_ethdev.h           |  4 ++--
 8 files changed, 28 insertions(+), 15 deletions(-)

diff --git a/app/test/virtual_pmd.c b/app/test/virtual_pmd.c
index 65b44c6..bd30b14 100644
--- a/app/test/virtual_pmd.c
+++ b/app/test/virtual_pmd.c
@@ -625,8 +625,8 @@ virtual_ethdev_create(const char *name, struct ether_addr *mac_addr,
 	dev_private->dev_ops = virtual_ethdev_default_dev_ops;
 	eth_dev->dev_ops = &dev_private->dev_ops;
 
-	eth_dev->pci_dev = pci_dev;
-	eth_dev->pci_dev->device.driver = &eth_drv->pci_drv.driver;
+	pci_dev->device.driver = &eth_drv->pci_drv.driver;
+	eth_dev->device = &pci_dev->device;
 
 	eth_dev->rx_pkt_burst = virtual_ethdev_rx_burst_success;
 	eth_dev->tx_pkt_burst = virtual_ethdev_tx_burst_success;
diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c
index 02ecde6..29436ea 100644
--- a/drivers/net/bonding/rte_eth_bond_args.c
+++ b/drivers/net/bonding/rte_eth_bond_args.c
@@ -54,15 +54,23 @@ const char *pmd_bond_init_valid_arguments[] = {
 static inline int
 find_port_id_by_pci_addr(const struct rte_pci_addr *pci_addr)
 {
+	struct rte_pci_device *pci_dev;
 	struct rte_pci_addr *eth_pci_addr;
 	unsigned i;
 
 	for (i = 0; i < rte_eth_dev_count(); i++) {
 
-		if (rte_eth_devices[i].pci_dev == NULL)
+		/* Currently populated by rte_eth_copy_pci_info().
+		 *
+		 * TODO: Once the PCI bus has arrived we should have a better
+		 * way to test for being a PCI device or not.
+		 */
+		if (rte_eth_devices[i].data->kdrv == RTE_KDRV_UNKNOWN ||
+		    rte_eth_devices[i].data->kdrv == RTE_KDRV_NONE)
 			continue;
 
-		eth_pci_addr = &(rte_eth_devices[i].pci_dev->addr);
+		pci_dev = ETH_DEV_PCI_DEV(&rte_eth_devices[i]);
+		eth_pci_addr = &pci_dev->addr;
 
 		if (pci_addr->bus == eth_pci_addr->bus &&
 			pci_addr->devid == eth_pci_addr->devid &&
diff --git a/drivers/net/cxgbe/cxgbe_main.c b/drivers/net/cxgbe/cxgbe_main.c
index 922155b..ea13c7e 100644
--- a/drivers/net/cxgbe/cxgbe_main.c
+++ b/drivers/net/cxgbe/cxgbe_main.c
@@ -1163,14 +1163,14 @@ int cxgbe_probe(struct adapter *adapter)
 		pi->eth_dev->data = data;
 
 allocate_mac:
-		pi->eth_dev->pci_dev = adapter->pdev;
+		pi->eth_dev->device = &adapter->pdev->device;
 		pi->eth_dev->data->dev_private = pi;
 		pi->eth_dev->driver = adapter->eth_dev->driver;
 		pi->eth_dev->dev_ops = adapter->eth_dev->dev_ops;
 		pi->eth_dev->tx_pkt_burst = adapter->eth_dev->tx_pkt_burst;
 		pi->eth_dev->rx_pkt_burst = adapter->eth_dev->rx_pkt_burst;
 
-		rte_eth_copy_pci_info(pi->eth_dev, pi->eth_dev->pci_dev);
+		rte_eth_copy_pci_info(pi->eth_dev, adapter->pdev);
 
 		TAILQ_INIT(&pi->eth_dev->link_intr_cbs);
 
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index 5d0bce5..5718b39 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -678,7 +678,7 @@ fm10k_dev_tx_init(struct rte_eth_dev *dev)
 		/* Enable use of FTAG bit in TX descriptor, PFVTCTL
 		 * register is read-only for VF.
 		 */
-		if (fm10k_check_ftag(dev->pci_dev->device.devargs)) {
+		if (fm10k_check_ftag(dev->device->devargs)) {
 			if (hw->mac.type == fm10k_mac_pf) {
 				FM10K_WRITE_REG(hw, FM10K_PFVTCTL(i),
 						FM10K_PFVTCTL_FTAG_DESC_ENABLE);
@@ -2740,7 +2740,7 @@ fm10k_set_tx_function(struct rte_eth_dev *dev)
 	int use_sse = 1;
 	uint16_t tx_ftag_en = 0;
 
-	if (fm10k_check_ftag(dev->pci_dev->device.devargs))
+	if (fm10k_check_ftag(dev->device->devargs))
 		tx_ftag_en = 1;
 
 	for (i = 0; i < dev->data->nb_tx_queues; i++) {
@@ -2771,7 +2771,7 @@ fm10k_set_rx_function(struct rte_eth_dev *dev)
 	uint16_t i, rx_using_sse;
 	uint16_t rx_ftag_en = 0;
 
-	if (fm10k_check_ftag(dev->pci_dev->device.devargs))
+	if (fm10k_check_ftag(dev->device->devargs))
 		rx_ftag_en = 1;
 
 	/* In order to allow Vector Rx there are a few configuration
diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
index 406beea..8cb983c 100644
--- a/drivers/net/virtio/virtio_user_ethdev.c
+++ b/drivers/net/virtio/virtio_user_ethdev.c
@@ -310,7 +310,6 @@ virtio_user_eth_dev_alloc(const char *name)
 	data->numa_node = SOCKET_ID_ANY;
 	data->kdrv = RTE_KDRV_NONE;
 	data->dev_flags = RTE_ETH_DEV_DETACHABLE;
-	eth_dev->pci_dev = NULL;
 	eth_dev->driver = NULL;
 	return eth_dev;
 }
diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
index 9ce8847..19deaf6 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -160,6 +160,12 @@ struct rte_pci_device {
 	enum rte_kernel_driver kdrv;            /**< Kernel driver passthrough */
 };
 
+/**
+ * @internal
+ * Helper macro for drivers that need to convert to struct rte_pci_device.
+ */
+#define DEV_PCI_DEV(ptr) container_of(ptr, struct rte_pci_device, device)
+
 /** Any PCI device identifier (vendor, device, ...) */
 #define PCI_ANY_ID (0xffff)
 #define RTE_CLASS_ANY_ID (0xffffff)
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 4ecea50..cc01672 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -257,7 +257,7 @@ rte_eth_dev_pci_probe(struct rte_pci_driver *pci_drv,
 		if (eth_dev->data->dev_private == NULL)
 			rte_panic("Cannot allocate memzone for private port data\n");
 	}
-	eth_dev->pci_dev = pci_dev;
+	eth_dev->device = &pci_dev->device;
 	eth_dev->intr_handle = &pci_dev->intr_handle;
 	eth_dev->driver = eth_drv;
 	eth_dev->data->rx_mbuf_alloc_failed = 0;
@@ -318,7 +318,7 @@ rte_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
 		rte_free(eth_dev->data->dev_private);
 
-	eth_dev->pci_dev = NULL;
+	eth_dev->device = NULL;
 	eth_dev->driver = NULL;
 	eth_dev->data = NULL;
 
@@ -2578,7 +2578,7 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
 	const struct rte_memzone *mz;
 
 	snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
-		 dev->driver->pci_drv.driver.name, ring_name,
+		 dev->data->drv_name, ring_name,
 		 dev->data->port_id, queue_id);
 
 	mz = rte_memzone_lookup(z_name);
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index f1f656a..58ef798 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1628,7 +1628,7 @@ struct rte_eth_dev {
 	struct rte_eth_dev_data *data;  /**< Pointer to device data */
 	const struct eth_driver *driver;/**< Driver for this device */
 	const struct eth_dev_ops *dev_ops; /**< Functions exported by PMD */
-	struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */
+	struct rte_device *device; /**< Backing device for this device */
 	struct rte_intr_handle *intr_handle; /**< Device interrupt handle */
 	/** User application callbacks for NIC interrupts */
 	struct rte_eth_dev_cb_list link_intr_cbs;
@@ -1649,7 +1649,7 @@ struct rte_eth_dev {
  * @internal
  * Helper for drivers that need to convert from rte_eth_dev to rte_pci_device.
  */
-#define ETH_DEV_PCI_DEV(ptr) ((ptr)->pci_dev)
+#define ETH_DEV_PCI_DEV(ptr) DEV_PCI_DEV((ptr)->device)
 
 struct rte_eth_dev_sriov {
 	uint8_t active;               /**< SRIOV is active with 16, 32 or 64 pools */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 4/9] virtio: Don't fill dev_info->driver_name
  2016-12-20 11:11 ` [PATCH v3 4/9] virtio: Don't fill dev_info->driver_name Jan Blunck
@ 2016-12-20 12:17   ` Ferruh Yigit
  2016-12-20 12:40     ` Jan Blunck
  0 siblings, 1 reply; 21+ messages in thread
From: Ferruh Yigit @ 2016-12-20 12:17 UTC (permalink / raw)
  To: Jan Blunck, dev; +Cc: shreyansh.jain, david.marchand, stephen

On 12/20/2016 11:11 AM, Jan Blunck wrote:
> This is overwritten in rte_eth_dev_info_get().
> 
> Signed-off-by: Jan Blunck <jblunck@infradead.org>
> Reviewed-by: David Marchand <david.marchand@6wind.com>
> ---
>  drivers/net/virtio/virtio_ethdev.c | 4 ----
>  1 file changed, 4 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
> index 079fd6c..741688e 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -1624,10 +1624,6 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  	uint64_t tso_mask;
>  	struct virtio_hw *hw = dev->data->dev_private;
>  
> -	if (dev->pci_dev)
> -		dev_info->driver_name = dev->driver->pci_drv.driver.name;
> -	else
> -		dev_info->driver_name = "virtio_user PMD";
>  	dev_info->max_rx_queues =
>  		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
>  	dev_info->max_tx_queues =
> 


This has been already removed in next-net with following commit:
7c6c1857358c ("net: remove dead driver names")

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 4/9] virtio: Don't fill dev_info->driver_name
  2016-12-20 12:17   ` Ferruh Yigit
@ 2016-12-20 12:40     ` Jan Blunck
  2016-12-20 12:58       ` Ferruh Yigit
  0 siblings, 1 reply; 21+ messages in thread
From: Jan Blunck @ 2016-12-20 12:40 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev, Shreyansh Jain, David Marchand, Stephen Hemminger

On Tue, Dec 20, 2016 at 1:17 PM, Ferruh Yigit <ferruh.yigit@intel.com> wrote:
> On 12/20/2016 11:11 AM, Jan Blunck wrote:
>> This is overwritten in rte_eth_dev_info_get().
>>
>> Signed-off-by: Jan Blunck <jblunck@infradead.org>
>> Reviewed-by: David Marchand <david.marchand@6wind.com>
>> ---
>>  drivers/net/virtio/virtio_ethdev.c | 4 ----
>>  1 file changed, 4 deletions(-)
>>
>> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
>> index 079fd6c..741688e 100644
>> --- a/drivers/net/virtio/virtio_ethdev.c
>> +++ b/drivers/net/virtio/virtio_ethdev.c
>> @@ -1624,10 +1624,6 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>       uint64_t tso_mask;
>>       struct virtio_hw *hw = dev->data->dev_private;
>>
>> -     if (dev->pci_dev)
>> -             dev_info->driver_name = dev->driver->pci_drv.driver.name;
>> -     else
>> -             dev_info->driver_name = "virtio_user PMD";
>>       dev_info->max_rx_queues =
>>               RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
>>       dev_info->max_tx_queues =
>>
>
>
> This has been already removed in next-net with following commit:
> 7c6c1857358c ("net: remove dead driver names")

Thanks. Do you want me to rebase against next-net and resend the
series before continuing to review further?

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 4/9] virtio: Don't fill dev_info->driver_name
  2016-12-20 12:40     ` Jan Blunck
@ 2016-12-20 12:58       ` Ferruh Yigit
  0 siblings, 0 replies; 21+ messages in thread
From: Ferruh Yigit @ 2016-12-20 12:58 UTC (permalink / raw)
  To: Jan Blunck; +Cc: dev, Shreyansh Jain, David Marchand, Stephen Hemminger

On 12/20/2016 12:40 PM, Jan Blunck wrote:
> On Tue, Dec 20, 2016 at 1:17 PM, Ferruh Yigit <ferruh.yigit@intel.com> wrote:
>> On 12/20/2016 11:11 AM, Jan Blunck wrote:
>>> This is overwritten in rte_eth_dev_info_get().
>>>
>>> Signed-off-by: Jan Blunck <jblunck@infradead.org>
>>> Reviewed-by: David Marchand <david.marchand@6wind.com>
>>> ---
>>>  drivers/net/virtio/virtio_ethdev.c | 4 ----
>>>  1 file changed, 4 deletions(-)
>>>
>>> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
>>> index 079fd6c..741688e 100644
>>> --- a/drivers/net/virtio/virtio_ethdev.c
>>> +++ b/drivers/net/virtio/virtio_ethdev.c
>>> @@ -1624,10 +1624,6 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>>       uint64_t tso_mask;
>>>       struct virtio_hw *hw = dev->data->dev_private;
>>>
>>> -     if (dev->pci_dev)
>>> -             dev_info->driver_name = dev->driver->pci_drv.driver.name;
>>> -     else
>>> -             dev_info->driver_name = "virtio_user PMD";
>>>       dev_info->max_rx_queues =
>>>               RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
>>>       dev_info->max_tx_queues =
>>>
>>
>>
>> This has been already removed in next-net with following commit:
>> 7c6c1857358c ("net: remove dead driver names")
> 
> Thanks. Do you want me to rebase against next-net and resend the
> series before continuing to review further?
> 

No, I thought this patch can be dropped from patchset, but no, you need
this for decoupling pci_dev.

So, this needs to be resolved in integration time.

I believe this patchset should be against main tree, because of eal and
ethdev patches in it.
And there are already a few patchset around for this area, let's not add
more complexity by adding next-net into the picture.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 2/9] ethdev: Helper to convert to struct rte_pci_device
  2016-12-20 11:11 ` [PATCH v3 2/9] ethdev: Helper to convert to struct rte_pci_device Jan Blunck
@ 2016-12-20 15:38   ` Stephen Hemminger
  0 siblings, 0 replies; 21+ messages in thread
From: Stephen Hemminger @ 2016-12-20 15:38 UTC (permalink / raw)
  To: Jan Blunck; +Cc: dev, shreyansh.jain, david.marchand

On Tue, 20 Dec 2016 12:11:48 +0100
Jan Blunck <jblunck@infradead.org> wrote:

> Signed-off-by: Jan Blunck <jblunck@infradead.org>
> Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com>
> ---
>  lib/librte_ether/rte_ethdev.h | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> index 9678179..3adbb2b 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -1644,6 +1644,12 @@ struct rte_eth_dev {
>  	uint8_t attached; /**< Flag indicating the port is attached */
>  } __rte_cache_aligned;
>  
> +/**
> + * @internal
> + * Helper for drivers that need to convert from rte_eth_dev to rte_pci_device.
> + */
> +#define ETH_DEV_PCI_DEV(ptr) ((ptr)->pci_dev)
> +
>  struct rte_eth_dev_sriov {
>  	uint8_t active;               /**< SRIOV is active with 16, 32 or 64 pools */
>  	uint8_t nb_q_per_pool;        /**< rx queue number per pool */

An inline might be better than macro, since a function is typed
versus a macro.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 7/9] ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get()
  2016-12-20 11:11 ` [PATCH v3 7/9] ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get() Jan Blunck
@ 2016-12-20 15:41   ` Stephen Hemminger
  2016-12-21 15:35     ` Jan Blunck
  2016-12-21  9:54   ` Shreyansh Jain
  1 sibling, 1 reply; 21+ messages in thread
From: Stephen Hemminger @ 2016-12-20 15:41 UTC (permalink / raw)
  To: Jan Blunck; +Cc: dev, shreyansh.jain, david.marchand

On Tue, 20 Dec 2016 12:11:53 +0100
Jan Blunck <jblunck@infradead.org> wrote:

> Only the device itself can decide its PCI or not.
> 
> Signed-off-by: Jan Blunck <jblunck@infradead.org>
> ---
>  drivers/net/bnx2x/bnx2x_ethdev.c        | 1 +
>  drivers/net/bnxt/bnxt_ethdev.c          | 2 ++
>  drivers/net/cxgbe/cxgbe_ethdev.c        | 2 ++
>  drivers/net/e1000/em_ethdev.c           | 1 +
>  drivers/net/e1000/igb_ethdev.c          | 2 ++
>  drivers/net/ena/ena_ethdev.c            | 2 ++
>  drivers/net/enic/enic_ethdev.c          | 1 +
>  drivers/net/fm10k/fm10k_ethdev.c        | 1 +
>  drivers/net/i40e/i40e_ethdev.c          | 1 +
>  drivers/net/i40e/i40e_ethdev_vf.c       | 1 +
>  drivers/net/ixgbe/ixgbe_ethdev.c        | 2 ++
>  drivers/net/mlx4/mlx4.c                 | 2 ++
>  drivers/net/mlx5/mlx5_ethdev.c          | 2 ++
>  drivers/net/nfp/nfp_net.c               | 1 +
>  drivers/net/qede/qede_ethdev.c          | 1 +
>  drivers/net/szedata2/rte_eth_szedata2.c | 1 +
>  drivers/net/thunderx/nicvf_ethdev.c     | 2 ++
>  drivers/net/virtio/virtio_ethdev.c      | 1 +
>  drivers/net/vmxnet3/vmxnet3_ethdev.c    | 2 ++
>  lib/librte_ether/rte_ethdev.c           | 1 -
>  20 files changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
> index c331ccd..551dbad 100644
> --- a/drivers/net/bnx2x/bnx2x_ethdev.c
> +++ b/drivers/net/bnx2x/bnx2x_ethdev.c
> @@ -431,6 +431,7 @@ static void
>  bnx2x_dev_infos_get(struct rte_eth_dev *dev, __rte_unused struct rte_eth_dev_info *dev_info)
>  {
>  	struct bnx2x_softc *sc = dev->data->dev_private;
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->max_rx_queues  = sc->max_rx_queues;
>  	dev_info->max_tx_queues  = sc->max_tx_queues;
>  	dev_info->min_rx_bufsize = BNX2X_MIN_RX_BUF_SIZE;
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
> index cd50f11..bf39fbe 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -303,6 +303,8 @@ static void bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
>  	struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
>  	uint16_t max_vnics, i, j, vpool, vrxq;
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
> +
>  	/* MAC Specifics */
>  	dev_info->max_mac_addrs = MAX_NUM_MAC_ADDR;
>  	dev_info->max_hash_mac_addrs = 0;
> diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
> index 8bfdda8..8938b08 100644
> --- a/drivers/net/cxgbe/cxgbe_ethdev.c
> +++ b/drivers/net/cxgbe/cxgbe_ethdev.c
> @@ -147,6 +147,8 @@ static void cxgbe_dev_info_get(struct rte_eth_dev *eth_dev,
>  		.nb_align = 1,
>  	};
>  
> +	device_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
> +
>  	device_info->min_rx_bufsize = CXGBE_MIN_RX_BUFSIZE;
>  	device_info->max_rx_pktlen = CXGBE_MAX_RX_PKTLEN;
>  	device_info->max_rx_queues = max_queues;
> diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
> index 7f2f521..3d34e5b 100644
> --- a/drivers/net/e1000/em_ethdev.c
> +++ b/drivers/net/e1000/em_ethdev.c
> @@ -1048,6 +1048,7 @@ eth_em_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  {
>  	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->min_rx_bufsize = 256; /* See BSIZE field of RCTL register. */
>  	dev_info->max_rx_pktlen = em_get_max_pktlen(hw);
>  	dev_info->max_mac_addrs = hw->mac.rar_entry_count;
> diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
> index b25c66e..7d77561 100644
> --- a/drivers/net/e1000/igb_ethdev.c
> +++ b/drivers/net/e1000/igb_ethdev.c
> @@ -1983,6 +1983,7 @@ eth_igb_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  {
>  	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->min_rx_bufsize = 256; /* See BSIZE field of RCTL register. */
>  	dev_info->max_rx_pktlen  = 0x3FFF; /* See RLPML register. */
>  	dev_info->max_mac_addrs = hw->mac.rar_entry_count;
> @@ -2111,6 +2112,7 @@ eth_igbvf_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  {
>  	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->min_rx_bufsize = 256; /* See BSIZE field of RCTL register. */
>  	dev_info->max_rx_pktlen  = 0x3FFF; /* See RLPML register. */
>  	dev_info->max_mac_addrs = hw->mac.rar_entry_count;
> diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
> index c17d969..051275e 100644
> --- a/drivers/net/ena/ena_ethdev.c
> +++ b/drivers/net/ena/ena_ethdev.c
> @@ -1436,6 +1436,8 @@ static void ena_infos_get(struct rte_eth_dev *dev,
>  	ena_dev = &adapter->ena_dev;
>  	ena_assert_msg(ena_dev != NULL, "Uninitialized device");
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
> +
>  	dev_info->speed_capa =
>  			ETH_LINK_SPEED_1G   |
>  			ETH_LINK_SPEED_2_5G |
> diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
> index 553a88e..bb5dfe6 100644
> --- a/drivers/net/enic/enic_ethdev.c
> +++ b/drivers/net/enic/enic_ethdev.c
> @@ -459,6 +459,7 @@ static void enicpmd_dev_info_get(struct rte_eth_dev *eth_dev,
>  	struct enic *enic = pmd_priv(eth_dev);
>  
>  	ENICPMD_FUNC_TRACE();
> +	device_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
>  	/* Scattered Rx uses two receive queues per rx queue exposed to dpdk */
>  	device_info->max_rx_queues = enic->conf_rq_count / 2;
>  	device_info->max_tx_queues = enic->conf_wq_count;
> diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
> index e1250f6..5d0bce5 100644
> --- a/drivers/net/fm10k/fm10k_ethdev.c
> +++ b/drivers/net/fm10k/fm10k_ethdev.c
> @@ -1392,6 +1392,7 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,
>  
>  	PMD_INIT_FUNC_TRACE();
>  
> +	dev_info->pci_dev            = ETH_DEV_PCI_DEV(dev);
>  	dev_info->min_rx_bufsize     = FM10K_MIN_RX_BUF_SIZE;
>  	dev_info->max_rx_pktlen      = FM10K_MAX_PKT_SIZE;
>  	dev_info->max_rx_queues      = hw->mac.max_queues;
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 8a63a8c..29c0277 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -2583,6 +2583,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>  	struct i40e_vsi *vsi = pf->main_vsi;
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->max_rx_queues = vsi->nb_qps;
>  	dev_info->max_tx_queues = vsi->nb_qps;
>  	dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
> index 781e658..caef72c 100644
> --- a/drivers/net/i40e/i40e_ethdev_vf.c
> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> @@ -2217,6 +2217,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  	struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
>  
>  	memset(dev_info, 0, sizeof(*dev_info));
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->max_rx_queues = vf->vsi_res->num_queue_pairs;
>  	dev_info->max_tx_queues = vf->vsi_res->num_queue_pairs;
>  	dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
> index f17da46..c88b7bf 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -3043,6 +3043,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  	struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
>  	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
>  	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
>  	if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
> @@ -3175,6 +3176,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
>  	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>  	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
>  	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
>  	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL reg */
> diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
> index da61a85..5455fea 100644
> --- a/drivers/net/mlx4/mlx4.c
> +++ b/drivers/net/mlx4/mlx4.c
> @@ -4421,6 +4421,8 @@ mlx4_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>  	unsigned int max;
>  	char ifname[IF_NAMESIZE];
>  
> +	info->pci_dev = ETH_DEV_PCI_DEV(dev);
> +
>  	if (priv == NULL)
>  		return;
>  	priv_lock(priv);
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> index c0f73e9..489a4f6 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -562,6 +562,8 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>  	unsigned int max;
>  	char ifname[IF_NAMESIZE];
>  
> +	info->pci_dev = ETH_DEV_PCI_DEV(dev);
> +
>  	priv_lock(priv);
>  	/* FIXME: we should ask the device for these values. */
>  	info->min_rx_bufsize = 32;
> diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
> index 7299fad..c49d38a 100644
> --- a/drivers/net/nfp/nfp_net.c
> +++ b/drivers/net/nfp/nfp_net.c
> @@ -1008,6 +1008,7 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  
>  	hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->driver_name = dev->driver->pci_drv.driver.name;
>  	dev_info->max_rx_queues = (uint16_t)hw->max_rx_queues;
>  	dev_info->max_tx_queues = (uint16_t)hw->max_tx_queues;
> diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
> index 959ff0f..2c4de92 100644
> --- a/drivers/net/qede/qede_ethdev.c
> +++ b/drivers/net/qede/qede_ethdev.c
> @@ -652,6 +652,7 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev,
>  
>  	PMD_INIT_FUNC_TRACE(edev);
>  
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
>  	dev_info->min_rx_bufsize = (uint32_t)(ETHER_MIN_MTU +
>  					      QEDE_ETH_OVERHEAD);
>  	dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
> diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
> index 6d80a5b..6356257 100644
> --- a/drivers/net/szedata2/rte_eth_szedata2.c
> +++ b/drivers/net/szedata2/rte_eth_szedata2.c
> @@ -1030,6 +1030,7 @@ eth_dev_info(struct rte_eth_dev *dev,
>  		struct rte_eth_dev_info *dev_info)
>  {
>  	struct pmd_internals *internals = dev->data->dev_private;
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->if_index = 0;
>  	dev_info->max_mac_addrs = 1;
>  	dev_info->max_rx_pktlen = (uint32_t)-1;
> diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
> index 099b252..daac853 100644
> --- a/drivers/net/thunderx/nicvf_ethdev.c
> +++ b/drivers/net/thunderx/nicvf_ethdev.c
> @@ -1339,6 +1339,8 @@ nicvf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  
>  	PMD_INIT_FUNC_TRACE();
>  
> +	dev_info->pci_dev = pci_dev;
> +
>  	dev_info->min_rx_bufsize = ETHER_MIN_MTU;
>  	dev_info->max_rx_pktlen = NIC_HW_MAX_FRS;
>  	dev_info->max_rx_queues =
> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
> index 023101d..2eb6a06 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -1625,6 +1625,7 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  	uint64_t tso_mask;
>  	struct virtio_hw *hw = dev->data->dev_private;
>  
> +	dev_info->pci_dev = hw->dev;
>  	dev_info->max_rx_queues =
>  		RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
>  	dev_info->max_tx_queues =
> diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> index bcb3751..f7c0382 100644
> --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
> +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> @@ -709,6 +709,8 @@ static void
>  vmxnet3_dev_info_get(__rte_unused struct rte_eth_dev *dev,
>  		     struct rte_eth_dev_info *dev_info)
>  {
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
> +
>  	dev_info->max_rx_queues = VMXNET3_MAX_RX_QUEUES;
>  	dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
>  	dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> index fde8112..4288577 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -1556,7 +1556,6 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
>  
>  	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
>  	(*dev->dev_ops->dev_infos_get)(dev, dev_info);
> -	dev_info->pci_dev = dev->pci_dev;
>  	dev_info->driver_name = dev->data->drv_name;
>  	dev_info->nb_rx_queues = dev->data->nb_rx_queues;
>  	dev_info->nb_tx_queues = dev->data->nb_tx_queues;


If dev_info_get sets a pointer to device (rather than pci_dev) then it can
stay in generic code.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 3/9] drivers: Use ETH_DEV_PCI_DEV() helper
  2016-12-20 11:11 ` [PATCH v3 3/9] drivers: Use ETH_DEV_PCI_DEV() helper Jan Blunck
@ 2016-12-21  9:50   ` Shreyansh Jain
  2016-12-21  9:57     ` Shreyansh Jain
  0 siblings, 1 reply; 21+ messages in thread
From: Shreyansh Jain @ 2016-12-21  9:50 UTC (permalink / raw)
  To: Jan Blunck, dev; +Cc: david.marchand, stephen

On Tuesday 20 December 2016 04:41 PM, Jan Blunck wrote:
> The drivers should not directly access the rte_eth_dev->pci_dev but use
> a macro instead. This is a preparation for replacing the pci_dev with
> a struct rte_device member in the future.
>
> Signed-off-by: Jan Blunck <jblunck@infradead.org>
> ---
>  drivers/net/bnx2x/bnx2x_ethdev.c        | 12 +++---
>  drivers/net/bnxt/bnxt_ethdev.c          | 19 ++++++----
>  drivers/net/bnxt/bnxt_ring.c            | 11 +++---
>  drivers/net/cxgbe/cxgbe_ethdev.c        |  2 +-
>  drivers/net/e1000/em_ethdev.c           | 20 ++++++----
>  drivers/net/e1000/igb_ethdev.c          | 50 ++++++++++++++-----------
>  drivers/net/e1000/igb_pf.c              |  3 +-
>  drivers/net/ena/ena_ethdev.c            |  2 +-
>  drivers/net/enic/enic_ethdev.c          |  2 +-
>  drivers/net/fm10k/fm10k_ethdev.c        | 49 +++++++++++++------------
>  drivers/net/i40e/i40e_ethdev.c          | 44 +++++++++++-----------
>  drivers/net/i40e/i40e_ethdev.h          |  4 ++
>  drivers/net/i40e/i40e_ethdev_vf.c       | 38 +++++++++----------
>  drivers/net/ixgbe/ixgbe_ethdev.c        | 65 ++++++++++++++++++++-------------
>  drivers/net/ixgbe/ixgbe_pf.c            |  2 +-
>  drivers/net/nfp/nfp_net.c               | 16 ++++----
>  drivers/net/qede/qede_ethdev.c          | 17 +++++----
>  drivers/net/szedata2/rte_eth_szedata2.c | 27 +++++++-------
>  drivers/net/szedata2/rte_eth_szedata2.h | 34 ++++++++---------
>  drivers/net/thunderx/nicvf_ethdev.c     |  5 ++-
>  drivers/net/vmxnet3/vmxnet3_ethdev.c    |  4 +-
>  21 files changed, 234 insertions(+), 192 deletions(-)
>
> diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
> index 0eae433..c331ccd 100644
> --- a/drivers/net/bnx2x/bnx2x_ethdev.c
> +++ b/drivers/net/bnx2x/bnx2x_ethdev.c
> @@ -124,7 +124,7 @@ bnx2x_interrupt_handler(__rte_unused struct rte_intr_handle *handle, void *param
>  	struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
>
>  	bnx2x_interrupt_action(dev);
> -	rte_intr_enable(&(dev->pci_dev->intr_handle));
> +	rte_intr_enable(&(ETH_DEV_PCI_DEV(dev)->intr_handle));
>  }
>
>  /*
> @@ -187,10 +187,10 @@ bnx2x_dev_start(struct rte_eth_dev *dev)
>  	}
>
>  	if (IS_PF(sc)) {
> -		rte_intr_callback_register(&(dev->pci_dev->intr_handle),
> +		rte_intr_callback_register(&sc->pci_dev->intr_handle,
>  				bnx2x_interrupt_handler, (void *)dev);
>
> -		if(rte_intr_enable(&(dev->pci_dev->intr_handle)))
> +		if (rte_intr_enable(&sc->pci_dev->intr_handle))


This changeset generates following error in my environment:

--->8---
/home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x_ethdev.c: In 
function ‘bnx2x_dev_start’:
/home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x_ethdev.c:190:30: 
error: passing argument 1 of ‘rte_intr_callback_register’ discards 
‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
    rte_intr_callback_register(&sc->pci_dev->intr_handle,
                               ^
In file included from 
/home/shreyansh/build/DPDK/01_dpdk/x86_64-native-linuxapp-gcc/include/rte_pci.h:86:0,
                  from 
/home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x_ethdev.h:34,
                  from 
/home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x.h:34,
                  from 
/home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x_ethdev.c:11:
/home/shreyansh/build/DPDK/01_dpdk/x86_64-native-linuxapp-gcc/include/rte_interrupts.h:73:5: 
note: expected ‘struct rte_intr_handle *’ but argument is of type ‘const 
struct rte_intr_handle *’
  int rte_intr_callback_register(struct rte_intr_handle *intr_handle,

--->8---

Problem is that earlier 'eth_dev->pci_dev->intr_handle' was being passed 
which was not a 'const'. But, the BNX2 local structure 'bnx2x_softc' has 
a 'const struct rte_pci_device *' as member.

Maybe, following can help:

rte_intr_callback_register(&ETH_DEV_PCI_DEV(dev),...);


>  			PMD_DRV_LOG(ERR, "rte_intr_enable failed");
>  	}
>
> @@ -215,8 +215,8 @@ bnx2x_dev_stop(struct rte_eth_dev *dev)
>  	PMD_INIT_FUNC_TRACE();
>
>  	if (IS_PF(sc)) {
> -		rte_intr_disable(&(dev->pci_dev->intr_handle));
> -		rte_intr_callback_unregister(&(dev->pci_dev->intr_handle),
> +		rte_intr_disable(&sc->pci_dev->intr_handle);
> +		rte_intr_callback_unregister(&sc->pci_dev->intr_handle,

Similar error here.
rte_intr_callback_unregister(&(ETH_DEV_PCI_DEV(dev)->intr_handle), ...) 
solves it for me.

>  				bnx2x_interrupt_handler, (void *)dev);
>  	}
>
> @@ -516,7 +516,7 @@ bnx2x_common_dev_init(struct rte_eth_dev *eth_dev, int is_vf)
>  	PMD_INIT_FUNC_TRACE();
>
>  	eth_dev->dev_ops = is_vf ? &bnx2xvf_eth_dev_ops : &bnx2x_eth_dev_ops;
> -	pci_dev = eth_dev->pci_dev;
> +	pci_dev = ETH_DEV_PCI_DEV(eth_dev);
>
>  	rte_eth_copy_pci_info(eth_dev, pci_dev);
>
<snip>

-
Shreyansh

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 7/9] ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get()
  2016-12-20 11:11 ` [PATCH v3 7/9] ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get() Jan Blunck
  2016-12-20 15:41   ` Stephen Hemminger
@ 2016-12-21  9:54   ` Shreyansh Jain
  1 sibling, 0 replies; 21+ messages in thread
From: Shreyansh Jain @ 2016-12-21  9:54 UTC (permalink / raw)
  To: Jan Blunck; +Cc: dev, david.marchand, stephen

On Tuesday 20 December 2016 04:41 PM, Jan Blunck wrote:
> Only the device itself can decide its PCI or not.
>
> Signed-off-by: Jan Blunck <jblunck@infradead.org>
> ---
>  drivers/net/bnx2x/bnx2x_ethdev.c        | 1 +
>  drivers/net/bnxt/bnxt_ethdev.c          | 2 ++
>  drivers/net/cxgbe/cxgbe_ethdev.c        | 2 ++
>  drivers/net/e1000/em_ethdev.c           | 1 +
>  drivers/net/e1000/igb_ethdev.c          | 2 ++
>  drivers/net/ena/ena_ethdev.c            | 2 ++
>  drivers/net/enic/enic_ethdev.c          | 1 +
>  drivers/net/fm10k/fm10k_ethdev.c        | 1 +
>  drivers/net/i40e/i40e_ethdev.c          | 1 +
>  drivers/net/i40e/i40e_ethdev_vf.c       | 1 +
>  drivers/net/ixgbe/ixgbe_ethdev.c        | 2 ++
>  drivers/net/mlx4/mlx4.c                 | 2 ++
>  drivers/net/mlx5/mlx5_ethdev.c          | 2 ++
>  drivers/net/nfp/nfp_net.c               | 1 +
>  drivers/net/qede/qede_ethdev.c          | 1 +
>  drivers/net/szedata2/rte_eth_szedata2.c | 1 +
>  drivers/net/thunderx/nicvf_ethdev.c     | 2 ++
>  drivers/net/virtio/virtio_ethdev.c      | 1 +
>  drivers/net/vmxnet3/vmxnet3_ethdev.c    | 2 ++
>  lib/librte_ether/rte_ethdev.c           | 1 -
>  20 files changed, 28 insertions(+), 1 deletion(-)
>

<snip>

> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
> index f17da46..c88b7bf 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -3043,6 +3043,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  	struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
>  	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
>
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
>  	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
>  	if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
> @@ -3175,6 +3176,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
>  	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>  	struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
>
> +	dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>  	dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
>  	dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
>  	dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL reg */
> diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
> index da61a85..5455fea 100644
> --- a/drivers/net/mlx4/mlx4.c
> +++ b/drivers/net/mlx4/mlx4.c
> @@ -4421,6 +4421,8 @@ mlx4_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>  	unsigned int max;
>  	char ifname[IF_NAMESIZE];
>
> +	info->pci_dev = ETH_DEV_PCI_DEV(dev);
> +

My compilation environment is reporting following error:

--->8---
/home/shreyansh/build/DPDK/01_dpdk/drivers/net/mlx4/mlx4.c: In function 
‘mlx4_pci_probe’:
/home/shreyansh/build/DPDK/01_dpdk/drivers/net/mlx4/mlx4.c:5843:10: 
error: ‘struct rte_eth_dev’ has no member named ‘pci_dev’
    eth_dev->pci_dev = pci_dev;
           ^
/home/shreyansh/build/DPDK/01_dpdk/mk/internal/rte.compile-pre.mk:138: 
recipe for target 'mlx4.o' failed
--->8---

Exact same issue exists on MLX5 also I think:

1d [shreyansh:~/build/DPDK/01_dpdk] 
tmp/jan_patches_ethdev_21dec(+11/-11)+* ± grep "eth_dev->pci_dev" * -rn
drivers/net/mlx5/mlx5.c:660:            eth_dev->pci_dev = pci_dev;
drivers/net/mlx4/mlx4.c:5843:           eth_dev->pci_dev = pci_dev;

(I don't yet have MLX5 compilation env - so, above is just my guess).


>  	if (priv == NULL)
>  		return;
>  	priv_lock(priv);
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> index c0f73e9..489a4f6 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -562,6 +562,8 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>  	unsigned int max;
>  	char ifname[IF_NAMESIZE];
>
> +	info->pci_dev = ETH_DEV_PCI_DEV(dev);
> +
>  	priv_lock(priv);
>  	/* FIXME: we should ask the device for these values. */
>  	info->min_rx_bufsize = 32;

<Snip>

-
Shreyansh

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 3/9] drivers: Use ETH_DEV_PCI_DEV() helper
  2016-12-21  9:50   ` Shreyansh Jain
@ 2016-12-21  9:57     ` Shreyansh Jain
  0 siblings, 0 replies; 21+ messages in thread
From: Shreyansh Jain @ 2016-12-21  9:57 UTC (permalink / raw)
  To: Jan Blunck; +Cc: dev, david.marchand, stephen

On Wednesday 21 December 2016 03:20 PM, Shreyansh Jain wrote:
> On Tuesday 20 December 2016 04:41 PM, Jan Blunck wrote:
>> The drivers should not directly access the rte_eth_dev->pci_dev but use
>> a macro instead. This is a preparation for replacing the pci_dev with
>> a struct rte_device member in the future.
>>
>> Signed-off-by: Jan Blunck <jblunck@infradead.org>
>> ---
>>  drivers/net/bnx2x/bnx2x_ethdev.c        | 12 +++---
>>  drivers/net/bnxt/bnxt_ethdev.c          | 19 ++++++----
>>  drivers/net/bnxt/bnxt_ring.c            | 11 +++---
>>  drivers/net/cxgbe/cxgbe_ethdev.c        |  2 +-
>>  drivers/net/e1000/em_ethdev.c           | 20 ++++++----
>>  drivers/net/e1000/igb_ethdev.c          | 50 ++++++++++++++-----------
>>  drivers/net/e1000/igb_pf.c              |  3 +-
>>  drivers/net/ena/ena_ethdev.c            |  2 +-
>>  drivers/net/enic/enic_ethdev.c          |  2 +-
>>  drivers/net/fm10k/fm10k_ethdev.c        | 49 +++++++++++++------------
>>  drivers/net/i40e/i40e_ethdev.c          | 44 +++++++++++-----------
>>  drivers/net/i40e/i40e_ethdev.h          |  4 ++
>>  drivers/net/i40e/i40e_ethdev_vf.c       | 38 +++++++++----------
>>  drivers/net/ixgbe/ixgbe_ethdev.c        | 65
>> ++++++++++++++++++++-------------
>>  drivers/net/ixgbe/ixgbe_pf.c            |  2 +-
>>  drivers/net/nfp/nfp_net.c               | 16 ++++----
>>  drivers/net/qede/qede_ethdev.c          | 17 +++++----
>>  drivers/net/szedata2/rte_eth_szedata2.c | 27 +++++++-------
>>  drivers/net/szedata2/rte_eth_szedata2.h | 34 ++++++++---------
>>  drivers/net/thunderx/nicvf_ethdev.c     |  5 ++-
>>  drivers/net/vmxnet3/vmxnet3_ethdev.c    |  4 +-
>>  21 files changed, 234 insertions(+), 192 deletions(-)
>>
>> diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c
>> b/drivers/net/bnx2x/bnx2x_ethdev.c
>> index 0eae433..c331ccd 100644
>> --- a/drivers/net/bnx2x/bnx2x_ethdev.c
>> +++ b/drivers/net/bnx2x/bnx2x_ethdev.c
>> @@ -124,7 +124,7 @@ bnx2x_interrupt_handler(__rte_unused struct
>> rte_intr_handle *handle, void *param
>>      struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
>>
>>      bnx2x_interrupt_action(dev);
>> -    rte_intr_enable(&(dev->pci_dev->intr_handle));
>> +    rte_intr_enable(&(ETH_DEV_PCI_DEV(dev)->intr_handle));
>>  }
>>
>>  /*
>> @@ -187,10 +187,10 @@ bnx2x_dev_start(struct rte_eth_dev *dev)
>>      }
>>
>>      if (IS_PF(sc)) {
>> -        rte_intr_callback_register(&(dev->pci_dev->intr_handle),
>> +        rte_intr_callback_register(&sc->pci_dev->intr_handle,
>>                  bnx2x_interrupt_handler, (void *)dev);
>>
>> -        if(rte_intr_enable(&(dev->pci_dev->intr_handle)))
>> +        if (rte_intr_enable(&sc->pci_dev->intr_handle))
>
>
> This changeset generates following error in my environment:
>
> --->8---
> /home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x_ethdev.c: In
> function ‘bnx2x_dev_start’:
> /home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x_ethdev.c:190:30:
> error: passing argument 1 of ‘rte_intr_callback_register’ discards
> ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
>    rte_intr_callback_register(&sc->pci_dev->intr_handle,
>                               ^
> In file included from
> /home/shreyansh/build/DPDK/01_dpdk/x86_64-native-linuxapp-gcc/include/rte_pci.h:86:0,
>
>                  from
> /home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x_ethdev.h:34,
>                  from
> /home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x.h:34,
>                  from
> /home/shreyansh/build/DPDK/01_dpdk/drivers/net/bnx2x/bnx2x_ethdev.c:11:
> /home/shreyansh/build/DPDK/01_dpdk/x86_64-native-linuxapp-gcc/include/rte_interrupts.h:73:5:
> note: expected ‘struct rte_intr_handle *’ but argument is of type ‘const
> struct rte_intr_handle *’
>  int rte_intr_callback_register(struct rte_intr_handle *intr_handle,
>
> --->8---
>
> Problem is that earlier 'eth_dev->pci_dev->intr_handle' was being passed
> which was not a 'const'. But, the BNX2 local structure 'bnx2x_softc' has
> a 'const struct rte_pci_device *' as member.
>
> Maybe, following can help:
>
> rte_intr_callback_register(&ETH_DEV_PCI_DEV(dev),...);

Forgot to add to above as a side note:
In case you are trying to extract info from private info of bnx2x, my 
suggestion above is wrong (though, the compilation error still exists).

>
>
>>              PMD_DRV_LOG(ERR, "rte_intr_enable failed");
>>      }
>>
>> @@ -215,8 +215,8 @@ bnx2x_dev_stop(struct rte_eth_dev *dev)
>>      PMD_INIT_FUNC_TRACE();
>>
>>      if (IS_PF(sc)) {
>> -        rte_intr_disable(&(dev->pci_dev->intr_handle));
>> -        rte_intr_callback_unregister(&(dev->pci_dev->intr_handle),
>> +        rte_intr_disable(&sc->pci_dev->intr_handle);
>> +        rte_intr_callback_unregister(&sc->pci_dev->intr_handle,
>
> Similar error here.
> rte_intr_callback_unregister(&(ETH_DEV_PCI_DEV(dev)->intr_handle), ...)
> solves it for me.
>
>>                  bnx2x_interrupt_handler, (void *)dev);
>>      }
>>
>> @@ -516,7 +516,7 @@ bnx2x_common_dev_init(struct rte_eth_dev *eth_dev,
>> int is_vf)
>>      PMD_INIT_FUNC_TRACE();
>>
>>      eth_dev->dev_ops = is_vf ? &bnx2xvf_eth_dev_ops :
>> &bnx2x_eth_dev_ops;
>> -    pci_dev = eth_dev->pci_dev;
>> +    pci_dev = ETH_DEV_PCI_DEV(eth_dev);
>>
>>      rte_eth_copy_pci_info(eth_dev, pci_dev);
>>
> <snip>
>
> -
> Shreyansh
>
>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 0/9] Decouple ethdev from PCI device
  2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
                   ` (8 preceding siblings ...)
  2016-12-20 11:11 ` [PATCH v3 9/9] ethdev: Decouple struct rte_eth_dev from struct rte_pci_device Jan Blunck
@ 2016-12-21 10:00 ` Shreyansh Jain
  2016-12-21 15:12   ` Jan Blunck
  9 siblings, 1 reply; 21+ messages in thread
From: Shreyansh Jain @ 2016-12-21 10:00 UTC (permalink / raw)
  To: Jan Blunck; +Cc: dev, david.marchand, Thomas Monjalon

Hi Jan,

On Tuesday 20 December 2016 04:41 PM, Jan Blunck wrote:
> This is a repost of the series I sent in November. I've addressed Shreyansh's
> review comments about the PCI device users I've missed.
>
> Jan Blunck (9):
>   eal: define container_of macro
>   ethdev: Helper to convert to struct rte_pci_device
>   drivers: Use ETH_DEV_PCI_DEV() helper
>   virtio: Don't fill dev_info->driver_name
>   virtio: Add vtpci_intr_handle() helper to get rte_intr_handle
>   virtio: Don't depend on struct rte_eth_dev's pci_dev
>   ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get()
>   ethdev: Decouple interrupt handling from PCI device
>   ethdev: Decouple struct rte_eth_dev from struct rte_pci_device
>
>  app/test/virtual_pmd.c                     |  4 +-
>  drivers/net/bnx2x/bnx2x_ethdev.c           | 13 +++---
>  drivers/net/bnxt/bnxt_ethdev.c             | 21 ++++++----
>  drivers/net/bnxt/bnxt_ring.c               | 11 ++---
>  drivers/net/bonding/rte_eth_bond_args.c    | 12 +++++-
>  drivers/net/cxgbe/cxgbe_ethdev.c           |  4 +-
>  drivers/net/cxgbe/cxgbe_main.c             |  4 +-
>  drivers/net/e1000/em_ethdev.c              | 21 ++++++----
>  drivers/net/e1000/igb_ethdev.c             | 52 +++++++++++++----------
>  drivers/net/e1000/igb_pf.c                 |  3 +-
>  drivers/net/ena/ena_ethdev.c               |  4 +-
>  drivers/net/enic/enic_ethdev.c             |  3 +-
>  drivers/net/fm10k/fm10k_ethdev.c           | 56 +++++++++++++------------
>  drivers/net/i40e/i40e_ethdev.c             | 45 ++++++++++----------
>  drivers/net/i40e/i40e_ethdev.h             |  4 ++
>  drivers/net/i40e/i40e_ethdev_vf.c          | 39 ++++++++---------
>  drivers/net/ixgbe/ixgbe_ethdev.c           | 67 ++++++++++++++++++------------
>  drivers/net/ixgbe/ixgbe_pf.c               |  2 +-
>  drivers/net/mlx4/mlx4.c                    |  2 +
>  drivers/net/mlx5/mlx5_ethdev.c             |  2 +
>  drivers/net/nfp/nfp_net.c                  | 17 ++++----
>  drivers/net/qede/qede_ethdev.c             | 18 ++++----
>  drivers/net/szedata2/rte_eth_szedata2.c    | 28 +++++++------
>  drivers/net/szedata2/rte_eth_szedata2.h    | 34 +++++++--------
>  drivers/net/thunderx/nicvf_ethdev.c        |  7 +++-
>  drivers/net/virtio/virtio_ethdev.c         | 38 ++++++++---------
>  drivers/net/virtio/virtio_pci.h            |  6 +++
>  drivers/net/virtio/virtio_user_ethdev.c    |  1 -
>  drivers/net/vmxnet3/vmxnet3_ethdev.c       |  6 ++-
>  lib/librte_eal/common/include/rte_common.h | 20 +++++++++
>  lib/librte_eal/common/include/rte_pci.h    |  6 +++
>  lib/librte_ether/rte_ethdev.c              | 25 ++++++++---
>  lib/librte_ether/rte_ethdev.h              |  9 +++-
>  33 files changed, 355 insertions(+), 229 deletions(-)
>

Besides the MLX* and bnx2x compile errors (responses in individual patch 
email), all other changes look fine to me.

Either you can directly add my series ACK to v4 or, for ML record 
purpose, I will do that once you post v4 - whichever way you prefer.

-
Shreyansh

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 0/9] Decouple ethdev from PCI device
  2016-12-21 10:00 ` [PATCH v3 0/9] Decouple ethdev from PCI device Shreyansh Jain
@ 2016-12-21 15:12   ` Jan Blunck
  0 siblings, 0 replies; 21+ messages in thread
From: Jan Blunck @ 2016-12-21 15:12 UTC (permalink / raw)
  To: Shreyansh Jain; +Cc: dev, David Marchand, Thomas Monjalon

On Wed, Dec 21, 2016 at 11:00 AM, Shreyansh Jain <shreyansh.jain@nxp.com> wrote:
> Hi Jan,
>
>
> On Tuesday 20 December 2016 04:41 PM, Jan Blunck wrote:
>>
>> This is a repost of the series I sent in November. I've addressed
>> Shreyansh's
>> review comments about the PCI device users I've missed.
>>
>> Jan Blunck (9):
>>   eal: define container_of macro
>>   ethdev: Helper to convert to struct rte_pci_device
>>   drivers: Use ETH_DEV_PCI_DEV() helper
>>   virtio: Don't fill dev_info->driver_name
>>   virtio: Add vtpci_intr_handle() helper to get rte_intr_handle
>>   virtio: Don't depend on struct rte_eth_dev's pci_dev
>>   ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get()
>>   ethdev: Decouple interrupt handling from PCI device
>>   ethdev: Decouple struct rte_eth_dev from struct rte_pci_device
>>
>>  app/test/virtual_pmd.c                     |  4 +-
>>  drivers/net/bnx2x/bnx2x_ethdev.c           | 13 +++---
>>  drivers/net/bnxt/bnxt_ethdev.c             | 21 ++++++----
>>  drivers/net/bnxt/bnxt_ring.c               | 11 ++---
>>  drivers/net/bonding/rte_eth_bond_args.c    | 12 +++++-
>>  drivers/net/cxgbe/cxgbe_ethdev.c           |  4 +-
>>  drivers/net/cxgbe/cxgbe_main.c             |  4 +-
>>  drivers/net/e1000/em_ethdev.c              | 21 ++++++----
>>  drivers/net/e1000/igb_ethdev.c             | 52 +++++++++++++----------
>>  drivers/net/e1000/igb_pf.c                 |  3 +-
>>  drivers/net/ena/ena_ethdev.c               |  4 +-
>>  drivers/net/enic/enic_ethdev.c             |  3 +-
>>  drivers/net/fm10k/fm10k_ethdev.c           | 56 +++++++++++++------------
>>  drivers/net/i40e/i40e_ethdev.c             | 45 ++++++++++----------
>>  drivers/net/i40e/i40e_ethdev.h             |  4 ++
>>  drivers/net/i40e/i40e_ethdev_vf.c          | 39 ++++++++---------
>>  drivers/net/ixgbe/ixgbe_ethdev.c           | 67
>> ++++++++++++++++++------------
>>  drivers/net/ixgbe/ixgbe_pf.c               |  2 +-
>>  drivers/net/mlx4/mlx4.c                    |  2 +
>>  drivers/net/mlx5/mlx5_ethdev.c             |  2 +
>>  drivers/net/nfp/nfp_net.c                  | 17 ++++----
>>  drivers/net/qede/qede_ethdev.c             | 18 ++++----
>>  drivers/net/szedata2/rte_eth_szedata2.c    | 28 +++++++------
>>  drivers/net/szedata2/rte_eth_szedata2.h    | 34 +++++++--------
>>  drivers/net/thunderx/nicvf_ethdev.c        |  7 +++-
>>  drivers/net/virtio/virtio_ethdev.c         | 38 ++++++++---------
>>  drivers/net/virtio/virtio_pci.h            |  6 +++
>>  drivers/net/virtio/virtio_user_ethdev.c    |  1 -
>>  drivers/net/vmxnet3/vmxnet3_ethdev.c       |  6 ++-
>>  lib/librte_eal/common/include/rte_common.h | 20 +++++++++
>>  lib/librte_eal/common/include/rte_pci.h    |  6 +++
>>  lib/librte_ether/rte_ethdev.c              | 25 ++++++++---
>>  lib/librte_ether/rte_ethdev.h              |  9 +++-
>>  33 files changed, 355 insertions(+), 229 deletions(-)
>>
>
> Besides the MLX* and bnx2x compile errors (responses in individual patch
> email), all other changes look fine to me.
>
> Either you can directly add my series ACK to v4 or, for ML record purpose, I
> will do that once you post v4 - whichever way you prefer.
>

Shreyansh,

Thanks for the review. I've added acks for the patches that you have
review. I've broken out the changes a little bit better like Stephen
did in his series. For these patches I haven't added your acks yet.

Cheers,
Jan

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 7/9] ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get()
  2016-12-20 15:41   ` Stephen Hemminger
@ 2016-12-21 15:35     ` Jan Blunck
  0 siblings, 0 replies; 21+ messages in thread
From: Jan Blunck @ 2016-12-21 15:35 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev, Shreyansh Jain, David Marchand

On Tue, Dec 20, 2016 at 4:41 PM, Stephen Hemminger
<stephen@networkplumber.org> wrote:
> On Tue, 20 Dec 2016 12:11:53 +0100
> Jan Blunck <jblunck@infradead.org> wrote:
>
>> Only the device itself can decide its PCI or not.
>>
>> Signed-off-by: Jan Blunck <jblunck@infradead.org>
>> ---
>>  drivers/net/bnx2x/bnx2x_ethdev.c        | 1 +
>>  drivers/net/bnxt/bnxt_ethdev.c          | 2 ++
>>  drivers/net/cxgbe/cxgbe_ethdev.c        | 2 ++
>>  drivers/net/e1000/em_ethdev.c           | 1 +
>>  drivers/net/e1000/igb_ethdev.c          | 2 ++
>>  drivers/net/ena/ena_ethdev.c            | 2 ++
>>  drivers/net/enic/enic_ethdev.c          | 1 +
>>  drivers/net/fm10k/fm10k_ethdev.c        | 1 +
>>  drivers/net/i40e/i40e_ethdev.c          | 1 +
>>  drivers/net/i40e/i40e_ethdev_vf.c       | 1 +
>>  drivers/net/ixgbe/ixgbe_ethdev.c        | 2 ++
>>  drivers/net/mlx4/mlx4.c                 | 2 ++
>>  drivers/net/mlx5/mlx5_ethdev.c          | 2 ++
>>  drivers/net/nfp/nfp_net.c               | 1 +
>>  drivers/net/qede/qede_ethdev.c          | 1 +
>>  drivers/net/szedata2/rte_eth_szedata2.c | 1 +
>>  drivers/net/thunderx/nicvf_ethdev.c     | 2 ++
>>  drivers/net/virtio/virtio_ethdev.c      | 1 +
>>  drivers/net/vmxnet3/vmxnet3_ethdev.c    | 2 ++
>>  lib/librte_ether/rte_ethdev.c           | 1 -
>>  20 files changed, 28 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
>> index c331ccd..551dbad 100644
>> --- a/drivers/net/bnx2x/bnx2x_ethdev.c
>> +++ b/drivers/net/bnx2x/bnx2x_ethdev.c
>> @@ -431,6 +431,7 @@ static void
>>  bnx2x_dev_infos_get(struct rte_eth_dev *dev, __rte_unused struct rte_eth_dev_info *dev_info)
>>  {
>>       struct bnx2x_softc *sc = dev->data->dev_private;
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->max_rx_queues  = sc->max_rx_queues;
>>       dev_info->max_tx_queues  = sc->max_tx_queues;
>>       dev_info->min_rx_bufsize = BNX2X_MIN_RX_BUF_SIZE;
>> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
>> index cd50f11..bf39fbe 100644
>> --- a/drivers/net/bnxt/bnxt_ethdev.c
>> +++ b/drivers/net/bnxt/bnxt_ethdev.c
>> @@ -303,6 +303,8 @@ static void bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
>>       struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
>>       uint16_t max_vnics, i, j, vpool, vrxq;
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
>> +
>>       /* MAC Specifics */
>>       dev_info->max_mac_addrs = MAX_NUM_MAC_ADDR;
>>       dev_info->max_hash_mac_addrs = 0;
>> diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
>> index 8bfdda8..8938b08 100644
>> --- a/drivers/net/cxgbe/cxgbe_ethdev.c
>> +++ b/drivers/net/cxgbe/cxgbe_ethdev.c
>> @@ -147,6 +147,8 @@ static void cxgbe_dev_info_get(struct rte_eth_dev *eth_dev,
>>               .nb_align = 1,
>>       };
>>
>> +     device_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
>> +
>>       device_info->min_rx_bufsize = CXGBE_MIN_RX_BUFSIZE;
>>       device_info->max_rx_pktlen = CXGBE_MAX_RX_PKTLEN;
>>       device_info->max_rx_queues = max_queues;
>> diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
>> index 7f2f521..3d34e5b 100644
>> --- a/drivers/net/e1000/em_ethdev.c
>> +++ b/drivers/net/e1000/em_ethdev.c
>> @@ -1048,6 +1048,7 @@ eth_em_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>  {
>>       struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->min_rx_bufsize = 256; /* See BSIZE field of RCTL register. */
>>       dev_info->max_rx_pktlen = em_get_max_pktlen(hw);
>>       dev_info->max_mac_addrs = hw->mac.rar_entry_count;
>> diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
>> index b25c66e..7d77561 100644
>> --- a/drivers/net/e1000/igb_ethdev.c
>> +++ b/drivers/net/e1000/igb_ethdev.c
>> @@ -1983,6 +1983,7 @@ eth_igb_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>  {
>>       struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->min_rx_bufsize = 256; /* See BSIZE field of RCTL register. */
>>       dev_info->max_rx_pktlen  = 0x3FFF; /* See RLPML register. */
>>       dev_info->max_mac_addrs = hw->mac.rar_entry_count;
>> @@ -2111,6 +2112,7 @@ eth_igbvf_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>  {
>>       struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->min_rx_bufsize = 256; /* See BSIZE field of RCTL register. */
>>       dev_info->max_rx_pktlen  = 0x3FFF; /* See RLPML register. */
>>       dev_info->max_mac_addrs = hw->mac.rar_entry_count;
>> diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
>> index c17d969..051275e 100644
>> --- a/drivers/net/ena/ena_ethdev.c
>> +++ b/drivers/net/ena/ena_ethdev.c
>> @@ -1436,6 +1436,8 @@ static void ena_infos_get(struct rte_eth_dev *dev,
>>       ena_dev = &adapter->ena_dev;
>>       ena_assert_msg(ena_dev != NULL, "Uninitialized device");
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>> +
>>       dev_info->speed_capa =
>>                       ETH_LINK_SPEED_1G   |
>>                       ETH_LINK_SPEED_2_5G |
>> diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
>> index 553a88e..bb5dfe6 100644
>> --- a/drivers/net/enic/enic_ethdev.c
>> +++ b/drivers/net/enic/enic_ethdev.c
>> @@ -459,6 +459,7 @@ static void enicpmd_dev_info_get(struct rte_eth_dev *eth_dev,
>>       struct enic *enic = pmd_priv(eth_dev);
>>
>>       ENICPMD_FUNC_TRACE();
>> +     device_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
>>       /* Scattered Rx uses two receive queues per rx queue exposed to dpdk */
>>       device_info->max_rx_queues = enic->conf_rq_count / 2;
>>       device_info->max_tx_queues = enic->conf_wq_count;
>> diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
>> index e1250f6..5d0bce5 100644
>> --- a/drivers/net/fm10k/fm10k_ethdev.c
>> +++ b/drivers/net/fm10k/fm10k_ethdev.c
>> @@ -1392,6 +1392,7 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,
>>
>>       PMD_INIT_FUNC_TRACE();
>>
>> +     dev_info->pci_dev            = ETH_DEV_PCI_DEV(dev);
>>       dev_info->min_rx_bufsize     = FM10K_MIN_RX_BUF_SIZE;
>>       dev_info->max_rx_pktlen      = FM10K_MAX_PKT_SIZE;
>>       dev_info->max_rx_queues      = hw->mac.max_queues;
>> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
>> index 8a63a8c..29c0277 100644
>> --- a/drivers/net/i40e/i40e_ethdev.c
>> +++ b/drivers/net/i40e/i40e_ethdev.c
>> @@ -2583,6 +2583,7 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>       struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>>       struct i40e_vsi *vsi = pf->main_vsi;
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->max_rx_queues = vsi->nb_qps;
>>       dev_info->max_tx_queues = vsi->nb_qps;
>>       dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
>> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
>> index 781e658..caef72c 100644
>> --- a/drivers/net/i40e/i40e_ethdev_vf.c
>> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
>> @@ -2217,6 +2217,7 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>       struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
>>
>>       memset(dev_info, 0, sizeof(*dev_info));
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->max_rx_queues = vf->vsi_res->num_queue_pairs;
>>       dev_info->max_tx_queues = vf->vsi_res->num_queue_pairs;
>>       dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
>> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
>> index f17da46..c88b7bf 100644
>> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
>> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
>> @@ -3043,6 +3043,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>       struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
>>       struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
>>       dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
>>       if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
>> @@ -3175,6 +3176,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
>>       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>>       struct rte_pci_device *pci_dev = ETH_DEV_PCI_DEV(dev);
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
>>       dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
>>       dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL reg */
>> diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
>> index da61a85..5455fea 100644
>> --- a/drivers/net/mlx4/mlx4.c
>> +++ b/drivers/net/mlx4/mlx4.c
>> @@ -4421,6 +4421,8 @@ mlx4_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>>       unsigned int max;
>>       char ifname[IF_NAMESIZE];
>>
>> +     info->pci_dev = ETH_DEV_PCI_DEV(dev);
>> +
>>       if (priv == NULL)
>>               return;
>>       priv_lock(priv);
>> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
>> index c0f73e9..489a4f6 100644
>> --- a/drivers/net/mlx5/mlx5_ethdev.c
>> +++ b/drivers/net/mlx5/mlx5_ethdev.c
>> @@ -562,6 +562,8 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
>>       unsigned int max;
>>       char ifname[IF_NAMESIZE];
>>
>> +     info->pci_dev = ETH_DEV_PCI_DEV(dev);
>> +
>>       priv_lock(priv);
>>       /* FIXME: we should ask the device for these values. */
>>       info->min_rx_bufsize = 32;
>> diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
>> index 7299fad..c49d38a 100644
>> --- a/drivers/net/nfp/nfp_net.c
>> +++ b/drivers/net/nfp/nfp_net.c
>> @@ -1008,6 +1008,7 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>
>>       hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->driver_name = dev->driver->pci_drv.driver.name;
>>       dev_info->max_rx_queues = (uint16_t)hw->max_rx_queues;
>>       dev_info->max_tx_queues = (uint16_t)hw->max_tx_queues;
>> diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
>> index 959ff0f..2c4de92 100644
>> --- a/drivers/net/qede/qede_ethdev.c
>> +++ b/drivers/net/qede/qede_ethdev.c
>> @@ -652,6 +652,7 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev,
>>
>>       PMD_INIT_FUNC_TRACE(edev);
>>
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(eth_dev);
>>       dev_info->min_rx_bufsize = (uint32_t)(ETHER_MIN_MTU +
>>                                             QEDE_ETH_OVERHEAD);
>>       dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
>> diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
>> index 6d80a5b..6356257 100644
>> --- a/drivers/net/szedata2/rte_eth_szedata2.c
>> +++ b/drivers/net/szedata2/rte_eth_szedata2.c
>> @@ -1030,6 +1030,7 @@ eth_dev_info(struct rte_eth_dev *dev,
>>               struct rte_eth_dev_info *dev_info)
>>  {
>>       struct pmd_internals *internals = dev->data->dev_private;
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>>       dev_info->if_index = 0;
>>       dev_info->max_mac_addrs = 1;
>>       dev_info->max_rx_pktlen = (uint32_t)-1;
>> diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c
>> index 099b252..daac853 100644
>> --- a/drivers/net/thunderx/nicvf_ethdev.c
>> +++ b/drivers/net/thunderx/nicvf_ethdev.c
>> @@ -1339,6 +1339,8 @@ nicvf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>
>>       PMD_INIT_FUNC_TRACE();
>>
>> +     dev_info->pci_dev = pci_dev;
>> +
>>       dev_info->min_rx_bufsize = ETHER_MIN_MTU;
>>       dev_info->max_rx_pktlen = NIC_HW_MAX_FRS;
>>       dev_info->max_rx_queues =
>> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
>> index 023101d..2eb6a06 100644
>> --- a/drivers/net/virtio/virtio_ethdev.c
>> +++ b/drivers/net/virtio/virtio_ethdev.c
>> @@ -1625,6 +1625,7 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>>       uint64_t tso_mask;
>>       struct virtio_hw *hw = dev->data->dev_private;
>>
>> +     dev_info->pci_dev = hw->dev;
>>       dev_info->max_rx_queues =
>>               RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
>>       dev_info->max_tx_queues =
>> diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
>> index bcb3751..f7c0382 100644
>> --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
>> +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
>> @@ -709,6 +709,8 @@ static void
>>  vmxnet3_dev_info_get(__rte_unused struct rte_eth_dev *dev,
>>                    struct rte_eth_dev_info *dev_info)
>>  {
>> +     dev_info->pci_dev = ETH_DEV_PCI_DEV(dev);
>> +
>>       dev_info->max_rx_queues = VMXNET3_MAX_RX_QUEUES;
>>       dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
>>       dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
>> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
>> index fde8112..4288577 100644
>> --- a/lib/librte_ether/rte_ethdev.c
>> +++ b/lib/librte_ether/rte_ethdev.c
>> @@ -1556,7 +1556,6 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
>>
>>       RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
>>       (*dev->dev_ops->dev_infos_get)(dev, dev_info);
>> -     dev_info->pci_dev = dev->pci_dev;
>>       dev_info->driver_name = dev->data->drv_name;
>>       dev_info->nb_rx_queues = dev->data->nb_rx_queues;
>>       dev_info->nb_tx_queues = dev->data->nb_tx_queues;
>
>
> If dev_info_get sets a pointer to device (rather than pci_dev) then it can
> stay in generic code.

True. But as mentioned before I still think that the low-level device
shouldn't get exposed via rte_eth_dev_info. Having the generic
rte_device there is even more questionable if you ask me.

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2016-12-21 15:35 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-20 11:11 [PATCH v3 0/9] Decouple ethdev from PCI device Jan Blunck
2016-12-20 11:11 ` [PATCH v3 1/9] eal: define container_of macro Jan Blunck
2016-12-20 11:11 ` [PATCH v3 2/9] ethdev: Helper to convert to struct rte_pci_device Jan Blunck
2016-12-20 15:38   ` Stephen Hemminger
2016-12-20 11:11 ` [PATCH v3 3/9] drivers: Use ETH_DEV_PCI_DEV() helper Jan Blunck
2016-12-21  9:50   ` Shreyansh Jain
2016-12-21  9:57     ` Shreyansh Jain
2016-12-20 11:11 ` [PATCH v3 4/9] virtio: Don't fill dev_info->driver_name Jan Blunck
2016-12-20 12:17   ` Ferruh Yigit
2016-12-20 12:40     ` Jan Blunck
2016-12-20 12:58       ` Ferruh Yigit
2016-12-20 11:11 ` [PATCH v3 5/9] virtio: Add vtpci_intr_handle() helper to get rte_intr_handle Jan Blunck
2016-12-20 11:11 ` [PATCH v3 6/9] virtio: Don't depend on struct rte_eth_dev's pci_dev Jan Blunck
2016-12-20 11:11 ` [PATCH v3 7/9] ethdev: Move filling of rte_eth_dev_info->pci_dev to dev_infos_get() Jan Blunck
2016-12-20 15:41   ` Stephen Hemminger
2016-12-21 15:35     ` Jan Blunck
2016-12-21  9:54   ` Shreyansh Jain
2016-12-20 11:11 ` [PATCH v3 8/9] ethdev: Decouple interrupt handling from PCI device Jan Blunck
2016-12-20 11:11 ` [PATCH v3 9/9] ethdev: Decouple struct rte_eth_dev from struct rte_pci_device Jan Blunck
2016-12-21 10:00 ` [PATCH v3 0/9] Decouple ethdev from PCI device Shreyansh Jain
2016-12-21 15:12   ` Jan Blunck

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.