Commit 9c16e157 authored by Dr. David Alan Gilbert's avatar Dr. David Alan Gilbert Committed by Alex Deucher
Browse files

drm/radeon/cik: Clean up doorbells



Free doorbells in the error paths of cik_init and in cik_fini.

Build tested only.

Suggested-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: default avatarDr. David Alan Gilbert <linux@treblig.org>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 72ea7833
Loading
Loading
Loading
Loading
+30 −12
Original line number Diff line number Diff line
@@ -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);