Skip to content

Commit 09323b3

Browse files
ShayAgroskuba-moo
authored andcommitted
net: ena: set initial DMA width to avoid intel iommu issue
The ENA driver uses the readless mechanism, which uses DMA, to find out what the DMA mask is supposed to be. If DMA is used without setting the dma_mask first, it causes the Intel IOMMU driver to think that ENA is a 32-bit device and therefore disables IOMMU passthrough permanently. This patch sets the dma_mask to be ENA_MAX_PHYS_ADDR_SIZE_BITS=48 before readless initialization in ena_device_init()->ena_com_mmio_reg_read_request_init(), which is large enough to workaround the intel_iommu issue. DMA mask is set again to the correct value after it's received from the device after readless is initialized. The patch also changes the driver to use dma_set_mask_and_coherent() function instead of the two pci_set_dma_mask() and pci_set_consistent_dma_mask() ones. Both methods achieve the same effect. Fixes: 1738cd3 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)") Signed-off-by: Mike Cui <[email protected]> Signed-off-by: Arthur Kiyanovski <[email protected]> Signed-off-by: Shay Agroskin <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 5b7022c commit 09323b3

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

drivers/net/ethernet/amazon/ena/ena_netdev.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3367,16 +3367,9 @@ static int ena_device_init(struct ena_com_dev *ena_dev, struct pci_dev *pdev,
33673367
goto err_mmio_read_less;
33683368
}
33693369

3370-
rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(dma_width));
3370+
rc = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(dma_width));
33713371
if (rc) {
3372-
dev_err(dev, "pci_set_dma_mask failed 0x%x\n", rc);
3373-
goto err_mmio_read_less;
3374-
}
3375-
3376-
rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(dma_width));
3377-
if (rc) {
3378-
dev_err(dev, "err_pci_set_consistent_dma_mask failed 0x%x\n",
3379-
rc);
3372+
dev_err(dev, "dma_set_mask_and_coherent failed %d\n", rc);
33803373
goto err_mmio_read_less;
33813374
}
33823375

@@ -4146,6 +4139,12 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
41464139
return rc;
41474140
}
41484141

4142+
rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(ENA_MAX_PHYS_ADDR_SIZE_BITS));
4143+
if (rc) {
4144+
dev_err(&pdev->dev, "dma_set_mask_and_coherent failed %d\n", rc);
4145+
goto err_disable_device;
4146+
}
4147+
41494148
pci_set_master(pdev);
41504149

41514150
ena_dev = vzalloc(sizeof(*ena_dev));

0 commit comments

Comments
 (0)