Lines Matching full:quirk
188 * The generic mirror quirk handles devices which expose PCI config space
281 VFIOQuirk *quirk = g_new0(VFIOQuirk, 1); in vfio_quirk_alloc() local
282 QLIST_INIT(&quirk->ioeventfds); in vfio_quirk_alloc()
283 quirk->mem = g_new0(MemoryRegion, nr_mem); in vfio_quirk_alloc()
284 quirk->nr_mem = nr_mem; in vfio_quirk_alloc()
286 return quirk; in vfio_quirk_alloc()
323 static void vfio_drop_dynamic_eventfds(VFIOPCIDevice *vdev, VFIOQuirk *quirk) in vfio_drop_dynamic_eventfds() argument
327 QLIST_FOREACH_SAFE(ioeventfd, &quirk->ioeventfds, next, tmp) { in vfio_drop_dynamic_eventfds()
411 VFIOQuirk *quirk; in vfio_vga_probe_ati_3c3_quirk() local
422 quirk = vfio_quirk_alloc(1); in vfio_vga_probe_ati_3c3_quirk()
424 memory_region_init_io(quirk->mem, OBJECT(vdev), &vfio_ati_3c3_quirk, vdev, in vfio_vga_probe_ati_3c3_quirk()
425 "vfio-ati-3c3-quirk", 1); in vfio_vga_probe_ati_3c3_quirk()
427 3 /* offset 3 bytes from 0x3c0 */, quirk->mem); in vfio_vga_probe_ati_3c3_quirk()
430 quirk, next); in vfio_vga_probe_ati_3c3_quirk()
446 VFIOQuirk *quirk; in vfio_probe_ati_bar4_quirk() local
455 quirk = vfio_quirk_alloc(2); in vfio_probe_ati_bar4_quirk()
456 window = quirk->data = g_malloc0(sizeof(*window) + in vfio_probe_ati_bar4_quirk()
465 window->addr_mem = &quirk->mem[0]; in vfio_probe_ati_bar4_quirk()
466 window->data_mem = &quirk->mem[1]; in vfio_probe_ati_bar4_quirk()
470 "vfio-ati-bar4-window-address-quirk", 4); in vfio_probe_ati_bar4_quirk()
477 "vfio-ati-bar4-window-data-quirk", 4); in vfio_probe_ati_bar4_quirk()
482 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); in vfio_probe_ati_bar4_quirk()
492 VFIOQuirk *quirk; in vfio_probe_ati_bar2_quirk() local
501 quirk = vfio_quirk_alloc(1); in vfio_probe_ati_bar2_quirk()
502 mirror = quirk->data = g_malloc0(sizeof(*mirror)); in vfio_probe_ati_bar2_quirk()
503 mirror->mem = quirk->mem; in vfio_probe_ati_bar2_quirk()
510 "vfio-ati-bar2-4000-quirk", PCI_CONFIG_SPACE_SIZE); in vfio_probe_ati_bar2_quirk()
514 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); in vfio_probe_ati_bar2_quirk()
531 * The first quirk is actually not documented in envytools and is found
538 * through 0x3d0. This quirk doesn't seem to be necessary on newer cards
554 VFIONvidia3d0Quirk *quirk = opaque; in vfio_nvidia_3d4_quirk_read() local
555 VFIOPCIDevice *vdev = quirk->vdev; in vfio_nvidia_3d4_quirk_read()
557 quirk->state = NONE; in vfio_nvidia_3d4_quirk_read()
566 VFIONvidia3d0Quirk *quirk = opaque; in vfio_nvidia_3d4_quirk_write() local
567 VFIOPCIDevice *vdev = quirk->vdev; in vfio_nvidia_3d4_quirk_write()
568 VFIONvidia3d0State old_state = quirk->state; in vfio_nvidia_3d4_quirk_write()
570 quirk->state = NONE; in vfio_nvidia_3d4_quirk_write()
575 quirk->state = SELECT; in vfio_nvidia_3d4_quirk_write()
577 nv3d0_states[quirk->state]); in vfio_nvidia_3d4_quirk_write()
582 quirk->state = READ; in vfio_nvidia_3d4_quirk_write()
584 nv3d0_states[quirk->state]); in vfio_nvidia_3d4_quirk_write()
589 quirk->state = WRITE; in vfio_nvidia_3d4_quirk_write()
591 nv3d0_states[quirk->state]); in vfio_nvidia_3d4_quirk_write()
609 VFIONvidia3d0Quirk *quirk = opaque; in vfio_nvidia_3d0_quirk_read() local
610 VFIOPCIDevice *vdev = quirk->vdev; in vfio_nvidia_3d0_quirk_read()
611 VFIONvidia3d0State old_state = quirk->state; in vfio_nvidia_3d0_quirk_read()
615 quirk->state = NONE; in vfio_nvidia_3d0_quirk_read()
618 (quirk->offset & ~(PCI_CONFIG_SPACE_SIZE - 1)) == 0x1800) { in vfio_nvidia_3d0_quirk_read()
619 uint8_t offset = quirk->offset & (PCI_CONFIG_SPACE_SIZE - 1); in vfio_nvidia_3d0_quirk_read()
632 VFIONvidia3d0Quirk *quirk = opaque; in vfio_nvidia_3d0_quirk_write() local
633 VFIOPCIDevice *vdev = quirk->vdev; in vfio_nvidia_3d0_quirk_write()
634 VFIONvidia3d0State old_state = quirk->state; in vfio_nvidia_3d0_quirk_write()
636 quirk->state = NONE; in vfio_nvidia_3d0_quirk_write()
639 quirk->offset = (uint32_t)data; in vfio_nvidia_3d0_quirk_write()
640 quirk->state = WINDOW; in vfio_nvidia_3d0_quirk_write()
642 nv3d0_states[quirk->state]); in vfio_nvidia_3d0_quirk_write()
644 if ((quirk->offset & ~(PCI_CONFIG_SPACE_SIZE - 1)) == 0x1800) { in vfio_nvidia_3d0_quirk_write()
645 uint8_t offset = quirk->offset & (PCI_CONFIG_SPACE_SIZE - 1); in vfio_nvidia_3d0_quirk_write()
666 VFIOQuirk *quirk; in vfio_vga_probe_nvidia_3d0_quirk() local
675 quirk = vfio_quirk_alloc(2); in vfio_vga_probe_nvidia_3d0_quirk()
676 quirk->data = data = g_malloc0(sizeof(*data)); in vfio_vga_probe_nvidia_3d0_quirk()
679 memory_region_init_io(&quirk->mem[0], OBJECT(vdev), &vfio_nvidia_3d4_quirk, in vfio_vga_probe_nvidia_3d0_quirk()
680 data, "vfio-nvidia-3d4-quirk", 2); in vfio_vga_probe_nvidia_3d0_quirk()
682 0x14 /* 0x3c0 + 0x14 */, &quirk->mem[0]); in vfio_vga_probe_nvidia_3d0_quirk()
684 memory_region_init_io(&quirk->mem[1], OBJECT(vdev), &vfio_nvidia_3d0_quirk, in vfio_vga_probe_nvidia_3d0_quirk()
685 data, "vfio-nvidia-3d0-quirk", 2); in vfio_vga_probe_nvidia_3d0_quirk()
687 0x10 /* 0x3c0 + 0x10 */, &quirk->mem[1]); in vfio_vga_probe_nvidia_3d0_quirk()
690 quirk, next); in vfio_vga_probe_nvidia_3d0_quirk()
696 * The second quirk is documented in envytools. The I/O port BAR5 is just
782 VFIOQuirk *quirk; in vfio_probe_nvidia_bar5_quirk() local
792 quirk = vfio_quirk_alloc(4); in vfio_probe_nvidia_bar5_quirk()
793 bar5 = quirk->data = g_malloc0(sizeof(*bar5) + in vfio_probe_nvidia_bar5_quirk()
806 window->addr_mem = bar5->addr_mem = &quirk->mem[0]; in vfio_probe_nvidia_bar5_quirk()
807 window->data_mem = bar5->data_mem = &quirk->mem[1]; in vfio_probe_nvidia_bar5_quirk()
811 "vfio-nvidia-bar5-window-address-quirk", 4); in vfio_probe_nvidia_bar5_quirk()
819 "vfio-nvidia-bar5-window-data-quirk", 4); in vfio_probe_nvidia_bar5_quirk()
825 memory_region_init_io(&quirk->mem[2], OBJECT(vdev), in vfio_probe_nvidia_bar5_quirk()
827 "vfio-nvidia-bar5-master-quirk", 4); in vfio_probe_nvidia_bar5_quirk()
829 0, &quirk->mem[2], 1); in vfio_probe_nvidia_bar5_quirk()
831 memory_region_init_io(&quirk->mem[3], OBJECT(vdev), in vfio_probe_nvidia_bar5_quirk()
833 "vfio-nvidia-bar5-enable-quirk", 4); in vfio_probe_nvidia_bar5_quirk()
835 4, &quirk->mem[3], 1); in vfio_probe_nvidia_bar5_quirk()
837 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); in vfio_probe_nvidia_bar5_quirk()
843 VFIOQuirk *quirk; member
909 VFIOQuirk *quirk = last->quirk; in vfio_nvidia_quirk_mirror_write() local
911 QLIST_INSERT_HEAD(&quirk->ioeventfds, ioeventfd, next); in vfio_nvidia_quirk_mirror_write()
930 static void vfio_nvidia_bar0_quirk_reset(VFIOPCIDevice *vdev, VFIOQuirk *quirk) in vfio_nvidia_bar0_quirk_reset() argument
932 VFIOConfigMirrorQuirk *mirror = quirk->data; in vfio_nvidia_bar0_quirk_reset()
937 vfio_drop_dynamic_eventfds(vdev, quirk); in vfio_nvidia_bar0_quirk_reset()
942 VFIOQuirk *quirk; in vfio_probe_nvidia_bar0_quirk() local
952 quirk = vfio_quirk_alloc(1); in vfio_probe_nvidia_bar0_quirk()
953 quirk->reset = vfio_nvidia_bar0_quirk_reset; in vfio_probe_nvidia_bar0_quirk()
954 mirror = quirk->data = g_malloc0(sizeof(*mirror) + sizeof(LastDataSet)); in vfio_probe_nvidia_bar0_quirk()
955 mirror->mem = quirk->mem; in vfio_probe_nvidia_bar0_quirk()
960 last->quirk = quirk; in vfio_probe_nvidia_bar0_quirk()
964 "vfio-nvidia-bar0-88000-mirror-quirk", in vfio_probe_nvidia_bar0_quirk()
969 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); in vfio_probe_nvidia_bar0_quirk()
973 quirk = vfio_quirk_alloc(1); in vfio_probe_nvidia_bar0_quirk()
974 quirk->reset = vfio_nvidia_bar0_quirk_reset; in vfio_probe_nvidia_bar0_quirk()
975 mirror = quirk->data = g_malloc0(sizeof(*mirror) + sizeof(LastDataSet)); in vfio_probe_nvidia_bar0_quirk()
976 mirror->mem = quirk->mem; in vfio_probe_nvidia_bar0_quirk()
981 last->quirk = quirk; in vfio_probe_nvidia_bar0_quirk()
985 "vfio-nvidia-bar0-1800-mirror-quirk", in vfio_probe_nvidia_bar0_quirk()
990 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); in vfio_probe_nvidia_bar0_quirk()
1134 VFIOQuirk *quirk; in vfio_probe_rtl8168_bar2_quirk() local
1141 quirk = vfio_quirk_alloc(2); in vfio_probe_rtl8168_bar2_quirk()
1142 quirk->data = rtl = g_malloc0(sizeof(*rtl)); in vfio_probe_rtl8168_bar2_quirk()
1145 memory_region_init_io(&quirk->mem[0], OBJECT(vdev), in vfio_probe_rtl8168_bar2_quirk()
1147 "vfio-rtl8168-window-address-quirk", 4); in vfio_probe_rtl8168_bar2_quirk()
1149 0x74, &quirk->mem[0], 1); in vfio_probe_rtl8168_bar2_quirk()
1151 memory_region_init_io(&quirk->mem[1], OBJECT(vdev), in vfio_probe_rtl8168_bar2_quirk()
1153 "vfio-rtl8168-window-data-quirk", 4); in vfio_probe_rtl8168_bar2_quirk()
1155 0x70, &quirk->mem[1], 1); in vfio_probe_rtl8168_bar2_quirk()
1157 QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); in vfio_probe_rtl8168_bar2_quirk()
1213 * Common quirk probe entry points.
1223 VFIOQuirk *quirk; in vfio_vga_quirk_exit() local
1227 QLIST_FOREACH(quirk, &vdev->vga->region[i].quirks, next) { in vfio_vga_quirk_exit()
1228 for (j = 0; j < quirk->nr_mem; j++) { in vfio_vga_quirk_exit()
1230 &quirk->mem[j]); in vfio_vga_quirk_exit()
1242 VFIOQuirk *quirk = QLIST_FIRST(&vdev->vga->region[i].quirks); in vfio_vga_quirk_finalize() local
1243 QLIST_REMOVE(quirk, next); in vfio_vga_quirk_finalize()
1244 for (j = 0; j < quirk->nr_mem; j++) { in vfio_vga_quirk_finalize()
1245 object_unparent(OBJECT(&quirk->mem[j])); in vfio_vga_quirk_finalize()
1247 g_free(quirk->mem); in vfio_vga_quirk_finalize()
1248 g_free(quirk->data); in vfio_vga_quirk_finalize()
1249 g_free(quirk); in vfio_vga_quirk_finalize()
1270 VFIOQuirk *quirk; in vfio_bar_quirk_exit() local
1273 QLIST_FOREACH(quirk, &bar->quirks, next) { in vfio_bar_quirk_exit()
1274 while (!QLIST_EMPTY(&quirk->ioeventfds)) { in vfio_bar_quirk_exit()
1275 vfio_ioeventfd_exit(vdev, QLIST_FIRST(&quirk->ioeventfds)); in vfio_bar_quirk_exit()
1278 for (i = 0; i < quirk->nr_mem; i++) { in vfio_bar_quirk_exit()
1279 memory_region_del_subregion(bar->region.mem, &quirk->mem[i]); in vfio_bar_quirk_exit()
1290 VFIOQuirk *quirk = QLIST_FIRST(&bar->quirks); in vfio_bar_quirk_finalize() local
1291 QLIST_REMOVE(quirk, next); in vfio_bar_quirk_finalize()
1292 for (i = 0; i < quirk->nr_mem; i++) { in vfio_bar_quirk_finalize()
1293 object_unparent(OBJECT(&quirk->mem[i])); in vfio_bar_quirk_finalize()
1295 g_free(quirk->mem); in vfio_bar_quirk_finalize()
1296 g_free(quirk->data); in vfio_bar_quirk_finalize()
1297 g_free(quirk); in vfio_bar_quirk_finalize()
1309 VFIOQuirk *quirk; in vfio_quirk_reset() local
1312 QLIST_FOREACH(quirk, &bar->quirks, next) { in vfio_quirk_reset()
1313 if (quirk->reset) { in vfio_quirk_reset()
1314 quirk->reset(vdev, quirk); in vfio_quirk_reset()
1625 * located at offset 0x2000 in MEMBAR2 (BAR 4). This quirk provides the HPA