Message ID | 1307133546-7538-1-git-send-email-alexdeucher@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
I tested the patch and it fixed the problem. Thanks, Ari 2011/6/3 Alex Deucher <alexdeucher@gmail.com>: > The PHY was not initialized correctly after > ac89af1e1010640db072416c786f97391b85790f since > the function bailed early as an encoder was not > assigned. The encoder isn't necessary for PHY init > so just assign to 0 for init so that the table > is executed. > > Reported-by: Ari Savolainen <ari.m.savolainen@gmail.com> > > Cc: Ari Savolainen <ari.m.savolainen@gmail.com> > Signed-off-by: Alex Deucher <alexdeucher@gmail.com> > --- > drivers/gpu/drm/radeon/radeon_encoders.c | 17 +++++++++++------ > 1 files changed, 11 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c > index 13e4fa0..302248b 100644 > --- a/drivers/gpu/drm/radeon/radeon_encoders.c > +++ b/drivers/gpu/drm/radeon/radeon_encoders.c > @@ -949,10 +949,15 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t > int dp_lane_count = 0; > int connector_object_id = 0; > int igp_lane_info = 0; > + int dig_encoder = dig->dig_encoder; > > - if (action == ATOM_TRANSMITTER_ACTION_INIT) > + if (action == ATOM_TRANSMITTER_ACTION_INIT) { > connector = radeon_get_connector_for_encoder_init(encoder); > - else > + /* just needed to avoid bailing in the encoder check. the encoder > + * isn't used for init > + */ > + dig_encoder = 0; > + } else > connector = radeon_get_connector_for_encoder(encoder); > > if (connector) { > @@ -968,7 +973,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t > } > > /* no dig encoder assigned */ > - if (dig->dig_encoder == -1) > + if (dig_encoder == -1) > return; > > if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) > @@ -1018,7 +1023,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t > > if (dig->linkb) > args.v3.acConfig.ucLinkSel = 1; > - if (dig->dig_encoder & 1) > + if (dig_encoder & 1) > args.v3.acConfig.ucEncoderSel = 1; > > /* Select the PLL for the PHY > @@ -1068,7 +1073,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t > args.v3.acConfig.fDualLinkConnector = 1; > } > } else if (ASIC_IS_DCE32(rdev)) { > - args.v2.acConfig.ucEncoderSel = dig->dig_encoder; > + args.v2.acConfig.ucEncoderSel = dig_encoder; > if (dig->linkb) > args.v2.acConfig.ucLinkSel = 1; > > @@ -1095,7 +1100,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t > } else { > args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; > > - if (dig->dig_encoder) > + if (dig_encoder) > args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; > else > args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER; > -- > 1.7.1.1 > >
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 13e4fa0..302248b 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c @@ -949,10 +949,15 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t int dp_lane_count = 0; int connector_object_id = 0; int igp_lane_info = 0; + int dig_encoder = dig->dig_encoder; - if (action == ATOM_TRANSMITTER_ACTION_INIT) + if (action == ATOM_TRANSMITTER_ACTION_INIT) { connector = radeon_get_connector_for_encoder_init(encoder); - else + /* just needed to avoid bailing in the encoder check. the encoder + * isn't used for init + */ + dig_encoder = 0; + } else connector = radeon_get_connector_for_encoder(encoder); if (connector) { @@ -968,7 +973,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t } /* no dig encoder assigned */ - if (dig->dig_encoder == -1) + if (dig_encoder == -1) return; if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) @@ -1018,7 +1023,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t if (dig->linkb) args.v3.acConfig.ucLinkSel = 1; - if (dig->dig_encoder & 1) + if (dig_encoder & 1) args.v3.acConfig.ucEncoderSel = 1; /* Select the PLL for the PHY @@ -1068,7 +1073,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t args.v3.acConfig.fDualLinkConnector = 1; } } else if (ASIC_IS_DCE32(rdev)) { - args.v2.acConfig.ucEncoderSel = dig->dig_encoder; + args.v2.acConfig.ucEncoderSel = dig_encoder; if (dig->linkb) args.v2.acConfig.ucLinkSel = 1; @@ -1095,7 +1100,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t } else { args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; - if (dig->dig_encoder) + if (dig_encoder) args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; else args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;
The PHY was not initialized correctly after ac89af1e1010640db072416c786f97391b85790f since the function bailed early as an encoder was not assigned. The encoder isn't necessary for PHY init so just assign to 0 for init so that the table is executed. Reported-by: Ari Savolainen <ari.m.savolainen@gmail.com> Cc: Ari Savolainen <ari.m.savolainen@gmail.com> Signed-off-by: Alex Deucher <alexdeucher@gmail.com> --- drivers/gpu/drm/radeon/radeon_encoders.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-)