return ret;
                }
 
-               *addr = pci_resource_start(dev->pdev, 0) +
+               *addr = dev->bar_addr +
                        MLX5_GET64(alloc_memic_out, out, memic_start_addr);
 
                return 0;
        u64 start_page_idx;
        int err;
 
-       addr -= pci_resource_start(dev->pdev, 0);
+       addr -= dev->bar_addr;
        start_page_idx = (addr - hw_start_addr) >> PAGE_SHIFT;
 
        MLX5_SET(dealloc_memic_in, in, opcode, MLX5_CMD_OP_DEALLOC_MEMIC);
 
 
        fw_uars_per_page = MLX5_CAP_GEN(dev->mdev, uar_4k) ? MLX5_UARS_IN_PAGE : 1;
 
-       return (pci_resource_start(dev->mdev->pdev, 0) >> PAGE_SHIFT) + uar_idx / fw_uars_per_page;
+       return (dev->mdev->bar_addr >> PAGE_SHIFT) + uar_idx / fw_uars_per_page;
 }
 
 static int get_command(unsigned long offset)
            page_idx + npages)
                return -EINVAL;
 
-       pfn = ((pci_resource_start(dev->mdev->pdev, 0) +
+       pfn = ((dev->mdev->bar_addr +
              MLX5_CAP64_DEV_MEM(dev->mdev, memic_bar_start_addr)) >>
              PAGE_SHIFT) +
              page_idx;
                goto err_free;
 
        start_offset = memic_addr & ~PAGE_MASK;
-       page_idx = (memic_addr - pci_resource_start(memic->dev->pdev, 0) -
+       page_idx = (memic_addr - memic->dev->bar_addr -
                    MLX5_CAP64_DEV_MEM(memic->dev, memic_bar_start_addr)) >>
                    PAGE_SHIFT;
 
        if (ret)
                return ret;
 
-       page_idx = (dm->dev_addr - pci_resource_start(memic->dev->pdev, 0) -
+       page_idx = (dm->dev_addr - memic->dev->bar_addr -
                    MLX5_CAP64_DEV_MEM(memic->dev, memic_bar_start_addr)) >>
                    PAGE_SHIFT;
        bitmap_clear(to_mucontext(ibdm->uobject->context)->dm_pages,
 
        MLX5_SET64(mkc, mkc, len, length);
        MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn);
        MLX5_SET(mkc, mkc, qpn, 0xffffff);
-       MLX5_SET64(mkc, mkc, start_addr,
-                  memic_addr - pci_resource_start(dev->mdev->pdev, 0));
+       MLX5_SET64(mkc, mkc, start_addr, memic_addr - dev->mdev->bar_addr);
 
        err = mlx5_core_create_mkey(mdev, &mr->mmkey, in, inlen);
        if (err)
 
 
        pci_set_drvdata(dev->pdev, dev);
 
+       dev->bar_addr = pci_resource_start(pdev, 0);
        priv->numa_node = dev_to_node(&dev->pdev->dev);
 
        err = mlx5_pci_enable_device(dev);
            pci_enable_atomic_ops_to_root(pdev, PCI_EXP_DEVCAP2_ATOMIC_COMP128))
                mlx5_core_dbg(dev, "Enabling pci atomics failed\n");
 
-       dev->iseg_base = pci_resource_start(dev->pdev, 0);
+       dev->iseg_base = dev->bar_addr;
        dev->iseg = ioremap(dev->iseg_base, sizeof(*dev->iseg));
        if (!dev->iseg) {
                err = -ENOMEM;
 
        else
                system_page_index = index;
 
-       return (pci_resource_start(mdev->pdev, 0) >> PAGE_SHIFT) + system_page_index;
+       return (mdev->bar_addr >> PAGE_SHIFT) + system_page_index;
 }
 
 static void up_rel_func(struct kref *kref)
 
        u64                     sys_image_guid;
        phys_addr_t             iseg_base;
        struct mlx5_init_seg __iomem *iseg;
+       phys_addr_t             bar_addr;
        enum mlx5_device_state  state;
        /* sync interface state */
        struct mutex            intf_state_mutex;