@@ -8548,7 +8548,7 @@ int cik_suspend(struct radeon_device *rdev)
85488548 */
85498549int 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 */
86968709void 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