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

Commit ec51efa9 authored by Pierre Ossman's avatar Pierre Ossman Committed by Dave Airlie
Browse files

drm/radeon/kms: Disable both CRTCs during mode switch



Reconfiguring one CRTC whilst another is running can cause a hang under
some circumstances. Unfortunately we haven't pinpointed exactly what those
circumstances are, so disable all CRTCs for every mode switch.

Signed-off-by: default avatarPierre Ossman <pierre@ossman.eu>
Acked-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 32f48ffe
Loading
Loading
Loading
Loading
+19 −2
Original line number Original line Diff line number Diff line
@@ -1047,12 +1047,29 @@ static int radeon_crtc_mode_set(struct drm_crtc *crtc,


static void radeon_crtc_prepare(struct drm_crtc *crtc)
static void radeon_crtc_prepare(struct drm_crtc *crtc)
{
{
	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
	struct drm_device *dev = crtc->dev;
	struct drm_crtc *crtci;

	/*
	* The hardware wedges sometimes if you reconfigure one CRTC
	* whilst another is running (see fdo bug #24611).
	*/
	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head)
		radeon_crtc_dpms(crtci, DRM_MODE_DPMS_OFF);
}
}


static void radeon_crtc_commit(struct drm_crtc *crtc)
static void radeon_crtc_commit(struct drm_crtc *crtc)
{
{
	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
	struct drm_device *dev = crtc->dev;
	struct drm_crtc *crtci;

	/*
	* Reenable the CRTCs that should be running.
	*/
	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head) {
		if (crtci->enabled)
			radeon_crtc_dpms(crtci, DRM_MODE_DPMS_ON);
	}
}
}


static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
static const struct drm_crtc_helper_funcs legacy_helper_funcs = {