> -----Original Message----- > From: dev <dev-boun...@dpdk.org> On Behalf Of Rosen Xu > Sent: Friday, August 2, 2019 6:49 AM > To: dev@dpdk.org > Cc: ferruh.yi...@intel.com; tianfei.zh...@intel.com; rosen...@intel.com; > andy....@intel.com; david.lomart...@intel.com; qi.z.zh...@intel.com; > xiaolong...@intel.com > Subject: [dpdk-dev] [PATCH v2 02/12] raw/ifpga_rawdev/base: add irq > support > > From: Tianfei zhang <tianfei.zh...@intel.com> > > Add irq support for ifpga FME globle error, port error and uint unit. > We implmented this feature by vfio interrupt mechanism. > > Signed-off-by: Tianfei zhang <tianfei.zh...@intel.com> > --- > drivers/raw/ifpga_rawdev/base/ifpga_feature_dev.c | 61 > +++++++++++++++++++++++ > drivers/raw/ifpga_rawdev/base/ifpga_fme_error.c | 22 ++++++++ > drivers/raw/ifpga_rawdev/base/ifpga_port.c | 20 ++++++++ > drivers/raw/ifpga_rawdev/base/ifpga_port_error.c | 21 ++++++++ > 4 files changed, 124 insertions(+) > > diff --git a/drivers/raw/ifpga_rawdev/base/ifpga_feature_dev.c > b/drivers/raw/ifpga_rawdev/base/ifpga_feature_dev.c > index 63c8bcc..6b942e6 100644 > --- a/drivers/raw/ifpga_rawdev/base/ifpga_feature_dev.c > +++ b/drivers/raw/ifpga_rawdev/base/ifpga_feature_dev.c > @@ -3,6 +3,7 @@ > */ > > #include <sys/ioctl.h> > +#include <rte_vfio.h> > > #include "ifpga_feature_dev.h" > > @@ -331,3 +332,63 @@ int port_hw_init(struct ifpga_port_hw *port) > port_hw_uinit(port); > return ret; > } > + > +/* > + * FIXME: we should get msix vec count during pci enumeration instead > +of > + * below hardcode value. > + */ > +#define FPGA_MSIX_VEC_COUNT 20 > +/* irq set buffer length for interrupt */ #define MSIX_IRQ_SET_BUF_LEN > +(sizeof(struct vfio_irq_set) + \ > + sizeof(int) * FPGA_MSIX_VEC_COUNT) > + > +/* only support msix for now*/ > +static int vfio_msix_enable_block(s32 vfio_dev_fd, unsigned int vec_start, > + unsigned int count, s32 *fds)
Isn't better to use generic EAL function for the same? > +{ > + char irq_set_buf[MSIX_IRQ_SET_BUF_LEN]; > + struct vfio_irq_set *irq_set; > + int len, ret; > + int *fd_ptr; > + > + len = sizeof(irq_set_buf); > + > + irq_set = (struct vfio_irq_set *)irq_set_buf; > + irq_set->argsz = len; > + irq_set->count = count; > + irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | > + VFIO_IRQ_SET_ACTION_TRIGGER; > + irq_set->index = VFIO_PCI_MSIX_IRQ_INDEX; > + irq_set->start = vec_start; > + > + fd_ptr = (int *)&irq_set->data; > + memcpy(fd_ptr, fds, sizeof(int) * count); > + > + ret = ioctl(vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set); > + if (ret) > + printf("Error enabling MSI-X interrupts\n"); > + > + return ret; > +} > +