--- a/sys/dev/drm/i915/vlv_dsi.c +++ b/sys/dev/drm/i915/vlv_dsi.c @@ -1794,6 +1794,10 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv) else intel_encoder->crtc_mask = BIT(PIPE_B); + /* intel_bios_is_dsi_present() keys off the child device list, but + * vbt.dsi.config is only set when BDB_MIPI_CONFIG exists and both + * kmemdups in parse_mipi_config() succeeded. Never deref it + * unguarded (DF-4205). */ + if (!dev_priv->vbt.dsi.config) + goto err; + if (dev_priv->vbt.dsi.config->dual_link) intel_dsi->ports = BIT(PORT_A) | BIT(PORT_C); else --- a/sys/dev/drm/i915/intel_bios.c +++ b/sys/dev/drm/i915/intel_bios.c @@ -846,6 +846,7 @@ parse_mipi_config(struct drm_i915_private *dev_priv, dev_priv->vbt.dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL); if (!dev_priv->vbt.dsi.pps) { kfree(dev_priv->vbt.dsi.config); + dev_priv->vbt.dsi.config = NULL; return; }