@@ -26,6 +26,7 @@ supported user-kernel APIs are as follows:
2. Bind/Unbind guest PASID table (e.g. ARM SMMU)
3. Invalidate IOMMU caches upon guest requests
4. Report errors to the guest and serve page requests
+5. Read iommu_nesting_info from kernel
Requirements
============
@@ -96,7 +97,9 @@ kernel. Simply recompiling existing code with newer kernel header should
not be an issue in that only existing flags are used.
IOMMU vendor driver should report the below features to IOMMU UAPI
-consumers (e.g. via VFIO).
+consumers (e.g. via VFIO). The feature list is passed by struct
+iommu_nesting_info. The future extension to this structure follows
+the rule defined in section "Extension Rules & Precautions".
1. IOMMU_NESTING_FEAT_SYSWIDE_PASID
2. IOMMU_NESTING_FEAT_BIND_PGTBL
@@ -338,4 +338,76 @@ struct iommu_gpasid_bind_data {
} vendor;
};
+/*
+ * struct iommu_nesting_info_vtd - Intel VT-d specific nesting info.
+ *
+ * @flags: VT-d specific flags. Currently reserved for future
+ * extension. must be set to 0.
+ * @cap_reg: Describe basic capabilities as defined in VT-d capability
+ * register.
+ * @ecap_reg: Describe the extended capabilities as defined in VT-d
+ * extended capability register.
+ */
+struct iommu_nesting_info_vtd {
+ __u32 flags;
+ __u8 padding[12];
+ __u64 cap_reg;
+ __u64 ecap_reg;
+};
+
+/*
+ * struct iommu_nesting_info - Information for nesting-capable IOMMU.
+ * userspace should check it before using
+ * nesting capability.
+ *
+ * @argsz: size of the whole structure.
+ * @flags: currently reserved for future extension. must set to 0.
+ * @format: PASID table entry format, the same definition as struct
+ * iommu_gpasid_bind_data @format.
+ * @features: supported nesting features.
+ * @addr_width: the output addr width of first level/stage translation
+ * @pasid_bits: maximum supported PASID bits, 0 represents no PASID
+ * support.
+ * @vendor: vendor specific data, structure type can be deduced from
+ * @format field.
+ *
+ * +===============+======================================================+
+ * | feature | Notes |
+ * +===============+======================================================+
+ * | BIND_PGTBL | IOMMU vendor driver sets it to mandate userspace to |
+ * | | bind the first level/stage page table to associated |
+ * | | PASID (either the one specified in bind request or |
+ * | | the default PASID of iommu domain), through IOMMU |
+ * | | UAPI. |
+ * +---------------+------------------------------------------------------+
+ * | CACHE_INVLD | IOMMU vendor driver sets it to mandate userspace to |
+ * | | explicitly invalidate the IOMMU cache through IOMMU |
+ * | | UAPI according to vendor-specific requirement when |
+ * | | changing the 1st level/stage page table. |
+ * +---------------+------------------------------------------------------+
+ *
+ * data struct types defined for @format:
+ * +================================+=====================================+
+ * | @format | data struct |
+ * +================================+=====================================+
+ * | IOMMU_PASID_FORMAT_INTEL_VTD | struct iommu_nesting_info_vtd |
+ * +--------------------------------+-------------------------------------+
+ *
+ */
+struct iommu_nesting_info {
+ __u32 argsz;
+ __u32 flags;
+ __u32 format;
+#define IOMMU_NESTING_FEAT_BIND_PGTBL (1 << 0)
+#define IOMMU_NESTING_FEAT_CACHE_INVLD (1 << 1)
+ __u32 features;
+ __u16 addr_width;
+ __u16 pasid_bits;
+ __u8 padding[12];
+ /* Vendor specific data */
+ union {
+ struct iommu_nesting_info_vtd vtd;
+ } vendor;
+};
+
#endif /* _UAPI_IOMMU_H */