drm/radeon: Store PCI controller in struct radeon_device.hose
[linux-2.6-microblaze.git] / drivers / gpu / drm / drm_cache.c
index 0fe3c49..49551a7 100644 (file)
@@ -30,6 +30,7 @@
 
 #include <linux/export.h>
 #include <linux/highmem.h>
+#include <xen/xen.h>
 
 #include <drm/drm_cache.h>
 
@@ -176,3 +177,34 @@ drm_clflush_virt_range(void *addr, unsigned long length)
 #endif
 }
 EXPORT_SYMBOL(drm_clflush_virt_range);
+
+bool drm_need_swiotlb(int dma_bits)
+{
+       struct resource *tmp;
+       resource_size_t max_iomem = 0;
+
+       /*
+        * Xen paravirtual hosts require swiotlb regardless of requested dma
+        * transfer size.
+        *
+        * NOTE: Really, what it requires is use of the dma_alloc_coherent
+        *       allocator used in ttm_dma_populate() instead of
+        *       ttm_populate_and_map_pages(), which bounce buffers so much in
+        *       Xen it leads to swiotlb buffer exhaustion.
+        */
+       if (xen_pv_domain())
+               return true;
+
+       /*
+        * Enforce dma_alloc_coherent when memory encryption is active as well
+        * for the same reasons as for Xen paravirtual hosts.
+        */
+       if (mem_encrypt_active())
+               return true;
+
+       for (tmp = iomem_resource.child; tmp; tmp = tmp->sibling)
+               max_iomem = max(max_iomem,  tmp->end);
+
+       return max_iomem > ((u64)1 << dma_bits);
+}
+EXPORT_SYMBOL(drm_need_swiotlb);