diff mbox

[1/2] hyperv-fb: add pci stub

Message ID 1380714911-6254-1-git-send-email-kraxel@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Gerd Hoffman Oct. 2, 2013, 11:55 a.m. UTC
This patch adds a pci stub driver to hyper-fb.  The hyperv framebuffer
driver will bind to the pci device then, so linux kernel and userspace
know there is a proper kernel driver for the device active.  lspci shows
this for example:

[root@dhcp231 ~]# lspci -vs8
00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual
VGA (prog-if 00 [VGA controller])
        Flags: bus master, fast devsel, latency 0, IRQ 11
        Memory at f8000000 (32-bit, non-prefetchable) [size=64M]
        Expansion ROM at <unassigned> [disabled]
        Kernel driver in use: hyperv_fb

Another effect is that the xorg vesa driver will not attach to the
device and thus the Xorg server will automatically use the fbdev
driver instead.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 drivers/video/hyperv_fb.c | 40 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 39 insertions(+), 1 deletion(-)

Comments

KY Srinivasan Oct. 2, 2013, 2:29 p.m. UTC | #1
> -----Original Message-----
> From: Gerd Hoffmann [mailto:kraxel@redhat.com]
> Sent: Wednesday, October 02, 2013 4:55 AM
> Cc: Gerd Hoffmann; KY Srinivasan; Haiyang Zhang; Jean-Christophe Plagniol-
> Villard; Tomi Valkeinen; open list:Hyper-V CORE AND...; open list:FRAMEBUFFER
> LAYER; open list
> Subject: [PATCH 1/2] hyperv-fb: add pci stub
> 
> This patch adds a pci stub driver to hyper-fb.  The hyperv framebuffer
> driver will bind to the pci device then, so linux kernel and userspace
> know there is a proper kernel driver for the device active.  lspci shows
> this for example:
> 
> [root@dhcp231 ~]# lspci -vs8
> 00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual
> VGA (prog-if 00 [VGA controller])
>         Flags: bus master, fast devsel, latency 0, IRQ 11
>         Memory at f8000000 (32-bit, non-prefetchable) [size=64M]
>         Expansion ROM at <unassigned> [disabled]
>         Kernel driver in use: hyperv_fb
> 
> Another effect is that the xorg vesa driver will not attach to the
> device and thus the Xorg server will automatically use the fbdev
> driver instead.
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  drivers/video/hyperv_fb.c | 40
> +++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 39 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c
> index 8ac99b8..8d456dc 100644
> --- a/drivers/video/hyperv_fb.c
> +++ b/drivers/video/hyperv_fb.c
> @@ -795,12 +795,21 @@ static int hvfb_remove(struct hv_device *hdev)
>  }
> 
> 
> +static DEFINE_PCI_DEVICE_TABLE(pci_stub_id_table) = {
> +	{
> +		.vendor      = PCI_VENDOR_ID_MICROSOFT,
> +		.device      = PCI_DEVICE_ID_HYPERV_VIDEO,
> +	},
> +	{ /* end of list */ }
> +};
> +
>  static const struct hv_vmbus_device_id id_table[] = {
>  	/* Synthetic Video Device GUID */
>  	{HV_SYNTHVID_GUID},
>  	{}
>  };
> 
> +MODULE_DEVICE_TABLE(pci, pci_stub_id_table);
>  MODULE_DEVICE_TABLE(vmbus, id_table);
> 
>  static struct hv_driver hvfb_drv = {
> @@ -810,14 +819,43 @@ static struct hv_driver hvfb_drv = {
>  	.remove = hvfb_remove,
>  };
> 
> +static int hvfb_pci_stub_probe(struct pci_dev *pdev,
> +			       const struct pci_device_id *ent)
> +{
> +	return 0;
> +}
> +
> +static void hvfb_pci_stub_remove(struct pci_dev *pdev)
> +{
> +}
> +
> +static struct pci_driver hvfb_pci_stub_driver = {
> +	.name =		KBUILD_MODNAME,
> +	.id_table =	pci_stub_id_table,
> +	.probe =	hvfb_pci_stub_probe,
> +	.remove =	hvfb_pci_stub_remove,
> +};
> 
>  static int __init hvfb_drv_init(void)
>  {
> -	return vmbus_driver_register(&hvfb_drv);
> +	int ret;
> +
> +	ret = vmbus_driver_register(&hvfb_drv);
> +	if (ret != 0)
> +		return ret;
> +
> +	ret = pci_register_driver(&hvfb_pci_stub_driver);
> +	if (ret != 0) {
> +		vmbus_driver_unregister(&hvfb_drv);
> +		return ret;
> +	}
> +
> +	return 0;
>  }
> 
>  static void __exit hvfb_drv_exit(void)
>  {
> +	pci_unregister_driver(&hvfb_pci_stub_driver);
>  	vmbus_driver_unregister(&hvfb_drv);
>  }
> 
> --
> 1.8.3.1
Gerd,

Thanks for doing this. This certainly will address some of the issues that are reported. I do have a question though - how would this work if we don't have PCI bus in the guest.

Regards,

K. Y
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Haiyang Zhang Oct. 2, 2013, 8:42 p.m. UTC | #2
> -----Original Message-----
> From: linux-fbdev-owner@vger.kernel.org [mailto:linux-fbdev-
> owner@vger.kernel.org] On Behalf Of Gerd Hoffmann
> Sent: Wednesday, October 2, 2013 7:55 AM
> Cc: Gerd Hoffmann; KY Srinivasan; Haiyang Zhang; Jean-Christophe Plagniol-
> Villard; Tomi Valkeinen; open list:Hyper-V CORE AND...; open
> list:FRAMEBUFFER LAYER; open list
> Subject: [PATCH 1/2] hyperv-fb: add pci stub
> 
> This patch adds a pci stub driver to hyper-fb.  The hyperv framebuffer driver
> will bind to the pci device then, so linux kernel and userspace know there is a
> proper kernel driver for the device active.  lspci shows this for example:
> 
> [root@dhcp231 ~]# lspci -vs8
> 00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual
> VGA (prog-if 00 [VGA controller])
>         Flags: bus master, fast devsel, latency 0, IRQ 11
>         Memory at f8000000 (32-bit, non-prefetchable) [size=64M]
>         Expansion ROM at <unassigned> [disabled]
>         Kernel driver in use: hyperv_fb
> 
> Another effect is that the xorg vesa driver will not attach to the device and
> thus the Xorg server will automatically use the fbdev driver instead.
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

Acked-by: Haiyang Zhang <haiyangz@microsoft.com>

Thank you for fixing this!

- Haiyang


--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Gerd Hoffman Oct. 7, 2013, 6:50 a.m. UTC | #3
On Mi, 2013-10-02 at 14:29 +0000, KY Srinivasan wrote:
> 
> > This patch adds a pci stub driver to hyper-fb.  The hyperv framebuffer
> > driver will bind to the pci device then, so linux kernel and userspace
> > know there is a proper kernel driver for the device active.  lspci shows
> > this for example:

> Gerd,
> 
> Thanks for doing this. This certainly will address some of the issues that are reported. I do have a question though - how would this work if we don't have PCI bus in the guest.

The hyperv framebuffer driver wouldn't work in the first place then as
it looks up the framebuffer address in pci config space (see hvfb_getmem
function).

cheers,
  Gerd



--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
KY Srinivasan Oct. 7, 2013, 5:12 p.m. UTC | #4
> -----Original Message-----

> From: Gerd Hoffmann [mailto:kraxel@redhat.com]

> Sent: Sunday, October 06, 2013 11:51 PM

> To: KY Srinivasan

> Cc: Haiyang Zhang; Jean-Christophe Plagniol-Villard; Tomi Valkeinen; open

> list:Hyper-V CORE AND...; open list:FRAMEBUFFER LAYER; open list

> Subject: Re: [PATCH 1/2] hyperv-fb: add pci stub

> 

> On Mi, 2013-10-02 at 14:29 +0000, KY Srinivasan wrote:

> >

> > > This patch adds a pci stub driver to hyper-fb.  The hyperv framebuffer

> > > driver will bind to the pci device then, so linux kernel and userspace

> > > know there is a proper kernel driver for the device active.  lspci shows

> > > this for example:

> 

> > Gerd,

> >

> > Thanks for doing this. This certainly will address some of the issues that are

> reported. I do have a question though - how would this work if we don't have PCI

> bus in the guest.

> 

> The hyperv framebuffer driver wouldn't work in the first place then as

> it looks up the framebuffer address in pci config space (see hvfb_getmem

> function).


We are going to fix this as we move this code to run on our UEFI firmware. 

Regards,

K. Y
Gerd Hoffman Oct. 8, 2013, 8:41 a.m. UTC | #5
On Mo, 2013-10-07 at 17:12 +0000, KY Srinivasan wrote:
> 
> > -----Original Message-----
> > From: Gerd Hoffmann [mailto:kraxel@redhat.com]
> > Sent: Sunday, October 06, 2013 11:51 PM
> > To: KY Srinivasan
> > Cc: Haiyang Zhang; Jean-Christophe Plagniol-Villard; Tomi Valkeinen; open
> > list:Hyper-V CORE AND...; open list:FRAMEBUFFER LAYER; open list
> > Subject: Re: [PATCH 1/2] hyperv-fb: add pci stub
> > 
> > On Mi, 2013-10-02 at 14:29 +0000, KY Srinivasan wrote:
> > >
> > > > This patch adds a pci stub driver to hyper-fb.  The hyperv framebuffer
> > > > driver will bind to the pci device then, so linux kernel and userspace
> > > > know there is a proper kernel driver for the device active.  lspci shows
> > > > this for example:
> > 
> > > Gerd,
> > >
> > > Thanks for doing this. This certainly will address some of the issues that are
> > reported. I do have a question though - how would this work if we don't have PCI
> > bus in the guest.
> > 
> > The hyperv framebuffer driver wouldn't work in the first place then as
> > it looks up the framebuffer address in pci config space (see hvfb_getmem
> > function).
> 
> We are going to fix this as we move this code to run on our UEFI firmware. 

Hmm, windows server 2012 seems to have no option to enable uefi.  So I
guess this is still in development?  How this is going to look like?

Probably you are going for pure uefi firmware, without csm, to be able
to leave all the legacy bios stuff behind in uefi mode.  Therefore no
vesa bios support.  efi drivers for vmbus network/storage/display/input
in the firmware.  No legacy ide/vga pci devices.  Correct?

The linux kernel will come up with efifb then, switching over to
hyperv-fb once the driver is loaded.  The hyperv-fb pci stub driver will
not bind to the hyperv vga pci device if it isn't present in the guest.
hyperv-fb will load just fine nevertheless (once hvfb_getmem is fixed to
not depend on the pci device config space).  The pci stub added by the
patch and the vmbus driver in hyperv-fb are completely independent.

cheers,
  Gerd


--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tomi Valkeinen Oct. 9, 2013, 9:53 a.m. UTC | #6
On 02/10/13 14:55, Gerd Hoffmann wrote:
> This patch adds a pci stub driver to hyper-fb.  The hyperv framebuffer
> driver will bind to the pci device then, so linux kernel and userspace
> know there is a proper kernel driver for the device active.  lspci shows
> this for example:
> 
> [root@dhcp231 ~]# lspci -vs8
> 00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual
> VGA (prog-if 00 [VGA controller])
>         Flags: bus master, fast devsel, latency 0, IRQ 11
>         Memory at f8000000 (32-bit, non-prefetchable) [size=64M]
>         Expansion ROM at <unassigned> [disabled]
>         Kernel driver in use: hyperv_fb
> 
> Another effect is that the xorg vesa driver will not attach to the
> device and thus the Xorg server will automatically use the fbdev
> driver instead.
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  drivers/video/hyperv_fb.c | 40 +++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 39 insertions(+), 1 deletion(-)
> 

Thanks, queuing the series for 3.13.

 Tomi
diff mbox

Patch

diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c
index 8ac99b8..8d456dc 100644
--- a/drivers/video/hyperv_fb.c
+++ b/drivers/video/hyperv_fb.c
@@ -795,12 +795,21 @@  static int hvfb_remove(struct hv_device *hdev)
 }
 
 
+static DEFINE_PCI_DEVICE_TABLE(pci_stub_id_table) = {
+	{
+		.vendor      = PCI_VENDOR_ID_MICROSOFT,
+		.device      = PCI_DEVICE_ID_HYPERV_VIDEO,
+	},
+	{ /* end of list */ }
+};
+
 static const struct hv_vmbus_device_id id_table[] = {
 	/* Synthetic Video Device GUID */
 	{HV_SYNTHVID_GUID},
 	{}
 };
 
+MODULE_DEVICE_TABLE(pci, pci_stub_id_table);
 MODULE_DEVICE_TABLE(vmbus, id_table);
 
 static struct hv_driver hvfb_drv = {
@@ -810,14 +819,43 @@  static struct hv_driver hvfb_drv = {
 	.remove = hvfb_remove,
 };
 
+static int hvfb_pci_stub_probe(struct pci_dev *pdev,
+			       const struct pci_device_id *ent)
+{
+	return 0;
+}
+
+static void hvfb_pci_stub_remove(struct pci_dev *pdev)
+{
+}
+
+static struct pci_driver hvfb_pci_stub_driver = {
+	.name =		KBUILD_MODNAME,
+	.id_table =	pci_stub_id_table,
+	.probe =	hvfb_pci_stub_probe,
+	.remove =	hvfb_pci_stub_remove,
+};
 
 static int __init hvfb_drv_init(void)
 {
-	return vmbus_driver_register(&hvfb_drv);
+	int ret;
+
+	ret = vmbus_driver_register(&hvfb_drv);
+	if (ret != 0)
+		return ret;
+
+	ret = pci_register_driver(&hvfb_pci_stub_driver);
+	if (ret != 0) {
+		vmbus_driver_unregister(&hvfb_drv);
+		return ret;
+	}
+
+	return 0;
 }
 
 static void __exit hvfb_drv_exit(void)
 {
+	pci_unregister_driver(&hvfb_pci_stub_driver);
 	vmbus_driver_unregister(&hvfb_drv);
 }