vfio/pci: Pass an error object to vfio_populate_vga
Pass an error object to prepare for the same operation in vfio_populate_device. Eventually this contributes to the migration to VFIO-PCI realize. We now report an error on vfio_get_region_info failure. vfio_probe_igd_bar4_quirk is not involved in the migration to realize and simply calls error_reportf_err. Signed-off-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
		
							parent
							
								
									426ec9049e
								
							
						
					
					
						commit
						cde4279baa
					
				@ -1363,6 +1363,7 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
 | 
				
			|||||||
    uint64_t *bdsm_size;
 | 
					    uint64_t *bdsm_size;
 | 
				
			||||||
    uint32_t gmch;
 | 
					    uint32_t gmch;
 | 
				
			||||||
    uint16_t cmd_orig, cmd;
 | 
					    uint16_t cmd_orig, cmd;
 | 
				
			||||||
 | 
					    Error *err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
     * This must be an Intel VGA device at address 00:02.0 for us to even
 | 
					     * This must be an Intel VGA device at address 00:02.0 for us to even
 | 
				
			||||||
@ -1464,7 +1465,8 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
 | 
				
			|||||||
     * try to enable it.  Probably shouldn't be using legacy mode without VGA,
 | 
					     * try to enable it.  Probably shouldn't be using legacy mode without VGA,
 | 
				
			||||||
     * but also no point in us enabling VGA if disabled in hardware.
 | 
					     * but also no point in us enabling VGA if disabled in hardware.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    if (!(gmch & 0x2) && !vdev->vga && vfio_populate_vga(vdev)) {
 | 
					    if (!(gmch & 0x2) && !vdev->vga && vfio_populate_vga(vdev, &err)) {
 | 
				
			||||||
 | 
					        error_reportf_err(err, ERR_PREFIX, vdev->vbasedev.name);
 | 
				
			||||||
        error_report("IGD device %s failed to enable VGA access, "
 | 
					        error_report("IGD device %s failed to enable VGA access, "
 | 
				
			||||||
                     "legacy mode disabled", vdev->vbasedev.name);
 | 
					                     "legacy mode disabled", vdev->vbasedev.name);
 | 
				
			||||||
        goto out;
 | 
					        goto out;
 | 
				
			||||||
 | 
				
			|||||||
@ -2134,7 +2134,7 @@ static VFIODeviceOps vfio_pci_ops = {
 | 
				
			|||||||
    .vfio_eoi = vfio_intx_eoi,
 | 
					    .vfio_eoi = vfio_intx_eoi,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int vfio_populate_vga(VFIOPCIDevice *vdev)
 | 
					int vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    VFIODevice *vbasedev = &vdev->vbasedev;
 | 
					    VFIODevice *vbasedev = &vdev->vbasedev;
 | 
				
			||||||
    struct vfio_region_info *reg_info;
 | 
					    struct vfio_region_info *reg_info;
 | 
				
			||||||
@ -2142,15 +2142,18 @@ int vfio_populate_vga(VFIOPCIDevice *vdev)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    ret = vfio_get_region_info(vbasedev, VFIO_PCI_VGA_REGION_INDEX, ®_info);
 | 
					    ret = vfio_get_region_info(vbasedev, VFIO_PCI_VGA_REGION_INDEX, ®_info);
 | 
				
			||||||
    if (ret) {
 | 
					    if (ret) {
 | 
				
			||||||
 | 
					        error_setg_errno(errp, -ret,
 | 
				
			||||||
 | 
					                         "failed getting region info for VGA region index %d",
 | 
				
			||||||
 | 
					                         VFIO_PCI_VGA_REGION_INDEX);
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(reg_info->flags & VFIO_REGION_INFO_FLAG_READ) ||
 | 
					    if (!(reg_info->flags & VFIO_REGION_INFO_FLAG_READ) ||
 | 
				
			||||||
        !(reg_info->flags & VFIO_REGION_INFO_FLAG_WRITE) ||
 | 
					        !(reg_info->flags & VFIO_REGION_INFO_FLAG_WRITE) ||
 | 
				
			||||||
        reg_info->size < 0xbffff + 1) {
 | 
					        reg_info->size < 0xbffff + 1) {
 | 
				
			||||||
        error_report("vfio: Unexpected VGA info, flags 0x%lx, size 0x%lx",
 | 
					        error_setg(errp, "unexpected VGA info, flags 0x%lx, size 0x%lx",
 | 
				
			||||||
                     (unsigned long)reg_info->flags,
 | 
					                   (unsigned long)reg_info->flags,
 | 
				
			||||||
                     (unsigned long)reg_info->size);
 | 
					                   (unsigned long)reg_info->size);
 | 
				
			||||||
        g_free(reg_info);
 | 
					        g_free(reg_info);
 | 
				
			||||||
        return -EINVAL;
 | 
					        return -EINVAL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -2205,6 +2208,7 @@ static int vfio_populate_device(VFIOPCIDevice *vdev)
 | 
				
			|||||||
    struct vfio_region_info *reg_info;
 | 
					    struct vfio_region_info *reg_info;
 | 
				
			||||||
    struct vfio_irq_info irq_info = { .argsz = sizeof(irq_info) };
 | 
					    struct vfio_irq_info irq_info = { .argsz = sizeof(irq_info) };
 | 
				
			||||||
    int i, ret = -1;
 | 
					    int i, ret = -1;
 | 
				
			||||||
 | 
					    Error *err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Sanity check device */
 | 
					    /* Sanity check device */
 | 
				
			||||||
    if (!(vbasedev->flags & VFIO_DEVICE_FLAGS_PCI)) {
 | 
					    if (!(vbasedev->flags & VFIO_DEVICE_FLAGS_PCI)) {
 | 
				
			||||||
@ -2259,10 +2263,11 @@ static int vfio_populate_device(VFIOPCIDevice *vdev)
 | 
				
			|||||||
    g_free(reg_info);
 | 
					    g_free(reg_info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (vdev->features & VFIO_FEATURE_ENABLE_VGA) {
 | 
					    if (vdev->features & VFIO_FEATURE_ENABLE_VGA) {
 | 
				
			||||||
        ret = vfio_populate_vga(vdev);
 | 
					        ret = vfio_populate_vga(vdev, &err);
 | 
				
			||||||
        if (ret) {
 | 
					        if (ret) {
 | 
				
			||||||
            error_report(
 | 
					            error_append_hint(&err, "device does not support "
 | 
				
			||||||
                "vfio: Device does not support requested feature x-vga");
 | 
					                              "requested feature x-vga\n");
 | 
				
			||||||
 | 
					            error_reportf_err(err, ERR_PREFIX, vdev->vbasedev.name);
 | 
				
			||||||
            goto error;
 | 
					            goto error;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -161,7 +161,7 @@ void vfio_bar_quirk_exit(VFIOPCIDevice *vdev, int nr);
 | 
				
			|||||||
void vfio_bar_quirk_finalize(VFIOPCIDevice *vdev, int nr);
 | 
					void vfio_bar_quirk_finalize(VFIOPCIDevice *vdev, int nr);
 | 
				
			||||||
void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev);
 | 
					void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int vfio_populate_vga(VFIOPCIDevice *vdev);
 | 
					int vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int vfio_pci_igd_opregion_init(VFIOPCIDevice *vdev,
 | 
					int vfio_pci_igd_opregion_init(VFIOPCIDevice *vdev,
 | 
				
			||||||
                               struct vfio_region_info *info);
 | 
					                               struct vfio_region_info *info);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user