mirror of https://github.com/xqemu/xqemu.git
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,13 +2142,16 @@ 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);
|
||||||
|
@ -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…
Reference in New Issue