aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_abi16.c4
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bo.c4
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bo.h5
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_display.c10
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fbcon.c2
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_gem.c36
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_gem.h2
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_prime.c10
8 files changed, 38 insertions, 35 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c
index 8f467e7bfd19..3897549aabba 100644
--- a/drivers/gpu/drm/nouveau/nouveau_abi16.c
+++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c
@@ -130,7 +130,7 @@ nouveau_abi16_chan_fini(struct nouveau_abi16 *abi16,
130 if (chan->ntfy) { 130 if (chan->ntfy) {
131 nouveau_bo_vma_del(chan->ntfy, &chan->ntfy_vma); 131 nouveau_bo_vma_del(chan->ntfy, &chan->ntfy_vma);
132 nouveau_bo_unpin(chan->ntfy); 132 nouveau_bo_unpin(chan->ntfy);
133 drm_gem_object_unreference_unlocked(chan->ntfy->gem); 133 drm_gem_object_unreference_unlocked(&chan->ntfy->gem);
134 } 134 }
135 135
136 if (chan->heap.block_size) 136 if (chan->heap.block_size)
@@ -320,7 +320,7 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
320 goto done; 320 goto done;
321 } 321 }
322 322
323 ret = drm_gem_handle_create(file_priv, chan->ntfy->gem, 323 ret = drm_gem_handle_create(file_priv, &chan->ntfy->gem,
324 &init->notifier_handle); 324 &init->notifier_handle);
325 if (ret) 325 if (ret)
326 goto done; 326 goto done;
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 755c38d06271..4172854d4365 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -146,7 +146,7 @@ nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
146 struct drm_device *dev = drm->dev; 146 struct drm_device *dev = drm->dev;
147 struct nouveau_bo *nvbo = nouveau_bo(bo); 147 struct nouveau_bo *nvbo = nouveau_bo(bo);
148 148
149 if (unlikely(nvbo->gem)) 149 if (unlikely(nvbo->gem.filp))
150 DRM_ERROR("bo %p still attached to GEM object\n", bo); 150 DRM_ERROR("bo %p still attached to GEM object\n", bo);
151 WARN_ON(nvbo->pin_refcnt > 0); 151 WARN_ON(nvbo->pin_refcnt > 0);
152 nv10_bo_put_tile_region(dev, nvbo->tile, NULL); 152 nv10_bo_put_tile_region(dev, nvbo->tile, NULL);
@@ -1267,7 +1267,7 @@ nouveau_bo_verify_access(struct ttm_buffer_object *bo, struct file *filp)
1267{ 1267{
1268 struct nouveau_bo *nvbo = nouveau_bo(bo); 1268 struct nouveau_bo *nvbo = nouveau_bo(bo);
1269 1269
1270 return drm_vma_node_verify_access(&nvbo->gem->vma_node, filp); 1270 return drm_vma_node_verify_access(&nvbo->gem.vma_node, filp);
1271} 1271}
1272 1272
1273static int 1273static int
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.h b/drivers/gpu/drm/nouveau/nouveau_bo.h
index 653dbbbd4fa1..ff17c1f432fc 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.h
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.h
@@ -27,7 +27,10 @@ struct nouveau_bo {
27 u32 tile_flags; 27 u32 tile_flags;
28 struct nouveau_drm_tile *tile; 28 struct nouveau_drm_tile *tile;
29 29
30 struct drm_gem_object *gem; 30 /* Only valid if allocated via nouveau_gem_new() and iff you hold a
31 * gem reference to it! For debugging, use gem.filp != NULL to test
32 * whether it is valid. */
33 struct drm_gem_object gem;
31 34
32 /* protect by the ttm reservation lock */ 35 /* protect by the ttm reservation lock */
33 int pin_refcnt; 36 int pin_refcnt;
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index 7848590f5568..bdd5cf71a24c 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -50,7 +50,7 @@ nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb)
50 struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb); 50 struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb);
51 51
52 if (fb->nvbo) 52 if (fb->nvbo)
53 drm_gem_object_unreference_unlocked(fb->nvbo->gem); 53 drm_gem_object_unreference_unlocked(&fb->nvbo->gem);
54 54
55 drm_framebuffer_cleanup(drm_fb); 55 drm_framebuffer_cleanup(drm_fb);
56 kfree(fb); 56 kfree(fb);
@@ -63,7 +63,7 @@ nouveau_user_framebuffer_create_handle(struct drm_framebuffer *drm_fb,
63{ 63{
64 struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb); 64 struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb);
65 65
66 return drm_gem_handle_create(file_priv, fb->nvbo->gem, handle); 66 return drm_gem_handle_create(file_priv, &fb->nvbo->gem, handle);
67} 67}
68 68
69static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = { 69static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
@@ -674,8 +674,8 @@ nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
674 if (ret) 674 if (ret)
675 return ret; 675 return ret;
676 676
677 ret = drm_gem_handle_create(file_priv, bo->gem, &args->handle); 677 ret = drm_gem_handle_create(file_priv, &bo->gem, &args->handle);
678 drm_gem_object_unreference_unlocked(bo->gem); 678 drm_gem_object_unreference_unlocked(&bo->gem);
679 return ret; 679 return ret;
680} 680}
681 681
@@ -688,7 +688,7 @@ nouveau_display_dumb_map_offset(struct drm_file *file_priv,
688 688
689 gem = drm_gem_object_lookup(dev, file_priv, handle); 689 gem = drm_gem_object_lookup(dev, file_priv, handle);
690 if (gem) { 690 if (gem) {
691 struct nouveau_bo *bo = gem->driver_private; 691 struct nouveau_bo *bo = nouveau_gem_object(gem);
692 *poffset = drm_vma_node_offset_addr(&bo->bo.vma_node); 692 *poffset = drm_vma_node_offset_addr(&bo->bo.vma_node);
693 drm_gem_object_unreference_unlocked(gem); 693 drm_gem_object_unreference_unlocked(gem);
694 return 0; 694 return 0;
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
index a86ecf65c164..c80b519b513a 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
@@ -420,7 +420,7 @@ nouveau_fbcon_destroy(struct drm_device *dev, struct nouveau_fbdev *fbcon)
420 nouveau_bo_unmap(nouveau_fb->nvbo); 420 nouveau_bo_unmap(nouveau_fb->nvbo);
421 nouveau_bo_vma_del(nouveau_fb->nvbo, &nouveau_fb->vma); 421 nouveau_bo_vma_del(nouveau_fb->nvbo, &nouveau_fb->vma);
422 nouveau_bo_unpin(nouveau_fb->nvbo); 422 nouveau_bo_unpin(nouveau_fb->nvbo);
423 drm_gem_object_unreference_unlocked(nouveau_fb->nvbo->gem); 423 drm_gem_object_unreference_unlocked(&nouveau_fb->nvbo->gem);
424 nouveau_fb->nvbo = NULL; 424 nouveau_fb->nvbo = NULL;
425 } 425 }
426 drm_fb_helper_fini(&fbcon->helper); 426 drm_fb_helper_fini(&fbcon->helper);
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index f32b71238c03..6618318abf50 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -43,20 +43,17 @@ nouveau_gem_object_new(struct drm_gem_object *gem)
43void 43void
44nouveau_gem_object_del(struct drm_gem_object *gem) 44nouveau_gem_object_del(struct drm_gem_object *gem)
45{ 45{
46 struct nouveau_bo *nvbo = gem->driver_private; 46 struct nouveau_bo *nvbo = nouveau_gem_object(gem);
47 struct ttm_buffer_object *bo = &nvbo->bo; 47 struct ttm_buffer_object *bo = &nvbo->bo;
48 48
49 if (!nvbo)
50 return;
51 nvbo->gem = NULL;
52
53 if (gem->import_attach) 49 if (gem->import_attach)
54 drm_prime_gem_destroy(gem, nvbo->bo.sg); 50 drm_prime_gem_destroy(gem, nvbo->bo.sg);
55 51
56 ttm_bo_unref(&bo);
57
58 drm_gem_object_release(gem); 52 drm_gem_object_release(gem);
59 kfree(gem); 53
54 /* reset filp so nouveau_bo_del_ttm() can test for it */
55 gem->filp = NULL;
56 ttm_bo_unref(&bo);
60} 57}
61 58
62int 59int
@@ -186,14 +183,15 @@ nouveau_gem_new(struct drm_device *dev, int size, int align, uint32_t domain,
186 if (nv_device(drm->device)->card_type >= NV_50) 183 if (nv_device(drm->device)->card_type >= NV_50)
187 nvbo->valid_domains &= domain; 184 nvbo->valid_domains &= domain;
188 185
189 nvbo->gem = drm_gem_object_alloc(dev, nvbo->bo.mem.size); 186 /* Initialize the embedded gem-object. We return a single gem-reference
190 if (!nvbo->gem) { 187 * to the caller, instead of a normal nouveau_bo ttm reference. */
188 ret = drm_gem_object_init(dev, &nvbo->gem, nvbo->bo.mem.size);
189 if (ret) {
191 nouveau_bo_ref(NULL, pnvbo); 190 nouveau_bo_ref(NULL, pnvbo);
192 return -ENOMEM; 191 return -ENOMEM;
193 } 192 }
194 193
195 nvbo->bo.persistent_swap_storage = nvbo->gem->filp; 194 nvbo->bo.persistent_swap_storage = nvbo->gem.filp;
196 nvbo->gem->driver_private = nvbo;
197 return 0; 195 return 0;
198} 196}
199 197
@@ -250,15 +248,15 @@ nouveau_gem_ioctl_new(struct drm_device *dev, void *data,
250 if (ret) 248 if (ret)
251 return ret; 249 return ret;
252 250
253 ret = drm_gem_handle_create(file_priv, nvbo->gem, &req->info.handle); 251 ret = drm_gem_handle_create(file_priv, &nvbo->gem, &req->info.handle);
254 if (ret == 0) { 252 if (ret == 0) {
255 ret = nouveau_gem_info(file_priv, nvbo->gem, &req->info); 253 ret = nouveau_gem_info(file_priv, &nvbo->gem, &req->info);
256 if (ret) 254 if (ret)
257 drm_gem_handle_delete(file_priv, req->info.handle); 255 drm_gem_handle_delete(file_priv, req->info.handle);
258 } 256 }
259 257
260 /* drop reference from allocate - handle holds it now */ 258 /* drop reference from allocate - handle holds it now */
261 drm_gem_object_unreference_unlocked(nvbo->gem); 259 drm_gem_object_unreference_unlocked(&nvbo->gem);
262 return ret; 260 return ret;
263} 261}
264 262
@@ -266,7 +264,7 @@ static int
266nouveau_gem_set_domain(struct drm_gem_object *gem, uint32_t read_domains, 264nouveau_gem_set_domain(struct drm_gem_object *gem, uint32_t read_domains,
267 uint32_t write_domains, uint32_t valid_domains) 265 uint32_t write_domains, uint32_t valid_domains)
268{ 266{
269 struct nouveau_bo *nvbo = gem->driver_private; 267 struct nouveau_bo *nvbo = nouveau_gem_object(gem);
270 struct ttm_buffer_object *bo = &nvbo->bo; 268 struct ttm_buffer_object *bo = &nvbo->bo;
271 uint32_t domains = valid_domains & nvbo->valid_domains & 269 uint32_t domains = valid_domains & nvbo->valid_domains &
272 (write_domains ? write_domains : read_domains); 270 (write_domains ? write_domains : read_domains);
@@ -327,7 +325,7 @@ validate_fini_list(struct list_head *list, struct nouveau_fence *fence,
327 list_del(&nvbo->entry); 325 list_del(&nvbo->entry);
328 nvbo->reserved_by = NULL; 326 nvbo->reserved_by = NULL;
329 ttm_bo_unreserve_ticket(&nvbo->bo, ticket); 327 ttm_bo_unreserve_ticket(&nvbo->bo, ticket);
330 drm_gem_object_unreference_unlocked(nvbo->gem); 328 drm_gem_object_unreference_unlocked(&nvbo->gem);
331 } 329 }
332} 330}
333 331
@@ -376,7 +374,7 @@ retry:
376 validate_fini(op, NULL); 374 validate_fini(op, NULL);
377 return -ENOENT; 375 return -ENOENT;
378 } 376 }
379 nvbo = gem->driver_private; 377 nvbo = nouveau_gem_object(gem);
380 if (nvbo == res_bo) { 378 if (nvbo == res_bo) {
381 res_bo = NULL; 379 res_bo = NULL;
382 drm_gem_object_unreference_unlocked(gem); 380 drm_gem_object_unreference_unlocked(gem);
@@ -478,7 +476,7 @@ validate_list(struct nouveau_channel *chan, struct nouveau_cli *cli,
478 return ret; 476 return ret;
479 } 477 }
480 478
481 ret = nouveau_gem_set_domain(nvbo->gem, b->read_domains, 479 ret = nouveau_gem_set_domain(&nvbo->gem, b->read_domains,
482 b->write_domains, 480 b->write_domains,
483 b->valid_domains); 481 b->valid_domains);
484 if (unlikely(ret)) { 482 if (unlikely(ret)) {
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.h b/drivers/gpu/drm/nouveau/nouveau_gem.h
index 502e4290aa8f..b535895df1a6 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.h
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.h
@@ -12,7 +12,7 @@
12static inline struct nouveau_bo * 12static inline struct nouveau_bo *
13nouveau_gem_object(struct drm_gem_object *gem) 13nouveau_gem_object(struct drm_gem_object *gem)
14{ 14{
15 return gem ? gem->driver_private : NULL; 15 return gem ? container_of(gem, struct nouveau_bo, gem) : NULL;
16} 16}
17 17
18/* nouveau_gem.c */ 18/* nouveau_gem.c */
diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c
index e90468d5e5c0..51a2cb102b44 100644
--- a/drivers/gpu/drm/nouveau/nouveau_prime.c
+++ b/drivers/gpu/drm/nouveau/nouveau_prime.c
@@ -71,14 +71,16 @@ struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev,
71 return ERR_PTR(ret); 71 return ERR_PTR(ret);
72 72
73 nvbo->valid_domains = NOUVEAU_GEM_DOMAIN_GART; 73 nvbo->valid_domains = NOUVEAU_GEM_DOMAIN_GART;
74 nvbo->gem = drm_gem_object_alloc(dev, nvbo->bo.mem.size); 74
75 if (!nvbo->gem) { 75 /* Initialize the embedded gem-object. We return a single gem-reference
76 * to the caller, instead of a normal nouveau_bo ttm reference. */
77 ret = drm_gem_object_init(dev, &nvbo->gem, nvbo->bo.mem.size);
78 if (ret) {
76 nouveau_bo_ref(NULL, &nvbo); 79 nouveau_bo_ref(NULL, &nvbo);
77 return ERR_PTR(-ENOMEM); 80 return ERR_PTR(-ENOMEM);
78 } 81 }
79 82
80 nvbo->gem->driver_private = nvbo; 83 return &nvbo->gem;
81 return nvbo->gem;
82} 84}
83 85
84int nouveau_gem_prime_pin(struct drm_gem_object *obj) 86int nouveau_gem_prime_pin(struct drm_gem_object *obj)