| From 91f3a6aaf280294b07c05dfe606e6c27b7ba3c72 Mon Sep 17 00:00:00 2001 | 
 | From: Alex Deucher <alexander.deucher@amd.com> | 
 | Date: Mon, 9 Sep 2013 10:54:22 -0400 | 
 | Subject: drm/radeon/atom: workaround vbios bug in transmitter table on rs880 (v2) | 
 |  | 
 | From: Alex Deucher <alexander.deucher@amd.com> | 
 |  | 
 | commit 91f3a6aaf280294b07c05dfe606e6c27b7ba3c72 upstream. | 
 |  | 
 | The OUTPUT_ENABLE action jumps past the point in the coder where | 
 | the data_offset is set on certain rs780 cards.  This worked | 
 | previously because the OUTPUT_ENABLE action is always called | 
 | immediately after the ENABLE action so the data_offset remained | 
 | set.  In 6f8bbaf568c7f2c497558bfd04654c0b9841ad57 | 
 | (drm/radeon/atom: initialize more atom interpretor elements to 0), | 
 | we explictly reset data_offset to 0 between atom calls which then | 
 | caused this to fail.  The fix is to just skip calling the | 
 | OUTPUT_ENABLE action on the problematic chipsets.  The ENABLE | 
 | action does the same thing and more.  Ultimately, we could | 
 | probably drop the OUTPUT_ENABLE action all together on DCE3 | 
 | asics. | 
 |  | 
 | fixes: | 
 | https://bugzilla.kernel.org/show_bug.cgi?id=60791 | 
 |  | 
 | v2: only rs880 seems to be affected | 
 |  | 
 | Signed-off-by: Alex Deucher <alexander.deucher@amd.com> | 
 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 
 |  | 
 | --- | 
 |  drivers/gpu/drm/radeon/atombios_encoders.c |    8 ++++++-- | 
 |  1 file changed, 6 insertions(+), 2 deletions(-) | 
 |  | 
 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c | 
 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | 
 | @@ -1636,8 +1636,12 @@ radeon_atom_encoder_dpms_dig(struct drm_ | 
 |  			atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0); | 
 |  			atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); | 
 |  			atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | 
 | -			/* some early dce3.2 boards have a bug in their transmitter control table */ | 
 | -			if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730)) | 
 | +			/* some dce3.x boards have a bug in their transmitter control table. | 
 | +			 * ACTION_ENABLE_OUTPUT can probably be dropped since ACTION_ENABLE | 
 | +			 * does the same thing and more. | 
 | +			 */ | 
 | +			if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730) && | 
 | +			    (rdev->family != CHIP_RS880)) | 
 |  				atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | 
 |  		} | 
 |  		if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |