Re: [PATCH] drm/qxl: unbind vgacon
From: Daniel Vetter
Date: Thu Feb 21 2019 - 04:57:58 EST
On Wed, Feb 20, 2019 at 03:36:40PM +0100, Gerd Hoffmann wrote:
> Problem: qxl switches from native mode back into vga compatibility mode
> when it notices someone is accessing vga registers. And vgacon does
> exactly that before fbcon takes over.
>
> Before qxl switched to the generic fbdev emulation that didn't cause any
> problems. With the generic fbdev emulation the switch to vga mode
> happens now and then, probably caused by a initialization order change
> and triggered by a printk in a bad moment.
>
> So make sure we take vgacon out of the picture by making dummycon
> taking over the console early enough.
>
> Not entriely happy with the approach, I'm open to better ideas.
>
> Signed-off-by: Gerd Hoffmann <kraxel@xxxxxxxxxx>
> ---
> drivers/gpu/drm/qxl/qxl_drv.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
> index bb81e310eb..88349dc13e 100644
> --- a/drivers/gpu/drm/qxl/qxl_drv.c
> +++ b/drivers/gpu/drm/qxl/qxl_drv.c
> @@ -30,6 +30,7 @@
>
> #include <linux/module.h>
> #include <linux/console.h>
> +#include <linux/vt_kern.h>
>
> #include <drm/drmP.h>
> #include <drm/drm.h>
> @@ -89,6 +90,11 @@ qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>
> drm_kms_helper_poll_init(&qdev->ddev);
>
> + /* unbind vgacon to make sure it doesn't touch our vga registers */
> + console_lock();
> + ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, true);
> + console_unlock();
Still seems very late, in i915 we kick out vgacon as pretty much the first
thing in driver load. See i915_kick_out_vgacon.
I wonder whether we should integrate that logic into
drm_fb_helper_remove_conflicting_pci_framebuffers, by checking whether
that pci device can decode VGA and kick out vgacon in that case. Instead
of sprinkling the same logic over all drivers.
-Daniel
> +
> /* Complete initialization. */
> ret = drm_dev_register(&qdev->ddev, ent->driver_data);
> if (ret)
> --
> 2.9.3
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch