Skip to content

Commit 9c16e15

Browse files
Dr. David Alan Gilbertalexdeucher
authored andcommitted
drm/radeon/cik: Clean up doorbells
Free doorbells in the error paths of cik_init and in cik_fini. Build tested only. Suggested-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> Signed-off-by: Dr. David Alan Gilbert <linux@treblig.org> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 72ea783 commit 9c16e15

1 file changed

Lines changed: 30 additions & 12 deletions

File tree

  • drivers/gpu/drm/radeon

drivers/gpu/drm/radeon/cik.c

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8548,7 +8548,7 @@ int cik_suspend(struct radeon_device *rdev)
85488548
*/
85498549
int cik_init(struct radeon_device *rdev)
85508550
{
8551-
struct radeon_ring *ring;
8551+
struct radeon_ring *ring, *ring_cp1, *ring_cp2;
85528552
int r;
85538553

85548554
/* Read BIOS */
@@ -8623,19 +8623,22 @@ int cik_init(struct radeon_device *rdev)
86238623
ring->ring_obj = NULL;
86248624
r600_ring_init(rdev, ring, 1024 * 1024);
86258625

8626-
ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8627-
ring->ring_obj = NULL;
8628-
r600_ring_init(rdev, ring, 1024 * 1024);
8629-
r = radeon_doorbell_get(rdev, &ring->doorbell_index);
8626+
ring_cp1 = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8627+
ring_cp2 = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8628+
ring_cp1->ring_obj = NULL;
8629+
ring_cp2->ring_obj = NULL;
8630+
ring_cp1->doorbell_index = RADEON_MAX_DOORBELLS;
8631+
ring_cp2->doorbell_index = RADEON_MAX_DOORBELLS;
8632+
8633+
r600_ring_init(rdev, ring_cp1, 1024 * 1024);
8634+
r = radeon_doorbell_get(rdev, &ring_cp1->doorbell_index);
86308635
if (r)
86318636
return r;
86328637

8633-
ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8634-
ring->ring_obj = NULL;
8635-
r600_ring_init(rdev, ring, 1024 * 1024);
8636-
r = radeon_doorbell_get(rdev, &ring->doorbell_index);
8638+
r600_ring_init(rdev, ring_cp2, 1024 * 1024);
8639+
r = radeon_doorbell_get(rdev, &ring_cp2->doorbell_index);
86378640
if (r)
8638-
return r;
8641+
goto out;
86398642

86408643
ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
86418644
ring->ring_obj = NULL;
@@ -8653,12 +8656,16 @@ int cik_init(struct radeon_device *rdev)
86538656

86548657
r = r600_pcie_gart_init(rdev);
86558658
if (r)
8656-
return r;
8659+
goto out;
86578660

86588661
rdev->accel_working = true;
86598662
r = cik_startup(rdev);
86608663
if (r) {
86618664
dev_err(rdev->dev, "disabling GPU acceleration\n");
8665+
radeon_doorbell_free(rdev, ring_cp1->doorbell_index);
8666+
radeon_doorbell_free(rdev, ring_cp2->doorbell_index);
8667+
ring_cp1->doorbell_index = RADEON_MAX_DOORBELLS;
8668+
ring_cp2->doorbell_index = RADEON_MAX_DOORBELLS;
86628669
cik_cp_fini(rdev);
86638670
cik_sdma_fini(rdev);
86648671
cik_irq_fini(rdev);
@@ -8678,10 +8685,16 @@ int cik_init(struct radeon_device *rdev)
86788685
*/
86798686
if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
86808687
DRM_ERROR("radeon: MC ucode required for NI+.\n");
8681-
return -EINVAL;
8688+
r = -EINVAL;
8689+
goto out;
86828690
}
86838691

86848692
return 0;
8693+
8694+
out:
8695+
radeon_doorbell_free(rdev, ring_cp1->doorbell_index);
8696+
radeon_doorbell_free(rdev, ring_cp2->doorbell_index);
8697+
return r;
86858698
}
86868699

86878700
/**
@@ -8695,6 +8708,7 @@ int cik_init(struct radeon_device *rdev)
86958708
*/
86968709
void cik_fini(struct radeon_device *rdev)
86978710
{
8711+
struct radeon_ring *ring;
86988712
radeon_pm_fini(rdev);
86998713
cik_cp_fini(rdev);
87008714
cik_sdma_fini(rdev);
@@ -8708,6 +8722,10 @@ void cik_fini(struct radeon_device *rdev)
87088722
radeon_ib_pool_fini(rdev);
87098723
radeon_irq_kms_fini(rdev);
87108724
uvd_v1_0_fini(rdev);
8725+
ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
8726+
radeon_doorbell_free(rdev, ring->doorbell_index);
8727+
ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
8728+
radeon_doorbell_free(rdev, ring->doorbell_index);
87118729
radeon_uvd_fini(rdev);
87128730
radeon_vce_fini(rdev);
87138731
cik_pcie_gart_fini(rdev);

0 commit comments

Comments
 (0)