aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c25
3 files changed, 20 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 2a009c398dcb..992f00b65be4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -602,6 +602,8 @@ int amdgpu_sync_wait(struct amdgpu_sync *sync);
602void amdgpu_sync_free(struct amdgpu_sync *sync); 602void amdgpu_sync_free(struct amdgpu_sync *sync);
603int amdgpu_sync_init(void); 603int amdgpu_sync_init(void);
604void amdgpu_sync_fini(void); 604void amdgpu_sync_fini(void);
605int amdgpu_fence_slab_init(void);
606void amdgpu_fence_slab_fini(void);
605 607
606/* 608/*
607 * GART structures, functions & helpers 609 * GART structures, functions & helpers
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 0dee008bcc57..6ff587900cf5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -565,9 +565,12 @@ static struct pci_driver amdgpu_kms_pci_driver = {
565 .driver.pm = &amdgpu_pm_ops, 565 .driver.pm = &amdgpu_pm_ops,
566}; 566};
567 567
568
569
568static int __init amdgpu_init(void) 570static int __init amdgpu_init(void)
569{ 571{
570 amdgpu_sync_init(); 572 amdgpu_sync_init();
573 amdgpu_fence_slab_init();
571 if (vgacon_text_force()) { 574 if (vgacon_text_force()) {
572 DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n"); 575 DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");
573 return -EINVAL; 576 return -EINVAL;
@@ -578,7 +581,6 @@ static int __init amdgpu_init(void)
578 driver->driver_features |= DRIVER_MODESET; 581 driver->driver_features |= DRIVER_MODESET;
579 driver->num_ioctls = amdgpu_max_kms_ioctl; 582 driver->num_ioctls = amdgpu_max_kms_ioctl;
580 amdgpu_register_atpx_handler(); 583 amdgpu_register_atpx_handler();
581
582 /* let modprobe override vga console setting */ 584 /* let modprobe override vga console setting */
583 return drm_pci_init(driver, pdriver); 585 return drm_pci_init(driver, pdriver);
584} 586}
@@ -589,6 +591,7 @@ static void __exit amdgpu_exit(void)
589 drm_pci_exit(driver, pdriver); 591 drm_pci_exit(driver, pdriver);
590 amdgpu_unregister_atpx_handler(); 592 amdgpu_unregister_atpx_handler();
591 amdgpu_sync_fini(); 593 amdgpu_sync_fini();
594 amdgpu_fence_slab_fini();
592} 595}
593 596
594module_init(amdgpu_init); 597module_init(amdgpu_init);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index ba9c04283d01..7eb2fca871e8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -55,8 +55,21 @@ struct amdgpu_fence {
55}; 55};
56 56
57static struct kmem_cache *amdgpu_fence_slab; 57static struct kmem_cache *amdgpu_fence_slab;
58static atomic_t amdgpu_fence_slab_ref = ATOMIC_INIT(0);
59 58
59int amdgpu_fence_slab_init(void)
60{
61 amdgpu_fence_slab = kmem_cache_create(
62 "amdgpu_fence", sizeof(struct amdgpu_fence), 0,
63 SLAB_HWCACHE_ALIGN, NULL);
64 if (!amdgpu_fence_slab)
65 return -ENOMEM;
66 return 0;
67}
68
69void amdgpu_fence_slab_fini(void)
70{
71 kmem_cache_destroy(amdgpu_fence_slab);
72}
60/* 73/*
61 * Cast helper 74 * Cast helper
62 */ 75 */
@@ -396,13 +409,6 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
396 */ 409 */
397int amdgpu_fence_driver_init(struct amdgpu_device *adev) 410int amdgpu_fence_driver_init(struct amdgpu_device *adev)
398{ 411{
399 if (atomic_inc_return(&amdgpu_fence_slab_ref) == 1) {
400 amdgpu_fence_slab = kmem_cache_create(
401 "amdgpu_fence", sizeof(struct amdgpu_fence), 0,
402 SLAB_HWCACHE_ALIGN, NULL);
403 if (!amdgpu_fence_slab)
404 return -ENOMEM;
405 }
406 if (amdgpu_debugfs_fence_init(adev)) 412 if (amdgpu_debugfs_fence_init(adev))
407 dev_err(adev->dev, "fence debugfs file creation failed\n"); 413 dev_err(adev->dev, "fence debugfs file creation failed\n");
408 414
@@ -441,9 +447,6 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
441 kfree(ring->fence_drv.fences); 447 kfree(ring->fence_drv.fences);
442 ring->fence_drv.initialized = false; 448 ring->fence_drv.initialized = false;
443 } 449 }
444
445 if (atomic_dec_and_test(&amdgpu_fence_slab_ref))
446 kmem_cache_destroy(amdgpu_fence_slab);
447} 450}
448 451
449/** 452/**