diff options
| author | Dave Airlie <airlied@redhat.com> | 2012-04-02 11:46:06 +0100 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2012-05-23 10:46:27 +0100 | 
| commit | 129b78bfca591e736e56a294f0e357d73d938f7e (patch) | |
| tree | b5754d4b12346b67077ac3b2239c04bda37bf6a0 /drivers/gpu | |
| parent | 96503f592fd729f296f5870a57be0417eeffc92a (diff) | |
| download | olio-linux-3.10-129b78bfca591e736e56a294f0e357d73d938f7e.tar.xz olio-linux-3.10-129b78bfca591e736e56a294f0e357d73d938f7e.zip  | |
ttm: add prime sharing support to TTM (v2)
This adds the ability for ttm common code to take an SG table
and use it as the backing for a slave TTM object.
The drivers can then populate their GTT tables using the SG object.
v2: make sure to setup VM for sg bos as well.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 2 | 
4 files changed, 18 insertions, 5 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 12ce044f12f..81599d6e636 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c @@ -121,7 +121,7 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,  	ret = ttm_bo_init(&dev_priv->ttm.bdev, &nvbo->bo, size,  			  ttm_bo_type_device, &nvbo->placement, -			  align >> PAGE_SHIFT, 0, false, NULL, acc_size, +			  align >> PAGE_SHIFT, 0, false, NULL, acc_size, NULL,  			  nouveau_bo_del_ttm);  	if (ret) {  		/* ttm will call nouveau_bo_del_ttm if it fails.. */ diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index df6a4dbd93f..1affbc954c5 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c @@ -155,7 +155,7 @@ retry:  	mutex_lock(&rdev->vram_mutex);  	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,  			&bo->placement, page_align, 0, !kernel, NULL, -			acc_size, &radeon_ttm_bo_destroy); +			acc_size, NULL, &radeon_ttm_bo_destroy);  	mutex_unlock(&rdev->vram_mutex);  	if (unlikely(r != 0)) {  		if (r != -ERESTARTSYS) { diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 1f5c67c579c..36792bd4da7 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -343,6 +343,16 @@ static int ttm_bo_add_ttm(struct ttm_buffer_object *bo, bool zero_alloc)  		if (unlikely(bo->ttm == NULL))  			ret = -ENOMEM;  		break; +	case ttm_bo_type_sg: +		bo->ttm = bdev->driver->ttm_tt_create(bdev, bo->num_pages << PAGE_SHIFT, +						      page_flags | TTM_PAGE_FLAG_SG, +						      glob->dummy_read_page); +		if (unlikely(bo->ttm == NULL)) { +			ret = -ENOMEM; +			break; +		} +		bo->ttm->sg = bo->sg; +		break;  	default:  		pr_err("Illegal buffer object type\n");  		ret = -EINVAL; @@ -1169,6 +1179,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,  		bool interruptible,  		struct file *persistent_swap_storage,  		size_t acc_size, +		struct sg_table *sg,  		void (*destroy) (struct ttm_buffer_object *))  {  	int ret = 0; @@ -1223,6 +1234,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,  	bo->seq_valid = false;  	bo->persistent_swap_storage = persistent_swap_storage;  	bo->acc_size = acc_size; +	bo->sg = sg;  	atomic_inc(&bo->glob->bo_count);  	ret = ttm_bo_check_placement(bo, placement); @@ -1233,7 +1245,8 @@ int ttm_bo_init(struct ttm_bo_device *bdev,  	 * For ttm_bo_type_device buffers, allocate  	 * address space from the device.  	 */ -	if (bo->type == ttm_bo_type_device) { +	if (bo->type == ttm_bo_type_device || +	    bo->type == ttm_bo_type_sg) {  		ret = ttm_bo_setup_vm(bo);  		if (ret)  			goto out_err; @@ -1312,7 +1325,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,  	ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,  				buffer_start, interruptible, -				persistent_swap_storage, acc_size, NULL); +			  persistent_swap_storage, acc_size, NULL, NULL);  	if (likely(ret == 0))  		*p_bo = bo; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index a37abb581cb..22bf9a21ec7 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c @@ -1567,7 +1567,7 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv,  	ret = ttm_bo_init(bdev, &vmw_bo->base, size,  			  ttm_bo_type_device, placement,  			  0, 0, interruptible, -			  NULL, acc_size, bo_free); +			  NULL, acc_size, NULL, bo_free);  	return ret;  }  |