On Fri, 23 Nov 2018 16:53:02 +1100
Alexey Kardashevskiy <a...@ozlabs.ru> wrote:

> So far we only allowed mapping of MMIO BARs to the userspace. However
> there there are GPUs with on-board coherent RAM accessible via side

s/there there/there/

Otherwise:

Acked-by: Alex Williamson <alex.william...@redhat.com>

> channels which we also want to map to the userspace. The first client
> for this is NVIDIA V100 GPU with NVLink2 direct links to a POWER9
> NPU-enabled CPU; such GPUs have 16GB RAM which is coherently mapped
> to the system address space, we are going to export these as an extra
> PCI region.
> 
> We already support extra PCI regions and this adds support for mapping
> them to the userspace.
> 
> Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru>
> Reviewed-by: David Gibson <da...@gibson.dropbear.id.au>
> ---
> Changes:
> v2:
> * reverted one of mistakenly removed error checks
> ---
>  drivers/vfio/pci/vfio_pci_private.h | 3 +++
>  drivers/vfio/pci/vfio_pci.c         | 9 +++++++++
>  2 files changed, 12 insertions(+)
> 
> diff --git a/drivers/vfio/pci/vfio_pci_private.h 
> b/drivers/vfio/pci/vfio_pci_private.h
> index cde3b5d..86aab05 100644
> --- a/drivers/vfio/pci/vfio_pci_private.h
> +++ b/drivers/vfio/pci/vfio_pci_private.h
> @@ -59,6 +59,9 @@ struct vfio_pci_regops {
>                     size_t count, loff_t *ppos, bool iswrite);
>       void    (*release)(struct vfio_pci_device *vdev,
>                          struct vfio_pci_region *region);
> +     int     (*mmap)(struct vfio_pci_device *vdev,
> +                     struct vfio_pci_region *region,
> +                     struct vm_area_struct *vma);
>  };
>  
>  struct vfio_pci_region {
> diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
> index fef5002..4a6f7c0 100644
> --- a/drivers/vfio/pci/vfio_pci.c
> +++ b/drivers/vfio/pci/vfio_pci.c
> @@ -1130,6 +1130,15 @@ static int vfio_pci_mmap(void *device_data, struct 
> vm_area_struct *vma)
>               return -EINVAL;
>       if ((vma->vm_flags & VM_SHARED) == 0)
>               return -EINVAL;
> +     if (index >= VFIO_PCI_NUM_REGIONS) {
> +             int regnum = index - VFIO_PCI_NUM_REGIONS;
> +             struct vfio_pci_region *region = vdev->region + regnum;
> +
> +             if (region && region->ops && region->ops->mmap &&
> +                 (region->flags & VFIO_REGION_INFO_FLAG_MMAP))
> +                     return region->ops->mmap(vdev, region, vma);
> +             return -EINVAL;
> +     }
>       if (index >= VFIO_PCI_ROM_REGION_INDEX)
>               return -EINVAL;
>       if (!vdev->bar_mmap_supported[index])

Reply via email to