Skip to content

Commit fb9981a

Browse files
Damien Lespiaudanvet
authored andcommitted
drm/i915: Fix atomic state when reusing the firmware fb
Right now, we get a warning when taking over the firmware fb: [drm:drm_atomic_plane_check] FB set but no CRTC with the following backtrace: [<ffffffffa010339d>] drm_atomic_check_only+0x35d/0x510 [drm] [<ffffffffa0103567>] drm_atomic_commit+0x17/0x60 [drm] [<ffffffffa00a6ccd>] drm_atomic_helper_plane_set_property+0x8d/0xd0 [drm_kms_helper] [<ffffffffa00f1fed>] drm_mode_plane_set_obj_prop+0x2d/0x90 [drm] [<ffffffffa00a8a1b>] restore_fbdev_mode+0x6b/0xf0 [drm_kms_helper] [<ffffffffa00aa969>] drm_fb_helper_restore_fbdev_mode_unlocked+0x29/0x80 [drm_kms_helper] [<ffffffffa00aa9e2>] drm_fb_helper_set_par+0x22/0x50 [drm_kms_helper] [<ffffffffa050a71a>] intel_fbdev_set_par+0x1a/0x60 [i915] [<ffffffff813ad444>] fbcon_init+0x4f4/0x580 That's because we update the plane state with the fb from the firmware, but we never associate the plane to that CRTC. We don't quite have the full DRM take over from HW state just yet, so fake enough of the plane atomic state to pass the checks. v2: Fix the state on which we set the CRTC in the case we're sharing the initial fb with another pipe. (Matt) Signed-off-by: Damien Lespiau <[email protected]> Reviewed-by: Matt Roper <[email protected]> Signed-off-by: Daniel Vetter <[email protected]>
1 parent 2d14030 commit fb9981a

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

drivers/gpu/drm/i915/intel_display.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2439,8 +2439,12 @@ intel_find_plane_obj(struct intel_crtc *intel_crtc,
24392439
return;
24402440

24412441
if (intel_alloc_plane_obj(intel_crtc, plane_config)) {
2442-
intel_crtc->base.primary->fb = &plane_config->fb->base;
2443-
update_state_fb(intel_crtc->base.primary);
2442+
struct drm_plane *primary = intel_crtc->base.primary;
2443+
2444+
primary->fb = &plane_config->fb->base;
2445+
primary->state->crtc = &intel_crtc->base;
2446+
update_state_fb(primary);
2447+
24442448
return;
24452449
}
24462450

@@ -2464,11 +2468,14 @@ intel_find_plane_obj(struct intel_crtc *intel_crtc,
24642468
continue;
24652469

24662470
if (i915_gem_obj_ggtt_offset(obj) == plane_config->base) {
2471+
struct drm_plane *primary = intel_crtc->base.primary;
2472+
24672473
if (obj->tiling_mode != I915_TILING_NONE)
24682474
dev_priv->preserve_bios_swizzle = true;
24692475

24702476
drm_framebuffer_reference(c->primary->fb);
2471-
intel_crtc->base.primary->fb = c->primary->fb;
2477+
primary->fb = c->primary->fb;
2478+
primary->state->crtc = &intel_crtc->base;
24722479
update_state_fb(intel_crtc->base.primary);
24732480
obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
24742481
break;

0 commit comments

Comments
 (0)