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

Commit c47655fb authored by Shirish S's avatar Shirish S Committed by Greg Kroah-Hartman
Browse files

amdgpu/gmc_v9: save/restore sdpif regs during S3



commit a3ed353cf8015ba84a0407a5dc3ffee038166ab0 upstream.

fixes S3 issue with IOMMU + S/G  enabled @ 64M VRAM.

Suggested-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarShirish S <shirish.s@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a8b1fa6c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ struct amdgpu_gmc {
	uint32_t                srbm_soft_reset;
	bool			prt_warning;
	uint64_t		stolen_size;
	uint32_t		sdpif_register;
	/* apertures */
	u64			shared_aperture_start;
	u64			shared_aperture_end;
+36 −1
Original line number Diff line number Diff line
@@ -992,6 +992,19 @@ static void gmc_v9_0_init_golden_registers(struct amdgpu_device *adev)
	}
}

/**
 * gmc_v9_0_restore_registers - restores regs
 *
 * @adev: amdgpu_device pointer
 *
 * This restores register values, saved at suspend.
 */
static void gmc_v9_0_restore_registers(struct amdgpu_device *adev)
{
	if (adev->asic_type == CHIP_RAVEN)
		WREG32(mmDCHUBBUB_SDPIF_MMIO_CNTRL_0, adev->gmc.sdpif_register);
}

/**
 * gmc_v9_0_gart_enable - gart enable
 *
@@ -1080,6 +1093,20 @@ static int gmc_v9_0_hw_init(void *handle)
	return r;
}

/**
 * gmc_v9_0_save_registers - saves regs
 *
 * @adev: amdgpu_device pointer
 *
 * This saves potential register values that should be
 * restored upon resume
 */
static void gmc_v9_0_save_registers(struct amdgpu_device *adev)
{
	if (adev->asic_type == CHIP_RAVEN)
		adev->gmc.sdpif_register = RREG32(mmDCHUBBUB_SDPIF_MMIO_CNTRL_0);
}

/**
 * gmc_v9_0_gart_disable - gart disable
 *
@@ -1112,9 +1139,16 @@ static int gmc_v9_0_hw_fini(void *handle)

static int gmc_v9_0_suspend(void *handle)
{
	int r;
	struct amdgpu_device *adev = (struct amdgpu_device *)handle;

	return gmc_v9_0_hw_fini(adev);
	r = gmc_v9_0_hw_fini(adev);
	if (r)
		return r;

	gmc_v9_0_save_registers(adev);

	return 0;
}

static int gmc_v9_0_resume(void *handle)
@@ -1122,6 +1156,7 @@ static int gmc_v9_0_resume(void *handle)
	int r;
	struct amdgpu_device *adev = (struct amdgpu_device *)handle;

	gmc_v9_0_restore_registers(adev);
	r = gmc_v9_0_hw_init(adev);
	if (r)
		return r;
+2 −0
Original line number Diff line number Diff line
@@ -7376,6 +7376,8 @@
#define mmCRTC4_CRTC_DRR_CONTROL                                                                       0x0f3e
#define mmCRTC4_CRTC_DRR_CONTROL_BASE_IDX                                                              2
#define mmDCHUBBUB_SDPIF_MMIO_CNTRL_0                                                                  0x395d
#define mmDCHUBBUB_SDPIF_MMIO_CNTRL_0_BASE_IDX                                                         2
// addressBlock: dce_dc_fmt4_dispdec
// base address: 0x2000