Message ID | 20240603061023.269738-6-zhenzhong.duan@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add a host IOMMU device abstraction to check with vIOMMU | expand |
On 6/3/24 08:10, Zhenzhong Duan wrote: > HostIOMMUDeviceCaps's elements map to the host IOMMU's capabilities. > Different platform IOMMU can support different elements. > > Currently only two elements, type and aw_bits, type hints the host > platform IOMMU type, i.e., INTEL vtd, ARM smmu, etc; aw_bits hints > host IOMMU address width. > > Introduce .get_cap() handler to check if HOST_IOMMU_DEVICE_CAP_XXX > is supported. > > Suggested-by: Cédric Le Goater <clg@redhat.com> > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > --- > include/sysemu/host_iommu_device.h | 37 ++++++++++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > > diff --git a/include/sysemu/host_iommu_device.h b/include/sysemu/host_iommu_device.h > index 2b58a94d62..d47d1034b1 100644 > --- a/include/sysemu/host_iommu_device.h > +++ b/include/sysemu/host_iommu_device.h > @@ -15,11 +15,25 @@ > #include "qom/object.h" > #include "qapi/error.h" > > +/** > + * struct HostIOMMUDeviceCaps - Define host IOMMU device capabilities. > + * > + * @type: host platform IOMMU type. > + * > + * @aw_bits: host IOMMU address width. 0xff if no limitation. Could we introduce a define for the special value 0xff ? This would answer Eric's question. Thanks, C. > + */ > +typedef struct HostIOMMUDeviceCaps { > + uint32_t type; > + uint8_t aw_bits; > +} HostIOMMUDeviceCaps; > + > #define TYPE_HOST_IOMMU_DEVICE "host-iommu-device" > OBJECT_DECLARE_TYPE(HostIOMMUDevice, HostIOMMUDeviceClass, HOST_IOMMU_DEVICE) > > struct HostIOMMUDevice { > Object parent_obj; > + > + HostIOMMUDeviceCaps caps; > }; > > /** > @@ -47,5 +61,28 @@ struct HostIOMMUDeviceClass { > * Returns: true on success, false on failure. > */ > bool (*realize)(HostIOMMUDevice *hiod, void *opaque, Error **errp); > + /** > + * @get_cap: check if a host IOMMU device capability is supported. > + * > + * Optional callback, if not implemented, hint not supporting query > + * of @cap. > + * > + * @hiod: pointer to a host IOMMU device instance. > + * > + * @cap: capability to check. > + * > + * @errp: pass an Error out when fails to query capability. > + * > + * Returns: <0 on failure, 0 if a @cap is unsupported, or else > + * 1 or some positive value for some special @cap, > + * i.e., HOST_IOMMU_DEVICE_CAP_AW_BITS. > + */ > + int (*get_cap)(HostIOMMUDevice *hiod, int cap, Error **errp); > }; > + > +/* > + * Host IOMMU device capability list. > + */ > +#define HOST_IOMMU_DEVICE_CAP_IOMMU_TYPE 0 > +#define HOST_IOMMU_DEVICE_CAP_AW_BITS 1 > #endif
On 6/3/24 08:10, Zhenzhong Duan wrote: > HostIOMMUDeviceCaps's elements map to the host IOMMU's capabilities. > Different platform IOMMU can support different elements. > > Currently only two elements, type and aw_bits, type hints the host > platform IOMMU type, i.e., INTEL vtd, ARM smmu, etc; aw_bits hints > host IOMMU address width. > > Introduce .get_cap() handler to check if HOST_IOMMU_DEVICE_CAP_XXX > is supported. > > Suggested-by: Cédric Le Goater <clg@redhat.com> > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> I would either squash this patch into patch 1 or if you prefer ti keep it seperated, add it just after. Eric > --- > include/sysemu/host_iommu_device.h | 37 ++++++++++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > > diff --git a/include/sysemu/host_iommu_device.h b/include/sysemu/host_iommu_device.h > index 2b58a94d62..d47d1034b1 100644 > --- a/include/sysemu/host_iommu_device.h > +++ b/include/sysemu/host_iommu_device.h > @@ -15,11 +15,25 @@ > #include "qom/object.h" > #include "qapi/error.h" > > +/** > + * struct HostIOMMUDeviceCaps - Define host IOMMU device capabilities. > + * > + * @type: host platform IOMMU type. > + * > + * @aw_bits: host IOMMU address width. 0xff if no limitation. > + */ > +typedef struct HostIOMMUDeviceCaps { > + uint32_t type; > + uint8_t aw_bits; > +} HostIOMMUDeviceCaps; > + > #define TYPE_HOST_IOMMU_DEVICE "host-iommu-device" > OBJECT_DECLARE_TYPE(HostIOMMUDevice, HostIOMMUDeviceClass, HOST_IOMMU_DEVICE) > > struct HostIOMMUDevice { > Object parent_obj; > + > + HostIOMMUDeviceCaps caps; > }; > > /** > @@ -47,5 +61,28 @@ struct HostIOMMUDeviceClass { > * Returns: true on success, false on failure. > */ > bool (*realize)(HostIOMMUDevice *hiod, void *opaque, Error **errp); > + /** > + * @get_cap: check if a host IOMMU device capability is supported. > + * > + * Optional callback, if not implemented, hint not supporting query > + * of @cap. > + * > + * @hiod: pointer to a host IOMMU device instance. > + * > + * @cap: capability to check. > + * > + * @errp: pass an Error out when fails to query capability. > + * > + * Returns: <0 on failure, 0 if a @cap is unsupported, or else > + * 1 or some positive value for some special @cap, > + * i.e., HOST_IOMMU_DEVICE_CAP_AW_BITS. > + */ > + int (*get_cap)(HostIOMMUDevice *hiod, int cap, Error **errp); > }; > + > +/* > + * Host IOMMU device capability list. > + */ > +#define HOST_IOMMU_DEVICE_CAP_IOMMU_TYPE 0 > +#define HOST_IOMMU_DEVICE_CAP_AW_BITS 1 > #endif
diff --git a/include/sysemu/host_iommu_device.h b/include/sysemu/host_iommu_device.h index 2b58a94d62..d47d1034b1 100644 --- a/include/sysemu/host_iommu_device.h +++ b/include/sysemu/host_iommu_device.h @@ -15,11 +15,25 @@ #include "qom/object.h" #include "qapi/error.h" +/** + * struct HostIOMMUDeviceCaps - Define host IOMMU device capabilities. + * + * @type: host platform IOMMU type. + * + * @aw_bits: host IOMMU address width. 0xff if no limitation. + */ +typedef struct HostIOMMUDeviceCaps { + uint32_t type; + uint8_t aw_bits; +} HostIOMMUDeviceCaps; + #define TYPE_HOST_IOMMU_DEVICE "host-iommu-device" OBJECT_DECLARE_TYPE(HostIOMMUDevice, HostIOMMUDeviceClass, HOST_IOMMU_DEVICE) struct HostIOMMUDevice { Object parent_obj; + + HostIOMMUDeviceCaps caps; }; /** @@ -47,5 +61,28 @@ struct HostIOMMUDeviceClass { * Returns: true on success, false on failure. */ bool (*realize)(HostIOMMUDevice *hiod, void *opaque, Error **errp); + /** + * @get_cap: check if a host IOMMU device capability is supported. + * + * Optional callback, if not implemented, hint not supporting query + * of @cap. + * + * @hiod: pointer to a host IOMMU device instance. + * + * @cap: capability to check. + * + * @errp: pass an Error out when fails to query capability. + * + * Returns: <0 on failure, 0 if a @cap is unsupported, or else + * 1 or some positive value for some special @cap, + * i.e., HOST_IOMMU_DEVICE_CAP_AW_BITS. + */ + int (*get_cap)(HostIOMMUDevice *hiod, int cap, Error **errp); }; + +/* + * Host IOMMU device capability list. + */ +#define HOST_IOMMU_DEVICE_CAP_IOMMU_TYPE 0 +#define HOST_IOMMU_DEVICE_CAP_AW_BITS 1 #endif
HostIOMMUDeviceCaps's elements map to the host IOMMU's capabilities. Different platform IOMMU can support different elements. Currently only two elements, type and aw_bits, type hints the host platform IOMMU type, i.e., INTEL vtd, ARM smmu, etc; aw_bits hints host IOMMU address width. Introduce .get_cap() handler to check if HOST_IOMMU_DEVICE_CAP_XXX is supported. Suggested-by: Cédric Le Goater <clg@redhat.com> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> --- include/sysemu/host_iommu_device.h | 37 ++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)