aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/hyperv
diff options
context:
space:
mode:
authorToomas Soome <tsoome@FreeBSD.org>2020-11-30 08:22:40 +0000
committerToomas Soome <tsoome@FreeBSD.org>2020-11-30 08:22:40 +0000
commita4a10b37d422dcdff2b0d700ab073b3078627a08 (patch)
tree618705b9ee323cc3255c373b3fd51f60fafa64c1 /sys/dev/hyperv
parent52a832072d3721aa3d4efe3e28fb42f305a1d305 (diff)
Notes
Diffstat (limited to 'sys/dev/hyperv')
-rw-r--r--sys/dev/hyperv/vmbus/vmbus.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/sys/dev/hyperv/vmbus/vmbus.c b/sys/dev/hyperv/vmbus/vmbus.c
index 38e9cd7b4c26..7ff374acafa7 100644
--- a/sys/dev/hyperv/vmbus/vmbus.c
+++ b/sys/dev/hyperv/vmbus/vmbus.c
@@ -1337,8 +1337,8 @@ vmbus_get_mmio_res(device_t dev)
/*
* On Gen2 VMs, Hyper-V provides mmio space for framebuffer.
* This mmio address range is not useable for other PCI devices.
- * Currently only efifb driver is using this range without reserving
- * it from system.
+ * Currently only efifb and vbefb drivers are using this range without
+ * reserving it from system.
* Therefore, vmbus driver reserves it before any other PCI device
* drivers start to request mmio addresses.
*/
@@ -1348,6 +1348,9 @@ static void
vmbus_fb_mmio_res(device_t dev)
{
struct efi_fb *efifb;
+ struct vbe_fb *vbefb;
+ rman_res_t fb_start, fb_end, fb_count;
+ int fb_height, fb_width;
caddr_t kmdp;
struct vmbus_softc *sc = device_get_softc(dev);
@@ -1359,30 +1362,43 @@ vmbus_fb_mmio_res(device_t dev)
efifb = (struct efi_fb *)preload_search_info(kmdp,
MODINFO_METADATA | MODINFOMD_EFI_FB);
if (efifb == NULL) {
+ vbefb = (struct vbe_fb *)preload_search_info(kmdp,
+ MODINFO_METADATA | MODINFOMD_VBE_FB);
+ fb_start = vbefb->fb_addr;
+ fb_end = vbefb->fb_addr + vbefb->fb_size;
+ fb_count = vbefb->fb_size;
+ fb_height = efifb->fb_height;
+ fb_width = efifb->fb_width;
+ } else {
+ fb_start = efifb->fb_addr;
+ fb_end = efifb->fb_addr + efifb->fb_size;
+ fb_count = efifb->fb_size;
+ fb_height = efifb->fb_height;
+ fb_width = efifb->fb_width;
+ }
+ if (fb_start == 0) {
if (bootverbose)
device_printf(dev,
- "fb has no preloaded kernel efi information\n");
+ "no preloaded kernel fb information\n");
/* We are on Gen1 VM, just return. */
return;
} else {
if (bootverbose)
device_printf(dev,
- "efifb: fb_addr: %#jx, size: %#jx, "
+ "fb: fb_addr: %#jx, size: %#jx, "
"actual size needed: 0x%x\n",
- efifb->fb_addr, efifb->fb_size,
- (int) efifb->fb_height * efifb->fb_width);
+ fb_start, fb_count, fb_height * fb_width);
}
hv_fb_res = pcib_host_res_alloc(&sc->vmbus_mmio_res, dev,
- SYS_RES_MEMORY, &rid,
- efifb->fb_addr, efifb->fb_addr + efifb->fb_size, efifb->fb_size,
+ SYS_RES_MEMORY, &rid, fb_start, fb_end, fb_count,
RF_ACTIVE | rman_make_alignment_flags(PAGE_SIZE));
if (hv_fb_res && bootverbose)
device_printf(dev,
"successfully reserved memory for framebuffer "
"starting at %#jx, size %#jx\n",
- efifb->fb_addr, efifb->fb_size);
+ fb_start, fb_count);
}
static void