Lines Matching +full:gen +full:- +full:2
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
15 #include "qemu/error-report.h"
29 * "Universal Pass-Through" mode, or UPT. Theoretically in UPT mode, nothing
46 * NB - It is possible to enable physical outputs in UPT mode by supplying
57 * supportable, some of them don't even support VT-d.
62 if ((vdev->device_id & 0xfff) == 0xa84) { in igd_gen()
66 switch (vdev->device_id & 0xff00) { in igd_gen()
76 return -1; in igd_gen()
106 return -1; in igd_gen()
117 #define IGD_BDSM_GEN11 0xc0 /* Base Data of Stolen Memory of gen 11 and later */
134 {PCI_REVISION_ID, 2},
135 {PCI_SUBSYSTEM_VENDOR_ID, 2},
136 {PCI_SUBSYSTEM_ID, 2},
140 {PCI_VENDOR_ID, 2},
141 {PCI_DEVICE_ID, 2},
142 {PCI_REVISION_ID, 2},
143 {PCI_SUBSYSTEM_VENDOR_ID, 2},
144 {PCI_SUBSYSTEM_ID, 2},
154 ret = pread(vdev->vbasedev.fd, pdev->config + list[i].offset, in vfio_pci_igd_copy()
155 list[i].len, info->offset + list[i].offset); in vfio_pci_igd_copy()
158 return -errno; in vfio_pci_igd_copy()
175 bus = pci_device_root_bus(&vdev->pdev); in vfio_pci_igd_host_init()
180 return -ENODEV; in vfio_pci_igd_host_init()
186 trace_vfio_pci_igd_host_bridge_enabled(vdev->vbasedev.name); in vfio_pci_igd_host_init()
200 if (pdev->devfn != PCI_DEVFN(0x1f, 0)) { in vfio_pci_igd_lpc_bridge_realize()
210 set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); in vfio_pci_igd_lpc_bridge_class_init()
211 dc->desc = "VFIO dummy ISA/LPC bridge for IGD assignment"; in vfio_pci_igd_lpc_bridge_class_init()
212 dc->hotpluggable = false; in vfio_pci_igd_lpc_bridge_class_init()
213 k->realize = vfio_pci_igd_lpc_bridge_realize; in vfio_pci_igd_lpc_bridge_class_init()
214 k->class_id = PCI_CLASS_BRIDGE_ISA; in vfio_pci_igd_lpc_bridge_class_init()
218 .name = "vfio-pci-igd-lpc-bridge",
240 lpc_bridge = pci_find_device(pci_device_root_bus(&vdev->pdev), in type_init()
243 lpc_bridge = pci_create_simple(pci_device_root_bus(&vdev->pdev), in type_init()
244 PCI_DEVFN(0x1f, 0), "vfio-pci-igd-lpc-bridge"); in type_init()
250 trace_vfio_pci_igd_lpc_bridge_enabled(vdev->vbasedev.name); in type_init()
258 * entry, older IGDs use 2MB and 32bit. Each PTE maps a 4k page. Therefore
259 * we either have 2M/4k * 4 = 2k or 8M/4k * 8 = 16k as the maximum iobar index
266 uint32_t gmch = vfio_pci_read_config(&vdev->pdev, IGD_GMCH, sizeof(gmch)); in vfio_igd_gtt_max()
267 int ggms, gen = igd_gen(vdev); in vfio_igd_gtt_max() local
269 gmch = vfio_pci_read_config(&vdev->pdev, IGD_GMCH, sizeof(gmch)); in vfio_igd_gtt_max()
270 ggms = (gmch >> (gen < 8 ? 8 : 6)) & 0x3; in vfio_igd_gtt_max()
271 if (gen > 6) { in vfio_igd_gtt_max()
277 return (ggms / (4 * KiB)) * (gen < 8 ? 4 : 8); in vfio_igd_gtt_max()
295 VFIOPCIDevice *vdev = igd->vdev; in vfio_igd_quirk_data_read()
297 igd->index = ~0; in vfio_igd_quirk_data_read()
299 return vfio_region_read(&vdev->bars[4].region, addr + 4, size); in vfio_igd_quirk_data_read()
306 VFIOPCIDevice *vdev = igd->vdev; in vfio_igd_quirk_data_write()
308 int gen = igd_gen(vdev); in vfio_igd_quirk_data_write() local
312 * 0x1, 0x5, 0x9, 0xd,...). For pre-Gen8 each 4-byte write is a whole PTE in vfio_igd_quirk_data_write()
324 if ((igd->index % 4 == 1) && igd->index < vfio_igd_gtt_max(vdev)) { in vfio_igd_quirk_data_write()
325 if (gen < 8 || (igd->index % 8 == 1)) { in vfio_igd_quirk_data_write()
328 if (gen < 11) { in vfio_igd_quirk_data_write()
329 base = pci_get_long(vdev->pdev.config + IGD_BDSM); in vfio_igd_quirk_data_write()
331 base = pci_get_quad(vdev->pdev.config + IGD_BDSM_GEN11); in vfio_igd_quirk_data_write()
334 hw_error("vfio-igd: Guest attempted to program IGD GTT before " in vfio_igd_quirk_data_write()
338 val = data - igd->bdsm + base; in vfio_igd_quirk_data_write()
343 trace_vfio_pci_igd_bar4_write(vdev->vbasedev.name, in vfio_igd_quirk_data_write()
344 igd->index, data, val); in vfio_igd_quirk_data_write()
347 vfio_region_write(&vdev->bars[4].region, addr + 4, val, size); in vfio_igd_quirk_data_write()
349 igd->index = ~0; in vfio_igd_quirk_data_write()
362 VFIOPCIDevice *vdev = igd->vdev; in vfio_igd_quirk_index_read()
364 igd->index = ~0; in vfio_igd_quirk_index_read()
366 return vfio_region_read(&vdev->bars[4].region, addr, size); in vfio_igd_quirk_index_read()
373 VFIOPCIDevice *vdev = igd->vdev; in vfio_igd_quirk_index_write()
375 igd->index = data; in vfio_igd_quirk_index_write()
377 vfio_region_write(&vdev->bars[4].region, addr, data, size); in vfio_igd_quirk_index_write()
398 return pci_get_byte(vdev->pdev.config + offset); in vfio_igd_quirk_bdsm_read()
399 case 2: in vfio_igd_quirk_bdsm_read()
400 return pci_get_word(vdev->pdev.config + offset); in vfio_igd_quirk_bdsm_read()
402 return pci_get_long(vdev->pdev.config + offset); in vfio_igd_quirk_bdsm_read()
404 return pci_get_quad(vdev->pdev.config + offset); in vfio_igd_quirk_bdsm_read()
423 pci_set_byte(vdev->pdev.config + offset, data); in vfio_igd_quirk_bdsm_write()
425 case 2: in vfio_igd_quirk_bdsm_write()
426 pci_set_word(vdev->pdev.config + offset, data); in vfio_igd_quirk_bdsm_write()
429 pci_set_long(vdev->pdev.config + offset, data); in vfio_igd_quirk_bdsm_write()
432 pci_set_quad(vdev->pdev.config + offset, data); in vfio_igd_quirk_bdsm_write()
449 int gen; in vfio_probe_igd_bar0_quirk() local
458 &vdev->pdev != pci_find_device(pci_device_root_bus(&vdev->pdev), in vfio_probe_igd_bar0_quirk()
464 * Only on IGD devices of gen 11 and above, the BDSM register is mirrored in vfio_probe_igd_bar0_quirk()
467 gen = igd_gen(vdev); in vfio_probe_igd_bar0_quirk()
468 if (gen < 11) { in vfio_probe_igd_bar0_quirk()
473 quirk->data = vdev; in vfio_probe_igd_bar0_quirk()
475 memory_region_init_io(&quirk->mem[0], OBJECT(vdev), &vfio_igd_bdsm_quirk, in vfio_probe_igd_bar0_quirk()
476 vdev, "vfio-igd-bdsm-quirk", 8); in vfio_probe_igd_bar0_quirk()
477 memory_region_add_subregion_overlap(vdev->bars[0].region.mem, in vfio_probe_igd_bar0_quirk()
478 IGD_BDSM_MMIO_OFFSET, &quirk->mem[0], in vfio_probe_igd_bar0_quirk()
481 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); in vfio_probe_igd_bar0_quirk()
484 static int igd_get_stolen_mb(int gen, uint32_t gmch) in igd_get_stolen_mb() argument
488 if (gen < 8) { in igd_get_stolen_mb()
494 if (gen < 9) { in igd_get_stolen_mb()
504 return (gms - 0xf0) * 4 + 4; in igd_get_stolen_mb()
517 int i, ret, ggms_mb, gms_mb = 0, gen; in vfio_probe_igd_bar4_quirk() local
530 &vdev->pdev != pci_find_device(pci_device_root_bus(&vdev->pdev), in vfio_probe_igd_bar4_quirk()
538 * one we can hack on, legacy mode is no-go. Sorry Q35. in vfio_probe_igd_bar4_quirk()
540 lpc_bridge = pci_find_device(pci_device_root_bus(&vdev->pdev), in vfio_probe_igd_bar4_quirk()
543 "vfio-pci-igd-lpc-bridge")) { in vfio_probe_igd_bar4_quirk()
545 "devices at address 1f.0", vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
554 gen = igd_gen(vdev); in vfio_probe_igd_bar4_quirk()
555 if (gen == -1) { in vfio_probe_igd_bar4_quirk()
557 "try SandyBridge or newer", vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
566 ret = vfio_get_region_info(&vdev->vbasedev, in vfio_probe_igd_bar4_quirk()
568 if ((ret || !rom->size) && !vdev->pdev.romfile) { in vfio_probe_igd_bar4_quirk()
570 vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
578 if (vdev->pdev.qdev.hotplugged) { in vfio_probe_igd_bar4_quirk()
580 "legacy mode disabled", vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
581 vdev->rom_read_failed = true; in vfio_probe_igd_bar4_quirk()
589 ret = vfio_get_dev_region_info(&vdev->vbasedev, in vfio_probe_igd_bar4_quirk()
594 "legacy mode disabled", vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
598 ret = vfio_get_dev_region_info(&vdev->vbasedev, in vfio_probe_igd_bar4_quirk()
603 "legacy mode disabled", vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
607 ret = vfio_get_dev_region_info(&vdev->vbasedev, in vfio_probe_igd_bar4_quirk()
612 "legacy mode disabled", vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
616 gmch = vfio_pci_read_config(&vdev->pdev, IGD_GMCH, 4); in vfio_probe_igd_bar4_quirk()
623 if (!(gmch & 0x2) && !vdev->vga && !vfio_populate_vga(vdev, &err)) { in vfio_probe_igd_bar4_quirk()
624 error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
626 "legacy mode disabled", vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
634 "legacy mode disabled", vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
642 "legacy mode disabled", vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
649 error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
654 quirk = vfio_quirk_alloc(2); in vfio_probe_igd_bar4_quirk()
655 igd = quirk->data = g_malloc0(sizeof(*igd)); in vfio_probe_igd_bar4_quirk()
656 igd->vdev = vdev; in vfio_probe_igd_bar4_quirk()
657 igd->index = ~0; in vfio_probe_igd_bar4_quirk()
658 if (gen < 11) { in vfio_probe_igd_bar4_quirk()
659 igd->bdsm = vfio_pci_read_config(&vdev->pdev, IGD_BDSM, 4); in vfio_probe_igd_bar4_quirk()
661 igd->bdsm = vfio_pci_read_config(&vdev->pdev, IGD_BDSM_GEN11, 4); in vfio_probe_igd_bar4_quirk()
662 igd->bdsm |= in vfio_probe_igd_bar4_quirk()
663 (uint64_t)vfio_pci_read_config(&vdev->pdev, IGD_BDSM_GEN11 + 4, 4) << 32; in vfio_probe_igd_bar4_quirk()
665 igd->bdsm &= ~((1 * MiB) - 1); /* 1MB aligned */ in vfio_probe_igd_bar4_quirk()
667 memory_region_init_io(&quirk->mem[0], OBJECT(vdev), &vfio_igd_index_quirk, in vfio_probe_igd_bar4_quirk()
668 igd, "vfio-igd-index-quirk", 4); in vfio_probe_igd_bar4_quirk()
669 memory_region_add_subregion_overlap(vdev->bars[nr].region.mem, in vfio_probe_igd_bar4_quirk()
670 0, &quirk->mem[0], 1); in vfio_probe_igd_bar4_quirk()
672 memory_region_init_io(&quirk->mem[1], OBJECT(vdev), &vfio_igd_data_quirk, in vfio_probe_igd_bar4_quirk()
673 igd, "vfio-igd-data-quirk", 4); in vfio_probe_igd_bar4_quirk()
674 memory_region_add_subregion_overlap(vdev->bars[nr].region.mem, in vfio_probe_igd_bar4_quirk()
675 4, &quirk->mem[1], 1); in vfio_probe_igd_bar4_quirk()
677 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); in vfio_probe_igd_bar4_quirk()
680 ggms_mb = (gmch >> (gen < 8 ? 8 : 6)) & 0x3; in vfio_probe_igd_bar4_quirk()
681 if (gen > 6) { in vfio_probe_igd_bar4_quirk()
685 gms_mb = igd_get_stolen_mb(gen, gmch); in vfio_probe_igd_bar4_quirk()
697 fw_cfg_add_file(fw_cfg_find(), "etc/igd-bdsm-size", in vfio_probe_igd_bar4_quirk()
700 /* GMCH is read-only, emulated */ in vfio_probe_igd_bar4_quirk()
701 pci_set_long(vdev->pdev.config + IGD_GMCH, gmch); in vfio_probe_igd_bar4_quirk()
702 pci_set_long(vdev->pdev.wmask + IGD_GMCH, 0); in vfio_probe_igd_bar4_quirk()
703 pci_set_long(vdev->emulated_config_bits + IGD_GMCH, ~0); in vfio_probe_igd_bar4_quirk()
705 /* BDSM is read-write, emulated. The BIOS needs to be able to write it */ in vfio_probe_igd_bar4_quirk()
706 if (gen < 11) { in vfio_probe_igd_bar4_quirk()
707 pci_set_long(vdev->pdev.config + IGD_BDSM, 0); in vfio_probe_igd_bar4_quirk()
708 pci_set_long(vdev->pdev.wmask + IGD_BDSM, ~0); in vfio_probe_igd_bar4_quirk()
709 pci_set_long(vdev->emulated_config_bits + IGD_BDSM, ~0); in vfio_probe_igd_bar4_quirk()
711 pci_set_quad(vdev->pdev.config + IGD_BDSM_GEN11, 0); in vfio_probe_igd_bar4_quirk()
712 pci_set_quad(vdev->pdev.wmask + IGD_BDSM_GEN11, ~0); in vfio_probe_igd_bar4_quirk()
713 pci_set_quad(vdev->emulated_config_bits + IGD_BDSM_GEN11, ~0); in vfio_probe_igd_bar4_quirk()
722 if (pread(vdev->vbasedev.fd, &cmd_orig, sizeof(cmd_orig), in vfio_probe_igd_bar4_quirk()
723 vdev->config_offset + PCI_COMMAND) != sizeof(cmd_orig)) { in vfio_probe_igd_bar4_quirk()
724 error_report("IGD device %s - failed to read PCI command register", in vfio_probe_igd_bar4_quirk()
725 vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
730 if (pwrite(vdev->vbasedev.fd, &cmd, sizeof(cmd), in vfio_probe_igd_bar4_quirk()
731 vdev->config_offset + PCI_COMMAND) != sizeof(cmd)) { in vfio_probe_igd_bar4_quirk()
732 error_report("IGD device %s - failed to write PCI command register", in vfio_probe_igd_bar4_quirk()
733 vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
737 vfio_region_write(&vdev->bars[4].region, 0, i, 4); in vfio_probe_igd_bar4_quirk()
738 vfio_region_write(&vdev->bars[4].region, 4, 0, 4); in vfio_probe_igd_bar4_quirk()
741 if (pwrite(vdev->vbasedev.fd, &cmd_orig, sizeof(cmd_orig), in vfio_probe_igd_bar4_quirk()
742 vdev->config_offset + PCI_COMMAND) != sizeof(cmd_orig)) { in vfio_probe_igd_bar4_quirk()
743 error_report("IGD device %s - failed to restore PCI command register", in vfio_probe_igd_bar4_quirk()
744 vdev->vbasedev.name); in vfio_probe_igd_bar4_quirk()
747 trace_vfio_pci_igd_bdsm_enabled(vdev->vbasedev.name, ggms_mb + gms_mb); in vfio_probe_igd_bar4_quirk()