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

Commit 3899ca84 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/radeon/dpm: fix 120hz handling harder

Need to expand the check to handle short circuiting
if the selected state is the same as current state.

bug:
https://bugs.freedesktop.org/show_bug.cgi?id=87796



Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
parent 9822393d
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -1565,6 +1565,7 @@ struct radeon_dpm {
	int			new_active_crtc_count;
	int			new_active_crtc_count;
	u32			current_active_crtcs;
	u32			current_active_crtcs;
	int			current_active_crtc_count;
	int			current_active_crtc_count;
	bool single_display;
	struct radeon_dpm_dynamic_state dyn_state;
	struct radeon_dpm_dynamic_state dyn_state;
	struct radeon_dpm_fan fan;
	struct radeon_dpm_fan fan;
	u32 tdp_limit;
	u32 tdp_limit;
+17 −5
Original line number Original line Diff line number Diff line
@@ -837,12 +837,8 @@ static void radeon_dpm_thermal_work_handler(struct work_struct *work)
	radeon_pm_compute_clocks(rdev);
	radeon_pm_compute_clocks(rdev);
}
}


static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev,
static bool radeon_dpm_single_display(struct radeon_device *rdev)
						     enum radeon_pm_state_type dpm_state)
{
{
	int i;
	struct radeon_ps *ps;
	u32 ui_class;
	bool single_display = (rdev->pm.dpm.new_active_crtc_count < 2) ?
	bool single_display = (rdev->pm.dpm.new_active_crtc_count < 2) ?
		true : false;
		true : false;


@@ -858,6 +854,17 @@ static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev,
	if (single_display && (r600_dpm_get_vrefresh(rdev) >= 120))
	if (single_display && (r600_dpm_get_vrefresh(rdev) >= 120))
		single_display = false;
		single_display = false;


	return single_display;
}

static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev,
						     enum radeon_pm_state_type dpm_state)
{
	int i;
	struct radeon_ps *ps;
	u32 ui_class;
	bool single_display = radeon_dpm_single_display(rdev);

	/* certain older asics have a separare 3D performance state,
	/* certain older asics have a separare 3D performance state,
	 * so try that first if the user selected performance
	 * so try that first if the user selected performance
	 */
	 */
@@ -983,6 +990,7 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
	struct radeon_ps *ps;
	struct radeon_ps *ps;
	enum radeon_pm_state_type dpm_state;
	enum radeon_pm_state_type dpm_state;
	int ret;
	int ret;
	bool single_display = radeon_dpm_single_display(rdev);


	/* if dpm init failed */
	/* if dpm init failed */
	if (!rdev->pm.dpm_enabled)
	if (!rdev->pm.dpm_enabled)
@@ -1007,6 +1015,9 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
		/* vce just modifies an existing state so force a change */
		/* vce just modifies an existing state so force a change */
		if (ps->vce_active != rdev->pm.dpm.vce_active)
		if (ps->vce_active != rdev->pm.dpm.vce_active)
			goto force;
			goto force;
		/* user has made a display change (such as timing) */
		if (rdev->pm.dpm.single_display != single_display)
			goto force;
		if ((rdev->family < CHIP_BARTS) || (rdev->flags & RADEON_IS_IGP)) {
		if ((rdev->family < CHIP_BARTS) || (rdev->flags & RADEON_IS_IGP)) {
			/* for pre-BTC and APUs if the num crtcs changed but state is the same,
			/* for pre-BTC and APUs if the num crtcs changed but state is the same,
			 * all we need to do is update the display configuration.
			 * all we need to do is update the display configuration.
@@ -1069,6 +1080,7 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)


	rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs;
	rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs;
	rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count;
	rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count;
	rdev->pm.dpm.single_display = single_display;


	/* wait for the rings to drain */
	/* wait for the rings to drain */
	for (i = 0; i < RADEON_NUM_RINGS; i++) {
	for (i = 0; i < RADEON_NUM_RINGS; i++) {