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

Commit 71fe2899 authored by Jérome Glisse's avatar Jérome Glisse Committed by Alex Deucher
Browse files

drm/radeon: allow to force hard GPU reset.



In some cases, like when freezing for hibernation, we need to be
able to force hard reset even if no engine are stuck. This patch
add a bool option to current asic reset callback to allow to force
hard reset on asic that supports it.

Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarJérôme Glisse <jglisse@redhat.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent fabb5935
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -5261,15 +5261,21 @@ static void cik_gpu_pci_config_reset(struct radeon_device *rdev)
 * cik_asic_reset - soft reset GPU
 *
 * @rdev: radeon_device pointer
 * @hard: force hard reset
 *
 * Look up which blocks are hung and attempt
 * to reset them.
 * Returns 0 for success.
 */
int cik_asic_reset(struct radeon_device *rdev)
int cik_asic_reset(struct radeon_device *rdev, bool hard)
{
	u32 reset_mask;

	if (hard) {
		cik_gpu_pci_config_reset(rdev);
		return 0;
	}

	reset_mask = cik_gpu_check_soft_reset(rdev);

	if (reset_mask)
+6 −1
Original line number Diff line number Diff line
@@ -3984,10 +3984,15 @@ void evergreen_gpu_pci_config_reset(struct radeon_device *rdev)
	}
}

int evergreen_asic_reset(struct radeon_device *rdev)
int evergreen_asic_reset(struct radeon_device *rdev, bool hard)
{
	u32 reset_mask;

	if (hard) {
		evergreen_gpu_pci_config_reset(rdev);
		return 0;
	}

	reset_mask = evergreen_gpu_check_soft_reset(rdev);

	if (reset_mask)
+6 −1
Original line number Diff line number Diff line
@@ -1959,10 +1959,15 @@ static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
	evergreen_print_gpu_status_regs(rdev);
}

int cayman_asic_reset(struct radeon_device *rdev)
int cayman_asic_reset(struct radeon_device *rdev, bool hard)
{
	u32 reset_mask;

	if (hard) {
		evergreen_gpu_pci_config_reset(rdev);
		return 0;
	}

	reset_mask = cayman_gpu_check_soft_reset(rdev);

	if (reset_mask)
+1 −1
Original line number Diff line number Diff line
@@ -2555,7 +2555,7 @@ void r100_bm_disable(struct radeon_device *rdev)
	mdelay(1);
}

int r100_asic_reset(struct radeon_device *rdev)
int r100_asic_reset(struct radeon_device *rdev, bool hard)
{
	struct r100_mc_save save;
	u32 status, tmp;
+1 −1
Original line number Diff line number Diff line
@@ -410,7 +410,7 @@ static void r300_gpu_init(struct radeon_device *rdev)
		 rdev->num_gb_pipes, rdev->num_z_pipes);
}

int r300_asic_reset(struct radeon_device *rdev)
int r300_asic_reset(struct radeon_device *rdev, bool hard)
{
	struct r100_mc_save save;
	u32 status, tmp;
Loading