On Thu, 21 Sep 2023 15:40:37 +0300
Yishai Hadas <yish...@nvidia.com> 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 <yish...@nvidia.com>
> ---
>  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);
>  

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to