* Re: [PATCH v2 2/5] vmbus: add missing breaks
From: Gerd Hoffmann @ 2014-02-24 10:55 UTC (permalink / raw)
To: Dan Carpenter
Cc: linux-fbdev, gregkh, jasowang, linux-kernel, tomi.valkeinen,
open list:Hyper-V CORE AND..., haiyangz
In-Reply-To: <20140224104207.GG26722@mwanda>
On Mo, 2014-02-24 at 13:42 +0300, Dan Carpenter wrote:
> I'm sorry, I know it sucks to not get credit for fixes, but please just
> fold this into [patch 1/5]. We really should have a tag for this kind
> of thing.
It's not because of the credits, but because Greg picked up #1 into one
of his branches already (cover letter explains this). I'll happily
submit a v3 with 1+2 squashed together if that doesn't ruin the patch
workflow. Greg?
cheers,
Gerd
^ permalink raw reply
* Re: [PATCH v2 2/5] vmbus: add missing breaks
From: Dan Carpenter @ 2014-02-24 10:42 UTC (permalink / raw)
To: Gerd Hoffmann
Cc: linux-fbdev, gregkh, jasowang, linux-kernel, tomi.valkeinen,
open list:Hyper-V CORE AND..., haiyangz
In-Reply-To: <1393237516-28545-3-git-send-email-kraxel@redhat.com>
I'm sorry, I know it sucks to not get credit for fixes, but please just
fold this into [patch 1/5]. We really should have a tag for this kind
of thing.
Would something like this work?
Additional-Fixes: Gerd Hoffmann <kraxel@redhat.com>
regards,
dan carpenter
^ permalink raw reply
* Re: [PATCH v2 1/5] Drivers: hv: vmbus: Extract the mmio information from DSDT
From: Dan Carpenter @ 2014-02-24 10:36 UTC (permalink / raw)
To: Gerd Hoffmann
Cc: linux-fbdev, gregkh, jasowang, linux-kernel, tomi.valkeinen,
open list:Hyper-V CORE AND..., haiyangz
In-Reply-To: <1393237516-28545-2-git-send-email-kraxel@redhat.com>
On Mon, Feb 24, 2014 at 11:25:12AM +0100, Gerd Hoffmann wrote:
> -static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *irq)
> +static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
> {
> + switch (res->type) {
> + case ACPI_RESOURCE_TYPE_IRQ:
> + irq = res->data.irq.interrupts[0];
>
> - if (res->type = ACPI_RESOURCE_TYPE_IRQ) {
> - struct acpi_resource_irq *irqp;
> - irqp = &res->data.irq;
> -
> - *((unsigned int *)irq) = irqp->interrupts[0];
Add a /* fall through */ comment here.
> + case ACPI_RESOURCE_TYPE_ADDRESS64:
> + hyperv_mmio_start = res->data.address64.minimum;
> + hyperv_mmio_size = res->data.address64.address_length;
> }
regards,
dan carpenter
^ permalink raw reply
* [PATCH v2 5/5] hyperv-fb: kick off efifb early
From: Gerd Hoffmann @ 2014-02-24 10:25 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, abgupta, haiyangz, jasowang,
tomi.valkeinen, Gerd Hoffmann, Jean-Christophe Plagniol-Villard,
open list:Hyper-V CORE AND...
In-Reply-To: <1393237516-28545-1-git-send-email-kraxel@redhat.com>
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 ec4b22c..b425951 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, "hyperv-fb", false);
info->fix.smem_start = par->mem.start;
info->fix.smem_len = screen_fb_size;
--
1.8.3.1
^ permalink raw reply related
* [PATCH v2 4/5] hyperv-fb: add support for generation 2 virtual machines.
From: Gerd Hoffmann @ 2014-02-24 10:25 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, abgupta, haiyangz, jasowang,
tomi.valkeinen, Gerd Hoffmann, Jean-Christophe Plagniol-Villard,
open list:Hyper-V CORE AND...
In-Reply-To: <1393237516-28545-1-git-send-email-kraxel@redhat.com>
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..ec4b22c 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 = "hyperv_fb";
+ 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");
+ return -ENODEV;
+ }
+ }
- 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
* [PATCH v2 3/5] vmbus: use resource for hyperv mmio region
From: Gerd Hoffmann @ 2014-02-24 10:25 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, abgupta, haiyangz, jasowang,
tomi.valkeinen, Gerd Hoffmann, open list:Hyper-V CORE AND...
In-Reply-To: <1393237516-28545-1-git-send-email-kraxel@redhat.com>
Use a resource for the hyperv mmio region instead of start/size
variables. Register the region properly so it shows up in
/proc/iomem.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
drivers/hv/vmbus_drv.c | 16 ++++++++++------
include/linux/hyperv.h | 3 +--
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index 2352ae48..a14f603 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -43,10 +43,12 @@ static struct acpi_device *hv_acpi_dev;
static struct tasklet_struct msg_dpc;
static struct completion probe_event;
static int irq;
-u64 hyperv_mmio_start;
-EXPORT_SYMBOL_GPL(hyperv_mmio_start);
-u64 hyperv_mmio_size;
-EXPORT_SYMBOL_GPL(hyperv_mmio_size);
+
+struct resource hyperv_mmio = {
+ .name = "hyperv mmio",
+ .flags = IORESOURCE_MEM,
+};
+EXPORT_SYMBOL_GPL(hyperv_mmio);
static int vmbus_exists(void)
{
@@ -902,8 +904,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
break;
case ACPI_RESOURCE_TYPE_ADDRESS64:
- hyperv_mmio_start = res->data.address64.minimum;
- hyperv_mmio_size = res->data.address64.address_length;
+ hyperv_mmio.start = res->data.address64.minimum;
+ hyperv_mmio.end = res->data.address64.maximum;
break;
}
@@ -933,6 +935,8 @@ static int vmbus_acpi_add(struct acpi_device *device)
if (ACPI_FAILURE(result))
goto acpi_walk_err;
+ if (hyperv_mmio.start && hyperv_mmio.end)
+ request_resource(&iomem_resource, &hyperv_mmio);
}
ret_val = 0;
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index be3028f..c93e342 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -1459,8 +1459,7 @@ int hv_vss_init(struct hv_util_service *);
void hv_vss_deinit(void);
void hv_vss_onchannelcallback(void *);
-extern u64 hyperv_mmio_start;
-extern u64 hyperv_mmio_size;
+extern struct resource hyperv_mmio;
/*
* Negotiated version with the Host.
--
1.8.3.1
^ permalink raw reply related
* [PATCH v2 2/5] vmbus: add missing breaks
From: Gerd Hoffmann @ 2014-02-24 10:25 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, abgupta, haiyangz, jasowang,
tomi.valkeinen, Gerd Hoffmann, open list:Hyper-V CORE AND...
In-Reply-To: <1393237516-28545-1-git-send-email-kraxel@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
drivers/hv/vmbus_drv.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index b37c91b..2352ae48 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -899,10 +899,12 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
switch (res->type) {
case ACPI_RESOURCE_TYPE_IRQ:
irq = res->data.irq.interrupts[0];
+ break;
case ACPI_RESOURCE_TYPE_ADDRESS64:
hyperv_mmio_start = res->data.address64.minimum;
hyperv_mmio_size = res->data.address64.address_length;
+ break;
}
return AE_OK;
--
1.8.3.1
^ permalink raw reply related
* [PATCH v2 1/5] Drivers: hv: vmbus: Extract the mmio information from DSDT
From: Gerd Hoffmann @ 2014-02-24 10:25 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, abgupta, haiyangz, jasowang,
tomi.valkeinen, open list:Hyper-V CORE AND...
In-Reply-To: <1393237516-28545-1-git-send-email-kraxel@redhat.com>
From: "K. Y. Srinivasan" <kys@microsoft.com>
On Gen2 firmware, Hyper-V does not emulate the PCI bus. However, the MMIO
information is packaged up in DSDT. Extract this information and export it
for use by the synthetic framebuffer driver. This is the only driver that
needs this currently.
In this version of the patch mmio, I have updated the hyperv header file
(linux/hyperv.h) with mmio definitions.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/hv/vmbus_drv.c | 45 ++++++++++++++++++++++++++++++++-------------
include/linux/hyperv.h | 3 +++
2 files changed, 35 insertions(+), 13 deletions(-)
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index 077bb1b..b37c91b 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -43,6 +43,10 @@ static struct acpi_device *hv_acpi_dev;
static struct tasklet_struct msg_dpc;
static struct completion probe_event;
static int irq;
+u64 hyperv_mmio_start;
+EXPORT_SYMBOL_GPL(hyperv_mmio_start);
+u64 hyperv_mmio_size;
+EXPORT_SYMBOL_GPL(hyperv_mmio_size);
static int vmbus_exists(void)
{
@@ -886,18 +890,19 @@ void vmbus_device_unregister(struct hv_device *device_obj)
/*
- * VMBUS is an acpi enumerated device. Get the the IRQ information
- * from DSDT.
+ * VMBUS is an acpi enumerated device. Get the the information we
+ * need from DSDT.
*/
-static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *irq)
+static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
{
+ switch (res->type) {
+ case ACPI_RESOURCE_TYPE_IRQ:
+ irq = res->data.irq.interrupts[0];
- if (res->type = ACPI_RESOURCE_TYPE_IRQ) {
- struct acpi_resource_irq *irqp;
- irqp = &res->data.irq;
-
- *((unsigned int *)irq) = irqp->interrupts[0];
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ hyperv_mmio_start = res->data.address64.minimum;
+ hyperv_mmio_size = res->data.address64.address_length;
}
return AE_OK;
@@ -906,18 +911,32 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *irq)
static int vmbus_acpi_add(struct acpi_device *device)
{
acpi_status result;
+ int ret_val = -ENODEV;
hv_acpi_dev = device;
result = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
- vmbus_walk_resources, &irq);
+ vmbus_walk_resources, NULL);
- if (ACPI_FAILURE(result)) {
- complete(&probe_event);
- return -ENODEV;
+ if (ACPI_FAILURE(result))
+ goto acpi_walk_err;
+ /*
+ * The parent of the vmbus acpi device (Gen2 firmware) is the VMOD that
+ * has the mmio ranges. Get that.
+ */
+ if (device->parent) {
+ result = acpi_walk_resources(device->parent->handle,
+ METHOD_NAME__CRS,
+ vmbus_walk_resources, NULL);
+
+ if (ACPI_FAILURE(result))
+ goto acpi_walk_err;
}
+ ret_val = 0;
+
+acpi_walk_err:
complete(&probe_event);
- return 0;
+ return ret_val;
}
static const struct acpi_device_id vmbus_acpi_device_ids[] = {
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index 344883d..be3028f 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -1459,6 +1459,9 @@ int hv_vss_init(struct hv_util_service *);
void hv_vss_deinit(void);
void hv_vss_onchannelcallback(void *);
+extern u64 hyperv_mmio_start;
+extern u64 hyperv_mmio_size;
+
/*
* Negotiated version with the Host.
*/
--
1.8.3.1
^ permalink raw reply related
* [PATCH v2 0/5] hyperv-fb: add support for generation 2 virtual machines.
From: Gerd Hoffmann @ 2014-02-24 10:25 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, abgupta, haiyangz, jasowang,
tomi.valkeinen, Gerd Hoffmann
Hi,
This patch series adds support for uefi-based gen2 virtual machines to
the hyperv-fb driver.
Patch #1 is included just for completeness. Greg picked it up
already and it is in -next, but it isn't in master yet.
Patch #2 is a bugfix for the first patch.
Patch #3 changes vmbus to properly hook the hyperv mmio area into
the linux resource management.
Patch #4 actually implements gen2 vm support for hyperv-fb, building
on the hyperv mmio support added by the other patches.
Patch #5 unregisters efifb early to make sure the framebuffer isn't used
any more while hyperv-fb initialization is in progress. This patch is
new in v2 and it fixes the hang listed as "known issue" in v1 of this
patch series.
please apply,
Gerd
Gerd Hoffmann (4):
vmbus: add missing breaks
vmbus: use resource for hyperv mmio region
hyperv-fb: add support for generation 2 virtual machines.
hyperv-fb: kick off efifb early
K. Y. Srinivasan (1):
Drivers: hv: vmbus: Extract the mmio information from DSDT
drivers/hv/vmbus_drv.c | 51 ++++++++++++++++++++-------
drivers/video/hyperv_fb.c | 87 +++++++++++++++++++++++++++++++++--------------
include/linux/hyperv.h | 2 ++
3 files changed, 101 insertions(+), 39 deletions(-)
--
1.8.3.1
^ permalink raw reply
* [PATCH] fbdev: FB_OPENCORES should depend on HAS_DMA
From: Geert Uytterhoeven @ 2014-02-21 19:56 UTC (permalink / raw)
To: Jean-Christophe Plagniol-Villard, Tomi Valkeinen,
Stefan Kristiansson
Cc: linux-fbdev, linux-kernel, Geert Uytterhoeven
If NO_DMA=y:
drivers/built-in.o: In function `ocfb_remove':
ocfb.c:(.text+0x27fee): undefined reference to `dma_free_coherent'
drivers/built-in.o: In function `ocfb_probe':
ocfb.c:(.text+0x28418): undefined reference to `dma_alloc_coherent'
ocfb.c:(.text+0x284d2): undefined reference to `dma_free_coherent'
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
drivers/video/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index 0192900dd183..fb8d31e717bc 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -982,7 +982,7 @@ config FB_PVR2
config FB_OPENCORES
tristate "OpenCores VGA/LCD core 2.0 framebuffer support"
- depends on FB
+ depends on FB && HAS_DMA
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
--
1.7.9.5
^ permalink raw reply related
* RE: [PATCH 4/4] hyperv-fb: add support for generation 2 virtual machines.
From: KY Srinivasan @ 2014-02-21 14:49 UTC (permalink / raw)
To: Gerd Hoffmann, linux-fbdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org,
Haiyang Zhang, jasowang@redhat.com,
Jean-Christophe Plagniol-Villard, Tomi Valkeinen,
open list:Hyper-V CORE AND...
In-Reply-To: <1392973004-28215-5-git-send-email-kraxel@redhat.com>
> -----Original Message-----
> From: Gerd Hoffmann [mailto:kraxel@redhat.com]
> Sent: Friday, February 21, 2014 12:57 AM
> To: linux-fbdev@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org; gregkh@linuxfoundation.org; KY Srinivasan;
> Haiyang Zhang; jasowang@redhat.com; Gerd Hoffmann; Jean-Christophe
> Plagniol-Villard; Tomi Valkeinen; open list:Hyper-V CORE AND...
> Subject: [PATCH 4/4] hyperv-fb: add support for generation 2 virtual machines.
>
> 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..f956cd9 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;
> + bool gen2vm = efi_enabled(EFI_BOOT);
Gerd,
efi_enabled() returns an int and not a bool. That is the fix that Haiyang made last night.
K. Y
> + int ret;
>
> - pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
> + par->mem.name = "hyperv_fb";
> + 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");
> + return -ENODEV;
> + }
> + }
>
> - 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
* [PATCH] hyperv-fb: kick off efifb early
From: Gerd Hoffmann @ 2014-02-21 14:39 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, haiyangz, jasowang, Gerd Hoffmann,
Jean-Christophe Plagniol-Villard, Tomi Valkeinen,
open list:Hyper-V CORE AND...
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 f956cd9..3901ffe 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, "hyperv-fb", false);
info->fix.smem_start = par->mem.start;
info->fix.smem_len = screen_fb_size;
--
1.8.3.1
^ permalink raw reply related
* Re: [PATCH v5] video: add OpenCores VGA/LCD framebuffer driver
From: Uwe Kleine-König @ 2014-02-21 13:54 UTC (permalink / raw)
To: Stefan Kristiansson; +Cc: linux-kernel, linux-fbdev, tomi.valkeinen, plagnioj
In-Reply-To: <1389384793-4710-1-git-send-email-stefan.kristiansson@saunalahti.fi>
Hello,
On Fri, Jan 10, 2014 at 10:13:13PM +0200, Stefan Kristiansson wrote:
> This adds support for the VGA/LCD core available from OpenCores:
> http://opencores.org/project,vga_lcd
>
> The driver have been tested together with both OpenRISC and
> ARM (socfpga) processors.
>
> Signed-off-by: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
> ---
> Changes in v2:
> - Add Microblaze as an example user and fix a typo in Xilinx Zynq
>
> Changes in v3:
> - Use devm_kzalloc instead of kzalloc
> - Remove superflous MODULE #ifdef
>
> Changes in v4:
> - Remove 'default n' in Kconfig
> - Simplify ioremap/request_mem_region by using devm_ioremap_resource
> - Remove release_mem_region
>
> Changes in v5:
> - Remove static structs to support multiple devices
> ---
> drivers/video/Kconfig | 16 ++
> drivers/video/Makefile | 1 +
> drivers/video/ocfb.c | 440 +++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 457 insertions(+)
> create mode 100644 drivers/video/ocfb.c
>
> diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
> index 84b685f..8e41a1e 100644
> --- a/drivers/video/Kconfig
> +++ b/drivers/video/Kconfig
> @@ -979,6 +979,22 @@ config FB_PVR2
> (<file:drivers/video/pvr2fb.c>). Please see the file
> <file:Documentation/fb/pvr2fb.txt>.
>
> +config FB_OPENCORES
> + tristate "OpenCores VGA/LCD core 2.0 framebuffer support"
> + depends on FB
Maybe add something like:
depends on ARCH_SOCFPGA || ARCH_ZYNQ || MICROBLAZE || OPENRISC || COMPILE_TEST
(Sorry for being late with that suggestion, this attracted my attention
only during make oldconfig on v3.14-rc, so if you agree this is a good
idea you need a seperate patch :-)
Best regards
Uwe
> + select FB_CFB_FILLRECT
> + select FB_CFB_COPYAREA
> + select FB_CFB_IMAGEBLIT
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
^ permalink raw reply
* [!! SPAM]Foreign Stakeholder Needed!!!
From: Yung kyu kim @ 2014-02-21 13:08 UTC (permalink / raw)
To: linux-fbdev
Hello,
The Project is about the exportation of 100,000 barrels of Light Crude
Oil daily out from Iraq to Turkey through my client's company in Iraq
at the rate of $92.00 per barrel. This amount to $9,200,000 daily. I ask
for your support as a foreigner to handle this business project with my
client and you are not expected to invest in Iraq
If yes, let me know and we will discuss this project proper.
Kim.
Contact My Private Email : 1469813849@qq.com
^ permalink raw reply
* Re: [PATCH Resend] video: exynos: Remove OF dependency for Exynos DP
From: Sachin Kamat @ 2014-02-21 10:52 UTC (permalink / raw)
To: linux-fbdev
In-Reply-To: <1392194002-6670-1-git-send-email-sachin.kamat@linaro.org>
On 12 February 2014 14:03, Sachin Kamat <sachin.kamat@linaro.org> wrote:
> OF dependency can be removed as the driver does not actually
> depend on it at all.
>
> Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
> Acked-by: Jingoo Han <jg1.han@samsung.com>
> ---
> drivers/video/exynos/Kconfig | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/video/exynos/Kconfig b/drivers/video/exynos/Kconfig
> index 1129d0e9e640..976594d578a9 100644
> --- a/drivers/video/exynos/Kconfig
> +++ b/drivers/video/exynos/Kconfig
> @@ -30,7 +30,7 @@ config EXYNOS_LCD_S6E8AX0
>
> config EXYNOS_DP
> bool "EXYNOS DP driver support"
> - depends on OF && ARCH_EXYNOS
> + depends on ARCH_EXYNOS
> default n
> help
> This enables support for DP device.
> --
> 1.7.9.5
>
Gentle ping, Tomi.
--
With warm regards,
Sachin
^ permalink raw reply
* Re: [PATCH 00/11] SimpleDRM & Sysfb
From: Thierry Reding @ 2014-02-21 9:56 UTC (permalink / raw)
To: David Herrmann
Cc: linux-fbdev@vger.kernel.org, Daniel Vetter, linux-kernel,
dri-devel@lists.freedesktop.org, Tomi Valkeinen, Ingo Molnar
In-Reply-To: <CANq1E4S=+ixMQRMfX2-DXh3ZDO0jNAdWrUe6=z9aTdOSfR-SDA@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1908 bytes --]
On Mon, Jan 27, 2014 at 11:18:51PM +0100, David Herrmann wrote:
> Hi
>
> On Thu, Jan 23, 2014 at 3:14 PM, David Herrmann <dh.herrmann@gmail.com> wrote:
> > Hi
> >
> > Another round of SimpleDRM patches. I somehow lost track of the last ones and as
> > this is a major rewrite, I'll just start at v1 again.
> >
> > Some comments up-front:
> >
> > - @Ingo: Patch #1 and #2 are unchanged from the previous ML discussions. I
> > included them in this series as the other patches depend on them. Could you
> > pick them up for the x86 tree? The other 9 patches won't make it in 3.14 so
> > no reason to put them through the DRM tree.
> > All mentioned issues should be addressed. If there's still sth missing,
> > please let me know.
> >
> > - The DRM patches depend on my "DRM Anonymous Inode" patches. But it should be
> > trivial to apply them on drm-next (I think only one line needs to be changed:
> > i_mapping => dev_mapping).
> >
> > - I tested the SimpleDRM fbdev fallback with linux-console+Xorg and it works
> > fine. The DRM backend is only tested with some DRM tests I have locally. I
> > have no idea how to make Xorg pick up a specific /dev/dri/card0 card. It
> > always tells me "no screens found" (as the underlying device is not marked as
> > boot_vga..). If someone knows how to tell Xorg to use card0, I'd gladly test
> > this. But I'm no longer used to writing xorg.confs..
>
> For completeness, I tested this with Xorg+xf86-video-modesetting and
> it works just fine. The xorg.conf I used can be found below. If this
> driver gets upstreamed, I will try to make the X11 auto-loader detect
> it just like any other platform-device.
I recently posted patches[0] to the xorg-devel mailing list that I think
should solve that issue.
Thierry
[0]: http://lists.x.org/archives/xorg-devel/2014-February/040568.html
[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply
* [PATCH 4/4] hyperv-fb: add support for generation 2 virtual machines.
From: Gerd Hoffmann @ 2014-02-21 8:56 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, haiyangz, jasowang, Gerd Hoffmann,
Jean-Christophe Plagniol-Villard, Tomi Valkeinen,
open list:Hyper-V CORE AND...
In-Reply-To: <1392973004-28215-1-git-send-email-kraxel@redhat.com>
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..f956cd9 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;
+ bool gen2vm = efi_enabled(EFI_BOOT);
+ int ret;
- pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
+ par->mem.name = "hyperv_fb";
+ 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");
+ return -ENODEV;
+ }
+ }
- 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
* [PATCH 3/4] vmbus: use resource for hyperv mmio region
From: Gerd Hoffmann @ 2014-02-21 8:56 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, haiyangz, jasowang, Gerd Hoffmann,
open list:Hyper-V CORE AND...
In-Reply-To: <1392973004-28215-1-git-send-email-kraxel@redhat.com>
Use a resource for the hyperv mmio region instead of start/size
variables. Register the region properly so it shows up in
/proc/iomem.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
drivers/hv/vmbus_drv.c | 16 ++++++++++------
include/linux/hyperv.h | 3 +--
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index 2352ae48..a14f603 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -43,10 +43,12 @@ static struct acpi_device *hv_acpi_dev;
static struct tasklet_struct msg_dpc;
static struct completion probe_event;
static int irq;
-u64 hyperv_mmio_start;
-EXPORT_SYMBOL_GPL(hyperv_mmio_start);
-u64 hyperv_mmio_size;
-EXPORT_SYMBOL_GPL(hyperv_mmio_size);
+
+struct resource hyperv_mmio = {
+ .name = "hyperv mmio",
+ .flags = IORESOURCE_MEM,
+};
+EXPORT_SYMBOL_GPL(hyperv_mmio);
static int vmbus_exists(void)
{
@@ -902,8 +904,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
break;
case ACPI_RESOURCE_TYPE_ADDRESS64:
- hyperv_mmio_start = res->data.address64.minimum;
- hyperv_mmio_size = res->data.address64.address_length;
+ hyperv_mmio.start = res->data.address64.minimum;
+ hyperv_mmio.end = res->data.address64.maximum;
break;
}
@@ -933,6 +935,8 @@ static int vmbus_acpi_add(struct acpi_device *device)
if (ACPI_FAILURE(result))
goto acpi_walk_err;
+ if (hyperv_mmio.start && hyperv_mmio.end)
+ request_resource(&iomem_resource, &hyperv_mmio);
}
ret_val = 0;
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index be3028f..c93e342 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -1459,8 +1459,7 @@ int hv_vss_init(struct hv_util_service *);
void hv_vss_deinit(void);
void hv_vss_onchannelcallback(void *);
-extern u64 hyperv_mmio_start;
-extern u64 hyperv_mmio_size;
+extern struct resource hyperv_mmio;
/*
* Negotiated version with the Host.
--
1.8.3.1
^ permalink raw reply related
* [PATCH 2/4] vmbus: add missing breaks
From: Gerd Hoffmann @ 2014-02-21 8:56 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, haiyangz, jasowang, Gerd Hoffmann,
open list:Hyper-V CORE AND...
In-Reply-To: <1392973004-28215-1-git-send-email-kraxel@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
drivers/hv/vmbus_drv.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index b37c91b..2352ae48 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -899,10 +899,12 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
switch (res->type) {
case ACPI_RESOURCE_TYPE_IRQ:
irq = res->data.irq.interrupts[0];
+ break;
case ACPI_RESOURCE_TYPE_ADDRESS64:
hyperv_mmio_start = res->data.address64.minimum;
hyperv_mmio_size = res->data.address64.address_length;
+ break;
}
return AE_OK;
--
1.8.3.1
^ permalink raw reply related
* [PATCH 1/4] Drivers: hv: vmbus: Extract the mmio information from DSDT
From: Gerd Hoffmann @ 2014-02-21 8:56 UTC (permalink / raw)
To: linux-fbdev
Cc: linux-kernel, gregkh, kys, haiyangz, jasowang,
open list:Hyper-V CORE AND...
In-Reply-To: <1392973004-28215-1-git-send-email-kraxel@redhat.com>
From: "K. Y. Srinivasan" <kys@microsoft.com>
On Gen2 firmware, Hyper-V does not emulate the PCI bus. However, the MMIO
information is packaged up in DSDT. Extract this information and export it
for use by the synthetic framebuffer driver. This is the only driver that
needs this currently.
In this version of the patch mmio, I have updated the hyperv header file
(linux/hyperv.h) with mmio definitions.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/hv/vmbus_drv.c | 45 ++++++++++++++++++++++++++++++++-------------
include/linux/hyperv.h | 3 +++
2 files changed, 35 insertions(+), 13 deletions(-)
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index 077bb1b..b37c91b 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -43,6 +43,10 @@ static struct acpi_device *hv_acpi_dev;
static struct tasklet_struct msg_dpc;
static struct completion probe_event;
static int irq;
+u64 hyperv_mmio_start;
+EXPORT_SYMBOL_GPL(hyperv_mmio_start);
+u64 hyperv_mmio_size;
+EXPORT_SYMBOL_GPL(hyperv_mmio_size);
static int vmbus_exists(void)
{
@@ -886,18 +890,19 @@ void vmbus_device_unregister(struct hv_device *device_obj)
/*
- * VMBUS is an acpi enumerated device. Get the the IRQ information
- * from DSDT.
+ * VMBUS is an acpi enumerated device. Get the the information we
+ * need from DSDT.
*/
-static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *irq)
+static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
{
+ switch (res->type) {
+ case ACPI_RESOURCE_TYPE_IRQ:
+ irq = res->data.irq.interrupts[0];
- if (res->type = ACPI_RESOURCE_TYPE_IRQ) {
- struct acpi_resource_irq *irqp;
- irqp = &res->data.irq;
-
- *((unsigned int *)irq) = irqp->interrupts[0];
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ hyperv_mmio_start = res->data.address64.minimum;
+ hyperv_mmio_size = res->data.address64.address_length;
}
return AE_OK;
@@ -906,18 +911,32 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *irq)
static int vmbus_acpi_add(struct acpi_device *device)
{
acpi_status result;
+ int ret_val = -ENODEV;
hv_acpi_dev = device;
result = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
- vmbus_walk_resources, &irq);
+ vmbus_walk_resources, NULL);
- if (ACPI_FAILURE(result)) {
- complete(&probe_event);
- return -ENODEV;
+ if (ACPI_FAILURE(result))
+ goto acpi_walk_err;
+ /*
+ * The parent of the vmbus acpi device (Gen2 firmware) is the VMOD that
+ * has the mmio ranges. Get that.
+ */
+ if (device->parent) {
+ result = acpi_walk_resources(device->parent->handle,
+ METHOD_NAME__CRS,
+ vmbus_walk_resources, NULL);
+
+ if (ACPI_FAILURE(result))
+ goto acpi_walk_err;
}
+ ret_val = 0;
+
+acpi_walk_err:
complete(&probe_event);
- return 0;
+ return ret_val;
}
static const struct acpi_device_id vmbus_acpi_device_ids[] = {
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index 344883d..be3028f 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -1459,6 +1459,9 @@ int hv_vss_init(struct hv_util_service *);
void hv_vss_deinit(void);
void hv_vss_onchannelcallback(void *);
+extern u64 hyperv_mmio_start;
+extern u64 hyperv_mmio_size;
+
/*
* Negotiated version with the Host.
*/
--
1.8.3.1
^ permalink raw reply related
* [PATCH 0/4] hyperv-fb: add support for generation 2 virtual machines
From: Gerd Hoffmann @ 2014-02-21 8:56 UTC (permalink / raw)
To: linux-fbdev; +Cc: linux-kernel, gregkh, kys, haiyangz, jasowang, Gerd Hoffmann
Hi,
This patch series adds support for uefi-based gen2 virtual machines to
the hyperv-fb driver.
First patch is included just for completeness. Greg picked it up
already and it is in -next, but it isn't in master yet.
Second patch is a bugfix for the first patch.
Third patch changes vmbus to properly hook the hyperv mmio area into
the linux resource management.
Final patch actually implements gen2 vm support for hyperv-fb, building
on the hyperv mmio support added by the other patches.
Known issue: There is a long delay when loading the hyperv-fb driver on
gen2 virtual machines which isn't present on gen1 virtual machines.
Gerd Hoffmann (3):
vmbus: add missing breaks
vmbus: use resource for hyperv mmio region
hyperv-fb: add support for generation 2 virtual machines.
K. Y. Srinivasan (1):
Drivers: hv: vmbus: Extract the mmio information from DSDT
drivers/hv/vmbus_drv.c | 51 +++++++++++++++++++++-------
drivers/video/hyperv_fb.c | 86 +++++++++++++++++++++++++++++++++--------------
include/linux/hyperv.h | 2 ++
3 files changed, 100 insertions(+), 39 deletions(-)
--
1.8.3.1
^ permalink raw reply
* [PATCH] video: da8xx-fb: fix typos
From: Prabhakar Lad @ 2014-02-21 6:53 UTC (permalink / raw)
To: Jean-Christophe Plagniol-Villard, Tomi Valkeinen
Cc: linux-kernel, linux-fbdev, linux-pm, Lad, Prabhakar
From: "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
This patch fixes couple of typos in the comments
for da8xx-fb.c file.
Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com>
---
drivers/video/da8xx-fb.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index a1d74dd..dced43a 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -265,7 +265,7 @@ static void lcd_enable_raster(void)
lcdc_write(0, LCD_CLK_RESET_REG);
mdelay(1);
- /* Above reset sequence doesnot reset register context */
+ /* Above reset sequence does not reset register context */
reg = lcdc_read(LCD_RASTER_CTRL_REG);
if (!(reg & LCD_RASTER_ENABLE))
lcdc_write(reg | LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
@@ -357,7 +357,7 @@ static void lcd_blit(int load_mode, struct da8xx_fb_par *par)
lcd_enable_raster();
}
-/* Configure the Burst Size and fifo threhold of DMA */
+/* Configure the Burst Size and fifo threshold of DMA */
static int lcd_cfg_dma(int burst_size, int fifo_th)
{
u32 reg;
@@ -393,7 +393,7 @@ static void lcd_cfg_ac_bias(int period, int transitions_per_int)
{
u32 reg;
- /* Set the AC Bias Period and Number of Transisitons per Interrupt */
+ /* Set the AC Bias Period and Number of Transitions per Interrupt */
reg = lcdc_read(LCD_RASTER_TIMING_2_REG) & 0xFFF00000;
reg |= LCD_AC_BIAS_FREQUENCY(period) |
LCD_AC_BIAS_TRANSITIONS_PER_INT(transitions_per_int);
--
1.7.9.5
^ permalink raw reply related
* [PATCH v2,2/2] hyperv_fb: Add support for Gen2 VM
From: Haiyang Zhang @ 2014-02-21 4:59 UTC (permalink / raw)
To: plagnioj, tomi.valkeinen, akpm, linux-fbdev
Cc: olaf, jasowang, driverdev-devel, linux-kernel, haiyangz
In-Reply-To: <1392961811-11960-1-git-send-email-haiyangz@microsoft.com>
This patch enables Hyper-V FB driver to run on Gen2 VM.
The Gen2 VM provides MMIO area for synthetic video from ACPI module,
which is exported by vmbus. The generic video is provided by UEFI. PCI
video in Gen1 is no longer available.
To support synthetic video on Hyper-V Gen2 VM, this patch updated
code related to the changes above.
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
---
drivers/video/hyperv_fb.c | 60 ++++++++++++++++++++++++++++++--------------
1 files changed, 41 insertions(+), 19 deletions(-)
diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c
index bbcc8c0..5db1f20 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>
@@ -461,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;
@@ -635,22 +636,33 @@ 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;
+ struct pci_dev *pdev = NULL;
ulong fb_phys;
void __iomem *fb_virt;
+ int gen2vm = efi_enabled(EFI_BOOT);
- pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
+ if (gen2vm) {
+ if (!hyperv_mmio_start || hyperv_mmio_size < screen_fb_size) {
+ pr_err("Unable to find ACPI MMIO area\n");
+ return -ENODEV;
+ }
+
+ fb_phys = hyperv_mmio_start;
+ } 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;
+ }
- fb_phys = pci_resource_end(pdev, 0) - screen_fb_size + 1;
if (!request_mem_region(fb_phys, screen_fb_size, KBUILD_MODNAME))
goto err1;
@@ -662,14 +674,22 @@ 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);
+ 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 = fb_phys;
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:
@@ -677,7 +697,9 @@ err3:
err2:
release_mem_region(fb_phys, screen_fb_size);
err1:
- pci_dev_put(pdev);
+ if (!gen2vm)
+ pci_dev_put(pdev);
+
return -ENOMEM;
}
--
1.7.4.1
^ permalink raw reply related
* [PATCH v2,1/2] hyperv_fb: Add screen refresh after pause/resume operation
From: Haiyang Zhang @ 2014-02-21 4:59 UTC (permalink / raw)
To: plagnioj, tomi.valkeinen, akpm, linux-fbdev
Cc: olaf, jasowang, driverdev-devel, linux-kernel, haiyangz
In-Reply-To: <1392961811-11960-1-git-send-email-haiyangz@microsoft.com>
This is necessary because after VM is pause/resumed, some portion of
the screen may need refresh.
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
---
drivers/video/hyperv_fb.c | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c
index 130708f..bbcc8c0 100644
--- a/drivers/video/hyperv_fb.c
+++ b/drivers/video/hyperv_fb.c
@@ -218,6 +218,7 @@ struct hvfb_par {
struct delayed_work dwork;
bool update;
+ bool xrefresh;
u32 pseudo_palette[16];
u8 init_buf[MAX_VMBUS_PKT_SIZE];
@@ -369,7 +370,7 @@ static void synthvid_recv_sub(struct hv_device *hdev)
synthvid_send_situ(hdev);
}
- par->update = msg->feature_chg.is_dirt_needed;
+ par->xrefresh = par->update = msg->feature_chg.is_dirt_needed;
if (par->update)
schedule_delayed_work(&par->dwork, HVFB_UPDATE_DELAY);
}
@@ -522,6 +523,13 @@ static void hvfb_update_work(struct work_struct *w)
{
struct hvfb_par *par = container_of(w, struct hvfb_par, dwork.work);
struct fb_info *info = par->info;
+ char *argv[] = {"/usr/bin/xrefresh", "-display", ":0.0", NULL};
+ char *envp[] = {"HOME=/", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
+
+ if (par->xrefresh) {
+ par->xrefresh = false;
+ call_usermodehelper(argv[0], argv, envp, UMH_NO_WAIT);
+ }
if (par->fb_ready)
synthvid_update(info);
--
1.7.4.1
^ permalink raw reply related
* [PATCH v2,0/2] Re-sending two patches for hyperv_fb
From: Haiyang Zhang @ 2014-02-21 4:58 UTC (permalink / raw)
To: plagnioj, tomi.valkeinen, akpm, linux-fbdev
Cc: olaf, jasowang, driverdev-devel, linux-kernel, haiyangz
They were sent out during tree closing, I'm re-sending them now.
---
v2:
Updated the variable type gen2vm to int, because efi_enabled() returns int.
Haiyang Zhang (2):
hyperv_fb: Add screen refresh after pause/resume operation
hyperv_fb: Add support for Gen2 VM
drivers/video/hyperv_fb.c | 70 ++++++++++++++++++++++++++++++++-------------
1 files changed, 50 insertions(+), 20 deletions(-)
--
1.7.4.1
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox