diff mbox

make fbdev/fbcon switchable per driver?

Message ID 1485511238.19754.58.camel@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Gerd Hoffmann Jan. 27, 2017, 10 a.m. UTC
Hi folks,

Problem at hand:  A virtual machine, equipped with two display devices,
one virtual, one physical (using pci pass-through, or kvmgt-based vgpu).

There is no easy way for the user to configure which of the two display
devices fbcon should run on.  i915 happens to win over bochs-drm or qxl,
so you can't use the emulated gfx device as text console.

One way out would be to add a module option to each driver, to turn off
fbdev emulation.  Attached patch does that for i915.

Comments?  Better ideas?

cheers,
  Gerd

Comments

Daniel Vetter Jan. 27, 2017, 2:02 p.m. UTC | #1
On Fri, Jan 27, 2017 at 11:00:38AM +0100, Gerd Hoffmann wrote:
>   Hi folks,
> 
> Problem at hand:  A virtual machine, equipped with two display devices,
> one virtual, one physical (using pci pass-through, or kvmgt-based vgpu).
> 
> There is no easy way for the user to configure which of the two display
> devices fbcon should run on.  i915 happens to win over bochs-drm or qxl,
> so you can't use the emulated gfx device as text console.
> 
> One way out would be to add a module option to each driver, to turn off
> fbdev emulation.  Attached patch does that for i915.
> 
> Comments?  Better ideas?

fbcon can be switched between different fbdev afaik, but don't ask me how.
I'd say if you want to keep fbcon (and not switch to something like
kmscon), then that's where this logic should be. Might even exist already.
Having a per-driver knob won't work, since then the next person complains
about his multi-amd setup using the wrong gpu :-)
-Daniel

> 
> cheers,
>   Gerd
> 

> From 19236e412a6f0e9390c1ce77d8702bbdb5511174 Mon Sep 17 00:00:00 2001
> From: Gerd Hoffmann <kraxel@redhat.com>
> Date: Fri, 27 Jan 2017 08:05:40 +0100
> Subject: [PATCH] drm i915: add fbdev option
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  drivers/gpu/drm/i915/intel_fbdev.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
> index 3e3632c..cc0ba3e 100644
> --- a/drivers/gpu/drm/i915/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/intel_fbdev.c
> @@ -45,6 +45,11 @@
>  #include <drm/i915_drm.h>
>  #include "i915_drv.h"
>  
> +static bool enable_fbdev = true;
> +module_param_named(fbdev, enable_fbdev, bool, 0600);
> +MODULE_PARM_DESC(fbdev,
> +		 "Enable legacy fbdev emulation [default=true]");
> +
>  static int intel_fbdev_set_par(struct fb_info *info)
>  {
>  	struct drm_fb_helper *fb_helper = info->par;
> @@ -706,6 +711,9 @@ int intel_fbdev_init(struct drm_device *dev)
>  	struct drm_i915_private *dev_priv = to_i915(dev);
>  	int ret;
>  
> +	if (!enable_fbdev)
> +		return 0;
> +
>  	if (WARN_ON(INTEL_INFO(dev)->num_pipes == 0))
>  		return -ENODEV;
>  
> @@ -747,6 +755,8 @@ void intel_fbdev_initial_config_async(struct drm_device *dev)
>  {
>  	struct intel_fbdev *ifbdev = to_i915(dev)->fbdev;
>  
> +	if (!ifbdev)
> +		return;
>  	ifbdev->cookie = async_schedule(intel_fbdev_initial_config, ifbdev);
>  }
>  
> -- 
> 1.8.3.1
> 

> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
Liviu Dudau Jan. 27, 2017, 2:41 p.m. UTC | #2
On Fri, Jan 27, 2017 at 03:02:42PM +0100, Daniel Vetter wrote:
> On Fri, Jan 27, 2017 at 11:00:38AM +0100, Gerd Hoffmann wrote:
> >   Hi folks,
> > 
> > Problem at hand:  A virtual machine, equipped with two display devices,
> > one virtual, one physical (using pci pass-through, or kvmgt-based vgpu).
> > 
> > There is no easy way for the user to configure which of the two display
> > devices fbcon should run on.  i915 happens to win over bochs-drm or qxl,
> > so you can't use the emulated gfx device as text console.
> > 
> > One way out would be to add a module option to each driver, to turn off
> > fbdev emulation.  Attached patch does that for i915.
> > 
> > Comments?  Better ideas?
> 
> fbcon can be switched between different fbdev afaik, but don't ask me how.

Hint: Documentation/fb/fbcon.txt says fbcon=map:<ttynumbers>

Best regards,
Liviu

> I'd say if you want to keep fbcon (and not switch to something like
> kmscon), then that's where this logic should be. Might even exist already.
> Having a per-driver knob won't work, since then the next person complains
> about his multi-amd setup using the wrong gpu :-)
> -Daniel
> 
> > 
> > cheers,
> >   Gerd
> > 
> 
> > From 19236e412a6f0e9390c1ce77d8702bbdb5511174 Mon Sep 17 00:00:00 2001
> > From: Gerd Hoffmann <kraxel@redhat.com>
> > Date: Fri, 27 Jan 2017 08:05:40 +0100
> > Subject: [PATCH] drm i915: add fbdev option
> > 
> > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> > ---
> >  drivers/gpu/drm/i915/intel_fbdev.c | 10 ++++++++++
> >  1 file changed, 10 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
> > index 3e3632c..cc0ba3e 100644
> > --- a/drivers/gpu/drm/i915/intel_fbdev.c
> > +++ b/drivers/gpu/drm/i915/intel_fbdev.c
> > @@ -45,6 +45,11 @@
> >  #include <drm/i915_drm.h>
> >  #include "i915_drv.h"
> >  
> > +static bool enable_fbdev = true;
> > +module_param_named(fbdev, enable_fbdev, bool, 0600);
> > +MODULE_PARM_DESC(fbdev,
> > +		 "Enable legacy fbdev emulation [default=true]");
> > +
> >  static int intel_fbdev_set_par(struct fb_info *info)
> >  {
> >  	struct drm_fb_helper *fb_helper = info->par;
> > @@ -706,6 +711,9 @@ int intel_fbdev_init(struct drm_device *dev)
> >  	struct drm_i915_private *dev_priv = to_i915(dev);
> >  	int ret;
> >  
> > +	if (!enable_fbdev)
> > +		return 0;
> > +
> >  	if (WARN_ON(INTEL_INFO(dev)->num_pipes == 0))
> >  		return -ENODEV;
> >  
> > @@ -747,6 +755,8 @@ void intel_fbdev_initial_config_async(struct drm_device *dev)
> >  {
> >  	struct intel_fbdev *ifbdev = to_i915(dev)->fbdev;
> >  
> > +	if (!ifbdev)
> > +		return;
> >  	ifbdev->cookie = async_schedule(intel_fbdev_initial_config, ifbdev);
> >  }
> >  
> > -- 
> > 1.8.3.1
> > 
> 
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel
> 
> 
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
Alex Williamson Jan. 27, 2017, 6:30 p.m. UTC | #3
On Fri, 27 Jan 2017 11:00:38 +0100
Gerd Hoffmann <kraxel@redhat.com> wrote:

>   Hi folks,
> 
> Problem at hand:  A virtual machine, equipped with two display devices,
> one virtual, one physical (using pci pass-through, or kvmgt-based vgpu).
> 
> There is no easy way for the user to configure which of the two display
> devices fbcon should run on.  i915 happens to win over bochs-drm or qxl,
> so you can't use the emulated gfx device as text console.
> 
> One way out would be to add a module option to each driver, to turn off
> fbdev emulation.  Attached patch does that for i915.
> 
> Comments?  Better ideas?

The vgaarb code has a concept of a vga_default_device(), it's rather
PCI-centric, but maybe better than nothing.  This is typically the
first VGA class code device found with I/O and MMIO enabled.  If fbcon
defaulted to running on the vga_default_device(), a user could select
which to use by re-ordering the VM hardware.

The problem isn't absent on bare metal, though re-ordering hardware
isn't always as simple, or necessarily possible.  The problem might run
deeper there too dealing with vesafb and simplefb, as well as the more
device specific drivers.  Rerouting legacy resources isn't always an
option, but some sort of primary selection for non-encumbered devices
would be useful.  Thanks,

Alex
Gerd Hoffmann Jan. 30, 2017, 8:15 a.m. UTC | #4
Hi,

> The vgaarb code has a concept of a vga_default_device(), it's rather
> PCI-centric, but maybe better than nothing.  This is typically the
> first VGA class code device found with I/O and MMIO enabled.  If fbcon
> defaulted to running on the vga_default_device(), a user could select
> which to use by re-ordering the VM hardware.

The qemu drivers don't register as vgaarb clients though.  Which easily
explains why igd always wins the primary selection, no matter how you
order your hardware.

So, should they register?  The drivers don't need access to the vga
registers[1][2].

cheers,
  Gerd

[1] Well, except cirrus, but that is deprecated anyway.
[2] And bochs-drm, when running on old qemu versions, where the
    stdvga has no mmio bar yet.  But those qemu versions don't
    support igd pass-through.
Alex Williamson Jan. 30, 2017, 5:45 p.m. UTC | #5
On Mon, 30 Jan 2017 09:15:50 +0100
Gerd Hoffmann <kraxel@redhat.com> wrote:

>   Hi,
> 
> > The vgaarb code has a concept of a vga_default_device(), it's rather
> > PCI-centric, but maybe better than nothing.  This is typically the
> > first VGA class code device found with I/O and MMIO enabled.  If fbcon
> > defaulted to running on the vga_default_device(), a user could select
> > which to use by re-ordering the VM hardware.  
> 
> The qemu drivers don't register as vgaarb clients though.  Which easily
> explains why igd always wins the primary selection, no matter how you
> order your hardware.
> 
> So, should they register?  The drivers don't need access to the vga
> registers[1][2].

The VGA arbiter sets up a notifier on the PCI bus and will add any VGA
class code devices it finds.  So even if the driver doesn't
participate, it'll still be tracked and might be marked as primary.  If
a graphics driver claims a VGA device that does not depend on VGA
region access then the driver should configure the device not to claim
VGA accesses (maybe only relevant for integrated graphics - i915 gets
this wrong), and register with the arbiter to opt-out of VGA
arbitration.  Picking a "primary" can be done w/o any of that latter if
we agree on the arbiter algorithm of picking the first device with VGA
routing to it (or it can be overridden by arch/platform code).  Thanks,

Alex
Daniel Vetter Jan. 31, 2017, 8 a.m. UTC | #6
On Mon, Jan 30, 2017 at 10:45:22AM -0700, Alex Williamson wrote:
> On Mon, 30 Jan 2017 09:15:50 +0100
> Gerd Hoffmann <kraxel@redhat.com> wrote:
> 
> >   Hi,
> > 
> > > The vgaarb code has a concept of a vga_default_device(), it's rather
> > > PCI-centric, but maybe better than nothing.  This is typically the
> > > first VGA class code device found with I/O and MMIO enabled.  If fbcon
> > > defaulted to running on the vga_default_device(), a user could select
> > > which to use by re-ordering the VM hardware.  
> > 
> > The qemu drivers don't register as vgaarb clients though.  Which easily
> > explains why igd always wins the primary selection, no matter how you
> > order your hardware.
> > 
> > So, should they register?  The drivers don't need access to the vga
> > registers[1][2].
> 
> The VGA arbiter sets up a notifier on the PCI bus and will add any VGA
> class code devices it finds.  So even if the driver doesn't
> participate, it'll still be tracked and might be marked as primary.  If
> a graphics driver claims a VGA device that does not depend on VGA
> region access then the driver should configure the device not to claim
> VGA accesses (maybe only relevant for integrated graphics - i915 gets
> this wrong), and register with the arbiter to opt-out of VGA
> arbitration.  Picking a "primary" can be done w/o any of that latter if
> we agree on the arbiter algorithm of picking the first device with VGA
> routing to it (or it can be overridden by arch/platform code).  Thanks,

Fyi we don't get this wrong, we indeed need vga access in some cases.
Broken hw :( The other issue is that the X server asks for vga access (or
at least did in the past) for every render op, even if it's a kms driver.
Which makes X crawl if you have multi-gpu system. Those two things
combined means vgaarb is essentially dead on any system with intel gfx.
-Daniel
Gerd Hoffmann Jan. 31, 2017, 10:06 a.m. UTC | #7
Hi,

> > The VGA arbiter sets up a notifier on the PCI bus and will add any VGA
> > class code devices it finds.  So even if the driver doesn't
> > participate, it'll still be tracked and might be marked as primary.  If
> > a graphics driver claims a VGA device that does not depend on VGA
> > region access then the driver should configure the device not to claim
> > VGA accesses (maybe only relevant for integrated graphics - i915 gets
> > this wrong), and register with the arbiter to opt-out of VGA
> > arbitration.  Picking a "primary" can be done w/o any of that latter if
> > we agree on the arbiter algorithm of picking the first device with VGA
> > routing to it (or it can be overridden by arch/platform code).  Thanks,
> 
> Fyi we don't get this wrong, we indeed need vga access in some cases.
> Broken hw :( The other issue is that the X server asks for vga access (or
> at least did in the past) for every render op, even if it's a kms driver.
> Which makes X crawl if you have multi-gpu system. Those two things
> combined means vgaarb is essentially dead on any system with intel gfx.
> -Daniel

Various qemu display devices exist in vga and non-vga variants.  So we
can sidestep the vgaarb issues by using one of those, so igd is the only
CLASS_DISPLAY_VGA device in the system.

That causes some other problems though.  First the vga variants are
supported better by the firmware because it is easy to create a simple
framebuffer with them.  With the non-vga variants you usually don't have
a display until the linux kms driver loads.  Also the vgaarb will not
pick them up, so they will not be considered as primary display.

With the vga variants primary selection by ordering the devices works
for me.  kms drivers for both igd and emulated graphics must be loaded.
fbcon will pick up whatever vgaarb declared as boot device.

cheers,
  Gerd
diff mbox

Patch

From 19236e412a6f0e9390c1ce77d8702bbdb5511174 Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Fri, 27 Jan 2017 08:05:40 +0100
Subject: [PATCH] drm i915: add fbdev option

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 drivers/gpu/drm/i915/intel_fbdev.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index 3e3632c..cc0ba3e 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -45,6 +45,11 @@ 
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
 
+static bool enable_fbdev = true;
+module_param_named(fbdev, enable_fbdev, bool, 0600);
+MODULE_PARM_DESC(fbdev,
+		 "Enable legacy fbdev emulation [default=true]");
+
 static int intel_fbdev_set_par(struct fb_info *info)
 {
 	struct drm_fb_helper *fb_helper = info->par;
@@ -706,6 +711,9 @@  int intel_fbdev_init(struct drm_device *dev)
 	struct drm_i915_private *dev_priv = to_i915(dev);
 	int ret;
 
+	if (!enable_fbdev)
+		return 0;
+
 	if (WARN_ON(INTEL_INFO(dev)->num_pipes == 0))
 		return -ENODEV;
 
@@ -747,6 +755,8 @@  void intel_fbdev_initial_config_async(struct drm_device *dev)
 {
 	struct intel_fbdev *ifbdev = to_i915(dev)->fbdev;
 
+	if (!ifbdev)
+		return;
 	ifbdev->cookie = async_schedule(intel_fbdev_initial_config, ifbdev);
 }
 
-- 
1.8.3.1