Message ID | a7c0072a7232da2f3aa76d9cd4cdf415fd1127d1.1630084211.git.jag.raman@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio-user server in QEMU | expand |
On Fri, Aug 27, 2021 at 01:53:23PM -0400, Jagannathan Raman wrote: > @@ -96,6 +102,28 @@ static void vfu_object_machine_done(Notifier *notifier, void *data) > strerror(errno)); > return; > } > + > + dev = qdev_find_recursive(sysbus_get_default(), o->devid); > + if (dev == NULL) { > + error_setg(&error_abort, "vfu: Device %s not found", o->devid); > + return; > + } > + > + if (!object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) { > + error_setg(&error_abort, "vfu: %s not a PCI devices", o->devid); > + return; > + } > + > + o->pci_dev = PCI_DEVICE(dev); > + > + ret = vfu_pci_init(o->vfu_ctx, VFU_PCI_TYPE_CONVENTIONAL, > + PCI_HEADER_TYPE_NORMAL, 0); What is needed to support PCI Express?
> On Sep 8, 2021, at 8:43 AM, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > On Fri, Aug 27, 2021 at 01:53:23PM -0400, Jagannathan Raman wrote: >> @@ -96,6 +102,28 @@ static void vfu_object_machine_done(Notifier *notifier, void *data) >> strerror(errno)); >> return; >> } >> + >> + dev = qdev_find_recursive(sysbus_get_default(), o->devid); >> + if (dev == NULL) { >> + error_setg(&error_abort, "vfu: Device %s not found", o->devid); >> + return; >> + } >> + >> + if (!object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) { >> + error_setg(&error_abort, "vfu: %s not a PCI devices", o->devid); >> + return; >> + } >> + >> + o->pci_dev = PCI_DEVICE(dev); >> + >> + ret = vfu_pci_init(o->vfu_ctx, VFU_PCI_TYPE_CONVENTIONAL, >> + PCI_HEADER_TYPE_NORMAL, 0); > > What is needed to support PCI Express? I think we could check if o->pci_dev supports QEMU_PCI_CAP_EXPRESS, and based on that choose if we should use VFU_PCI_TYPE_CONVENTIONAL or VFU_PCI_TYPE_EXPRESS. pci_is_express() is already doing that, although it’s a private function now. It’s a good time to export it. -- Jag
diff --git a/hw/remote/vfio-user-obj.c b/hw/remote/vfio-user-obj.c index 99d3dd1..5ae0991 100644 --- a/hw/remote/vfio-user-obj.c +++ b/hw/remote/vfio-user-obj.c @@ -38,6 +38,8 @@ #include "qapi/error.h" #include "sysemu/sysemu.h" #include "libvfio-user.h" +#include "hw/qdev-core.h" +#include "hw/pci/pci.h" #define TYPE_VFU_OBJECT "vfio-user" OBJECT_DECLARE_TYPE(VfuObject, VfuObjectClass, VFU_OBJECT) @@ -61,6 +63,8 @@ struct VfuObject { Notifier machine_done; vfu_ctx_t *vfu_ctx; + + PCIDevice *pci_dev; }; static void vfu_object_set_socket(Object *obj, const char *str, Error **errp) @@ -88,6 +92,8 @@ static void vfu_object_set_devid(Object *obj, const char *str, Error **errp) static void vfu_object_machine_done(Notifier *notifier, void *data) { VfuObject *o = container_of(notifier, VfuObject, machine_done); + DeviceState *dev = NULL; + int ret; o->vfu_ctx = vfu_create_ctx(VFU_TRANS_SOCK, o->socket, 0, o, VFU_DEV_TYPE_PCI); @@ -96,6 +102,28 @@ static void vfu_object_machine_done(Notifier *notifier, void *data) strerror(errno)); return; } + + dev = qdev_find_recursive(sysbus_get_default(), o->devid); + if (dev == NULL) { + error_setg(&error_abort, "vfu: Device %s not found", o->devid); + return; + } + + if (!object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) { + error_setg(&error_abort, "vfu: %s not a PCI devices", o->devid); + return; + } + + o->pci_dev = PCI_DEVICE(dev); + + ret = vfu_pci_init(o->vfu_ctx, VFU_PCI_TYPE_CONVENTIONAL, + PCI_HEADER_TYPE_NORMAL, 0); + if (ret < 0) { + error_setg(&error_abort, + "vfu: Failed to attach PCI device %s to context - %s", + o->devid, strerror(errno)); + return; + } } static void vfu_object_init(Object *obj)