NTB: Set dma mask and dma coherent mask to NTB devices
authorSerge Semin <fancer.lancer@gmail.com>
Wed, 6 Dec 2017 14:31:53 +0000 (17:31 +0300)
committerJon Mason <jdmason@kudzu.us>
Mon, 29 Jan 2018 03:17:23 +0000 (22:17 -0500)
The dma_mask and dma_coherent_mask fields of the NTB struct device
weren't initialized in hardware drivers. In fact it should be done
instead of PCIe interface usage, since NTB clients are supposed to
use NTB API and left unaware of real hardware implementation.
In addition to that ntb_device_register() method shouldn't clear
the passed ntb_dev structure, since it dma_mask is initialized
by hardware drivers.

Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
drivers/ntb/hw/amd/ntb_hw_amd.c
drivers/ntb/hw/idt/ntb_hw_idt.c
drivers/ntb/hw/intel/ntb_hw_intel.c
drivers/ntb/ntb.c

index f0788aae05c9c76f814df399f3f591892df78fb0..3cfa468762393dd058d4699e57bf97020ab8400f 100644 (file)
@@ -1020,6 +1020,10 @@ static int amd_ntb_init_pci(struct amd_ntb_dev *ndev,
                        goto err_dma_mask;
                dev_warn(&pdev->dev, "Cannot DMA consistent highmem\n");
        }
+       rc = dma_coerce_mask_and_coherent(&ndev->ntb.dev,
+                                         dma_get_mask(&pdev->dev));
+       if (rc)
+               goto err_dma_mask;
 
        ndev->self_mmio = pci_iomap(pdev, 0, 0);
        if (!ndev->self_mmio) {
index 24040317bb9ccd2cadfdc311a7ada0841c19d6f2..93d4c9d2a9addfa3b2c25da423eb885a38073609 100644 (file)
@@ -2426,7 +2426,7 @@ static int idt_init_pci(struct idt_ntb_dev *ndev)
        struct pci_dev *pdev = ndev->ntb.pdev;
        int ret;
 
-       /* Initialize the bit mask of DMA */
+       /* Initialize the bit mask of PCI/NTB DMA */
        ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (ret != 0) {
                ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
@@ -2447,6 +2447,12 @@ static int idt_init_pci(struct idt_ntb_dev *ndev)
                dev_warn(&pdev->dev,
                        "Cannot set consistent DMA highmem bit mask\n");
        }
+       ret = dma_coerce_mask_and_coherent(&ndev->ntb.dev,
+                                          dma_get_mask(&pdev->dev));
+       if (ret != 0) {
+               dev_err(&pdev->dev, "Failed to set NTB device DMA bit mask\n");
+               return ret;
+       }
 
        /*
         * Enable the device advanced error reporting. It's not critical to
index 341a3d5baa3f8cc4e797cf31b95584214393b0af..156b45cd4a198b9d1f1b50bebc33f4384953e89c 100644 (file)
@@ -2334,6 +2334,10 @@ static int intel_ntb_init_pci(struct intel_ntb_dev *ndev, struct pci_dev *pdev)
                        goto err_dma_mask;
                dev_warn(&pdev->dev, "Cannot DMA consistent highmem\n");
        }
+       rc = dma_coerce_mask_and_coherent(&ndev->ntb.dev,
+                                         dma_get_mask(&pdev->dev));
+       if (rc)
+               goto err_dma_mask;
 
        ndev->self_mmio = pci_iomap(pdev, 0, 0);
        if (!ndev->self_mmio) {
index bdcd59b13c1f7641c9fde5ee56a18dc5f4a1cf3f..2581ab724c34771e05f137947e71c86d8ccfb886 100644 (file)
@@ -111,7 +111,6 @@ int ntb_register_device(struct ntb_dev *ntb)
 
        init_completion(&ntb->released);
 
-       memset(&ntb->dev, 0, sizeof(ntb->dev));
        ntb->dev.bus = &ntb_bus;
        ntb->dev.parent = &ntb->pdev->dev;
        ntb->dev.release = ntb_dev_release;