[Intel-gfx] [PATCH] drm/i915/fbdev: Enable late fbdev initial configuration
Chris Wilson
chris at chris-wilson.co.uk
Tue Apr 17 23:44:30 UTC 2018
Quoting José Roberto de Souza (2018-04-17 23:34:18)
> If the initial fbdev configuration(intel_fbdev_initial_config()) runs and
> there still no sink connected it will cause
> drm_fb_helper_initial_config() to return 0 as no error happened(but
> internally the return is -EAGAIN).
> Because no framebuffer was allocated, when a sink is connected
> intel_fbdev_output_poll_changed() will not execute
> drm_fb_helper_hotplug_event() that would trigger another try to do the
> initial fbdev configuration.
>
> So here creating a dummy framebuffer of 800x600, so
> drm_fb_helper_hotplug_event() will be executed and fbdev can be properly
> setup when a sink is connected, if needed the dummy framebuffer will be
> freed and a new with the proper size will be allocated.
>
> This issue also happens when a MST DP sink is connected since boot, as
> the MST topology is discovered in parallel if intel_fbdev_initial_config()
> is executed before the first sink MST is discovered it will cause this
> same issue.
>
> This is a follow up patch of
> https://patchwork.freedesktop.org/patch/196089/
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104158
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104425
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
> ---
> drivers/gpu/drm/i915/intel_fbdev.c | 24 +++++++++++++++++++++++-
> 1 file changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
> index 7d41d139341b..773577d39782 100644
> --- a/drivers/gpu/drm/i915/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/intel_fbdev.c
> @@ -696,14 +696,36 @@ int intel_fbdev_init(struct drm_device *dev)
> return 0;
> }
>
> +static void intel_fbdev_dummy_fb_create(struct intel_fbdev *ifbdev)
> +{
> + struct drm_fb_helper_surface_size sizes;
> +
> + sizes.fb_width = 800;
> + sizes.fb_height = 600;
> + sizes.surface_width = sizes.fb_width;
> + sizes.surface_height = sizes.fb_height;
> + sizes.surface_bpp = 32;
> + sizes.surface_depth = 24;
> +
> + if (intelfb_create(&ifbdev->helper, &sizes))
> + DRM_ERROR("Unable to create dummy framebufer");
> +}
> +
> static void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
> {
> struct intel_fbdev *ifbdev = data;
>
> /* Due to peculiar init order wrt to hpd handling this is separate. */
> if (drm_fb_helper_initial_config(&ifbdev->helper,
> - ifbdev->preferred_bpp))
> + ifbdev->preferred_bpp)) {
> intel_fbdev_unregister(to_i915(ifbdev->helper.dev));
> + return;
> + }
> +
> + mutex_lock(&ifbdev->helper.lock);
> + if (!ifbdev->vma)
> + intel_fbdev_dummy_fb_create(ifbdev);
> + mutex_unlock(&ifbdev->helper.lock);
> }
Did you try
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index 65a3313723c9..4120c635742d 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -493,6 +493,7 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper,
bail:
DRM_DEBUG_KMS("Not using firmware configuration\n");
memcpy(enabled, save_enabled, count);
+ fb_helper->deferred_setup = true;
ret = false;
}
possible as of
commit ca91a2758fcef6635626993557dd51cfbb6dd134
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date: Thu Jul 6 15:00:21 2017 +0200
drm/fb-helper: Support deferred setup
FB helper code falls back to a 1024x768 mode if no outputs are connected
or don't report back any modes upon initialization. This can be annoying
because outputs that are added to FB helper later on can't be used with
FB helper if they don't support a matching mode.
...
-Chris
More information about the Intel-gfx
mailing list