--- sys/dev/drm/amd/amdgpu/amdgpu_connectors.c +++ amdgpu_connectors.fixed.c @@ -136,10 +136,17 @@ else { const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; struct drm_encoder *encoder = connector_funcs->best_encoder(connector); - struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); - struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; + struct amdgpu_encoder *amdgpu_encoder; + struct amdgpu_encoder_atom_dig *dig; + + if (!encoder) + break; + amdgpu_encoder = to_amdgpu_encoder(encoder); + dig = amdgpu_encoder->enc_priv; + if (!dig) + break; if (dig->lcd_misc & ATOM_PANEL_MISC_V13_6BIT_PER_COLOR) bpc = 6; else if (dig->lcd_misc & ATOM_PANEL_MISC_V13_8BIT_PER_COLOR) @@ -580,9 +587,13 @@ if (connector->encoder) { amdgpu_encoder = to_amdgpu_encoder(connector->encoder); } else { const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; - amdgpu_encoder = to_amdgpu_encoder(connector_funcs->best_encoder(connector)); + struct drm_encoder *best = connector_funcs->best_encoder(connector); + + if (!best) + return 0; + amdgpu_encoder = to_amdgpu_encoder(best); } switch (val) { default: @@ -789,9 +800,13 @@ if (connector->encoder) amdgpu_encoder = to_amdgpu_encoder(connector->encoder); else { const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; - amdgpu_encoder = to_amdgpu_encoder(connector_funcs->best_encoder(connector)); + struct drm_encoder *best = connector_funcs->best_encoder(connector); + + if (!best) + return 0; + amdgpu_encoder = to_amdgpu_encoder(best); } switch (value) { case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;