aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-05-08 09:22:28 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2017-05-10 04:14:06 -0400
commit315f0242aa2b1e999bc1211123f7b6664068dba4 (patch)
tree42e2c22a3955b73028891da75ea69a7b61976d83
parent94d7fb4982d2145c5784e33fa973ffb9ebb086ac (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.c63
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
45static struct platform_device *vgem_platform; 45static struct vgem_device {
46 struct drm_device drm;
47 struct platform_device *platform;
48} *vgem_device;
46 49
47static void vgem_gem_free_object(struct drm_gem_object *obj) 50static 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)
307static struct drm_gem_object* vgem_prime_import(struct drm_device *dev, 310static 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
313static struct drm_gem_object *vgem_prime_import_sg_table(struct drm_device *dev, 318static 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
385static 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
380static struct drm_driver vgem_driver = { 395static 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
411static struct drm_device *vgem_device;
412
413static int __init vgem_init(void) 427static 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
438out_unref: 456out_unregister:
439 platform_device_unregister(vgem_platform); 457 platform_device_unregister(vgem_device->platform);
440out: 458out_fini:
441 drm_dev_unref(vgem_device); 459 drm_dev_fini(&vgem_device->drm);
460out_free:
461 kfree(vgem_device);
442 return ret; 462 return ret;
443} 463}
444 464
445static void __exit vgem_exit(void) 465static 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
452module_init(vgem_init); 471module_init(vgem_init);