diff options
| -rw-r--r-- | linux-core/drmP.h | 7 | ||||
| -rw-r--r-- | linux-core/drm_agpsupport.c | 2 | ||||
| -rw-r--r-- | linux-core/drm_bo.c | 106 | ||||
| -rw-r--r-- | linux-core/drm_compat.c | 138 | ||||
| -rw-r--r-- | linux-core/drm_compat.h | 18 | ||||
| -rw-r--r-- | linux-core/drm_ttm.c | 51 | ||||
| -rw-r--r-- | linux-core/drm_ttm.h | 13 | ||||
| -rw-r--r-- | linux-core/drm_vm.c | 16 | 
8 files changed, 166 insertions, 185 deletions
diff --git a/linux-core/drmP.h b/linux-core/drmP.h index 84a06470..dd07a603 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -1044,6 +1044,13 @@ typedef struct drm_buffer_object{  	unsigned long num_pages;  	uint32_t vm_flags;          void *iomap; +   +         +#ifdef DRM_ODD_MM_COMPAT +  /* dev->struct_mutex only protected. */ +	struct list_head vma_list; +	struct list_head p_mm_list; +#endif  } drm_buffer_object_t; diff --git a/linux-core/drm_agpsupport.c b/linux-core/drm_agpsupport.c index 7a692af1..177180f9 100644 --- a/linux-core/drm_agpsupport.c +++ b/linux-core/drm_agpsupport.c @@ -620,7 +620,7 @@ static int drm_agp_bind_ttm(drm_ttm_backend_t *backend,  static int drm_agp_unbind_ttm(drm_ttm_backend_t *backend) {  	drm_agp_ttm_priv *agp_priv = (drm_agp_ttm_priv *) backend->private; - +	  	DRM_DEBUG("drm_agp_unbind_ttm\n");  	if (agp_priv->mem->is_bound)  		return drm_agp_unbind_memory(agp_priv->mem); diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c index 8fe5e8ef..9a27a4b5 100644 --- a/linux-core/drm_bo.c +++ b/linux-core/drm_bo.c @@ -107,23 +107,31 @@ static int drm_move_tt_to_local(drm_buffer_object_t * bo, int evict,  				int force_no_move)  {  	drm_device_t *dev = bo->dev; -	int ret; +	int ret = 0;  	if (bo->mm_node) { -	        drm_bo_unmap_virtual(bo); +#ifdef DRM_ODD_MM_COMPAT  		mutex_lock(&dev->struct_mutex); -		if (evict) -			ret = drm_evict_ttm(bo->ttm); -		else -			ret = drm_unbind_ttm(bo->ttm); - +		ret = drm_bo_lock_kmm(bo);  		if (ret) {  			mutex_unlock(&dev->struct_mutex);  			if (ret == -EAGAIN)  				schedule();  			return ret;  		} +	        drm_bo_unmap_virtual(bo); +		drm_bo_finish_unmap(bo); +		drm_bo_unlock_kmm(bo); +#else +		drm_bo_unmap_virtual(bo); +		mutex_lock(&dev->struct_mutex); +#endif +		if (evict) +			drm_ttm_evict(bo->ttm); +		else +			drm_ttm_unbind(bo->ttm); +		bo->mem_type = DRM_BO_MEM_LOCAL;  		if (!(bo->flags & DRM_BO_FLAG_NO_MOVE) || force_no_move) {  			drm_mm_put_block(bo->mm_node);  			bo->mm_node = NULL; @@ -262,23 +270,13 @@ static void drm_bo_destroy_locked(drm_buffer_object_t *bo)  	if (list_empty(&bo->lru) && bo->mm_node == NULL && atomic_read(&bo->usage) == 0) {  		BUG_ON(bo->fence != NULL); -		if (bo->ttm) { -			unsigned long _end = jiffies + DRM_HZ; -			int ret; - -			do { -				ret = drm_unbind_ttm(bo->ttm); -				if (ret == -EAGAIN) { -					mutex_unlock(&dev->struct_mutex); -					schedule(); -					mutex_lock(&dev->struct_mutex); -				} -			} while (ret == -EAGAIN && !time_after_eq(jiffies, _end)); +#ifdef DRM_ODD_MM_COMPAT +		BUG_ON(!list_empty(&bo->vma_list)); +		BUG_ON(!list_empty(&bo->p_mm_list)); +#endif -			if (ret) { -				DRM_ERROR("Couldn't unbind TTM region while destroying a buffer. " -					  "Bad. Continuing anyway\n"); -			} +		if (bo->ttm) { +			drm_ttm_unbind(bo->ttm);  			drm_destroy_ttm(bo->ttm);  			bo->ttm = NULL;  		} @@ -597,8 +595,7 @@ int drm_bo_alloc_space(drm_buffer_object_t * bo, unsigned mem_type,  static int drm_move_local_to_tt(drm_buffer_object_t * bo, int no_wait)  {  	drm_device_t *dev = bo->dev; -	drm_ttm_backend_t *be; -	int ret; +	int ret = 0;  	if (!(bo->mm_node && (bo->flags & DRM_BO_FLAG_NO_MOVE))) {  		BUG_ON(bo->mm_node); @@ -608,26 +605,41 @@ static int drm_move_local_to_tt(drm_buffer_object_t * bo, int no_wait)  	}  	DRM_DEBUG("Flipping in to AGP 0x%08lx\n", bo->mm_node->start); - -	drm_bo_unmap_virtual(bo); +	 +#ifdef DRM_ODD_MM_COMPAT  	mutex_lock(&dev->struct_mutex); +	ret = drm_bo_lock_kmm(bo); +	if (ret) { +		mutex_unlock(&dev->struct_mutex); +		goto out_put_unlock; +	} +#endif +	drm_bo_unmap_virtual(bo);  	ret = drm_bind_ttm(bo->ttm, bo->flags & DRM_BO_FLAG_BIND_CACHED,  			   bo->mm_node->start); +	  	if (ret) { -		drm_mm_put_block(bo->mm_node); -		bo->mm_node = NULL; +#ifdef DRM_ODD_MM_COMPAT +		drm_bo_unlock_kmm(bo); +		mutex_unlock(&dev->struct_mutex); +#endif +		goto out_put_unlock;  	} -	mutex_unlock(&dev->struct_mutex); +	 +	if (!(bo->flags & DRM_BO_FLAG_BIND_CACHED)) +		bo->flags &= DRM_BO_FLAG_CACHED; +	bo->flags &= ~DRM_BO_MASK_MEM; +	bo->flags |= DRM_BO_FLAG_MEM_TT; +	bo->mem_type = DRM_BO_MEM_TT; +#ifdef DRM_ODD_MM_COMPAT +	ret = drm_bo_remap_bound(bo);  	if (ret) { -		return ret; +		/* FIXME */  	} - -	be = bo->ttm->be; -	if (be->needs_ub_cache_adjust(be)) -		bo->flags &= ~DRM_BO_FLAG_CACHED; -	bo->flags &= ~DRM_BO_MASK_MEM; -	bo->flags |= DRM_BO_FLAG_MEM_TT; +	drm_bo_unlock_kmm(bo); +	mutex_unlock(&dev->struct_mutex); +#endif  	if (bo->priv_flags & _DRM_BO_FLAG_EVICTED) {  		ret = dev->driver->bo_driver->invalidate_caches(dev, bo->flags); @@ -637,6 +649,13 @@ static int drm_move_local_to_tt(drm_buffer_object_t * bo, int no_wait)  	DRM_FLAG_MASKED(bo->priv_flags, 0, _DRM_BO_FLAG_EVICTED);  	return 0; + +out_put_unlock: +	mutex_lock(&dev->struct_mutex); +	drm_mm_put_block(bo->mm_node); +	bo->mm_node = NULL; +	mutex_unlock(&dev->struct_mutex); +	return ret;  }  static int drm_bo_new_flags(drm_device_t * dev, @@ -1120,7 +1139,6 @@ static int drm_bo_move_buffer(drm_buffer_object_t * bo, uint32_t new_flags,  	} else {  		drm_move_tt_to_local(bo, 0, force_no_move);  	} -  	return 0;  } @@ -1213,13 +1231,12 @@ static int drm_buffer_object_validate(drm_buffer_object_t * bo,  		list_add_tail(&bo->lru, &bm->unfenced);  		mutex_unlock(&dev->struct_mutex);  	} else { -  		mutex_lock(&dev->struct_mutex);  		list_del_init(&bo->lru);  		drm_bo_add_to_lru(bo, bm);  		mutex_unlock(&dev->struct_mutex);  	} - +	  	bo->flags = new_flags;  	return 0;  } @@ -1427,6 +1444,10 @@ int drm_buffer_object_create(drm_file_t * priv,  	DRM_INIT_WAITQUEUE(&bo->event_queue);  	INIT_LIST_HEAD(&bo->lru);  	INIT_LIST_HEAD(&bo->ddestroy); +#ifdef DRM_ODD_MM_COMPAT +	INIT_LIST_HEAD(&bo->p_mm_list); +	INIT_LIST_HEAD(&bo->vma_list); +#endif  	bo->dev = dev;  	bo->type = type;  	bo->num_pages = num_pages; @@ -2041,7 +2062,6 @@ int drm_bo_pci_offset(const drm_buffer_object_t *bo,  	drm_mem_type_manager_t *man = &bm->man[bo->mem_type];   	*bus_size = 0; -  	if (bo->type != drm_bo_type_dc)  		return -EINVAL; @@ -2057,11 +2077,10 @@ int drm_bo_pci_offset(const drm_buffer_object_t *bo,  		drm_ttm_fixup_caching(ttm); -		if (!(ttm->page_flags & DRM_TTM_PAGE_UNCACHED)) +		if (!(ttm->page_flags & DRM_TTM_PAGE_UNCACHED))   			return 0;  		if (ttm->be->flags & DRM_BE_FLAG_CMA)  			return 0; -  		*bus_base = ttm->be->aperture_base;  	} else {  		*bus_base = man->io_offset; @@ -2069,7 +2088,6 @@ int drm_bo_pci_offset(const drm_buffer_object_t *bo,  	*bus_offset = bo->mm_node->start << PAGE_SHIFT;  	*bus_size = bo->num_pages << PAGE_SHIFT; -	  	return 0;  } diff --git a/linux-core/drm_compat.c b/linux-core/drm_compat.c index 3639ea4f..48d598e8 100644 --- a/linux-core/drm_compat.c +++ b/linux-core/drm_compat.c @@ -212,78 +212,85 @@ typedef struct vma_entry {  } vma_entry_t; -struct page *drm_vm_ttm_nopage(struct vm_area_struct *vma, +struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,  			       unsigned long address,   			       int *type)  { -	drm_local_map_t *map = (drm_local_map_t *) vma->vm_private_data; +	drm_buffer_object_t *bo = (drm_buffer_object_t *) vma->vm_private_data;  	unsigned long page_offset;  	struct page *page;  	drm_ttm_t *ttm;   	drm_buffer_manager_t *bm;  	drm_device_t *dev; +	unsigned long bus_base; +	unsigned long bus_offset; +	unsigned long bus_size; +	int err; -	/* -	 * FIXME: Check can't map aperture flag. -	 */ +	mutex_lock(&bo->mutex);  	if (type)  		*type = VM_FAULT_MINOR; -	if (!map)  -		return NOPAGE_OOM; - -	if (address > vma->vm_end)  -		return NOPAGE_SIGBUS; +	if (address > vma->vm_end) { +		page = NOPAGE_SIGBUS; +		goto out_unlock; +	} +	 +	dev = bo->dev; +	err = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size); +	 +	if (err) { +		page = NOPAGE_SIGBUS; +		goto out_unlock; +	} -	ttm = (drm_ttm_t *) map->offset;	 -	dev = ttm->dev; -	mutex_lock(&dev->struct_mutex); -	drm_fixup_ttm_caching(ttm); -	BUG_ON(ttm->page_flags & DRM_TTM_PAGE_UNCACHED); +	if (bus_size != 0) { +		DRM_ERROR("Invalid compat nopage.\n"); +		page = NOPAGE_SIGBUS; +		goto out_unlock; +	}  	bm = &dev->bm; +	ttm = bo->ttm;  	page_offset = (address - vma->vm_start) >> PAGE_SHIFT;  	page = ttm->pages[page_offset];  	if (!page) { -		if (drm_alloc_memctl(PAGE_SIZE)) { -			page = NOPAGE_OOM; -			goto out; -		} -		page = ttm->pages[page_offset] =  -			alloc_page(GFP_KERNEL | __GFP_ZERO | GFP_DMA32); +		page = drm_ttm_alloc_page();  		if (!page) { -		        drm_free_memctl(PAGE_SIZE);  			page = NOPAGE_OOM; -			goto out; +			goto out_unlock;  		} -		++bm->cur_pages; -		SetPageLocked(page); +		ttm->pages[page_offset] = page; +		++bm->cur_pages;		  	}  	get_page(page); - out: -	mutex_unlock(&dev->struct_mutex); + +out_unlock: +	mutex_unlock(&bo->mutex);  	return page;  } -int drm_ttm_map_bound(struct vm_area_struct *vma) +int drm_bo_map_bound(struct vm_area_struct *vma)  { -	drm_local_map_t *map = (drm_local_map_t *)vma->vm_private_data; -	drm_ttm_t *ttm = (drm_ttm_t *) map->offset; +	drm_buffer_object_t *bo = (drm_buffer_object_t *)vma->vm_private_data;  	int ret = 0; +	unsigned long bus_base; +	unsigned long bus_offset; +	unsigned long bus_size; +	 +	ret = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size); +	BUG_ON(ret); -	if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) &&  -	    !(ttm->be->flags & DRM_BE_FLAG_CMA)) { - -		unsigned long pfn = ttm->aper_offset +  -			(ttm->be->aperture_base >> PAGE_SHIFT); -		pgprot_t pgprot = drm_io_prot(ttm->be->drm_map_type, vma); -		 +	if (bus_size) { +		unsigned long pfn = (bus_base + bus_offset) >> PAGE_SHIFT; +		pgprot_t pgprot = drm_io_prot(_DRM_AGP, vma); +	       		ret = io_remap_pfn_range(vma, vma->vm_start, pfn,  					 vma->vm_end - vma->vm_start,  					 pgprot); @@ -293,31 +300,29 @@ int drm_ttm_map_bound(struct vm_area_struct *vma)  } -int drm_ttm_add_vma(drm_ttm_t * ttm, struct vm_area_struct *vma) +int drm_bo_add_vma(drm_buffer_object_t * bo, struct vm_area_struct *vma)  {  	p_mm_entry_t *entry, *n_entry;  	vma_entry_t *v_entry; -	drm_local_map_t *map = (drm_local_map_t *) -		vma->vm_private_data;  	struct mm_struct *mm = vma->vm_mm; -	v_entry = drm_ctl_alloc(sizeof(*v_entry), DRM_MEM_TTM); +	v_entry = drm_ctl_alloc(sizeof(*v_entry), DRM_MEM_BUFOBJ);  	if (!v_entry) {  		DRM_ERROR("Allocation of vma pointer entry failed\n");  		return -ENOMEM;  	}  	v_entry->vma = vma; -	map->handle = (void *) v_entry; -	list_add_tail(&v_entry->head, &ttm->vma_list); -	list_for_each_entry(entry, &ttm->p_mm_list, head) { +	list_add_tail(&v_entry->head, &bo->vma_list); + +	list_for_each_entry(entry, &bo->p_mm_list, head) {  		if (mm == entry->mm) {  			atomic_inc(&entry->refcount);  			return 0;  		} else if ((unsigned long)mm < (unsigned long)entry->mm) ;  	} -	n_entry = drm_ctl_alloc(sizeof(*n_entry), DRM_MEM_TTM); +	n_entry = drm_ctl_alloc(sizeof(*n_entry), DRM_MEM_BUFOBJ);  	if (!n_entry) {  		DRM_ERROR("Allocation of process mm pointer entry failed\n");  		return -ENOMEM; @@ -331,29 +336,29 @@ int drm_ttm_add_vma(drm_ttm_t * ttm, struct vm_area_struct *vma)  	return 0;  } -void drm_ttm_delete_vma(drm_ttm_t * ttm, struct vm_area_struct *vma) +void drm_bo_delete_vma(drm_buffer_object_t * bo, struct vm_area_struct *vma)  {  	p_mm_entry_t *entry, *n;  	vma_entry_t *v_entry, *v_n;  	int found = 0;  	struct mm_struct *mm = vma->vm_mm; -	list_for_each_entry_safe(v_entry, v_n, &ttm->vma_list, head) { +	list_for_each_entry_safe(v_entry, v_n, &bo->vma_list, head) {  		if (v_entry->vma == vma) {  			found = 1;  			list_del(&v_entry->head); -			drm_ctl_free(v_entry, sizeof(*v_entry), DRM_MEM_TTM); +			drm_ctl_free(v_entry, sizeof(*v_entry), DRM_MEM_BUFOBJ);  			break;  		}  	}  	BUG_ON(!found); -	list_for_each_entry_safe(entry, n, &ttm->p_mm_list, head) { +	list_for_each_entry_safe(entry, n, &bo->p_mm_list, head) {  		if (mm == entry->mm) {  			if (atomic_add_negative(-1, &entry->refcount)) {  				list_del(&entry->head);  				BUG_ON(entry->locked); -				drm_ctl_free(entry, sizeof(*entry), DRM_MEM_TTM); +				drm_ctl_free(entry, sizeof(*entry), DRM_MEM_BUFOBJ);  			}  			return;  		} @@ -363,12 +368,12 @@ void drm_ttm_delete_vma(drm_ttm_t * ttm, struct vm_area_struct *vma) -int drm_ttm_lock_mm(drm_ttm_t * ttm) +int drm_bo_lock_kmm(drm_buffer_object_t * bo)  {  	p_mm_entry_t *entry;  	int lock_ok = 1; -	list_for_each_entry(entry, &ttm->p_mm_list, head) { +	list_for_each_entry(entry, &bo->p_mm_list, head) {  		BUG_ON(entry->locked);  		if (!down_write_trylock(&entry->mm->mmap_sem)) {  			lock_ok = 0; @@ -380,7 +385,7 @@ int drm_ttm_lock_mm(drm_ttm_t * ttm)  	if (lock_ok)  		return 0; -	list_for_each_entry(entry, &ttm->p_mm_list, head) { +	list_for_each_entry(entry, &bo->p_mm_list, head) {  		if (!entry->locked)   			break;  		up_write(&entry->mm->mmap_sem); @@ -395,47 +400,46 @@ int drm_ttm_lock_mm(drm_ttm_t * ttm)  	return -EAGAIN;  } -void drm_ttm_unlock_mm(drm_ttm_t * ttm) +void drm_bo_unlock_kmm(drm_buffer_object_t * bo)  {  	p_mm_entry_t *entry; -	list_for_each_entry(entry, &ttm->p_mm_list, head) { +	list_for_each_entry(entry, &bo->p_mm_list, head) {  		BUG_ON(!entry->locked);  		up_write(&entry->mm->mmap_sem);  		entry->locked = 0;  	}  } -int drm_ttm_remap_bound(drm_ttm_t *ttm)  +int drm_bo_remap_bound(drm_buffer_object_t *bo)   {  	vma_entry_t *v_entry;  	int ret = 0; +	unsigned long bus_base; +	unsigned long bus_offset; +	unsigned long bus_size; -	if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) &&  -	    !(ttm->be->flags & DRM_BE_FLAG_CMA)) { +	ret = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size); +	BUG_ON(ret); -		list_for_each_entry(v_entry, &ttm->vma_list, head) { -			ret = drm_ttm_map_bound(v_entry->vma); +	if (bus_size) { +		list_for_each_entry(v_entry, &bo->vma_list, head) { +			ret = drm_bo_map_bound(v_entry->vma);  			if (ret)  				break;  		}  	} -	drm_ttm_unlock_mm(ttm);  	return ret;  } -void drm_ttm_finish_unmap(drm_ttm_t *ttm) +void drm_bo_finish_unmap(drm_buffer_object_t *bo)  {  	vma_entry_t *v_entry; -	 -	if (!(ttm->page_flags & DRM_TTM_PAGE_UNCACHED)) -		return; -	list_for_each_entry(v_entry, &ttm->vma_list, head) { +	list_for_each_entry(v_entry, &bo->vma_list, head) {  		v_entry->vma->vm_flags &= ~VM_PFNMAP;   	} -	drm_ttm_unlock_mm(ttm);  }	  #endif diff --git a/linux-core/drm_compat.h b/linux-core/drm_compat.h index 9048f021..313aab85 100644 --- a/linux-core/drm_compat.h +++ b/linux-core/drm_compat.h @@ -238,7 +238,7 @@ extern struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,  #ifdef DRM_ODD_MM_COMPAT -struct drm_ttm; +struct drm_buffer_object;  /* @@ -246,14 +246,14 @@ struct drm_ttm;   * process mm pointer to the ttm mm list. Needs the ttm mutex.   */ -extern int drm_ttm_add_vma(struct drm_ttm * ttm,  +extern int drm_bo_add_vma(struct drm_buffer_object * bo,   			   struct vm_area_struct *vma);  /*   * Delete a vma and the corresponding mm pointer from the   * ttm lists. Needs the ttm mutex.   */ -extern void drm_ttm_delete_vma(struct drm_ttm * ttm,  -			       struct vm_area_struct *vma); +extern void drm_bo_delete_vma(struct drm_buffer_object * bo,  +			      struct vm_area_struct *vma);  /*   * Attempts to lock all relevant mmap_sems for a ttm, while @@ -262,12 +262,12 @@ extern void drm_ttm_delete_vma(struct drm_ttm * ttm,   * schedule() and try again.   */ -extern int drm_ttm_lock_mm(struct drm_ttm * ttm); +extern int drm_bo_lock_kmm(struct drm_buffer_object * bo);  /*   * Unlock all relevant mmap_sems for a ttm.   */ -extern void drm_ttm_unlock_mm(struct drm_ttm * ttm); +extern void drm_bo_unlock_kmm(struct drm_buffer_object * bo);  /*   * If the ttm was bound to the aperture, this function shall be called @@ -277,7 +277,7 @@ extern void drm_ttm_unlock_mm(struct drm_ttm * ttm);   * releases the mmap_sems for this ttm.   */ -extern void drm_ttm_finish_unmap(struct drm_ttm *ttm); +extern void drm_bo_finish_unmap(struct drm_buffer_object *bo);  /*   * Remap all vmas of this ttm using io_remap_pfn_range. We cannot  @@ -286,14 +286,14 @@ extern void drm_ttm_finish_unmap(struct drm_ttm *ttm);   * releases the mmap_sems for this ttm.   */ -extern int drm_ttm_remap_bound(struct drm_ttm *ttm); +extern int drm_bo_remap_bound(struct drm_buffer_object *bo);  /*   * Remap a vma for a bound ttm. Call with the ttm mutex held and   * the relevant mmap_sem locked.   */ -extern int drm_ttm_map_bound(struct vm_area_struct *vma); +extern int drm_bo_map_bound(struct vm_area_struct *vma);  #endif  #endif diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c index 6699a0dd..9a2ce5cd 100644 --- a/linux-core/drm_ttm.c +++ b/linux-core/drm_ttm.c @@ -153,12 +153,6 @@ int drm_destroy_ttm(drm_ttm_t * ttm)  	if (!ttm)  		return 0; -	DRM_ERROR("Drm destroy ttm\n"); - -#ifdef DRM_ODD_MM_COMPAT -	BUG_ON(!list_empty(&ttm->vma_list)); -	BUG_ON(!list_empty(&ttm->p_mm_list)); -#endif  	be = ttm->be;  	if (be) {  		be->destroy(be); @@ -241,11 +235,6 @@ drm_ttm_t *drm_ttm_init(struct drm_device *dev, unsigned long size)  	if (!ttm)  		return NULL; -#ifdef DRM_ODD_MM_COMPAT -	INIT_LIST_HEAD(&ttm->p_mm_list); -	INIT_LIST_HEAD(&ttm->vma_list); -#endif -  	ttm->dev = dev;  	atomic_set(&ttm->vma_count, 0); @@ -278,15 +267,17 @@ drm_ttm_t *drm_ttm_init(struct drm_device *dev, unsigned long size)   * Unbind a ttm region from the aperture.   */ -int drm_evict_ttm(drm_ttm_t * ttm) +void drm_ttm_evict(drm_ttm_t * ttm)  {  	drm_ttm_backend_t *be = ttm->be; +	int ret; -	if (ttm->state == ttm_bound)  -		be->unbind(be); +	if (ttm->state == ttm_bound) { +		ret = be->unbind(be); +		BUG_ON(ret); +	}  	ttm->state = ttm_evicted; -	return 0;  }  void drm_ttm_fixup_caching(drm_ttm_t * ttm) @@ -301,18 +292,12 @@ void drm_ttm_fixup_caching(drm_ttm_t * ttm)  	}  } -int drm_unbind_ttm(drm_ttm_t * ttm) +void drm_ttm_unbind(drm_ttm_t * ttm)  { -	int ret = 0; -  	if (ttm->state == ttm_bound) -		ret = drm_evict_ttm(ttm); - -	if (ret) -		return ret; +		drm_ttm_evict(ttm);  	drm_ttm_fixup_caching(ttm); -	return 0;  }  int drm_bind_ttm(drm_ttm_t * ttm, int cached, unsigned long aper_offset) @@ -335,19 +320,9 @@ int drm_bind_ttm(drm_ttm_t * ttm, int cached, unsigned long aper_offset)  	if (ttm->state == ttm_unbound && !cached) {  		drm_set_caching(ttm, DRM_TTM_PAGE_UNCACHED);  	} -#ifdef DRM_ODD_MM_COMPAT -	else if (ttm->state == ttm_evicted && !cached) { -		ret = drm_ttm_lock_mm(ttm); -		if (ret) -			return ret; -	} -#endif +  	if ((ret = be->bind(be, aper_offset, cached))) {  		ttm->state = ttm_evicted; -#ifdef DRM_ODD_MM_COMPAT -		if (be->needs_ub_cache_adjust(be)) -			drm_ttm_unlock_mm(ttm); -#endif  		DRM_ERROR("Couldn't bind backend.\n");  		return ret;  	} @@ -355,13 +330,5 @@ int drm_bind_ttm(drm_ttm_t * ttm, int cached, unsigned long aper_offset)  	ttm->aper_offset = aper_offset;  	ttm->state = ttm_bound; -#ifdef DRM_ODD_MM_COMPAT -	if (be->needs_ub_cache_adjust(be)) { -		ret = drm_ttm_remap_bound(ttm); -		if (ret) -			return ret; -	} -#endif -  	return 0;  } diff --git a/linux-core/drm_ttm.h b/linux-core/drm_ttm.h index a6dc30ae..6aa1c5ad 100644 --- a/linux-core/drm_ttm.h +++ b/linux-core/drm_ttm.h @@ -79,10 +79,6 @@ typedef struct drm_ttm {  		ttm_unbound,  		ttm_unpopulated,  	} state; -#ifdef DRM_ODD_MM_COMPAT -	struct list_head vma_list; -	struct list_head p_mm_list; -#endif  } drm_ttm_t; @@ -90,13 +86,8 @@ typedef struct drm_ttm {  extern drm_ttm_t *drm_ttm_init(struct drm_device *dev, unsigned long size);  extern struct page *drm_ttm_alloc_page(void);  extern int drm_bind_ttm(drm_ttm_t * ttm, int cached, unsigned long aper_offset); -extern int drm_unbind_ttm(drm_ttm_t * ttm); - -/* - * Evict a ttm region. Keeps Aperture caching policy. - */ - -extern int drm_evict_ttm(drm_ttm_t * ttm); +extern void drm_ttm_unbind(drm_ttm_t * ttm); +extern void drm_ttm_evict(drm_ttm_t * ttm);  extern void drm_ttm_fixup_caching(drm_ttm_t * ttm);  /* diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c index 93d1c0b8..a4a9b09d 100644 --- a/linux-core/drm_vm.c +++ b/linux-core/drm_vm.c @@ -747,12 +747,6 @@ struct page *drm_bo_vm_fault(struct vm_area_struct *vma,  	mutex_lock(&bo->mutex); -	map = bo->map_list.map; - -	if (!map) { -		data->type = VM_FAULT_OOM; -		goto out_unlock; -	}  	if (address > vma->vm_end) {  		data->type = VM_FAULT_SIGBUS; @@ -808,8 +802,8 @@ static void drm_bo_vm_open_locked(struct vm_area_struct *vma)  	drm_vm_open_locked(vma);  	atomic_inc(&bo->usage); -#ifdef DRM_MM_ODD_COMPAT -	drm_bo_vm_add_vma(bo, vma); +#ifdef DRM_ODD_MM_COMPAT +	drm_bo_add_vma(bo, vma);  #endif  } @@ -843,8 +837,8 @@ static void drm_bo_vm_close(struct vm_area_struct *vma)  	drm_vm_close(vma);  	if (bo) {  		mutex_lock(&dev->struct_mutex); -#ifdef DRM_MM_ODD_COMPAT -		drm_bo_vm_delete_vma(bo, vma); +#ifdef DRM_ODD_MM_COMPAT +		drm_bo_delete_vma(bo, vma);  #endif  		drm_bo_usage_deref_locked(bo);  		mutex_unlock(&dev->struct_mutex); @@ -881,7 +875,7 @@ int drm_bo_mmap_locked(struct vm_area_struct *vma,  	vma->vm_flags |= VM_RESERVED | VM_IO;  	drm_bo_vm_open_locked(vma);  #ifdef DRM_ODD_MM_COMPAT -	drm_ttm_map_bound(vma); +	drm_bo_map_bound(vma);  #endif		  	return 0;  }  | 
