diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 25 |
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); | |||
602 | void amdgpu_sync_free(struct amdgpu_sync *sync); | 602 | void amdgpu_sync_free(struct amdgpu_sync *sync); |
603 | int amdgpu_sync_init(void); | 603 | int amdgpu_sync_init(void); |
604 | void amdgpu_sync_fini(void); | 604 | void amdgpu_sync_fini(void); |
605 | int amdgpu_fence_slab_init(void); | ||
606 | void 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 | |||
568 | static int __init amdgpu_init(void) | 570 | static 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 | ||
594 | module_init(amdgpu_init); | 597 | module_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 | ||
57 | static struct kmem_cache *amdgpu_fence_slab; | 57 | static struct kmem_cache *amdgpu_fence_slab; |
58 | static atomic_t amdgpu_fence_slab_ref = ATOMIC_INIT(0); | ||
59 | 58 | ||
59 | int 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 | |||
69 | void 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 | */ |
397 | int amdgpu_fence_driver_init(struct amdgpu_device *adev) | 410 | int 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 | /** |