diff options
| author | Jani Nikula <jani.nikula@intel.com> | 2017-09-04 21:40:34 +0300 | 
|---|---|---|
| committer | Jani Nikula <jani.nikula@intel.com> | 2017-09-04 21:40:34 +0300 | 
| commit | d149d6ae17197ce23e2cd6bc5fcdacf7b593e55e (patch) | |
| tree | 2fb8d66199080f6d7b41690f6e8616ccd79a1943 /drivers/gpu/drm/msm/msm_gem.c | |
| parent | afe722bee4bf8afc88c6ff7d6f781515d9428595 (diff) | |
| parent | 7846b12fe0b5feab5446d892f41b5140c1419109 (diff) | |
| download | linux-d149d6ae17197ce23e2cd6bc5fcdacf7b593e55e.tar.xz | |
Merge drm-upstream/drm-next into drm-intel-next-queued
Catch up with upstream while it's easy.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gem.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem.c | 58 | 
1 files changed, 55 insertions, 3 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 65f35544c1ec..f15821a0d900 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -383,8 +383,10 @@ int msm_gem_get_iova(struct drm_gem_object *obj,  		struct page **pages;  		vma = add_vma(obj, aspace); -		if (IS_ERR(vma)) -			return PTR_ERR(vma); +		if (IS_ERR(vma)) { +			ret = PTR_ERR(vma); +			goto unlock; +		}  		pages = get_pages(obj);  		if (IS_ERR(pages)) { @@ -405,7 +407,7 @@ int msm_gem_get_iova(struct drm_gem_object *obj,  fail:  	del_vma(vma); - +unlock:  	mutex_unlock(&msm_obj->lock);  	return ret;  } @@ -928,8 +930,12 @@ static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,  	if (use_vram) {  		struct msm_gem_vma *vma;  		struct page **pages; +		struct msm_gem_object *msm_obj = to_msm_bo(obj); + +		mutex_lock(&msm_obj->lock);  		vma = add_vma(obj, NULL); +		mutex_unlock(&msm_obj->lock);  		if (IS_ERR(vma)) {  			ret = PTR_ERR(vma);  			goto fail; @@ -1018,3 +1024,49 @@ fail:  	drm_gem_object_unreference_unlocked(obj);  	return ERR_PTR(ret);  } + +static void *_msm_gem_kernel_new(struct drm_device *dev, uint32_t size, +		uint32_t flags, struct msm_gem_address_space *aspace, +		struct drm_gem_object **bo, uint64_t *iova, bool locked) +{ +	void *vaddr; +	struct drm_gem_object *obj = _msm_gem_new(dev, size, flags, locked); +	int ret; + +	if (IS_ERR(obj)) +		return ERR_CAST(obj); + +	if (iova) { +		ret = msm_gem_get_iova(obj, aspace, iova); +		if (ret) { +			drm_gem_object_unreference(obj); +			return ERR_PTR(ret); +		} +	} + +	vaddr = msm_gem_get_vaddr(obj); +	if (!vaddr) { +		msm_gem_put_iova(obj, aspace); +		drm_gem_object_unreference(obj); +		return ERR_PTR(-ENOMEM); +	} + +	if (bo) +		*bo = obj; + +	return vaddr; +} + +void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size, +		uint32_t flags, struct msm_gem_address_space *aspace, +		struct drm_gem_object **bo, uint64_t *iova) +{ +	return _msm_gem_kernel_new(dev, size, flags, aspace, bo, iova, false); +} + +void *msm_gem_kernel_new_locked(struct drm_device *dev, uint32_t size, +		uint32_t flags, struct msm_gem_address_space *aspace, +		struct drm_gem_object **bo, uint64_t *iova) +{ +	return _msm_gem_kernel_new(dev, size, flags, aspace, bo, iova, true); +}  | 
