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, &reg_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, &reg_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 ---