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>
This commit is contained in:
Dr. David Alan Gilbert 2025-05-14 02:16:10 +01:00 committed by Alex Deucher
parent 72ea78335e
commit 9c16e15758

View file

@ -8548,7 +8548,7 @@ int cik_suspend(struct radeon_device *rdev)
*/
int cik_init(struct radeon_device *rdev)
{
struct radeon_ring *ring;
struct radeon_ring *ring, *ring_cp1, *ring_cp2;
int r;
/* Read BIOS */
@ -8623,19 +8623,22 @@ int cik_init(struct radeon_device *rdev)
ring->ring_obj = NULL;
r600_ring_init(rdev, ring, 1024 * 1024);
ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
ring->ring_obj = NULL;
r600_ring_init(rdev, ring, 1024 * 1024);
r = radeon_doorbell_get(rdev, &ring->doorbell_index);
ring_cp1 = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
ring_cp2 = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
ring_cp1->ring_obj = NULL;
ring_cp2->ring_obj = NULL;
ring_cp1->doorbell_index = RADEON_MAX_DOORBELLS;
ring_cp2->doorbell_index = RADEON_MAX_DOORBELLS;
r600_ring_init(rdev, ring_cp1, 1024 * 1024);
r = radeon_doorbell_get(rdev, &ring_cp1->doorbell_index);
if (r)
return r;
ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
ring->ring_obj = NULL;
r600_ring_init(rdev, ring, 1024 * 1024);
r = radeon_doorbell_get(rdev, &ring->doorbell_index);
r600_ring_init(rdev, ring_cp2, 1024 * 1024);
r = radeon_doorbell_get(rdev, &ring_cp2->doorbell_index);
if (r)
return r;
goto out;
ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
ring->ring_obj = NULL;
@ -8653,12 +8656,16 @@ int cik_init(struct radeon_device *rdev)
r = r600_pcie_gart_init(rdev);
if (r)
return r;
goto out;
rdev->accel_working = true;
r = cik_startup(rdev);
if (r) {
dev_err(rdev->dev, "disabling GPU acceleration\n");
radeon_doorbell_free(rdev, ring_cp1->doorbell_index);
radeon_doorbell_free(rdev, ring_cp2->doorbell_index);
ring_cp1->doorbell_index = RADEON_MAX_DOORBELLS;
ring_cp2->doorbell_index = RADEON_MAX_DOORBELLS;
cik_cp_fini(rdev);
cik_sdma_fini(rdev);
cik_irq_fini(rdev);
@ -8678,10 +8685,16 @@ int cik_init(struct radeon_device *rdev)
*/
if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
DRM_ERROR("radeon: MC ucode required for NI+.\n");
return -EINVAL;
r = -EINVAL;
goto out;
}
return 0;
out:
radeon_doorbell_free(rdev, ring_cp1->doorbell_index);
radeon_doorbell_free(rdev, ring_cp2->doorbell_index);
return r;
}
/**
@ -8695,6 +8708,7 @@ int cik_init(struct radeon_device *rdev)
*/
void cik_fini(struct radeon_device *rdev)
{
struct radeon_ring *ring;
radeon_pm_fini(rdev);
cik_cp_fini(rdev);
cik_sdma_fini(rdev);
@ -8708,6 +8722,10 @@ void cik_fini(struct radeon_device *rdev)
radeon_ib_pool_fini(rdev);
radeon_irq_kms_fini(rdev);
uvd_v1_0_fini(rdev);
ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
radeon_doorbell_free(rdev, ring->doorbell_index);
ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
radeon_doorbell_free(rdev, ring->doorbell_index);
radeon_uvd_fini(rdev);
radeon_vce_fini(rdev);
cik_pcie_gart_fini(rdev);