DF-4103 / fix.diff
--- a/sys/dev/drm/amd/amdgpu/atombios_encoders.c +++ b/sys/dev/drm/amd/amdgpu/atombios_encoders.c @@ -645,6 +645,9 @@ amdgpu_atombios_encoder_setup_dig_encoder(struct drm_encoder *encoder, int dp_clock = 0; int dp_lane_count = 0; int hpd_id = AMDGPU_HPD_NONE; + if (!dig) + return; + if (connector) { struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); struct amdgpu_connector_atom_dig *dig_connector = @@ -844,6 +847,10 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int ac int hpd_id = AMDGPU_HPD_NONE; int dig_encoder; + /* enc_priv may be NULL (get_lcd_info/get_dig_info failure) */ + if (dig == NULL) + return; + if (action == ATOM_TRANSMITTER_ACTION_INIT) { connector = amdgpu_get_connector_for_encoder_init(encoder); /* just needed to avoid bailing in the encoder check. the encoder @@ -1399,6 +1406,9 @@ amdgpu_atombios_encoder_setup_dig(struct drm_encoder *encoder, int action) struct amdgpu_connector_atom_dig *amdgpu_dig_connector = NULL; + if (!dig) + return; + if (connector) { amdgpu_connector = to_amdgpu_connector(connector); amdgpu_dig_connector = amdgpu_connector->con_priv; } @@ -1614,6 +1624,8 @@ amdgpu_atombios_encoder_set_crtc_source(struct drm_encoder *encoder) case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: dig = amdgpu_encoder->enc_priv; + if (!dig) + break; switch (dig->dig_encoder) { case 0: args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; @@ -1683,6 +1695,8 @@ amdgpu_atombios_encoder_set_crtc_source(struct drm_encoder *encoder) case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: dig = amdgpu_encoder->enc_priv; + if (!dig) + break; switch (dig->dig_encoder) { case 0: args.v3.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; |