Commit 5337aae9 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdgpu/soc15: add support for baco reset with swSMU



Add support for vega20 when the swSMU path is used.

Reviewed-by: default avatarEvan Quan <evan.quan@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 31fa2991
Loading
Loading
Loading
Loading
+35 −20
Original line number Diff line number Diff line
@@ -478,6 +478,12 @@ static int soc15_asic_mode1_reset(struct amdgpu_device *adev)

static int soc15_asic_get_baco_capability(struct amdgpu_device *adev, bool *cap)
{
	if (is_support_sw_smu(adev)) {
		struct smu_context *smu = &adev->smu;

		*cap = smu_baco_is_support(smu);
		return 0;
	} else {
		void *pp_handle = adev->powerplay.pp_handle;
		const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;

@@ -488,20 +494,30 @@ static int soc15_asic_get_baco_capability(struct amdgpu_device *adev, bool *cap)

		return pp_funcs->get_asic_baco_capability(pp_handle, cap);
	}
}

static int soc15_asic_baco_reset(struct amdgpu_device *adev)
{
	void *pp_handle = adev->powerplay.pp_handle;
	const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
	struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);

	if (!pp_funcs ||!pp_funcs->get_asic_baco_state ||!pp_funcs->set_asic_baco_state)
		return -ENOENT;

	/* avoid NBIF got stuck when do RAS recovery in BACO reset */
	if (ras && ras->supported)
		adev->nbio.funcs->enable_doorbell_interrupt(adev, false);

	dev_info(adev->dev, "GPU BACO reset\n");

	if (is_support_sw_smu(adev)) {
		struct smu_context *smu = &adev->smu;

		if (smu_baco_reset(smu))
			return -EIO;
	} else {
		void *pp_handle = adev->powerplay.pp_handle;
		const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;

		if (!pp_funcs ||!pp_funcs->get_asic_baco_state ||!pp_funcs->set_asic_baco_state)
			return -ENOENT;

		/* enter BACO state */
		if (pp_funcs->set_asic_baco_state(pp_handle, 1))
			return -EIO;
@@ -509,13 +525,12 @@ static int soc15_asic_baco_reset(struct amdgpu_device *adev)
		/* exit BACO state */
		if (pp_funcs->set_asic_baco_state(pp_handle, 0))
			return -EIO;
	}

	/* re-enable doorbell interrupt after BACO exit */
	if (ras && ras->supported)
		adev->nbio.funcs->enable_doorbell_interrupt(adev, true);

	dev_info(adev->dev, "GPU BACO reset\n");

	return 0;
}