diff options
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_abi16.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_display.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_fbcon.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_gem.c | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_gem.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_prime.c | 10 |
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 | ||
1273 | static int | 1273 | static 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 | ||
69 | static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = { | 69 | static 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) | |||
43 | void | 43 | void |
44 | nouveau_gem_object_del(struct drm_gem_object *gem) | 44 | nouveau_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 | ||
62 | int | 59 | int |
@@ -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 | |||
266 | nouveau_gem_set_domain(struct drm_gem_object *gem, uint32_t read_domains, | 264 | nouveau_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 @@ | |||
12 | static inline struct nouveau_bo * | 12 | static inline struct nouveau_bo * |
13 | nouveau_gem_object(struct drm_gem_object *gem) | 13 | nouveau_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 | ||
84 | int nouveau_gem_prime_pin(struct drm_gem_object *obj) | 86 | int nouveau_gem_prime_pin(struct drm_gem_object *obj) |