diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2017-05-08 09:22:28 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2017-05-10 04:14:06 -0400 |
commit | 315f0242aa2b1e999bc1211123f7b6664068dba4 (patch) | |
tree | 42e2c22a3955b73028891da75ea69a7b61976d83 | |
parent | 94d7fb4982d2145c5784e33fa973ffb9ebb086ac (diff) |
drm/vgem: Convert to a struct drm_device subclass
With Laura's introduction of the fake platform device for importing
dmabuf, we add a second static that is logically tied to the vgem_device.
Convert vgem over to using the struct drm_device subclassing, so that
the platform device is stored inside its owner.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Laura Abbott <labbott@redhat.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Laura Abbott <labbott@redhat.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20170508132228.9509-1-chris@chris-wilson.co.uk
-rw-r--r-- | drivers/gpu/drm/vgem/vgem_drv.c | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c index c9381d457a03..4b23ba049632 100644 --- a/drivers/gpu/drm/vgem/vgem_drv.c +++ b/drivers/gpu/drm/vgem/vgem_drv.c | |||
@@ -42,7 +42,10 @@ | |||
42 | #define DRIVER_MAJOR 1 | 42 | #define DRIVER_MAJOR 1 |
43 | #define DRIVER_MINOR 0 | 43 | #define DRIVER_MINOR 0 |
44 | 44 | ||
45 | static struct platform_device *vgem_platform; | 45 | static struct vgem_device { |
46 | struct drm_device drm; | ||
47 | struct platform_device *platform; | ||
48 | } *vgem_device; | ||
46 | 49 | ||
47 | static void vgem_gem_free_object(struct drm_gem_object *obj) | 50 | static void vgem_gem_free_object(struct drm_gem_object *obj) |
48 | { | 51 | { |
@@ -307,7 +310,9 @@ static struct sg_table *vgem_prime_get_sg_table(struct drm_gem_object *obj) | |||
307 | static struct drm_gem_object* vgem_prime_import(struct drm_device *dev, | 310 | static struct drm_gem_object* vgem_prime_import(struct drm_device *dev, |
308 | struct dma_buf *dma_buf) | 311 | struct dma_buf *dma_buf) |
309 | { | 312 | { |
310 | return drm_gem_prime_import_dev(dev, dma_buf, &vgem_platform->dev); | 313 | struct vgem_device *vgem = container_of(dev, typeof(*vgem), drm); |
314 | |||
315 | return drm_gem_prime_import_dev(dev, dma_buf, &vgem->platform->dev); | ||
311 | } | 316 | } |
312 | 317 | ||
313 | static struct drm_gem_object *vgem_prime_import_sg_table(struct drm_device *dev, | 318 | static struct drm_gem_object *vgem_prime_import_sg_table(struct drm_device *dev, |
@@ -377,8 +382,19 @@ static int vgem_prime_mmap(struct drm_gem_object *obj, | |||
377 | return 0; | 382 | return 0; |
378 | } | 383 | } |
379 | 384 | ||
385 | static void vgem_release(struct drm_device *dev) | ||
386 | { | ||
387 | struct vgem_device *vgem = container_of(dev, typeof(*vgem), drm); | ||
388 | |||
389 | platform_device_unregister(vgem->platform); | ||
390 | drm_dev_fini(&vgem->drm); | ||
391 | |||
392 | kfree(vgem); | ||
393 | } | ||
394 | |||
380 | static struct drm_driver vgem_driver = { | 395 | static struct drm_driver vgem_driver = { |
381 | .driver_features = DRIVER_GEM | DRIVER_PRIME, | 396 | .driver_features = DRIVER_GEM | DRIVER_PRIME, |
397 | .release = vgem_release, | ||
382 | .open = vgem_open, | 398 | .open = vgem_open, |
383 | .postclose = vgem_postclose, | 399 | .postclose = vgem_postclose, |
384 | .gem_free_object_unlocked = vgem_gem_free_object, | 400 | .gem_free_object_unlocked = vgem_gem_free_object, |
@@ -408,45 +424,48 @@ static struct drm_driver vgem_driver = { | |||
408 | .minor = DRIVER_MINOR, | 424 | .minor = DRIVER_MINOR, |
409 | }; | 425 | }; |
410 | 426 | ||
411 | static struct drm_device *vgem_device; | ||
412 | |||
413 | static int __init vgem_init(void) | 427 | static int __init vgem_init(void) |
414 | { | 428 | { |
415 | int ret; | 429 | int ret; |
416 | 430 | ||
417 | vgem_device = drm_dev_alloc(&vgem_driver, NULL); | 431 | vgem_device = kzalloc(sizeof(*vgem_device), GFP_KERNEL); |
418 | if (IS_ERR(vgem_device)) | 432 | if (!vgem_device) |
419 | return PTR_ERR(vgem_device); | 433 | return -ENOMEM; |
420 | 434 | ||
421 | vgem_platform = platform_device_register_simple("vgem", | 435 | ret = drm_dev_init(&vgem_device->drm, &vgem_driver, NULL); |
422 | -1, NULL, 0); | 436 | if (ret) |
437 | goto out_free; | ||
423 | 438 | ||
424 | if (!vgem_platform) { | 439 | vgem_device->platform = |
440 | platform_device_register_simple("vgem", -1, NULL, 0); | ||
441 | if (!vgem_device->platform) { | ||
425 | ret = -ENODEV; | 442 | ret = -ENODEV; |
426 | goto out; | 443 | goto out_fini; |
427 | } | 444 | } |
428 | 445 | ||
429 | dma_coerce_mask_and_coherent(&vgem_platform->dev, | 446 | dma_coerce_mask_and_coherent(&vgem_device->platform->dev, |
430 | DMA_BIT_MASK(64)); | 447 | DMA_BIT_MASK(64)); |
431 | 448 | ||
432 | ret = drm_dev_register(vgem_device, 0); | 449 | /* Final step: expose the device/driver to userspace */ |
450 | ret = drm_dev_register(&vgem_device->drm, 0); | ||
433 | if (ret) | 451 | if (ret) |
434 | goto out_unref; | 452 | goto out_unregister; |
435 | 453 | ||
436 | return 0; | 454 | return 0; |
437 | 455 | ||
438 | out_unref: | 456 | out_unregister: |
439 | platform_device_unregister(vgem_platform); | 457 | platform_device_unregister(vgem_device->platform); |
440 | out: | 458 | out_fini: |
441 | drm_dev_unref(vgem_device); | 459 | drm_dev_fini(&vgem_device->drm); |
460 | out_free: | ||
461 | kfree(vgem_device); | ||
442 | return ret; | 462 | return ret; |
443 | } | 463 | } |
444 | 464 | ||
445 | static void __exit vgem_exit(void) | 465 | static void __exit vgem_exit(void) |
446 | { | 466 | { |
447 | platform_device_unregister(vgem_platform); | 467 | drm_dev_unregister(&vgem_device->drm); |
448 | drm_dev_unregister(vgem_device); | 468 | drm_dev_unref(&vgem_device->drm); |
449 | drm_dev_unref(vgem_device); | ||
450 | } | 469 | } |
451 | 470 | ||
452 | module_init(vgem_init); | 471 | module_init(vgem_init); |