diff options
Diffstat (limited to 'drivers/gpu/drm/drm_file.c')
| -rw-r--r-- | drivers/gpu/drm/drm_file.c | 143 | 
1 files changed, 1 insertions, 142 deletions
diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c index dc7d2e5b16c8..a8b4d918e9a3 100644 --- a/drivers/gpu/drm/drm_file.c +++ b/drivers/gpu/drm/drm_file.c @@ -48,11 +48,6 @@  #include "drm_internal.h"  #include "drm_legacy.h" -#if defined(CONFIG_MMU) && defined(CONFIG_TRANSPARENT_HUGEPAGE) -#include <uapi/asm/mman.h> -#include <drm/drm_vma_manager.h> -#endif -  /* from BKL pushdown */  DEFINE_MUTEX(drm_global_mutex); @@ -131,7 +126,7 @@ bool drm_dev_needs_global_mutex(struct drm_device *dev)   *     };   *   * For plain GEM based drivers there is the DEFINE_DRM_GEM_FOPS() macro, and for - * CMA based drivers there is the DEFINE_DRM_GEM_CMA_FOPS() macro to make this + * DMA based drivers there is the DEFINE_DRM_GEM_DMA_FOPS() macro to make this   * simpler.   *   * The driver's &file_operations must be stored in &drm_driver.fops. @@ -912,139 +907,3 @@ struct file *mock_drm_getfile(struct drm_minor *minor, unsigned int flags)  	return file;  }  EXPORT_SYMBOL_FOR_TESTS_ONLY(mock_drm_getfile); - -#ifdef CONFIG_MMU -#ifdef CONFIG_TRANSPARENT_HUGEPAGE -/* - * drm_addr_inflate() attempts to construct an aligned area by inflating - * the area size and skipping the unaligned start of the area. - * adapted from shmem_get_unmapped_area() - */ -static unsigned long drm_addr_inflate(unsigned long addr, -				      unsigned long len, -				      unsigned long pgoff, -				      unsigned long flags, -				      unsigned long huge_size) -{ -	unsigned long offset, inflated_len; -	unsigned long inflated_addr; -	unsigned long inflated_offset; - -	offset = (pgoff << PAGE_SHIFT) & (huge_size - 1); -	if (offset && offset + len < 2 * huge_size) -		return addr; -	if ((addr & (huge_size - 1)) == offset) -		return addr; - -	inflated_len = len + huge_size - PAGE_SIZE; -	if (inflated_len > TASK_SIZE) -		return addr; -	if (inflated_len < len) -		return addr; - -	inflated_addr = current->mm->get_unmapped_area(NULL, 0, inflated_len, -						       0, flags); -	if (IS_ERR_VALUE(inflated_addr)) -		return addr; -	if (inflated_addr & ~PAGE_MASK) -		return addr; - -	inflated_offset = inflated_addr & (huge_size - 1); -	inflated_addr += offset - inflated_offset; -	if (inflated_offset > offset) -		inflated_addr += huge_size; - -	if (inflated_addr > TASK_SIZE - len) -		return addr; - -	return inflated_addr; -} - -/** - * drm_get_unmapped_area() - Get an unused user-space virtual memory area - * suitable for huge page table entries. - * @file: The struct file representing the address space being mmap()'d. - * @uaddr: Start address suggested by user-space. - * @len: Length of the area. - * @pgoff: The page offset into the address space. - * @flags: mmap flags - * @mgr: The address space manager used by the drm driver. This argument can - * probably be removed at some point when all drivers use the same - * address space manager. - * - * This function attempts to find an unused user-space virtual memory area - * that can accommodate the size we want to map, and that is properly - * aligned to facilitate huge page table entries matching actual - * huge pages or huge page aligned memory in buffer objects. Buffer objects - * are assumed to start at huge page boundary pfns (io memory) or be - * populated by huge pages aligned to the start of the buffer object - * (system- or coherent memory). Adapted from shmem_get_unmapped_area. - * - * Return: aligned user-space address. - */ -unsigned long drm_get_unmapped_area(struct file *file, -				    unsigned long uaddr, unsigned long len, -				    unsigned long pgoff, unsigned long flags, -				    struct drm_vma_offset_manager *mgr) -{ -	unsigned long addr; -	unsigned long inflated_addr; -	struct drm_vma_offset_node *node; - -	if (len > TASK_SIZE) -		return -ENOMEM; - -	/* -	 * @pgoff is the file page-offset the huge page boundaries of -	 * which typically aligns to physical address huge page boundaries. -	 * That's not true for DRM, however, where physical address huge -	 * page boundaries instead are aligned with the offset from -	 * buffer object start. So adjust @pgoff to be the offset from -	 * buffer object start. -	 */ -	drm_vma_offset_lock_lookup(mgr); -	node = drm_vma_offset_lookup_locked(mgr, pgoff, 1); -	if (node) -		pgoff -= node->vm_node.start; -	drm_vma_offset_unlock_lookup(mgr); - -	addr = current->mm->get_unmapped_area(file, uaddr, len, pgoff, flags); -	if (IS_ERR_VALUE(addr)) -		return addr; -	if (addr & ~PAGE_MASK) -		return addr; -	if (addr > TASK_SIZE - len) -		return addr; - -	if (len < HPAGE_PMD_SIZE) -		return addr; -	if (flags & MAP_FIXED) -		return addr; -	/* -	 * Our priority is to support MAP_SHARED mapped hugely; -	 * and support MAP_PRIVATE mapped hugely too, until it is COWed. -	 * But if caller specified an address hint, respect that as before. -	 */ -	if (uaddr) -		return addr; - -	inflated_addr = drm_addr_inflate(addr, len, pgoff, flags, -					 HPAGE_PMD_SIZE); - -	if (IS_ENABLED(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD) && -	    len >= HPAGE_PUD_SIZE) -		inflated_addr = drm_addr_inflate(inflated_addr, len, pgoff, -						 flags, HPAGE_PUD_SIZE); -	return inflated_addr; -} -#else /* CONFIG_TRANSPARENT_HUGEPAGE */ -unsigned long drm_get_unmapped_area(struct file *file, -				    unsigned long uaddr, unsigned long len, -				    unsigned long pgoff, unsigned long flags, -				    struct drm_vma_offset_manager *mgr) -{ -	return current->mm->get_unmapped_area(file, uaddr, len, pgoff, flags); -} -#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ -EXPORT_SYMBOL_GPL(drm_get_unmapped_area); -#endif /* CONFIG_MMU */  |