Skip to content

Commit 129b78b

Browse files
committed
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 <[email protected]> Reviewed-by: Jerome Glisse <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
1 parent 96503f5 commit 129b78b

File tree

6 files changed

+28
-6
lines changed

6 files changed

+28
-6
lines changed

drivers/gpu/drm/nouveau/nouveau_bo.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,
121121

122122
ret = ttm_bo_init(&dev_priv->ttm.bdev, &nvbo->bo, size,
123123
ttm_bo_type_device, &nvbo->placement,
124-
align >> PAGE_SHIFT, 0, false, NULL, acc_size,
124+
align >> PAGE_SHIFT, 0, false, NULL, acc_size, NULL,
125125
nouveau_bo_del_ttm);
126126
if (ret) {
127127
/* ttm will call nouveau_bo_del_ttm if it fails.. */

drivers/gpu/drm/radeon/radeon_object.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ int radeon_bo_create(struct radeon_device *rdev,
155155
mutex_lock(&rdev->vram_mutex);
156156
r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
157157
&bo->placement, page_align, 0, !kernel, NULL,
158-
acc_size, &radeon_ttm_bo_destroy);
158+
acc_size, NULL, &radeon_ttm_bo_destroy);
159159
mutex_unlock(&rdev->vram_mutex);
160160
if (unlikely(r != 0)) {
161161
if (r != -ERESTARTSYS) {

drivers/gpu/drm/ttm/ttm_bo.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,16 @@ static int ttm_bo_add_ttm(struct ttm_buffer_object *bo, bool zero_alloc)
343343
if (unlikely(bo->ttm == NULL))
344344
ret = -ENOMEM;
345345
break;
346+
case ttm_bo_type_sg:
347+
bo->ttm = bdev->driver->ttm_tt_create(bdev, bo->num_pages << PAGE_SHIFT,
348+
page_flags | TTM_PAGE_FLAG_SG,
349+
glob->dummy_read_page);
350+
if (unlikely(bo->ttm == NULL)) {
351+
ret = -ENOMEM;
352+
break;
353+
}
354+
bo->ttm->sg = bo->sg;
355+
break;
346356
default:
347357
pr_err("Illegal buffer object type\n");
348358
ret = -EINVAL;
@@ -1169,6 +1179,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
11691179
bool interruptible,
11701180
struct file *persistent_swap_storage,
11711181
size_t acc_size,
1182+
struct sg_table *sg,
11721183
void (*destroy) (struct ttm_buffer_object *))
11731184
{
11741185
int ret = 0;
@@ -1223,6 +1234,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
12231234
bo->seq_valid = false;
12241235
bo->persistent_swap_storage = persistent_swap_storage;
12251236
bo->acc_size = acc_size;
1237+
bo->sg = sg;
12261238
atomic_inc(&bo->glob->bo_count);
12271239

12281240
ret = ttm_bo_check_placement(bo, placement);
@@ -1233,7 +1245,8 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
12331245
* For ttm_bo_type_device buffers, allocate
12341246
* address space from the device.
12351247
*/
1236-
if (bo->type == ttm_bo_type_device) {
1248+
if (bo->type == ttm_bo_type_device ||
1249+
bo->type == ttm_bo_type_sg) {
12371250
ret = ttm_bo_setup_vm(bo);
12381251
if (ret)
12391252
goto out_err;
@@ -1312,7 +1325,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
13121325

13131326
ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,
13141327
buffer_start, interruptible,
1315-
persistent_swap_storage, acc_size, NULL);
1328+
persistent_swap_storage, acc_size, NULL, NULL);
13161329
if (likely(ret == 0))
13171330
*p_bo = bo;
13181331

drivers/gpu/drm/vmwgfx/vmwgfx_resource.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1567,7 +1567,7 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv,
15671567
ret = ttm_bo_init(bdev, &vmw_bo->base, size,
15681568
ttm_bo_type_device, placement,
15691569
0, 0, interruptible,
1570-
NULL, acc_size, bo_free);
1570+
NULL, acc_size, NULL, bo_free);
15711571
return ret;
15721572
}
15731573

include/drm/ttm/ttm_bo_api.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,15 @@ struct ttm_mem_reg {
124124
*
125125
* @ttm_bo_type_kernel: These buffers are like ttm_bo_type_device buffers,
126126
* but they cannot be accessed from user-space. For kernel-only use.
127+
*
128+
* @ttm_bo_type_sg: Buffer made from dmabuf sg table shared with another
129+
* driver.
127130
*/
128131

129132
enum ttm_bo_type {
130133
ttm_bo_type_device,
131-
ttm_bo_type_kernel
134+
ttm_bo_type_kernel,
135+
ttm_bo_type_sg
132136
};
133137

134138
struct ttm_tt;
@@ -271,6 +275,8 @@ struct ttm_buffer_object {
271275

272276
unsigned long offset;
273277
uint32_t cur_placement;
278+
279+
struct sg_table *sg;
274280
};
275281

276282
/**
@@ -503,6 +509,7 @@ extern int ttm_bo_init(struct ttm_bo_device *bdev,
503509
bool interrubtible,
504510
struct file *persistent_swap_storage,
505511
size_t acc_size,
512+
struct sg_table *sg,
506513
void (*destroy) (struct ttm_buffer_object *));
507514

508515
/**

include/drm/ttm/ttm_bo_driver.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ struct ttm_backend_func {
8181
#define TTM_PAGE_FLAG_PERSISTENT_SWAP (1 << 5)
8282
#define TTM_PAGE_FLAG_ZERO_ALLOC (1 << 6)
8383
#define TTM_PAGE_FLAG_DMA32 (1 << 7)
84+
#define TTM_PAGE_FLAG_SG (1 << 8)
8485

8586
enum ttm_caching_state {
8687
tt_uncached,
@@ -116,6 +117,7 @@ struct ttm_tt {
116117
struct page **pages;
117118
uint32_t page_flags;
118119
unsigned long num_pages;
120+
struct sg_table *sg; /* for SG objects via dma-buf */
119121
struct ttm_bo_global *glob;
120122
struct ttm_backend *be;
121123
struct file *swap_storage;

0 commit comments

Comments
 (0)