Message ID | 1562324511-2910-3-git-send-email-yi.l.liu@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | intel_iommu: expose Shared Virtual Addressing to VM | expand |
On Fri, Jul 05, 2019 at 07:01:35PM +0800, Liu Yi L wrote: > This patch imports the vIOMMU related definitions from kernel > uapi/vfio.h. e.g. pasid allocation, guest pasid bind, guest pasid > table bind and guest iommu cache invalidation. > > Cc: Kevin Tian <kevin.tian@intel.com> > Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> > Cc: Peter Xu <peterx@redhat.com> > Cc: Eric Auger <eric.auger@redhat.com> > Cc: Yi Sun <yi.y.sun@linux.intel.com> > Signed-off-by: Liu Yi L <yi.l.liu@intel.com> > Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> > Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com> Just a note that in the last version you can use scripts/update-linux-headers.sh to update the headers. For this RFC it's perfectly fine.
Hi Liu, On 7/9/19 3:58 AM, Peter Xu wrote: > On Fri, Jul 05, 2019 at 07:01:35PM +0800, Liu Yi L wrote: >> This patch imports the vIOMMU related definitions from kernel >> uapi/vfio.h. e.g. pasid allocation, guest pasid bind, guest pasid >> table bind and guest iommu cache invalidation. >> >> Cc: Kevin Tian <kevin.tian@intel.com> >> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> >> Cc: Peter Xu <peterx@redhat.com> >> Cc: Eric Auger <eric.auger@redhat.com> >> Cc: Yi Sun <yi.y.sun@linux.intel.com> >> Signed-off-by: Liu Yi L <yi.l.liu@intel.com> >> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> >> Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com> > > Just a note that in the last version you can use > scripts/update-linux-headers.sh to update the headers. For this RFC > it's perfectly fine. > You will need to update scripts/update-linux-headers.sh to import the new iommu.h header. See "[RFC v4 02/27] update-linux-headers: Import iommu.h" https://www.mail-archive.com/qemu-devel@nongnu.org/msg620098.html. Thanks Eric
> From: kvm-owner@vger.kernel.org [mailto:kvm-owner@vger.kernel.org] On Behalf > Of Peter Xu > Sent: Tuesday, July 9, 2019 9:58 AM > To: Liu, Yi L <yi.l.liu@intel.com> > Subject: Re: [RFC v1 02/18] linux-headers: import vfio.h from kernel > > On Fri, Jul 05, 2019 at 07:01:35PM +0800, Liu Yi L wrote: > > This patch imports the vIOMMU related definitions from kernel > > uapi/vfio.h. e.g. pasid allocation, guest pasid bind, guest pasid > > table bind and guest iommu cache invalidation. > > > > Cc: Kevin Tian <kevin.tian@intel.com> > > Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> > > Cc: Peter Xu <peterx@redhat.com> > > Cc: Eric Auger <eric.auger@redhat.com> > > Cc: Yi Sun <yi.y.sun@linux.intel.com> > > Signed-off-by: Liu Yi L <yi.l.liu@intel.com> > > Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> > > Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com> > > Just a note that in the last version you can use scripts/update-linux-headers.sh to > update the headers. For this RFC it's perfectly fine. yep, thanks for the remind. > -- > Peter Xu Regards, Yi Liu
> From: Auger Eric [mailto:eric.auger@redhat.com] > Sent: Tuesday, July 9, 2019 4:38 PM > To: Peter Xu <zhexu@redhat.com>; Liu, Yi L <yi.l.liu@intel.com> > Subject: Re: [RFC v1 02/18] linux-headers: import vfio.h from kernel > > Hi Liu, > > On 7/9/19 3:58 AM, Peter Xu wrote: > > On Fri, Jul 05, 2019 at 07:01:35PM +0800, Liu Yi L wrote: > >> This patch imports the vIOMMU related definitions from kernel > >> uapi/vfio.h. e.g. pasid allocation, guest pasid bind, guest pasid > >> table bind and guest iommu cache invalidation. > >> > >> Cc: Kevin Tian <kevin.tian@intel.com> > >> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> > >> Cc: Peter Xu <peterx@redhat.com> > >> Cc: Eric Auger <eric.auger@redhat.com> > >> Cc: Yi Sun <yi.y.sun@linux.intel.com> > >> Signed-off-by: Liu Yi L <yi.l.liu@intel.com> > >> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> > >> Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com> > > > > Just a note that in the last version you can use > > scripts/update-linux-headers.sh to update the headers. For this RFC > > it's perfectly fine. > > > > You will need to update scripts/update-linux-headers.sh to import the new iommu.h > header. See "[RFC v4 02/27] update-linux-headers: Import iommu.h" > https://www.mail-archive.com/qemu-devel@nongnu.org/msg620098.html. Thanks very much Eric. :-) Regards, Yi Liu
diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h index 24f5051..551648e 100644 --- a/linux-headers/linux/vfio.h +++ b/linux-headers/linux/vfio.h @@ -14,6 +14,7 @@ #include <linux/types.h> #include <linux/ioctl.h> +#include <linux/iommu.h> #define VFIO_API_VERSION 0 @@ -763,6 +764,121 @@ struct vfio_iommu_type1_dma_unmap { #define VFIO_IOMMU_ENABLE _IO(VFIO_TYPE, VFIO_BASE + 15) #define VFIO_IOMMU_DISABLE _IO(VFIO_TYPE, VFIO_BASE + 16) +/** + * VFIO_IOMMU_ATTACH_PASID_TABLE - _IOWR(VFIO_TYPE, VFIO_BASE + 22, + * struct vfio_iommu_type1_attach_pasid_table) + * + * Passes the PASID table to the host. Calling ATTACH_PASID_TABLE + * while a table is already installed is allowed: it replaces the old + * table. DETACH does a comprehensive tear down of the nested mode. + */ +struct vfio_iommu_type1_attach_pasid_table { + __u32 argsz; + __u32 flags; + struct iommu_pasid_table_config config; +}; +#define VFIO_IOMMU_ATTACH_PASID_TABLE _IO(VFIO_TYPE, VFIO_BASE + 22) + +/** + * VFIO_IOMMU_DETACH_PASID_TABLE - - _IOWR(VFIO_TYPE, VFIO_BASE + 23) + * Detaches the PASID table + */ +#define VFIO_IOMMU_DETACH_PASID_TABLE _IO(VFIO_TYPE, VFIO_BASE + 23) + +/** + * VFIO_IOMMU_CACHE_INVALIDATE - _IOWR(VFIO_TYPE, VFIO_BASE + 24, + * struct vfio_iommu_type1_cache_invalidate) + * + * Propagate guest IOMMU cache invalidation to the host. + */ +struct vfio_iommu_type1_cache_invalidate { + __u32 argsz; + __u32 flags; + struct iommu_cache_invalidate_info info; +}; +#define VFIO_IOMMU_CACHE_INVALIDATE _IO(VFIO_TYPE, VFIO_BASE + 24) + +/* + * @flag=VFIO_IOMMU_PASID_ALLOC, refer to the @min_pasid and @max_pasid fields + * @flag=VFIO_IOMMU_PASID_FREE, refer to @pasid field + */ +struct vfio_iommu_type1_pasid_request { + __u32 argsz; +#define VFIO_IOMMU_PASID_ALLOC (1 << 0) +#define VFIO_IOMMU_PASID_FREE (1 << 1) + __u32 flag; + union { + struct { + int min_pasid; + int max_pasid; + }; + int pasid; + }; +}; + +/** + * VFIO_IOMMU_PASID_REQUEST - _IOWR(VFIO_TYPE, VFIO_BASE + 27, + * struct vfio_iommu_type1_pasid_request) + * + */ +#define VFIO_IOMMU_PASID_REQUEST _IO(VFIO_TYPE, VFIO_BASE + 27) + +/* + * In guest use of SVA, the first level page tables is managed by the guest. + * we can either bind guest PASID table or explicitly bind a PASID with guest + * page table. + */ +struct vfio_iommu_type1_bind_guest_pasid { + struct gpasid_bind_data bind_data; +}; + +enum vfio_iommu_bind_type { + VFIO_IOMMU_BIND_PROCESS, + VFIO_IOMMU_BIND_GUEST_PASID, +}; + +/* + * Supported types: + * - VFIO_IOMMU_BIND_PROCESS: bind native process, which takes + * vfio_iommu_type1_bind_process in data. + * - VFIO_IOMMU_BIND_GUEST_PASID: bind guest pasid, which invoked + * by guest process binding, it takes + * vfio_iommu_type1_bind_guest_pasid in data. + */ +struct vfio_iommu_type1_bind { + __u32 argsz; + enum vfio_iommu_bind_type bind_type; + __u8 data[]; +}; + +/* + * VFIO_IOMMU_BIND - _IOWR(VFIO_TYPE, VFIO_BASE + 28, struct vfio_iommu_bind) + * + * Manage address spaces of devices in this container. Initially a TYPE1 + * container can only have one address space, managed with + * VFIO_IOMMU_MAP/UNMAP_DMA. + * + * An IOMMU of type VFIO_TYPE1_NESTING_IOMMU can be managed by both MAP/UNMAP + * and BIND ioctls at the same time. MAP/UNMAP acts on the stage-2 (host) page + * tables, and BIND manages the stage-1 (guest) page tables. Other types of + * IOMMU may allow MAP/UNMAP and BIND to coexist, where MAP/UNMAP controls + * non-PASID traffic and BIND controls PASID traffic. But this depends on the + * underlying IOMMU architecture and isn't guaranteed. + * + * Availability of this feature depends on the device, its bus, the underlying + * IOMMU and the CPU architecture. + * + * returns: 0 on success, -errno on failure. + */ +#define VFIO_IOMMU_BIND _IO(VFIO_TYPE, VFIO_BASE + 28) + +/* + * VFIO_IOMMU_UNBIND - _IOWR(VFIO_TYPE, VFIO_BASE + 29, struct vfio_iommu_bind) + * + * Undo what was done by the corresponding VFIO_IOMMU_BIND ioctl. + */ +#define VFIO_IOMMU_UNBIND _IO(VFIO_TYPE, VFIO_BASE + 29) + /* -------- Additional API for SPAPR TCE (Server POWERPC) IOMMU -------- */ /*