Skip to content

Commit

Permalink
linux/efa: Fail probe on missing BARs
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Firas Jahjah <[email protected]>
Signed-off-by: Michael Margolin <[email protected]>
  • Loading branch information
mrgolin committed Jun 5, 2024
1 parent 90be466 commit d8731fd
Showing 1 changed file with 22 additions and 8 deletions.
30 changes: 22 additions & 8 deletions kernel/linux/efa/src/efa_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,15 +223,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;
Expand Down Expand Up @@ -709,7 +717,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);
Expand Down Expand Up @@ -742,8 +750,14 @@ static struct efa_dev *efa_probe_device(struct pci_dev *pdev)
memset(dev->cqs_arr, 0, sizeof(dev->cqs_arr));
#endif

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);
Expand Down

0 comments on commit d8731fd

Please sign in to comment.