Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6ee925b authored by Rex Zhu's avatar Rex Zhu Committed by Alex Deucher
Browse files

drm/amd/pp: fix a couple locking issues



We should return unlock on the error path

Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarRex Zhu <Rex.Zhu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 63e138ab
Loading
Loading
Loading
Loading
+19 −12
Original line number Original line Diff line number Diff line
@@ -936,45 +936,49 @@ int smu7_enable_didt_config(struct pp_hwmgr *hwmgr)


			if (hwmgr->chip_id == CHIP_POLARIS10) {
			if (hwmgr->chip_id == CHIP_POLARIS10) {
				result = smu7_program_pt_config_registers(hwmgr, GCCACConfig_Polaris10);
				result = smu7_program_pt_config_registers(hwmgr, GCCACConfig_Polaris10);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", return result);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", goto error);
				result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_Polaris10);
				result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_Polaris10);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", return result);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", goto error);
			} else if (hwmgr->chip_id == CHIP_POLARIS11) {
			} else if (hwmgr->chip_id == CHIP_POLARIS11) {
				result = smu7_program_pt_config_registers(hwmgr, GCCACConfig_Polaris11);
				result = smu7_program_pt_config_registers(hwmgr, GCCACConfig_Polaris11);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", return result);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", goto error);
				if (hwmgr->is_kicker)
				if (hwmgr->is_kicker)
					result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_Polaris11_Kicker);
					result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_Polaris11_Kicker);
				else
				else
					result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_Polaris11);
					result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_Polaris11);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", return result);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", goto error);
			} else if (hwmgr->chip_id == CHIP_POLARIS12) {
			} else if (hwmgr->chip_id == CHIP_POLARIS12) {
				result = smu7_program_pt_config_registers(hwmgr, GCCACConfig_Polaris11);
				result = smu7_program_pt_config_registers(hwmgr, GCCACConfig_Polaris11);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", return result);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", goto error);
				result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_Polaris12);
				result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_Polaris12);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", return result);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", goto error);
			} else if (hwmgr->chip_id == CHIP_VEGAM) {
			} else if (hwmgr->chip_id == CHIP_VEGAM) {
				result = smu7_program_pt_config_registers(hwmgr, GCCACConfig_VegaM);
				result = smu7_program_pt_config_registers(hwmgr, GCCACConfig_VegaM);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", return result);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", goto error);
				result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_VegaM);
				result = smu7_program_pt_config_registers(hwmgr, DIDTConfig_VegaM);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", return result);
				PP_ASSERT_WITH_CODE((result == 0), "DIDT Config failed.", goto error);
			}
			}
		}
		}
		cgs_write_register(hwmgr->device, mmGRBM_GFX_INDEX, value2);
		cgs_write_register(hwmgr->device, mmGRBM_GFX_INDEX, value2);


		result = smu7_enable_didt(hwmgr, true);
		result = smu7_enable_didt(hwmgr, true);
		PP_ASSERT_WITH_CODE((result == 0), "EnableDiDt failed.", return result);
		PP_ASSERT_WITH_CODE((result == 0), "EnableDiDt failed.", goto error);


		if (hwmgr->chip_id == CHIP_POLARIS11) {
		if (hwmgr->chip_id == CHIP_POLARIS11) {
			result = smum_send_msg_to_smc(hwmgr,
			result = smum_send_msg_to_smc(hwmgr,
						(uint16_t)(PPSMC_MSG_EnableDpmDidt));
						(uint16_t)(PPSMC_MSG_EnableDpmDidt));
			PP_ASSERT_WITH_CODE((0 == result),
			PP_ASSERT_WITH_CODE((0 == result),
					"Failed to enable DPM DIDT.", return result);
					"Failed to enable DPM DIDT.", goto error);
		}
		}
		mutex_unlock(&adev->grbm_idx_mutex);
		mutex_unlock(&adev->grbm_idx_mutex);
		adev->gfx.rlc.funcs->exit_safe_mode(adev);
		adev->gfx.rlc.funcs->exit_safe_mode(adev);
	}
	}


	return 0;
	return 0;
error:
	mutex_unlock(&adev->grbm_idx_mutex);
	adev->gfx.rlc.funcs->exit_safe_mode(adev);
	return result;
}
}


int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)
int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)
@@ -992,17 +996,20 @@ int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)
		result = smu7_enable_didt(hwmgr, false);
		result = smu7_enable_didt(hwmgr, false);
		PP_ASSERT_WITH_CODE((result == 0),
		PP_ASSERT_WITH_CODE((result == 0),
				"Post DIDT enable clock gating failed.",
				"Post DIDT enable clock gating failed.",
				return result);
				goto error);
		if (hwmgr->chip_id == CHIP_POLARIS11) {
		if (hwmgr->chip_id == CHIP_POLARIS11) {
			result = smum_send_msg_to_smc(hwmgr,
			result = smum_send_msg_to_smc(hwmgr,
						(uint16_t)(PPSMC_MSG_DisableDpmDidt));
						(uint16_t)(PPSMC_MSG_DisableDpmDidt));
			PP_ASSERT_WITH_CODE((0 == result),
			PP_ASSERT_WITH_CODE((0 == result),
					"Failed to disable DPM DIDT.", return result);
					"Failed to disable DPM DIDT.", goto error);
		}
		}
		adev->gfx.rlc.funcs->exit_safe_mode(adev);
		adev->gfx.rlc.funcs->exit_safe_mode(adev);
	}
	}


	return 0;
	return 0;
error:
	adev->gfx.rlc.funcs->exit_safe_mode(adev);
	return result;
}
}


int smu7_enable_smc_cac(struct pp_hwmgr *hwmgr)
int smu7_enable_smc_cac(struct pp_hwmgr *hwmgr)