]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/efa: Fail probe on missing BARs
authorMichael Margolin <mrgolin@amazon.com>
Mon, 13 May 2024 08:10:19 +0000 (08:10 +0000)
committerLeon Romanovsky <leon@kernel.org>
Thu, 30 May 2024 12:07:55 +0000 (15:07 +0300)
In case any of PCI BARs is missing during device probe we would like to
fail as early as possible. Fail if any of the required BARs isn't listed
as a memory BAR.

Reviewed-by: Daniel Kranzdorf <dkkranzd@amazon.com>
Reviewed-by: Firas Jahjah <firasj@amazon.com>
Signed-off-by: Michael Margolin <mrgolin@amazon.com>
Link: https://lore.kernel.org/r/20240513081019.26998-1-mrgolin@amazon.com
Reviewed-by: Gal Pressman <gal.pressman@linux.dev>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/efa/efa_main.c

index d1a48f988f6c037a8e7f3226925c1b5d0d862b09..99f9ac23c7219bd200e8d4313a79ff9c63fa7496 100644 (file)
@@ -190,15 +190,23 @@ static int efa_request_doorbell_bar(struct efa_dev *dev)
 {
        u8 db_bar_idx = dev->dev_attr.db_bar;
        struct pci_dev *pdev = dev->pdev;
-       int bars;
+       int pci_mem_bars;
+       int db_bar;
        int err;
 
-       if (!(BIT(db_bar_idx) & EFA_BASE_BAR_MASK)) {
-               bars = pci_select_bars(pdev, IORESOURCE_MEM) & BIT(db_bar_idx);
+       db_bar = BIT(db_bar_idx);
+       if (!(db_bar & EFA_BASE_BAR_MASK)) {
+               pci_mem_bars = pci_select_bars(pdev, IORESOURCE_MEM);
+               if (db_bar & ~pci_mem_bars) {
+                       dev_err(&pdev->dev,
+                               "Doorbells BAR unavailable. Requested %#x, available %#x\n",
+                               db_bar, pci_mem_bars);
+                       return -ENODEV;
+               }
 
-               err = pci_request_selected_regions(pdev, bars, DRV_MODULE_NAME);
+               err = pci_request_selected_regions(pdev, db_bar, DRV_MODULE_NAME);
                if (err) {
-                       dev_err(&dev->pdev->dev,
+                       dev_err(&pdev->dev,
                                "pci_request_selected_regions for bar %d failed %d\n",
                                db_bar_idx, err);
                        return err;
@@ -531,7 +539,7 @@ static struct efa_dev *efa_probe_device(struct pci_dev *pdev)
 {
        struct efa_com_dev *edev;
        struct efa_dev *dev;
-       int bars;
+       int pci_mem_bars;
        int err;
 
        err = pci_enable_device_mem(pdev);
@@ -556,8 +564,14 @@ static struct efa_dev *efa_probe_device(struct pci_dev *pdev)
        dev->pdev = pdev;
        xa_init(&dev->cqs_xa);
 
-       bars = pci_select_bars(pdev, IORESOURCE_MEM) & EFA_BASE_BAR_MASK;
-       err = pci_request_selected_regions(pdev, bars, DRV_MODULE_NAME);
+       pci_mem_bars = pci_select_bars(pdev, IORESOURCE_MEM);
+       if (EFA_BASE_BAR_MASK & ~pci_mem_bars) {
+               dev_err(&pdev->dev, "BARs unavailable. Requested %#x, available %#x\n",
+                       (int)EFA_BASE_BAR_MASK, pci_mem_bars);
+               err = -ENODEV;
+               goto err_ibdev_destroy;
+       }
+       err = pci_request_selected_regions(pdev, EFA_BASE_BAR_MASK, DRV_MODULE_NAME);
        if (err) {
                dev_err(&pdev->dev, "pci_request_selected_regions failed %d\n",
                        err);