Lines Matching +full:has +full:- +full:legacy +full:- +full:mode

10  * the COPYING file in the top-level directory.
15 #include "qemu/error-report.h"
22 #include "pci-quirks.h"
32 * "Universal Pass-Through" mode, or UPT. Theoretically in UPT mode, nothing
34 * however support limitations to this mode. It only supports IGD as a
38 * The code here attempts to enable what we'll call legacy mode assignment,
40 * metal. To enable this mode, the IGD device must be assigned to the VM
49 * NB - It is possible to enable physical outputs in UPT mode by supplying
60 * supportable, some of them don't even support VT-d.
70 if ((vdev->device_id & 0xffe) == 0xa84) { in igd_gen()
74 switch (vdev->device_id & 0xff00) { in igd_gen()
107 return -1; in igd_gen()
136 return (gms - 0xf0 + 1) * 4 * MiB; in igd_stolen_memory_size()
145 * telling the driver what sort of outputs it has. Without this, the device
157 vdev->igd_opregion = g_malloc0(info->size); in vfio_pci_igd_opregion_init()
158 ret = pread(vdev->vbasedev.fd, vdev->igd_opregion, in vfio_pci_igd_opregion_init()
159 info->size, info->offset); in vfio_pci_igd_opregion_init()
160 if (ret != info->size) { in vfio_pci_igd_opregion_init()
162 g_free(vdev->igd_opregion); in vfio_pci_igd_opregion_init()
163 vdev->igd_opregion = NULL; in vfio_pci_igd_opregion_init()
173 * device, which may be at VM address 00:02.0 in legacy mode or another in vfio_pci_igd_opregion_init()
174 * address in UPT mode. in vfio_pci_igd_opregion_init()
180 fw_cfg_add_file(fw_cfg_find(), "etc/igd-opregion", in vfio_pci_igd_opregion_init()
181 vdev->igd_opregion, info->size); in vfio_pci_igd_opregion_init()
183 trace_vfio_pci_igd_opregion_enabled(vdev->vbasedev.name); in vfio_pci_igd_opregion_init()
185 pci_set_long(vdev->pdev.config + IGD_ASLS, 0); in vfio_pci_igd_opregion_init()
186 pci_set_long(vdev->pdev.wmask + IGD_ASLS, ~0); in vfio_pci_igd_opregion_init()
187 pci_set_long(vdev->emulated_config_bits + IGD_ASLS, ~0); in vfio_pci_igd_opregion_init()
198 if (vdev->pdev.qdev.hotplugged) { in vfio_pci_igd_setup_opregion()
203 ret = vfio_get_dev_region_info(&vdev->vbasedev, in vfio_pci_igd_setup_opregion()
207 error_setg_errno(errp, -ret, in vfio_pci_igd_setup_opregion()
253 ret = pread(vdev->vbasedev.fd, pdev->config + list[i].offset, in vfio_pci_igd_copy()
254 list[i].len, info->offset + list[i].offset); in vfio_pci_igd_copy()
257 return -errno; in vfio_pci_igd_copy()
274 bus = pci_device_root_bus(&vdev->pdev); in vfio_pci_igd_host_init()
279 return -ENODEV; in vfio_pci_igd_host_init()
285 trace_vfio_pci_igd_host_bridge_enabled(vdev->vbasedev.name); in vfio_pci_igd_host_init()
294 * to handle if the user has created it for us, which they might want to do
299 if (pdev->devfn != PCI_DEVFN(0x1f, 0)) { in vfio_pci_igd_lpc_bridge_realize()
309 set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); in vfio_pci_igd_lpc_bridge_class_init()
310 dc->desc = "VFIO dummy ISA/LPC bridge for IGD assignment"; in vfio_pci_igd_lpc_bridge_class_init()
311 dc->hotpluggable = false; in vfio_pci_igd_lpc_bridge_class_init()
312 k->realize = vfio_pci_igd_lpc_bridge_realize; in vfio_pci_igd_lpc_bridge_class_init()
313 k->class_id = PCI_CLASS_BRIDGE_ISA; in vfio_pci_igd_lpc_bridge_class_init()
317 .name = "vfio-pci-igd-lpc-bridge",
339 lpc_bridge = pci_find_device(pci_device_root_bus(&vdev->pdev), in type_init()
342 lpc_bridge = pci_create_simple(pci_device_root_bus(&vdev->pdev), in type_init()
343 PCI_DEVFN(0x1f, 0), "vfio-pci-igd-lpc-bridge"); in type_init()
349 trace_vfio_pci_igd_lpc_bridge_enabled(vdev->vbasedev.name); in type_init()
365 if (vdev->pdev.qdev.hotplugged) { in vfio_pci_igd_setup_lpc_bridge()
373 * one we can hack on, this quirk is no-go. Sorry Q35. in vfio_pci_igd_setup_lpc_bridge()
375 lpc_bridge = pci_find_device(pci_device_root_bus(&vdev->pdev), in vfio_pci_igd_setup_lpc_bridge()
378 "vfio-pci-igd-lpc-bridge")) { in vfio_pci_igd_setup_lpc_bridge()
388 ret = vfio_get_dev_region_info(&vdev->vbasedev, in vfio_pci_igd_setup_lpc_bridge()
396 ret = vfio_get_dev_region_info(&vdev->vbasedev, in vfio_pci_igd_setup_lpc_bridge()
432 * consider enabling legacy mode. Some driver have dependencies on the PCI in vfio_probe_igd_bar0_quirk()
450 ggc_mirror = ggc_quirk->data = g_malloc0(sizeof(*ggc_mirror)); in vfio_probe_igd_bar0_quirk()
451 ggc_mirror->mem = ggc_quirk->mem; in vfio_probe_igd_bar0_quirk()
452 ggc_mirror->vdev = vdev; in vfio_probe_igd_bar0_quirk()
453 ggc_mirror->bar = nr; in vfio_probe_igd_bar0_quirk()
454 ggc_mirror->offset = IGD_GGC_MMIO_OFFSET; in vfio_probe_igd_bar0_quirk()
455 ggc_mirror->config_offset = IGD_GMCH; in vfio_probe_igd_bar0_quirk()
457 memory_region_init_io(ggc_mirror->mem, OBJECT(vdev), in vfio_probe_igd_bar0_quirk()
459 "vfio-igd-ggc-quirk", 2); in vfio_probe_igd_bar0_quirk()
460 memory_region_add_subregion_overlap(vdev->bars[nr].region.mem, in vfio_probe_igd_bar0_quirk()
461 ggc_mirror->offset, ggc_mirror->mem, in vfio_probe_igd_bar0_quirk()
464 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, ggc_quirk, next); in vfio_probe_igd_bar0_quirk()
467 bdsm_mirror = bdsm_quirk->data = g_malloc0(sizeof(*bdsm_mirror)); in vfio_probe_igd_bar0_quirk()
468 bdsm_mirror->mem = bdsm_quirk->mem; in vfio_probe_igd_bar0_quirk()
469 bdsm_mirror->vdev = vdev; in vfio_probe_igd_bar0_quirk()
470 bdsm_mirror->bar = nr; in vfio_probe_igd_bar0_quirk()
471 bdsm_mirror->offset = IGD_BDSM_MMIO_OFFSET; in vfio_probe_igd_bar0_quirk()
472 bdsm_mirror->config_offset = (gen < 11) ? IGD_BDSM : IGD_BDSM_GEN11; in vfio_probe_igd_bar0_quirk()
474 memory_region_init_io(bdsm_mirror->mem, OBJECT(vdev), in vfio_probe_igd_bar0_quirk()
476 "vfio-igd-bdsm-quirk", (gen < 11) ? 4 : 8); in vfio_probe_igd_bar0_quirk()
477 memory_region_add_subregion_overlap(vdev->bars[nr].region.mem, in vfio_probe_igd_bar0_quirk()
478 bdsm_mirror->offset, bdsm_mirror->mem, in vfio_probe_igd_bar0_quirk()
481 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, bdsm_quirk, next); in vfio_probe_igd_bar0_quirk()
495 * consider enabling legacy mode. The vBIOS has dependencies on the in vfio_pci_igd_config_quirk()
509 if (gen == -1) { in vfio_pci_igd_config_quirk()
510 error_report("IGD device %s is unsupported in legacy mode, " in vfio_pci_igd_config_quirk()
511 "try SandyBridge or newer", vdev->vbasedev.name); in vfio_pci_igd_config_quirk()
515 gmch = vfio_pci_read_config(&vdev->pdev, IGD_GMCH, 4); in vfio_pci_igd_config_quirk()
518 * For backward compatibility, enable legacy mode when in vfio_pci_igd_config_quirk()
519 * - Machine type is i440fx (pc_piix) in vfio_pci_igd_config_quirk()
520 * - IGD device is at guest BDF 00:02.0 in vfio_pci_igd_config_quirk()
521 * - Not manually disabled by x-igd-legacy-mode=off in vfio_pci_igd_config_quirk()
523 if ((vdev->igd_legacy_mode != ON_OFF_AUTO_OFF) && in vfio_pci_igd_config_quirk()
524 !strcmp(MACHINE_GET_CLASS(qdev_get_machine())->family, "pc_piix") && in vfio_pci_igd_config_quirk()
525 (&vdev->pdev == pci_find_device(pci_device_root_bus(&vdev->pdev), in vfio_pci_igd_config_quirk()
528 * IGD legacy mode requires: in vfio_pci_igd_config_quirk()
529 * - VBIOS in ROM BAR or file in vfio_pci_igd_config_quirk()
530 * - VGA IO/MMIO ranges are claimed by IGD in vfio_pci_igd_config_quirk()
531 * - OpRegion in vfio_pci_igd_config_quirk()
532 * - Same LPC bridge and Host bridge VID/DID/SVID/SSID as host in vfio_pci_igd_config_quirk()
537 info_report("IGD legacy mode enabled, " in vfio_pci_igd_config_quirk()
538 "use x-igd-legacy-mode=off to disable it if unwanted."); in vfio_pci_igd_config_quirk()
545 ret = vfio_get_region_info(&vdev->vbasedev, in vfio_pci_igd_config_quirk()
547 if ((ret || !rom->size) && !vdev->pdev.romfile) { in vfio_pci_igd_config_quirk()
548 error_setg(&err, "Device has no ROM"); in vfio_pci_igd_config_quirk()
554 * enabled, try to enable it. Probably shouldn't be using legacy mode in vfio_pci_igd_config_quirk()
558 if (!(gmch & 0x2) && !vdev->vga && !vfio_populate_vga(vdev, &err)) { in vfio_pci_igd_config_quirk()
564 vdev->features |= VFIO_FEATURE_ENABLE_IGD_OPREGION; in vfio_pci_igd_config_quirk()
565 vdev->features |= VFIO_FEATURE_ENABLE_IGD_LPC; in vfio_pci_igd_config_quirk()
566 } else if (vdev->igd_legacy_mode == ON_OFF_AUTO_ON) { in vfio_pci_igd_config_quirk()
573 if ((vdev->features & VFIO_FEATURE_ENABLE_IGD_OPREGION) && in vfio_pci_igd_config_quirk()
579 if ((vdev->features & VFIO_FEATURE_ENABLE_IGD_LPC) && in vfio_pci_igd_config_quirk()
585 * Allow user to override dsm size using x-igd-gms option, in multiples of in vfio_pci_igd_config_quirk()
587 * set from DVMT Pre-Allocated option in host BIOS. in vfio_pci_igd_config_quirk()
589 if (vdev->igd_gms) { in vfio_pci_igd_config_quirk()
591 if (vdev->igd_gms <= 0x10) { in vfio_pci_igd_config_quirk()
593 gmch |= vdev->igd_gms << IGD_GMCH_GEN6_GMS_SHIFT; in vfio_pci_igd_config_quirk()
596 "x-igd-gms", "0~0x10"); in vfio_pci_igd_config_quirk()
599 if (vdev->igd_gms <= 0x40) { in vfio_pci_igd_config_quirk()
601 gmch |= vdev->igd_gms << IGD_GMCH_GEN8_GMS_SHIFT; in vfio_pci_igd_config_quirk()
604 "x-igd-gms", "0~0x40"); in vfio_pci_igd_config_quirk()
621 fw_cfg_add_file(fw_cfg_find(), "etc/igd-bdsm-size", in vfio_pci_igd_config_quirk()
624 /* GMCH is read-only, emulated */ in vfio_pci_igd_config_quirk()
625 pci_set_long(vdev->pdev.config + IGD_GMCH, gmch); in vfio_pci_igd_config_quirk()
626 pci_set_long(vdev->pdev.wmask + IGD_GMCH, 0); in vfio_pci_igd_config_quirk()
627 pci_set_long(vdev->emulated_config_bits + IGD_GMCH, ~0); in vfio_pci_igd_config_quirk()
629 /* BDSM is read-write, emulated. The BIOS needs to be able to write it */ in vfio_pci_igd_config_quirk()
631 pci_set_long(vdev->pdev.config + IGD_BDSM, 0); in vfio_pci_igd_config_quirk()
632 pci_set_long(vdev->pdev.wmask + IGD_BDSM, ~0); in vfio_pci_igd_config_quirk()
633 pci_set_long(vdev->emulated_config_bits + IGD_BDSM, ~0); in vfio_pci_igd_config_quirk()
635 pci_set_quad(vdev->pdev.config + IGD_BDSM_GEN11, 0); in vfio_pci_igd_config_quirk()
636 pci_set_quad(vdev->pdev.wmask + IGD_BDSM_GEN11, ~0); in vfio_pci_igd_config_quirk()
637 pci_set_quad(vdev->emulated_config_bits + IGD_BDSM_GEN11, ~0); in vfio_pci_igd_config_quirk()
640 trace_vfio_pci_igd_bdsm_enabled(vdev->vbasedev.name, (gms_size / MiB)); in vfio_pci_igd_config_quirk()
646 * When legacy mode is implicity enabled, continue on error, in vfio_pci_igd_config_quirk()
649 if (legacy_mode_enabled && (vdev->igd_legacy_mode == ON_OFF_AUTO_AUTO)) { in vfio_pci_igd_config_quirk()
651 error_report("IGD legacy mode disabled"); in vfio_pci_igd_config_quirk()
660 * KVMGT/GVT-g vGPU exposes an emulated OpRegion. So far, users have to specify
661 * x-igd-opregion=on to enable the access.
666 if ((vdev->features & VFIO_FEATURE_ENABLE_IGD_OPREGION) && in vfio_pci_kvmgt_config_quirk()
676 /* KVMGT/GVT-g vGPU is exposed as mdev */ in vfio_probe_igd_config_quirk()
677 if (vdev->vbasedev.mdev) { in vfio_probe_igd_config_quirk()