diff options
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/drm_bo.c | 118 | 
1 files changed, 49 insertions, 69 deletions
diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c index 70342ac9..368ec0c5 100644 --- a/linux-core/drm_bo.c +++ b/linux-core/drm_bo.c @@ -198,9 +198,8 @@ void drm_bo_usage_deref_unlocked(drm_device_t * dev, drm_buffer_object_t * bo)  	}  } -int drm_fence_buffer_objects(drm_file_t * priv,  -			     struct list_head *list,  -			     drm_fence_object_t *fence) +int drm_fence_buffer_objects(drm_file_t * priv, +			     struct list_head *list, drm_fence_object_t * fence)  {  	drm_device_t *dev = priv->head->dev;  	drm_buffer_manager_t *bm = &dev->bm; @@ -212,7 +211,7 @@ int drm_fence_buffer_objects(drm_file_t * priv,  	struct list_head f_list, *l;  	mutex_lock(&dev->struct_mutex); -	 +  	list_for_each_entry(entry, list, head) {  		BUG_ON(!(entry->priv_flags & _DRM_BO_FLAG_UNFENCED));  		fence_flags |= entry->fence_flags; @@ -256,7 +255,7 @@ int drm_fence_buffer_objects(drm_file_t * priv,  	count = 0;  	l = f_list.next; -	while(l != &f_list) { +	while (l != &f_list) {  		entry = list_entry(l, drm_buffer_object_t, head);  		atomic_inc(&entry->usage);  		mutex_unlock(&dev->struct_mutex); @@ -265,10 +264,10 @@ int drm_fence_buffer_objects(drm_file_t * priv,  		if (entry->priv_flags & _DRM_BO_FLAG_UNFENCED) {  			count++; -			if (entry->fence)  +			if (entry->fence)  				drm_fence_usage_deref_locked(dev, entry->fence);  			entry->fence = fence; -			DRM_FLAG_MASKED(entry->priv_flags, 0,  +			DRM_FLAG_MASKED(entry->priv_flags, 0,  					_DRM_BO_FLAG_UNFENCED);  			DRM_WAKEUP(&entry->event_queue);  			list_del_init(&entry->head); @@ -294,7 +293,6 @@ int drm_fence_buffer_objects(drm_file_t * priv,  	return ret;  } -  /*   * Call bo->mutex locked.   * Wait until the buffer is idle. @@ -468,7 +466,7 @@ static int drm_move_local_to_tt(drm_buffer_object_t * bo, int no_wait)  	return 0;  } -static int drm_bo_new_flags(drm_device_t *dev, +static int drm_bo_new_flags(drm_device_t * dev,  			    uint32_t flags, uint32_t new_mask, uint32_t hint,  			    int init, uint32_t * n_flags, uint32_t * n_mask)  { @@ -486,7 +484,6 @@ static int drm_bo_new_flags(drm_device_t *dev,  	if (!bm->use_tt)  		new_mask &= ~DRM_BO_FLAG_MEM_TT; -  	if (new_mask & DRM_BO_FLAG_BIND_CACHED) {  		if (((new_mask & DRM_BO_FLAG_MEM_TT) && !driver->cached_tt) &&  		    ((new_mask & DRM_BO_FLAG_MEM_VRAM) @@ -604,12 +601,10 @@ drm_buffer_object_t *drm_lookup_buffer_object(drm_file_t * priv,   * Doesn't do any fence flushing as opposed to the drm_bo_busy function.   */ - -static int drm_bo_quick_busy(drm_buffer_object_t *bo) +static int drm_bo_quick_busy(drm_buffer_object_t * bo)  {  	drm_fence_object_t *fence = bo->fence; -  	BUG_ON(bo->priv_flags & _DRM_BO_FLAG_UNFENCED);  	if (fence) {  		drm_device_t *dev = bo->dev; @@ -622,7 +617,6 @@ static int drm_bo_quick_busy(drm_buffer_object_t *bo)  	}  	return 0;  } -	  /*   * Call bo->mutex locked. @@ -656,7 +650,6 @@ static int drm_bo_read_cached(drm_buffer_object_t * bo)  {  	drm_device_t *dev = bo->dev;  	drm_buffer_manager_t *bm = &dev->bm; -		  	BUG_ON(bo->priv_flags & _DRM_BO_FLAG_UNFENCED);  	DRM_FLAG_MASKED(bo->priv_flags, _DRM_BO_FLAG_EVICTED, @@ -673,9 +666,9 @@ static int drm_bo_read_cached(drm_buffer_object_t * bo)   * Wait until a buffer is unmapped.   */ -static int drm_bo_wait_unmapped(drm_buffer_object_t *bo, int no_wait) +static int drm_bo_wait_unmapped(drm_buffer_object_t * bo, int no_wait)  { -	int ret = 0;  +	int ret = 0;  	if ((atomic_read(&bo->mapped) >= 0) && no_wait)  		return -EBUSY; @@ -685,11 +678,11 @@ static int drm_bo_wait_unmapped(drm_buffer_object_t *bo, int no_wait)  	if (ret == -EINTR)  		ret = -EAGAIN; -	 +  	return ret;  } -static int drm_bo_check_unfenced(drm_buffer_object_t *bo) +static int drm_bo_check_unfenced(drm_buffer_object_t * bo)  {  	int ret; @@ -711,17 +704,17 @@ static int drm_bo_check_unfenced(drm_buffer_object_t *bo)   * the buffer "unfenced" after validating, but before fencing.   */ -static int drm_bo_wait_unfenced(drm_buffer_object_t *bo, int no_wait,  +static int drm_bo_wait_unfenced(drm_buffer_object_t * bo, int no_wait,  				int eagain_if_wait)  {  	int ret = (bo->priv_flags & _DRM_BO_FLAG_UNFENCED); -	unsigned long _end = jiffies + 3*DRM_HZ; +	unsigned long _end = jiffies + 3 * DRM_HZ;  	if (ret && no_wait)  		return -EBUSY;  	else if (!ret)  		return 0; -	      +  	do {  		mutex_unlock(&bo->mutex);  		DRM_WAIT_ON(ret, bo->event_queue, 3 * DRM_HZ, @@ -730,7 +723,8 @@ static int drm_bo_wait_unfenced(drm_buffer_object_t *bo, int no_wait,  		if (ret == -EINTR)  			return -EAGAIN;  		if (ret) { -			DRM_ERROR("Error waiting for buffer to become fenced\n"); +			DRM_ERROR +			    ("Error waiting for buffer to become fenced\n");  			return ret;  		}  		ret = (bo->priv_flags & _DRM_BO_FLAG_UNFENCED); @@ -750,7 +744,6 @@ static int drm_bo_wait_unfenced(drm_buffer_object_t *bo, int no_wait,   * Bo locked.    */ -  static void drm_bo_fill_rep_arg(drm_buffer_object_t * bo,  				drm_bo_arg_reply_t * rep)  { @@ -770,13 +763,12 @@ static void drm_bo_fill_rep_arg(drm_buffer_object_t * bo,  	rep->fence_flags = bo->fence_flags;  	rep->rep_flags = 0; -	if ((bo->priv_flags & _DRM_BO_FLAG_UNFENCED) ||  -	    drm_bo_quick_busy(bo)) { -		DRM_FLAG_MASKED(rep->rep_flags, DRM_BO_REP_BUSY, DRM_BO_REP_BUSY); +	if ((bo->priv_flags & _DRM_BO_FLAG_UNFENCED) || drm_bo_quick_busy(bo)) { +		DRM_FLAG_MASKED(rep->rep_flags, DRM_BO_REP_BUSY, +				DRM_BO_REP_BUSY);  	}  } -  /*   * Wait for buffer idle and register that we've mapped the buffer.   * Mapping is registered as a drm_ref_object with type _DRM_REF_TYPE1,  @@ -786,7 +778,7 @@ static void drm_bo_fill_rep_arg(drm_buffer_object_t * bo,  static int drm_buffer_object_map(drm_file_t * priv, uint32_t handle,  				 uint32_t map_flags, int no_wait, -				 drm_bo_arg_reply_t *rep) +				 drm_bo_arg_reply_t * rep)  {  	drm_buffer_object_t *bo;  	drm_device_t *dev = priv->head->dev; @@ -827,12 +819,12 @@ static int drm_buffer_object_map(drm_file_t * priv, uint32_t handle,  		} else if ((map_flags & DRM_BO_FLAG_READ) &&  			   (bo->flags & DRM_BO_FLAG_READ_CACHED) &&  			   (!(bo->flags & DRM_BO_FLAG_CACHED))) { -			 +  			/*  			 * We are already mapped with different flags.  			 * need to wait for unmap.  			 */ -			 +  			ret = drm_bo_wait_unmapped(bo, no_wait);  			if (ret)  				goto out; @@ -849,7 +841,7 @@ static int drm_buffer_object_map(drm_file_t * priv, uint32_t handle,  		if (atomic_add_negative(-1, &bo->mapped))  			DRM_WAKEUP(&bo->event_queue); -	} else  +	} else  		drm_bo_fill_rep_arg(bo, rep);        out:  	mutex_unlock(&bo->mutex); @@ -975,10 +967,8 @@ static int drm_buffer_object_validate(drm_buffer_object_t * bo,  		DRM_ERROR("Cached binding not implemented yet\n");  		return -EINVAL;  	} -  #ifdef BODEBUG -	DRM_ERROR("New flags 0x%08x, Old flags 0x%08x\n", -		  new_flags, bo->flags); +	DRM_ERROR("New flags 0x%08x, Old flags 0x%08x\n", new_flags, bo->flags);  #endif  	ret = driver->fence_type(new_flags, &bo->fence_class, &bo->fence_flags);  	if (ret) { @@ -1029,7 +1019,7 @@ static int drm_buffer_object_validate(drm_buffer_object_t * bo,  static int drm_bo_handle_validate(drm_file_t * priv, uint32_t handle,  				  uint32_t flags, uint32_t mask, uint32_t hint, -				  drm_bo_arg_reply_t *rep) +				  drm_bo_arg_reply_t * rep)  {  	drm_buffer_object_t *bo;  	drm_device_t *dev = priv->head->dev; @@ -1048,42 +1038,43 @@ static int drm_bo_handle_validate(drm_file_t * priv, uint32_t handle,  	if (ret)  		goto out; -	ret = drm_bo_new_flags(dev, bo->flags,  +	ret = drm_bo_new_flags(dev, bo->flags,  			       (flags & mask) | (bo->mask & ~mask), hint,  			       0, &new_flags, &bo->mask);  	if (ret)  		goto out; -	ret = drm_buffer_object_validate(bo, new_flags, !(hint & DRM_BO_HINT_DONT_FENCE),  -					 no_wait); +	ret = +	    drm_buffer_object_validate(bo, new_flags, +				       !(hint & DRM_BO_HINT_DONT_FENCE), +				       no_wait);  	drm_bo_fill_rep_arg(bo, rep); -	 -out:			 -     + +      out: +  	mutex_unlock(&bo->mutex);  	drm_bo_usage_deref_unlocked(dev, bo);  	return ret;  }  static int drm_bo_handle_info(drm_file_t * priv, uint32_t handle, -			      drm_bo_arg_reply_t *rep) +			      drm_bo_arg_reply_t * rep)  {  	drm_buffer_object_t *bo;  	bo = drm_lookup_buffer_object(priv, handle, 1);  	if (!bo) {  		return -EINVAL; -	}     +	}  	mutex_lock(&bo->mutex); -	if (!(bo->priv_flags & _DRM_BO_FLAG_UNFENCED))  -		(void) drm_bo_busy(bo); +	if (!(bo->priv_flags & _DRM_BO_FLAG_UNFENCED)) +		(void)drm_bo_busy(bo);  	drm_bo_fill_rep_arg(bo, rep);  	mutex_unlock(&bo->mutex);  	return 0;  } -  /*   * Call bo->mutex locked.   */ @@ -1143,10 +1134,6 @@ static int drm_bo_add_ttm(drm_file_t * priv, drm_buffer_object_t * bo,  	return ret;  } - - - -  int drm_buffer_object_create(drm_file_t * priv,  			     unsigned long size,  			     drm_bo_type_t type, @@ -1355,8 +1342,7 @@ int drm_bo_ioctl(DRM_IOCTL_ARGS)  			rep.ret = drm_bo_lock_test(dev, filp);  			if (rep.ret)  				break; -			/**/ -			break; +			 /**/ break;  		case drm_bo_info:  			rep.ret = drm_bo_handle_info(priv, req->handle, &rep);  			break; @@ -1381,12 +1367,10 @@ int drm_bo_ioctl(DRM_IOCTL_ARGS)  	return 0;  } -  /*   * dev->struct_sem locked.   */ -  static void drm_bo_force_clean(drm_device_t * dev)  {  	drm_buffer_manager_t *bm = &dev->bm; @@ -1398,11 +1382,11 @@ static void drm_bo_force_clean(drm_device_t * dev)  	list_for_each_entry_safe(entry, next, &bm->ddestroy, ddestroy) {  		if (entry->fence) {  			if (nice_mode) { -				unsigned long _end = jiffies + 3*DRM_HZ; +				unsigned long _end = jiffies + 3 * DRM_HZ;  				do {  					ret = drm_bo_wait(entry, 0, 0); -				} while ((ret == -EINTR) &&  -					 !time_after_eq(jiffies, _end));	 +				} while ((ret == -EINTR) && +					 !time_after_eq(jiffies, _end));  			} else {  				drm_fence_usage_deref_locked(dev, entry->fence);  				entry->fence = NULL; @@ -1422,23 +1406,20 @@ static void drm_bo_force_clean(drm_device_t * dev)  	}  } - -int drm_bo_clean_mm(drm_device_t *dev) +int drm_bo_clean_mm(drm_device_t * dev)  {  	drm_buffer_manager_t *bm = &dev->bm;  	int ret = 0; -	  	mutex_lock(&dev->struct_mutex);  	if (!bm->initialized)  		goto out; -		  	drm_bo_force_clean(dev);  	bm->use_vram = 0;  	bm->use_tt = 0; -	 +  	if (bm->has_vram) {  		if (drm_mm_clean(&bm->vram_manager)) {  			drm_mm_takedown(&bm->vram_manager); @@ -1451,20 +1432,19 @@ int drm_bo_clean_mm(drm_device_t *dev)  		if (drm_mm_clean(&bm->tt_manager)) {  			drm_mm_takedown(&bm->tt_manager);  			bm->has_tt = 0; -		} else  +		} else  			ret = -EBUSY; -		 +  		if (!ret)  			bm->initialized = 0;  	} - out: +      out:  	mutex_unlock(&dev->struct_mutex);  	return ret;  } -  int drm_mm_init_ioctl(DRM_IOCTL_ARGS)  {  	DRM_DEVICE; @@ -1490,7 +1470,7 @@ int drm_mm_init_ioctl(DRM_IOCTL_ARGS)  		mutex_lock(&dev->struct_mutex);  		bm->has_vram = 0;  		bm->has_tt = 0; -		 +  		if (arg.req.vr_p_size) {  			ret = drm_mm_init(&bm->vram_manager,  					  arg.req.vr_p_offset, @@ -1499,7 +1479,7 @@ int drm_mm_init_ioctl(DRM_IOCTL_ARGS)  			/*  			 * VRAM not supported yet.  			 */ -			 +  			bm->use_vram = 0;  			if (ret)  				break;  | 
