On Fri, Jun 05, 2015 at 11:18:21PM +0200, Stefan Lippers-Hollmann wrote:
Hi
On 2015-04-20, Dave Airlie wrote: [...]
The following changes since commit 09d51602cf84a1264946711dd4ea0dddbac599a1:
Merge branch 'turbostat' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux (2015-04-19 14:31:41 -0700)
are available in the git repository at:
git://people.freedesktop.org/~airlied/linux drm-next-merged
for you to fetch changes up to 2c33ce009ca2389dbf0535d0672214d09738e35e:
Merge Linus master into drm-next (2015-04-20 13:05:20 +1000)
[...]
Ander Conselvan de Oliveira (28):
[...]
drm/i915: Allocate connector state together with the connectors
[...]
This commit introduces a regression relative to v4.0 on an Intel D945GCLF2 mainboard[1] (Atom 330) with Intel 82945G/GZ onboard graphics using its (only-) VGA connector for me.
v4.1-rc6-52-gff25ea8: [ 13.265699] BUG: unable to handle kernel NULL pointer dereference at 0000000000000010 [ 13.265723] IP: [<ffffffffa0556f01>] intel_modeset_update_connector_atomic_state+0x61/0x90 [i915]
Hmm. Smells like a connector with a NULL state pointer, and the bad commit touched exactly the part that sets it up. I can't immediately spot any place where we'd forget to set it up though.
Can you try with something like this so we'd at least find out which connector(s) is/are at fault here?
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 3007b44..c10f423 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -918,6 +918,8 @@ int drm_connector_init(struct drm_device *dev,
connector->debugfs_entry = NULL;
+ WARN(1, "connector = %p\n", connector); + out_put: if (ret) drm_mode_object_put(dev, &connector->base); diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index d0f3cbc..dd8ced7 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -10332,6 +10332,10 @@ static void intel_modeset_update_connector_atomic_state(struct drm_device *dev) struct intel_connector *connector;
for_each_intel_connector(dev, connector) { + if (WARN(!connector->base.state, + "connector = %p\n", &connector->base)) + continue; + if (connector->base.encoder) { connector->base.state->best_encoder = connector->base.encoder;