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 --- |