diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_encoders.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 35 | 
1 files changed, 30 insertions, 5 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 319d85d7e75..eb3f6dc6df8 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c @@ -1507,7 +1507,14 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)  		switch (mode) {  		case DRM_MODE_DPMS_ON:  			args.ucAction = ATOM_ENABLE; -			atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); +			/* workaround for DVOOutputControl on some RS690 systems */ +			if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DDI) { +				u32 reg = RREG32(RADEON_BIOS_3_SCRATCH); +				WREG32(RADEON_BIOS_3_SCRATCH, reg & ~ATOM_S3_DFP2I_ACTIVE); +				atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); +				WREG32(RADEON_BIOS_3_SCRATCH, reg); +			} else +				atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);  			if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {  				args.ucAction = ATOM_LCD_BLON;  				atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); @@ -1631,7 +1638,17 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder)  			break;  		case 2:  			args.v2.ucCRTC = radeon_crtc->crtc_id; -			args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder); +			if (radeon_encoder_is_dp_bridge(encoder)) { +				struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); + +				if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS) +					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS; +				else if (connector->connector_type == DRM_MODE_CONNECTOR_VGA) +					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT; +				else +					args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder); +			} else +				args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder);  			switch (radeon_encoder->encoder_id) {  			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:  			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: @@ -1748,9 +1765,17 @@ static int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder)  	/* DCE4/5 */  	if (ASIC_IS_DCE4(rdev)) {  		dig = radeon_encoder->enc_priv; -		if (ASIC_IS_DCE41(rdev)) -			return radeon_crtc->crtc_id; -		else { +		if (ASIC_IS_DCE41(rdev)) { +			/* ontario follows DCE4 */ +			if (rdev->family == CHIP_PALM) { +				if (dig->linkb) +					return 1; +				else +					return 0; +			} else +				/* llano follows DCE3.2 */ +				return radeon_crtc->crtc_id; +		} else {  			switch (radeon_encoder->encoder_id) {  			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:  				if (dig->linkb)  |