mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	drm: Implement drm_need_swiotlb() in drm_cache.c
The function is declared in drm_cache.h. I also removed the curly braces from the for loop to adhere to kernel coding style. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Christian König <christian.koenig@amd.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20210112081035.6882-3-tzimmermann@suse.de
This commit is contained in:
		
							parent
							
								
									ff28a9f8d3
								
							
						
					
					
						commit
						3abc667063
					
				
					 2 changed files with 32 additions and 33 deletions
				
			
		| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,7 +37,6 @@
 | 
			
		|||
#include <linux/highmem.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/vmalloc.h>
 | 
			
		||||
#include <xen/xen.h>
 | 
			
		||||
 | 
			
		||||
#include <drm/drm_agpsupport.h>
 | 
			
		||||
#include <drm/drm_cache.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -138,35 +137,3 @@ void drm_legacy_ioremapfree(struct drm_local_map *map, struct drm_device *dev)
 | 
			
		|||
		iounmap(map->handle);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(drm_legacy_ioremapfree);
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue