Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Dr. David Alan Gilbert and committed by
Alex Deucher
9c16e157 72ea7833

+30 -12
+30 -12
drivers/gpu/drm/radeon/cik.c
··· 8548 8548 */ 8549 8549 int cik_init(struct radeon_device *rdev) 8550 8550 { 8551 - struct radeon_ring *ring; 8551 + struct radeon_ring *ring, *ring_cp1, *ring_cp2; 8552 8552 int r; 8553 8553 8554 8554 /* Read BIOS */ ··· 8623 8623 ring->ring_obj = NULL; 8624 8624 r600_ring_init(rdev, ring, 1024 * 1024); 8625 8625 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); 8630 8635 if (r) 8631 8636 return r; 8632 8637 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); 8637 8640 if (r) 8638 - return r; 8641 + goto out; 8639 8642 8640 8643 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 8641 8644 ring->ring_obj = NULL; ··· 8656 8653 8657 8654 r = r600_pcie_gart_init(rdev); 8658 8655 if (r) 8659 - return r; 8656 + goto out; 8660 8657 8661 8658 rdev->accel_working = true; 8662 8659 r = cik_startup(rdev); 8663 8660 if (r) { 8664 8661 dev_err(rdev->dev, "disabling GPU acceleration\n"); 8662 + radeon_doorbell_free(rdev, ring_cp1->doorbell_index); 8663 + radeon_doorbell_free(rdev, ring_cp2->doorbell_index); 8664 + ring_cp1->doorbell_index = RADEON_MAX_DOORBELLS; 8665 + ring_cp2->doorbell_index = RADEON_MAX_DOORBELLS; 8665 8666 cik_cp_fini(rdev); 8666 8667 cik_sdma_fini(rdev); 8667 8668 cik_irq_fini(rdev); ··· 8685 8678 */ 8686 8679 if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) { 8687 8680 DRM_ERROR("radeon: MC ucode required for NI+.\n"); 8688 - return -EINVAL; 8681 + r = -EINVAL; 8682 + goto out; 8689 8683 } 8690 8684 8691 8685 return 0; 8686 + 8687 + out: 8688 + radeon_doorbell_free(rdev, ring_cp1->doorbell_index); 8689 + radeon_doorbell_free(rdev, ring_cp2->doorbell_index); 8690 + return r; 8692 8691 } 8693 8692 8694 8693 /** ··· 8708 8695 */ 8709 8696 void cik_fini(struct radeon_device *rdev) 8710 8697 { 8698 + struct radeon_ring *ring; 8711 8699 radeon_pm_fini(rdev); 8712 8700 cik_cp_fini(rdev); 8713 8701 cik_sdma_fini(rdev); ··· 8722 8708 radeon_ib_pool_fini(rdev); 8723 8709 radeon_irq_kms_fini(rdev); 8724 8710 uvd_v1_0_fini(rdev); 8711 + ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; 8712 + radeon_doorbell_free(rdev, ring->doorbell_index); 8713 + ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; 8714 + radeon_doorbell_free(rdev, ring->doorbell_index); 8725 8715 radeon_uvd_fini(rdev); 8726 8716 radeon_vce_fini(rdev); 8727 8717 cik_pcie_gart_fini(rdev);