vmbus.c (c7aa572cacdeca83c35c12a378909d0b659300a9) vmbus.c (a4a10b37d422dcdff2b0d700ab073b3078627a08)
1/*-
2 * Copyright (c) 2009-2012,2016-2017 Microsoft Corp.
3 * Copyright (c) 2012 NetApp Inc.
4 * Copyright (c) 2012 Citrix Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 1323 unchanged lines hidden (view full) ---

1332
1333 vmbus_get_mmio_res_pass(dev, parse_64);
1334 vmbus_get_mmio_res_pass(dev, parse_32);
1335}
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.
1/*-
2 * Copyright (c) 2009-2012,2016-2017 Microsoft Corp.
3 * Copyright (c) 2012 NetApp Inc.
4 * Copyright (c) 2012 Citrix Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 1323 unchanged lines hidden (view full) ---

1332
1333 vmbus_get_mmio_res_pass(dev, parse_64);
1334 vmbus_get_mmio_res_pass(dev, parse_32);
1335}
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.
1340 * Currently only efifb and vbefb drivers are using this range without
1341 * reserving it from system.
1342 * Therefore, vmbus driver reserves it before any other PCI device
1343 * drivers start to request mmio addresses.
1344 */
1345static struct resource *hv_fb_res;
1346
1347static void
1348vmbus_fb_mmio_res(device_t dev)
1349{
1350 struct efi_fb *efifb;
1342 * Therefore, vmbus driver reserves it before any other PCI device
1343 * drivers start to request mmio addresses.
1344 */
1345static struct resource *hv_fb_res;
1346
1347static void
1348vmbus_fb_mmio_res(device_t dev)
1349{
1350 struct efi_fb *efifb;
1351 struct vbe_fb *vbefb;
1352 rman_res_t fb_start, fb_end, fb_count;
1353 int fb_height, fb_width;
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) {
1354 caddr_t kmdp;
1355
1356 struct vmbus_softc *sc = device_get_softc(dev);
1357 int rid = 0;
1358
1359 kmdp = preload_search_by_type("elf kernel");
1360 if (kmdp == NULL)
1361 kmdp = preload_search_by_type("elf64 kernel");
1362 efifb = (struct efi_fb *)preload_search_info(kmdp,
1363 MODINFO_METADATA | MODINFOMD_EFI_FB);
1364 if (efifb == NULL) {
1365 vbefb = (struct vbe_fb *)preload_search_info(kmdp,
1366 MODINFO_METADATA | MODINFOMD_VBE_FB);
1367 fb_start = vbefb->fb_addr;
1368 fb_end = vbefb->fb_addr + vbefb->fb_size;
1369 fb_count = vbefb->fb_size;
1370 fb_height = efifb->fb_height;
1371 fb_width = efifb->fb_width;
1372 } else {
1373 fb_start = efifb->fb_addr;
1374 fb_end = efifb->fb_addr + efifb->fb_size;
1375 fb_count = efifb->fb_size;
1376 fb_height = efifb->fb_height;
1377 fb_width = efifb->fb_width;
1378 }
1379 if (fb_start == 0) {
1362 if (bootverbose)
1363 device_printf(dev,
1380 if (bootverbose)
1381 device_printf(dev,
1364 "fb has no preloaded kernel efi information\n");
1382 "no preloaded kernel fb information\n");
1365 /* We are on Gen1 VM, just return. */
1366 return;
1367 } else {
1368 if (bootverbose)
1369 device_printf(dev,
1383 /* We are on Gen1 VM, just return. */
1384 return;
1385 } else {
1386 if (bootverbose)
1387 device_printf(dev,
1370 "efifb: fb_addr: %#jx, size: %#jx, "
1388 "fb: fb_addr: %#jx, size: %#jx, "
1371 "actual size needed: 0x%x\n",
1389 "actual size needed: 0x%x\n",
1372 efifb->fb_addr, efifb->fb_size,
1373 (int) efifb->fb_height * efifb->fb_width);
1390 fb_start, fb_count, fb_height * fb_width);
1374 }
1375
1376 hv_fb_res = pcib_host_res_alloc(&sc->vmbus_mmio_res, dev,
1391 }
1392
1393 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,
1394 SYS_RES_MEMORY, &rid, fb_start, fb_end, fb_count,
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",
1395 RF_ACTIVE | rman_make_alignment_flags(PAGE_SIZE));
1396
1397 if (hv_fb_res && bootverbose)
1398 device_printf(dev,
1399 "successfully reserved memory for framebuffer "
1400 "starting at %#jx, size %#jx\n",
1385 efifb->fb_addr, efifb->fb_size);
1401 fb_start, fb_count);
1386}
1387
1388static void
1389vmbus_free_mmio_res(device_t dev)
1390{
1391 struct vmbus_softc *sc = device_get_softc(dev);
1392
1393 pcib_host_res_free(dev, &sc->vmbus_mmio_res);

--- 257 unchanged lines hidden ---
1402}
1403
1404static void
1405vmbus_free_mmio_res(device_t dev)
1406{
1407 struct vmbus_softc *sc = device_get_softc(dev);
1408
1409 pcib_host_res_free(dev, &sc->vmbus_mmio_res);

--- 257 unchanged lines hidden ---