pci.c (c32bab074ebac4dc872dabe801efe6581f73daba) | pci.c (64410a741d57b62f736562a89b89d0497b3033ce) |
---|---|
1/* 2 * vfio based device assignment support 3 * 4 * Copyright Red Hat, Inc. 2012 5 * 6 * Authors: 7 * Alex Williamson <alex.williamson@redhat.com> 8 * --- 2656 unchanged lines hidden (view full) --- 2665 .vfio_compute_needs_reset = vfio_pci_compute_needs_reset, 2666 .vfio_hot_reset_multi = vfio_pci_hot_reset_multi, 2667 .vfio_eoi = vfio_intx_eoi, 2668 .vfio_get_object = vfio_pci_get_object, 2669 .vfio_save_config = vfio_pci_save_config, 2670 .vfio_load_config = vfio_pci_load_config, 2671}; 2672 | 1/* 2 * vfio based device assignment support 3 * 4 * Copyright Red Hat, Inc. 2012 5 * 6 * Authors: 7 * Alex Williamson <alex.williamson@redhat.com> 8 * --- 2656 unchanged lines hidden (view full) --- 2665 .vfio_compute_needs_reset = vfio_pci_compute_needs_reset, 2666 .vfio_hot_reset_multi = vfio_pci_hot_reset_multi, 2667 .vfio_eoi = vfio_intx_eoi, 2668 .vfio_get_object = vfio_pci_get_object, 2669 .vfio_save_config = vfio_pci_save_config, 2670 .vfio_load_config = vfio_pci_load_config, 2671}; 2672 |
2673int vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp) | 2673bool vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp) |
2674{ 2675 VFIODevice *vbasedev = &vdev->vbasedev; 2676 struct vfio_region_info *reg_info; 2677 int ret; 2678 2679 ret = vfio_get_region_info(vbasedev, VFIO_PCI_VGA_REGION_INDEX, ®_info); 2680 if (ret) { 2681 error_setg_errno(errp, -ret, 2682 "failed getting region info for VGA region index %d", 2683 VFIO_PCI_VGA_REGION_INDEX); | 2674{ 2675 VFIODevice *vbasedev = &vdev->vbasedev; 2676 struct vfio_region_info *reg_info; 2677 int ret; 2678 2679 ret = vfio_get_region_info(vbasedev, VFIO_PCI_VGA_REGION_INDEX, ®_info); 2680 if (ret) { 2681 error_setg_errno(errp, -ret, 2682 "failed getting region info for VGA region index %d", 2683 VFIO_PCI_VGA_REGION_INDEX); |
2684 return ret; | 2684 return false; |
2685 } 2686 2687 if (!(reg_info->flags & VFIO_REGION_INFO_FLAG_READ) || 2688 !(reg_info->flags & VFIO_REGION_INFO_FLAG_WRITE) || 2689 reg_info->size < 0xbffff + 1) { 2690 error_setg(errp, "unexpected VGA info, flags 0x%lx, size 0x%lx", 2691 (unsigned long)reg_info->flags, 2692 (unsigned long)reg_info->size); 2693 g_free(reg_info); | 2685 } 2686 2687 if (!(reg_info->flags & VFIO_REGION_INFO_FLAG_READ) || 2688 !(reg_info->flags & VFIO_REGION_INFO_FLAG_WRITE) || 2689 reg_info->size < 0xbffff + 1) { 2690 error_setg(errp, "unexpected VGA info, flags 0x%lx, size 0x%lx", 2691 (unsigned long)reg_info->flags, 2692 (unsigned long)reg_info->size); 2693 g_free(reg_info); |
2694 return -EINVAL; | 2694 return false; |
2695 } 2696 2697 vdev->vga = g_new0(VFIOVGA, 1); 2698 2699 vdev->vga->fd_offset = reg_info->offset; 2700 vdev->vga->fd = vdev->vbasedev.fd; 2701 2702 g_free(reg_info); --- 27 unchanged lines hidden (view full) --- 2730 &vdev->vga->region[QEMU_PCI_VGA_IO_HI], 2731 "vfio-vga-io@0x3c0", 2732 QEMU_PCI_VGA_IO_HI_SIZE); 2733 2734 pci_register_vga(&vdev->pdev, &vdev->vga->region[QEMU_PCI_VGA_MEM].mem, 2735 &vdev->vga->region[QEMU_PCI_VGA_IO_LO].mem, 2736 &vdev->vga->region[QEMU_PCI_VGA_IO_HI].mem); 2737 | 2695 } 2696 2697 vdev->vga = g_new0(VFIOVGA, 1); 2698 2699 vdev->vga->fd_offset = reg_info->offset; 2700 vdev->vga->fd = vdev->vbasedev.fd; 2701 2702 g_free(reg_info); --- 27 unchanged lines hidden (view full) --- 2730 &vdev->vga->region[QEMU_PCI_VGA_IO_HI], 2731 "vfio-vga-io@0x3c0", 2732 QEMU_PCI_VGA_IO_HI_SIZE); 2733 2734 pci_register_vga(&vdev->pdev, &vdev->vga->region[QEMU_PCI_VGA_MEM].mem, 2735 &vdev->vga->region[QEMU_PCI_VGA_IO_LO].mem, 2736 &vdev->vga->region[QEMU_PCI_VGA_IO_HI].mem); 2737 |
2738 return 0; | 2738 return true; |
2739} 2740 2741static bool vfio_populate_device(VFIOPCIDevice *vdev, Error **errp) 2742{ 2743 VFIODevice *vbasedev = &vdev->vbasedev; 2744 struct vfio_region_info *reg_info; 2745 struct vfio_irq_info irq_info = { .argsz = sizeof(irq_info) }; 2746 int i, ret = -1; --- 46 unchanged lines hidden (view full) --- 2793 if (vdev->config_size == PCI_CONFIG_SPACE_SIZE) { 2794 vdev->pdev.cap_present &= ~QEMU_PCI_CAP_EXPRESS; 2795 } 2796 vdev->config_offset = reg_info->offset; 2797 2798 g_free(reg_info); 2799 2800 if (vdev->features & VFIO_FEATURE_ENABLE_VGA) { | 2739} 2740 2741static bool vfio_populate_device(VFIOPCIDevice *vdev, Error **errp) 2742{ 2743 VFIODevice *vbasedev = &vdev->vbasedev; 2744 struct vfio_region_info *reg_info; 2745 struct vfio_irq_info irq_info = { .argsz = sizeof(irq_info) }; 2746 int i, ret = -1; --- 46 unchanged lines hidden (view full) --- 2793 if (vdev->config_size == PCI_CONFIG_SPACE_SIZE) { 2794 vdev->pdev.cap_present &= ~QEMU_PCI_CAP_EXPRESS; 2795 } 2796 vdev->config_offset = reg_info->offset; 2797 2798 g_free(reg_info); 2799 2800 if (vdev->features & VFIO_FEATURE_ENABLE_VGA) { |
2801 ret = vfio_populate_vga(vdev, errp); 2802 if (ret) { | 2801 if (!vfio_populate_vga(vdev, errp)) { |
2803 error_append_hint(errp, "device does not support " 2804 "requested feature x-vga\n"); 2805 return false; 2806 } 2807 } 2808 2809 irq_info.index = VFIO_PCI_ERR_IRQ_INDEX; 2810 --- 677 unchanged lines hidden --- | 2802 error_append_hint(errp, "device does not support " 2803 "requested feature x-vga\n"); 2804 return false; 2805 } 2806 } 2807 2808 irq_info.index = VFIO_PCI_ERR_IRQ_INDEX; 2809 --- 677 unchanged lines hidden --- |