drm: ati_pcigart: Need to use PCI_DMA_BIDIRECTIONAL.
The buffers mapped by the PCI GART can be written to by the device, not just read. For example, this happens via the RB_RPTR writeback on Radeon. So we can't use PCI_DMA_TODEVICE else we'll get protection faults on IOMMU platforms. Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Dave Airlie <airlied@linux.ie>
This commit is contained in:
parent
5a7aad9a55
commit
296c6ae0e9
|
@ -77,7 +77,7 @@ int drm_ati_pcigart_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info
|
||||||
if (!entry->busaddr[i])
|
if (!entry->busaddr[i])
|
||||||
break;
|
break;
|
||||||
pci_unmap_page(dev->pdev, entry->busaddr[i],
|
pci_unmap_page(dev->pdev, entry->busaddr[i],
|
||||||
PAGE_SIZE, PCI_DMA_TODEVICE);
|
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gart_info->gart_table_location == DRM_ATI_GART_MAIN)
|
if (gart_info->gart_table_location == DRM_ATI_GART_MAIN)
|
||||||
|
@ -145,7 +145,7 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
|
||||||
for (i = 0; i < pages; i++) {
|
for (i = 0; i < pages; i++) {
|
||||||
/* we need to support large memory configurations */
|
/* we need to support large memory configurations */
|
||||||
entry->busaddr[i] = pci_map_page(dev->pdev, entry->pagelist[i],
|
entry->busaddr[i] = pci_map_page(dev->pdev, entry->pagelist[i],
|
||||||
0, PAGE_SIZE, PCI_DMA_TODEVICE);
|
0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||||
if (entry->busaddr[i] == 0) {
|
if (entry->busaddr[i] == 0) {
|
||||||
DRM_ERROR("unable to map PCIGART pages!\n");
|
DRM_ERROR("unable to map PCIGART pages!\n");
|
||||||
drm_ati_pcigart_cleanup(dev, gart_info);
|
drm_ati_pcigart_cleanup(dev, gart_info);
|
||||||
|
|
Loading…
Reference in New Issue