On 2022/10/26 2:12, Jason Gunthorpe wrote:
+/**
- struct iommu_ioas_iova_ranges - ioctl(IOMMU_IOAS_IOVA_RANGES)
- @size: sizeof(struct iommu_ioas_iova_ranges)
- @ioas_id: IOAS ID to read ranges from
- @num_iovas: Input/Output total number of ranges in the IOAS
- @__reserved: Must be 0
- @allowed_iovas: Pointer to the output array of struct iommu_iova_range
- @out_iova_alignment: Minimum alignment required for mapping IOVA
- Query an IOAS for ranges of allowed IOVAs. Mapping IOVA outside these ranges
- is not allowed. out_num_iovas will be set to the total number of iovas and
- the out_valid_iovas[] will be filled in as space permits.
"out_num_iovas" and "out_valid_iovas[]" are outdated.
- The allowed ranges are dependent on the HW path the DMA operation takes, and
- can change during the lifetime of the IOAS. A fresh empty IOAS will have a
- full range, and each attached device will narrow the ranges based on that
- devices HW restrictions. Detatching a device can widen the ranges. Userspace
- should query ranges after every attach/detatch to know what IOVAs are valid
- for mapping.
- On input num_iovas is the length of the allowed_iovas array. On output it is
- the total number of iovas filled in. The ioctl will return -EMSGSIZE and set
- num_iovas to the required value if num_iovas is too small. In this case the
- caller should allocate a larger output array and re-issue the ioctl.
- */
+struct iommu_ioas_iova_ranges {
- __u32 size;
- __u32 ioas_id;
- __u32 num_iovas;
- __u32 __reserved;
- __aligned_u64 allowed_iovas;
- __aligned_u64 out_iova_alignment;
+}; +#define IOMMU_IOAS_IOVA_RANGES _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_IOVA_RANGES)
+/**
- struct iommu_ioas_allow_iovas - ioctl(IOMMU_IOAS_ALLOW_IOVAS)
- @size: sizeof(struct iommu_ioas_allow_iovas)
- @ioas_id: IOAS ID to allow IOVAs from
@num_iovas: The number of elements in @allowed_iovas array
- @allowed_iovas: Pointer to array of struct iommu_iova_range
- Ensure a range of IOVAs are always available for allocation. If this call
- succeeds then IOMMU_IOAS_IOVA_RANGES will never return a list of IOVA ranges
- that are narrower than the ranges provided here. This call will fail if
- IOMMU_IOAS_IOVA_RANGES is currently narrower than the given ranges.
- When an IOAS is first created the IOVA_RANGES will be maximally sized, and as
- devices are attached the IOVA will narrow based on the device restrictions.
- When an allowed range is specified any narrowing will be refused, ie device
- attachment can fail if the device requires limiting within the allowed range.
- Automatic IOVA allocation is also impacted by this call. MAP will only
- allocate within the allowed IOVAs if they are present.
- This call replaces the entire allowed list with the given list.
- */
+struct iommu_ioas_allow_iovas {
- __u32 size;
- __u32 ioas_id;
- __u32 num_iovas;
- __u32 __reserved;
- __aligned_u64 allowed_iovas;
+}; +#define IOMMU_IOAS_ALLOW_IOVAS _IO(IOMMUFD_TYPE, IOMMUFD_CMD_IOAS_ALLOW_IOVAS)
Best regards, baolu