* [PATCH v4 0/2] hyperv-fb: add support for generation 2 virtual machines.
@ 2014-02-25 12:28 Gerd Hoffmann
2014-02-25 12:28 ` [PATCH v4 1/2] " Gerd Hoffmann
2014-02-25 12:28 ` [PATCH v4 2/2] hyperv-fb: kick off efifb early Gerd Hoffmann
0 siblings, 2 replies; 5+ messages in thread
From: Gerd Hoffmann @ 2014-02-25 12:28 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, abgupta, haiyangz, jasowang,
tomi.valkeinen, devel, Gerd Hoffmann
Hi,
This patch series adds support for uefi-based gen2 virtual machines
to the hyperv-fb driver. It depends on a few vmbus changes which are
staged in Greg's char-misc tree (and linux-next).
Patch #1 implements gen2 vm support for hyperv-fb.
Patch #2 unregisters efifb early to make sure the framebuffer isn't used
any more while hyperv-fb initialization is in progress.
v4 changes:
- use KBUILD_MODNAME everywhere for consistent naming.
- drop the two patches which Greg has staged in char-misc.
please apply,
Gerd
Gerd Hoffmann (2):
hyperv-fb: add support for generation 2 virtual machines.
hyperv-fb: kick off efifb early
drivers/video/hyperv_fb.c | 87 +++++++++++++++++++++++++++++++++--------------
1 file changed, 61 insertions(+), 26 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v4 1/2] hyperv-fb: add support for generation 2 virtual machines.
2014-02-25 12:28 [PATCH v4 0/2] hyperv-fb: add support for generation 2 virtual machines Gerd Hoffmann
@ 2014-02-25 12:28 ` Gerd Hoffmann
2014-02-25 12:28 ` [PATCH v4 2/2] hyperv-fb: kick off efifb early Gerd Hoffmann
1 sibling, 0 replies; 5+ messages in thread
From: Gerd Hoffmann @ 2014-02-25 12:28 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, abgupta, haiyangz, jasowang,
tomi.valkeinen, devel, Gerd Hoffmann,
Jean-Christophe Plagniol-Villard
UEFI-based generation 2 virtual machines support vmbus devices only.
There is no pci bus. Thus they use a different mechanism for the
graphics framebuffer: Instead of using the vga pci bar a chunk of
memory muct be allocated from the hyperv mmio region declared using
APCI. This patch implements support for it.
Based on a patch by Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
drivers/video/hyperv_fb.c | 86 +++++++++++++++++++++++++++++++++--------------
1 file changed, 60 insertions(+), 26 deletions(-)
diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c
index 130708f..b7b3dd0 100644
--- a/drivers/video/hyperv_fb.c
+++ b/drivers/video/hyperv_fb.c
@@ -42,6 +42,7 @@
#include <linux/completion.h>
#include <linux/fb.h>
#include <linux/pci.h>
+#include <linux/efi.h>
#include <linux/hyperv.h>
@@ -212,6 +213,7 @@ struct synthvid_msg {
struct hvfb_par {
struct fb_info *info;
+ struct resource mem;
bool fb_ready; /* fb device is ready */
struct completion wait;
u32 synthvid_version;
@@ -460,13 +462,13 @@ static int synthvid_connect_vsp(struct hv_device *hdev)
goto error;
}
- if (par->synthvid_version = SYNTHVID_VERSION_WIN7) {
+ if (par->synthvid_version = SYNTHVID_VERSION_WIN7)
screen_depth = SYNTHVID_DEPTH_WIN7;
- screen_fb_size = SYNTHVID_FB_SIZE_WIN7;
- } else {
+ else
screen_depth = SYNTHVID_DEPTH_WIN8;
- screen_fb_size = SYNTHVID_FB_SIZE_WIN8;
- }
+
+ screen_fb_size = hdev->channel->offermsg.offer.
+ mmio_megabytes * 1024 * 1024;
return 0;
@@ -627,26 +629,46 @@ static void hvfb_get_option(struct fb_info *info)
/* Get framebuffer memory from Hyper-V video pci space */
static int hvfb_getmem(struct fb_info *info)
{
- struct pci_dev *pdev;
- ulong fb_phys;
+ struct hvfb_par *par = info->par;
+ struct pci_dev *pdev = NULL;
void __iomem *fb_virt;
+ int gen2vm = efi_enabled(EFI_BOOT);
+ int ret;
- pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
+ par->mem.name = KBUILD_MODNAME;
+ par->mem.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
+ if (gen2vm) {
+ ret = allocate_resource(&hyperv_mmio, &par->mem,
+ screen_fb_size,
+ 0, -1,
+ screen_fb_size,
+ NULL, NULL);
+ if (ret != 0) {
+ pr_err("Unable to allocate framebuffer memory\n");
+ return -ENODEV;
+ }
+ } else {
+ pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
PCI_DEVICE_ID_HYPERV_VIDEO, NULL);
- if (!pdev) {
- pr_err("Unable to find PCI Hyper-V video\n");
- return -ENODEV;
- }
+ if (!pdev) {
+ pr_err("Unable to find PCI Hyper-V video\n");
+ return -ENODEV;
+ }
- if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) ||
- pci_resource_len(pdev, 0) < screen_fb_size)
- goto err1;
+ if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) ||
+ pci_resource_len(pdev, 0) < screen_fb_size)
+ goto err1;
- fb_phys = pci_resource_end(pdev, 0) - screen_fb_size + 1;
- if (!request_mem_region(fb_phys, screen_fb_size, KBUILD_MODNAME))
- goto err1;
+ par->mem.end = pci_resource_end(pdev, 0);
+ par->mem.start = par->mem.end - screen_fb_size + 1;
+ ret = request_resource(&pdev->resource[0], &par->mem);
+ if (ret != 0) {
+ pr_err("Unable to request framebuffer memory\n");
+ goto err1;
+ }
+ }
- fb_virt = ioremap(fb_phys, screen_fb_size);
+ fb_virt = ioremap(par->mem.start, screen_fb_size);
if (!fb_virt)
goto err2;
@@ -654,30 +676,42 @@ static int hvfb_getmem(struct fb_info *info)
if (!info->apertures)
goto err3;
- info->apertures->ranges[0].base = pci_resource_start(pdev, 0);
- info->apertures->ranges[0].size = pci_resource_len(pdev, 0);
- info->fix.smem_start = fb_phys;
+ if (gen2vm) {
+ info->apertures->ranges[0].base = screen_info.lfb_base;
+ info->apertures->ranges[0].size = screen_info.lfb_size;
+ } else {
+ info->apertures->ranges[0].base = pci_resource_start(pdev, 0);
+ info->apertures->ranges[0].size = pci_resource_len(pdev, 0);
+ }
+
+ info->fix.smem_start = par->mem.start;
info->fix.smem_len = screen_fb_size;
info->screen_base = fb_virt;
info->screen_size = screen_fb_size;
- pci_dev_put(pdev);
+ if (!gen2vm)
+ pci_dev_put(pdev);
+
return 0;
err3:
iounmap(fb_virt);
err2:
- release_mem_region(fb_phys, screen_fb_size);
+ release_resource(&par->mem);
err1:
- pci_dev_put(pdev);
+ if (!gen2vm)
+ pci_dev_put(pdev);
+
return -ENOMEM;
}
/* Release the framebuffer */
static void hvfb_putmem(struct fb_info *info)
{
+ struct hvfb_par *par = info->par;
+
iounmap(info->screen_base);
- release_mem_region(info->fix.smem_start, screen_fb_size);
+ release_resource(&par->mem);
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v4 2/2] hyperv-fb: kick off efifb early
2014-02-25 12:28 [PATCH v4 0/2] hyperv-fb: add support for generation 2 virtual machines Gerd Hoffmann
2014-02-25 12:28 ` [PATCH v4 1/2] " Gerd Hoffmann
@ 2014-02-25 12:28 ` Gerd Hoffmann
2014-02-25 15:51 ` Haiyang Zhang
1 sibling, 1 reply; 5+ messages in thread
From: Gerd Hoffmann @ 2014-02-25 12:28 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, abgupta, haiyangz, jasowang,
tomi.valkeinen, devel, Gerd Hoffmann,
Jean-Christophe Plagniol-Villard
Remove firmware framebuffer before initializing hyperv-fb. Needed
on gen2 virtual machines. Letting register_framebuffer handle the
switchover results in efifb still being active while hyperv graphics
are initialized, which in turn can make the linux kernel hang.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
drivers/video/hyperv_fb.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c
index b7b3dd0..1b11886 100644
--- a/drivers/video/hyperv_fb.c
+++ b/drivers/video/hyperv_fb.c
@@ -683,6 +683,7 @@ static int hvfb_getmem(struct fb_info *info)
info->apertures->ranges[0].base = pci_resource_start(pdev, 0);
info->apertures->ranges[0].size = pci_resource_len(pdev, 0);
}
+ remove_conflicting_framebuffers(info->apertures, KBUILD_MODNAME, false);
info->fix.smem_start = par->mem.start;
info->fix.smem_len = screen_fb_size;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* RE: [PATCH v4 2/2] hyperv-fb: kick off efifb early
2014-02-25 12:28 ` [PATCH v4 2/2] hyperv-fb: kick off efifb early Gerd Hoffmann
@ 2014-02-25 15:51 ` Haiyang Zhang
2014-02-26 9:49 ` Gerd Hoffmann
0 siblings, 1 reply; 5+ messages in thread
From: Haiyang Zhang @ 2014-02-25 15:51 UTC (permalink / raw)
To: Gerd Hoffmann, linux-fbdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org,
KY Srinivasan, Abhishek Gupta (LIS), jasowang@redhat.com,
tomi.valkeinen@ti.com, devel@linuxdriverproject.org,
Jean-Christophe Plagniol-Villard
> -----Original Message-----
> From: Gerd Hoffmann [mailto:kraxel@redhat.com]
> Sent: Tuesday, February 25, 2014 7:29 AM
> To: linux-fbdev@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org; gregkh@linuxfoundation.org; KY Srinivasan;
> Abhishek Gupta (LIS); Haiyang Zhang; jasowang@redhat.com;
> tomi.valkeinen@ti.com; devel@linuxdriverproject.org; Gerd Hoffmann; Jean-
> Christophe Plagniol-Villard
> Subject: [PATCH v4 2/2] hyperv-fb: kick off efifb early
>
> Remove firmware framebuffer before initializing hyperv-fb. Needed
> on gen2 virtual machines. Letting register_framebuffer handle the
> switchover results in efifb still being active while hyperv graphics are
> initialized, which in turn can make the linux kernel hang.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> drivers/video/hyperv_fb.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c index
> b7b3dd0..1b11886 100644
> --- a/drivers/video/hyperv_fb.c
> +++ b/drivers/video/hyperv_fb.c
> @@ -683,6 +683,7 @@ static int hvfb_getmem(struct fb_info *info)
> info->apertures->ranges[0].base = pci_resource_start(pdev, 0);
> info->apertures->ranges[0].size = pci_resource_len(pdev, 0);
> }
> + remove_conflicting_framebuffers(info->apertures,
> KBUILD_MODNAME,
> +false);
Thanks for the updates. I'm concerned about, after removing efifb,
if synthvid_send_config(hdev) fails, then there will be no video driver
available. Is there a way to bring the generic driver back if
synthvid_send_config(hdev) fails?
If no way to recover the generic driver, please limit the early
remove_conflicting_framebuffers() to Gen2 VM only.
Thanks,
- Haiyang
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v4 2/2] hyperv-fb: kick off efifb early
2014-02-25 15:51 ` Haiyang Zhang
@ 2014-02-26 9:49 ` Gerd Hoffmann
0 siblings, 0 replies; 5+ messages in thread
From: Gerd Hoffmann @ 2014-02-26 9:49 UTC (permalink / raw)
To: Haiyang Zhang
Cc: linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org,
gregkh@linuxfoundation.org, KY Srinivasan, Abhishek Gupta (LIS),
jasowang@redhat.com, tomi.valkeinen@ti.com,
devel@linuxdriverproject.org, Jean-Christophe Plagniol-Villard
Hi,
> > diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c index
> > b7b3dd0..1b11886 100644
> > --- a/drivers/video/hyperv_fb.c
> > +++ b/drivers/video/hyperv_fb.c
> > @@ -683,6 +683,7 @@ static int hvfb_getmem(struct fb_info *info)
> > info->apertures->ranges[0].base = pci_resource_start(pdev, 0);
> > info->apertures->ranges[0].size = pci_resource_len(pdev, 0);
> > }
> > + remove_conflicting_framebuffers(info->apertures,
> > KBUILD_MODNAME,
> > +false);
>
> Thanks for the updates. I'm concerned about, after removing efifb,
> if synthvid_send_config(hdev) fails, then there will be no video driver
> available.
That may happen, yes.
> Is there a way to bring the generic driver back if
> synthvid_send_config(hdev) fails?
Not that I know of.
> If no way to recover the generic driver, please limit the early
> remove_conflicting_framebuffers() to Gen2 VM only.
I'll send updated patches once they are tested.
cheers,
Gerd
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-02-26 9:49 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-25 12:28 [PATCH v4 0/2] hyperv-fb: add support for generation 2 virtual machines Gerd Hoffmann
2014-02-25 12:28 ` [PATCH v4 1/2] " Gerd Hoffmann
2014-02-25 12:28 ` [PATCH v4 2/2] hyperv-fb: kick off efifb early Gerd Hoffmann
2014-02-25 15:51 ` Haiyang Zhang
2014-02-26 9:49 ` Gerd Hoffmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).