* either add to a pointer or to read the pointer value.
  */
 #define NFP_QCP_QUEUE_ADDR_SZ                  0x800
-#define NFP_QCP_QUEUE_AREA_SZ                  0x80000
 #define NFP_QCP_QUEUE_OFF(_x)                  ((_x) * NFP_QCP_QUEUE_ADDR_SZ)
 #define NFP_QCP_QUEUE_ADD_RPTR                 0x0000
 #define NFP_QCP_QUEUE_ADD_WPTR                 0x0004
 #define NFP_QCP_QUEUE_STS_HI                   0x000c
 #define NFP_QCP_QUEUE_STS_HI_WRITEPTR_mask     0x3ffff
 
-/* The offset of a QCP queues in the PCIe Target */
-#define NFP_PCIE_QUEUE(_q) (0x80000 + (NFP_QCP_QUEUE_ADDR_SZ * ((_q) & 0xff)))
-
 /* nfp_qcp_ptr - Read or Write Pointer of a queue */
 enum nfp_qcp_ptr {
        NFP_QCP_READ_PTR = 0,
        return _nfp_qcp_read(q, NFP_QCP_WRITE_PTR);
 }
 
+u32 nfp_qcp_queue_offset(const struct nfp_dev_info *dev_info, u16 queue);
+
 static inline bool nfp_net_is_data_vnic(struct nfp_net *nn)
 {
        WARN_ON_ONCE(!nn->dp.netdev && nn->port);
 
 #include <net/vxlan.h>
 #include <net/xdp_sock_drv.h>
 
+#include "nfpcore/nfp_dev.h"
 #include "nfpcore/nfp_nsp.h"
 #include "ccm.h"
 #include "nfp_app.h"
        put_unaligned_le32(reg, fw_ver);
 }
 
+u32 nfp_qcp_queue_offset(const struct nfp_dev_info *dev_info, u16 queue)
+{
+       queue &= dev_info->qc_idx_mask;
+       return dev_info->qc_addr_offset + NFP_QCP_QUEUE_ADDR_SZ * queue;
+}
+
 static dma_addr_t nfp_net_dma_map_rx(struct nfp_net_dp *dp, void *frag)
 {
        return dma_map_single_attrs(dp->dev, frag + NFP_NET_RX_BUF_HEADROOM,
 
        }
 
        cpp_id = NFP_CPP_ISLAND_ID(0, NFP_CPP_ACTION_RW, 0, 0);
-       mem = nfp_cpp_map_area(pf->cpp, "net.qc", cpp_id, NFP_PCIE_QUEUE(0),
-                              NFP_QCP_QUEUE_AREA_SZ, &pf->qc_area);
+       mem = nfp_cpp_map_area(pf->cpp, "net.qc", cpp_id,
+                              nfp_qcp_queue_offset(pf->dev_info, 0),
+                              pf->dev_info->qc_area_sz, &pf->qc_area);
        if (IS_ERR(mem)) {
                nfp_err(pf->cpp, "Failed to map Queue Controller area.\n");
                err = PTR_ERR(mem);
 
 static const struct pci_device_id nfp_netvf_pci_device_ids[] = {
        { PCI_VENDOR_ID_NETRONOME, PCI_DEVICE_ID_NETRONOME_NFP6000_VF,
          PCI_VENDOR_ID_NETRONOME, PCI_ANY_ID,
-         PCI_ANY_ID, 0, NFP_DEV_NFP6000,
+         PCI_ANY_ID, 0, NFP_DEV_NFP6000_VF,
        },
        { 0, } /* Required last entry. */
 };
        }
 
        startq = readl(ctrl_bar + NFP_NET_CFG_START_TXQ);
-       tx_bar_off = NFP_PCIE_QUEUE(startq);
+       tx_bar_off = nfp_qcp_queue_offset(dev_info, startq);
        startq = readl(ctrl_bar + NFP_NET_CFG_START_RXQ);
-       rx_bar_off = NFP_PCIE_QUEUE(startq);
+       rx_bar_off = nfp_qcp_queue_offset(dev_info, startq);
 
        /* Allocate and initialise the netdev */
        nn = nfp_net_alloc(pdev, dev_info, ctrl_bar, true,
 
 /* Copyright (C) 2019 Netronome Systems, Inc. */
 
 #include <linux/dma-mapping.h>
+#include <linux/kernel.h>
 
 #include "nfp_dev.h"
 
 const struct nfp_dev_info nfp_dev_info[NFP_DEV_CNT] = {
        [NFP_DEV_NFP6000] = {
                .dma_mask               = DMA_BIT_MASK(40),
+               .qc_idx_mask            = GENMASK(7, 0),
+               .qc_addr_offset         = 0x80000,
+
                .chip_names             = "NFP4000/NFP5000/NFP6000",
                .pcie_cfg_expbar_offset = 0x0400,
                .pcie_expl_offset       = 0x1000,
+               .qc_area_sz             = 0x80000,
+       },
+       [NFP_DEV_NFP6000_VF] = {
+               .dma_mask               = DMA_BIT_MASK(40),
+               .qc_idx_mask            = GENMASK(7, 0),
+               .qc_addr_offset         = 0,
        },
 };
 
 
 enum nfp_dev_id {
        NFP_DEV_NFP6000,
+       NFP_DEV_NFP6000_VF,
        NFP_DEV_CNT,
 };
 
 struct nfp_dev_info {
+       /* Required fields */
        u64 dma_mask;
+       u32 qc_idx_mask;
+       u32 qc_addr_offset;
+
+       /* PF-only fields */
        const char *chip_names;
        u32 pcie_cfg_expbar_offset;
        u32 pcie_expl_offset;
+       u32 qc_area_sz;
 };
 
 extern const struct nfp_dev_info nfp_dev_info[NFP_DEV_CNT];