On Thu, 21 Sep 2023 15:40:37 +0300 Yishai Hadas <yishaih@xxxxxxxxxx> wrote: > Expose vfio_pci_core_setup_barmap() to be used by drivers. > > This will let drivers to mmap a BAR and re-use it from both vfio and the > driver when it's applicable. > > This API will be used in the next patches by the vfio/virtio coming > driver. > > Signed-off-by: Yishai Hadas <yishaih@xxxxxxxxxx> > --- > drivers/vfio/pci/vfio_pci_core.c | 25 +++++++++++++++++++++++++ > drivers/vfio/pci/vfio_pci_rdwr.c | 28 ++-------------------------- > include/linux/vfio_pci_core.h | 1 + > 3 files changed, 28 insertions(+), 26 deletions(-) > > diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c > index 1929103ee59a..b56111ed8a8c 100644 > --- a/drivers/vfio/pci/vfio_pci_core.c > +++ b/drivers/vfio/pci/vfio_pci_core.c > @@ -684,6 +684,31 @@ void vfio_pci_core_disable(struct vfio_pci_core_device *vdev) > } > EXPORT_SYMBOL_GPL(vfio_pci_core_disable); > > +int vfio_pci_core_setup_barmap(struct vfio_pci_core_device *vdev, int bar) > +{ > + struct pci_dev *pdev = vdev->pdev; > + void __iomem *io; > + int ret; > + > + if (vdev->barmap[bar]) > + return 0; > + > + ret = pci_request_selected_regions(pdev, 1 << bar, "vfio"); > + if (ret) > + return ret; > + > + io = pci_iomap(pdev, bar, 0); > + if (!io) { > + pci_release_selected_regions(pdev, 1 << bar); > + return -ENOMEM; > + } > + > + vdev->barmap[bar] = io; > + > + return 0; > +} > +EXPORT_SYMBOL(vfio_pci_core_setup_barmap); Not to endorse the rest of this yet, but minimally _GPL, same for the following patch. Thanks, Alex > + > void vfio_pci_core_close_device(struct vfio_device *core_vdev) > { > struct vfio_pci_core_device *vdev = > diff --git a/drivers/vfio/pci/vfio_pci_rdwr.c b/drivers/vfio/pci/vfio_pci_rdwr.c > index e27de61ac9fe..6f08b3ecbb89 100644 > --- a/drivers/vfio/pci/vfio_pci_rdwr.c > +++ b/drivers/vfio/pci/vfio_pci_rdwr.c > @@ -200,30 +200,6 @@ static ssize_t do_io_rw(struct vfio_pci_core_device *vdev, bool test_mem, > return done; > } > > -static int vfio_pci_setup_barmap(struct vfio_pci_core_device *vdev, int bar) > -{ > - struct pci_dev *pdev = vdev->pdev; > - int ret; > - void __iomem *io; > - > - if (vdev->barmap[bar]) > - return 0; > - > - ret = pci_request_selected_regions(pdev, 1 << bar, "vfio"); > - if (ret) > - return ret; > - > - io = pci_iomap(pdev, bar, 0); > - if (!io) { > - pci_release_selected_regions(pdev, 1 << bar); > - return -ENOMEM; > - } > - > - vdev->barmap[bar] = io; > - > - return 0; > -} > - > ssize_t vfio_pci_bar_rw(struct vfio_pci_core_device *vdev, char __user *buf, > size_t count, loff_t *ppos, bool iswrite) > { > @@ -262,7 +238,7 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_core_device *vdev, char __user *buf, > } > x_end = end; > } else { > - int ret = vfio_pci_setup_barmap(vdev, bar); > + int ret = vfio_pci_core_setup_barmap(vdev, bar); > if (ret) { > done = ret; > goto out; > @@ -438,7 +414,7 @@ int vfio_pci_ioeventfd(struct vfio_pci_core_device *vdev, loff_t offset, > return -EINVAL; > #endif > > - ret = vfio_pci_setup_barmap(vdev, bar); > + ret = vfio_pci_core_setup_barmap(vdev, bar); > if (ret) > return ret; > > diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h > index 562e8754869d..67ac58e20e1d 100644 > --- a/include/linux/vfio_pci_core.h > +++ b/include/linux/vfio_pci_core.h > @@ -127,6 +127,7 @@ int vfio_pci_core_match(struct vfio_device *core_vdev, char *buf); > int vfio_pci_core_enable(struct vfio_pci_core_device *vdev); > void vfio_pci_core_disable(struct vfio_pci_core_device *vdev); > void vfio_pci_core_finish_enable(struct vfio_pci_core_device *vdev); > +int vfio_pci_core_setup_barmap(struct vfio_pci_core_device *vdev, int bar); > pci_ers_result_t vfio_pci_core_aer_err_detected(struct pci_dev *pdev, > pci_channel_state_t state); >