|
@@ -1664,14 +1664,31 @@ nvkm_device_pci_new(struct pci_dev *pci_dev, const char *cfg, const char *dbg,
|
|
|
*pdevice = &pdev->device;
|
|
|
pdev->pdev = pci_dev;
|
|
|
|
|
|
- return nvkm_device_ctor(&nvkm_device_pci_func, quirk, &pci_dev->dev,
|
|
|
- pci_is_pcie(pci_dev) ? NVKM_DEVICE_PCIE :
|
|
|
- pci_find_capability(pci_dev, PCI_CAP_ID_AGP) ?
|
|
|
- NVKM_DEVICE_AGP : NVKM_DEVICE_PCI,
|
|
|
- (u64)pci_domain_nr(pci_dev->bus) << 32 |
|
|
|
- pci_dev->bus->number << 16 |
|
|
|
- PCI_SLOT(pci_dev->devfn) << 8 |
|
|
|
- PCI_FUNC(pci_dev->devfn), name,
|
|
|
- cfg, dbg, detect, mmio, subdev_mask,
|
|
|
- &pdev->device);
|
|
|
+ ret = nvkm_device_ctor(&nvkm_device_pci_func, quirk, &pci_dev->dev,
|
|
|
+ pci_is_pcie(pci_dev) ? NVKM_DEVICE_PCIE :
|
|
|
+ pci_find_capability(pci_dev, PCI_CAP_ID_AGP) ?
|
|
|
+ NVKM_DEVICE_AGP : NVKM_DEVICE_PCI,
|
|
|
+ (u64)pci_domain_nr(pci_dev->bus) << 32 |
|
|
|
+ pci_dev->bus->number << 16 |
|
|
|
+ PCI_SLOT(pci_dev->devfn) << 8 |
|
|
|
+ PCI_FUNC(pci_dev->devfn), name,
|
|
|
+ cfg, dbg, detect, mmio, subdev_mask,
|
|
|
+ &pdev->device);
|
|
|
+
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Set a preliminary DMA mask based on the .dma_bits member of the
|
|
|
+ * MMU subdevice. This allows other subdevices to create DMA mappings
|
|
|
+ * in their init() or oneinit() methods, which may be called before the
|
|
|
+ * TTM layer sets the DMA mask definitively.
|
|
|
+ * This is necessary for platforms where the default DMA mask of 32
|
|
|
+ * does not cover any system memory, i.e., when all RAM is > 4 GB.
|
|
|
+ */
|
|
|
+ if (subdev_mask & BIT(NVKM_SUBDEV_MMU))
|
|
|
+ dma_set_mask_and_coherent(&pci_dev->dev,
|
|
|
+ DMA_BIT_MASK(pdev->device.mmu->dma_bits));
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|