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: Pierre Ossman <pierre@ossman.eu> Acked-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
32f48ffea9
commit
ec51efa9b2
1 changed files with 19 additions and 2 deletions
|
@ -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 = {
|
||||||
|
|
Loading…
Add table
Reference in a new issue