View | Details | Raw Unified | Return to bug 222996 | Differences between
and this patch

Collapse All | Expand All

(-)b/head/sys/dev/hyperv/vmbus/vmbus.c (+57 lines)
Lines 35-40 Link Here
35
#include <sys/param.h>
35
#include <sys/param.h>
36
#include <sys/bus.h>
36
#include <sys/bus.h>
37
#include <sys/kernel.h>
37
#include <sys/kernel.h>
38
#include <sys/linker.h>
38
#include <sys/lock.h>
39
#include <sys/lock.h>
39
#include <sys/malloc.h>
40
#include <sys/malloc.h>
40
#include <sys/module.h>
41
#include <sys/module.h>
Lines 46-51 Link Here
46
47
47
#include <machine/bus.h>
48
#include <machine/bus.h>
48
#include <machine/intr_machdep.h>
49
#include <machine/intr_machdep.h>
50
#include <machine/metadata.h>
49
#include <machine/md_var.h>
51
#include <machine/md_var.h>
50
#include <machine/resource.h>
52
#include <machine/resource.h>
51
#include <x86/include/apicvar.h>
53
#include <x86/include/apicvar.h>
Lines 1332-1343 Link Here
1332
	vmbus_get_mmio_res_pass(dev, parse_32);
1334
	vmbus_get_mmio_res_pass(dev, parse_32);
1333
}
1335
}
1334
1336
1337
/*
1338
 * On Gen2 VMs, Hyper-V provides mmio space for framebuffer.
1339
 * This mmio address range is not useable for other PCI devices.
1340
 * Currently only efifb driver is using this range without reserving
1341
 * it from system.
1342
 * Therefore, vmbus driver reserves it before any other PCI devices
1343
 * drivers start to request mmio addresses.
1344
 */
1345
static struct resource *hv_fb_res;
1346
1335
static void
1347
static void
1348
vmbus_fb_mmio_res(device_t dev)
1349
{
1350
	struct efi_fb *efifb;
1351
	caddr_t kmdp;
1352
1353
	struct vmbus_softc *sc = device_get_softc(dev);
1354
	int rid = 0;
1355
1356
	kmdp = preload_search_by_type("elf kernel");
1357
	if (kmdp == NULL)
1358
		kmdp = preload_search_by_type("elf64 kernel");
1359
	efifb = (struct efi_fb *)preload_search_info(kmdp,
1360
	    MODINFO_METADATA | MODINFOMD_EFI_FB);
1361
	if (efifb == NULL) {
1362
		if (bootverbose)
1363
			device_printf(dev,
1364
			    "fb has no preloaded kernel efi information\n");
1365
		/* We are on Gen1 VM, just return. */
1366
		return;
1367
	} else {
1368
		if (bootverbose)
1369
			device_printf(dev,
1370
			    "efifb: fb_addr: %#jx, size: %#jx, "
1371
			    "actual size needed: 0x%x\n",
1372
			    efifb->fb_addr, efifb->fb_size,
1373
			    (int) efifb->fb_height * efifb->fb_width);
1374
	}
1375
1376
	hv_fb_res = pcib_host_res_alloc(&sc->vmbus_mmio_res, dev,
1377
	    SYS_RES_MEMORY, &rid,
1378
	    efifb->fb_addr, efifb->fb_addr + efifb->fb_size, efifb->fb_size,
1379
	    RF_ACTIVE | rman_make_alignment_flags(PAGE_SIZE));
1380
1381
	if (hv_fb_res && bootverbose)
1382
		device_printf(dev,
1383
		    "successfully reserved memory for framebuffer "
1384
		    "starting at %#jx, size %#jx\n",
1385
		    efifb->fb_addr, efifb->fb_size);
1386
}
1387
1388
static void
1336
vmbus_free_mmio_res(device_t dev)
1389
vmbus_free_mmio_res(device_t dev)
1337
{
1390
{
1338
	struct vmbus_softc *sc = device_get_softc(dev);
1391
	struct vmbus_softc *sc = device_get_softc(dev);
1339
1392
1340
	pcib_host_res_free(dev, &sc->vmbus_mmio_res);
1393
	pcib_host_res_free(dev, &sc->vmbus_mmio_res);
1394
1395
	if (hv_fb_res)
1396
		hv_fb_res = NULL;
1341
}
1397
}
1342
#endif	/* NEW_PCIB */
1398
#endif	/* NEW_PCIB */
1343
1399
Lines 1387-1392 Link Here
1387
1443
1388
#ifdef NEW_PCIB
1444
#ifdef NEW_PCIB
1389
	vmbus_get_mmio_res(sc->vmbus_dev);
1445
	vmbus_get_mmio_res(sc->vmbus_dev);
1446
	vmbus_fb_mmio_res(sc->vmbus_dev);
1390
#endif
1447
#endif
1391
1448
1392
	sc->vmbus_flags |= VMBUS_FLAG_ATTACHED;
1449
	sc->vmbus_flags |= VMBUS_FLAG_ATTACHED;

Return to bug 222996