diff --git a/sys/dev/drm/radeon/atombios_encoders.c b/sys/dev/drm/radeon/atombios_encoders.c index 1111111..2222222 100644 --- a/sys/dev/drm/radeon/atombios_encoders.c +++ b/sys/dev/drm/radeon/atombios_encoders.c @@ -739,7 +739,7 @@ int atombios_get_encoder_mode(struct drm_encoder *encoder) struct radeon_connector_atom_dig *dig_connector; struct radeon_encoder_atom_dig *dig_enc; - if (radeon_encoder_is_digital(encoder)) { + if (radeon_encoder_is_digital(encoder) && radeon_encoder->enc_priv) { dig_enc = radeon_encoder->enc_priv; if (dig_enc->active_mst_links) return ATOM_ENCODER_MODE_DP_MST; @@ -1082,6 +1082,9 @@ atombios_dig_transmitter_setup2(struct drm_encoder *encoder, int action, uint8_t int dig_encoder = dig->dig_encoder; int hpd_id = RADEON_HPD_NONE; + if (!dig) + return; + if (action == ATOM_TRANSMITTER_ACTION_INIT) { connector = radeon_get_connector_for_encoder_init(encoder); @@ -1690,6 +1693,9 @@ radeon_atom_encoder_dpms_avivo(struct drm_encoder *encoder, int mode) if (rdev->mode_info.bl_encoder) { struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; + if (!dig) + break; atombios_set_backlight_level(radeon_encoder, dig->backlight_level); } else { args.ucAction = ATOM_LCD_BLON; @@ -1721,6 +1727,9 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) struct radeon_connector_atom_dig *radeon_dig_connector = NULL; bool travis_quirk = false; + if (!dig) + return; + if (connector) { radeon_connector = to_radeon_connector(connector); radeon_dig_connector = radeon_connector->con_priv; @@ -2003,6 +2012,9 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder) case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: dig = radeon_encoder->enc_priv; + if (!dig) + break; switch (dig->dig_encoder) { case 0: args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; @@ -2267,6 +2279,9 @@ int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder, int fe_idx) radeon_test_encoder = to_radeon_encoder(test_encoder); dig = radeon_test_encoder->enc_priv; + if (!dig) + continue; + if (dig->dig_encoder >= 0) dig_enc_in_use |= (1 << dig->dig_encoder); } @@ -2658,6 +2673,10 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder) if (atombios_get_encoder_mode(encoder) != ATOM_ENCODER_MODE_DP_MST) { dig = radeon_encoder->enc_priv; + if (!dig) { + radeon_encoder->active_device = 0; + goto disable_done_active; + } radeon_atom_release_dig_encoder(rdev, dig->dig_encoder); dig->dig_encoder = -1; radeon_encoder->active_device = 0; +disable_done_active: } } else radeon_encoder->active_device = 0; # NOTE: matches the NULL guards the file already applies at :100 # (atombios_set_backlight_level), :240 (radeon_atom_backlight_init), # :629 (atombios_digital_setup) and :2551 (radeon_atom_encoder_prepare).