在 2026/6/1 21:43, Jason Gunthorpe 写道:
On Mon, Jun 01, 2026 at 04:41:48PM +0800, [email protected] wrote:
+/**
+ * iommu_iova_to_phys_length - Translate IOVA and return mapping page size
+ * @domain: IOMMU domain to query
+ * @iova: IO virtual address to translate
+ * @mapped_length: Output parameter for the PTE page size (e.g. 4KB/2MB/1GB)
+ *
+ * Like iommu_iova_to_phys() but additionally returns the page size of the
+ * PTE mapping at @iova through @mapped_length.
+ *
+ * Return: The physical address for the given IOVA, or 0 if no translation.
+ */
When introducing the new function I would like to fix this 0 error as
well, it should return PHYS_MAX for error
Implementations such as arm_smmu_iova_to_phys/DOMAIN_NS(iova_to_phys)
all use a return value of 0 as an invalid state, so 0 is used as the
representation of an invalid state to maintain compatibility.
I know, but this bad choice has already caused bugs so if we are
changing everything I would prefer we fix it.
OK, there are a lot of changes in the current commit. This issue will be
fixed in a subsequent series patch.
+phys_addr_t iommu_iova_to_phys_length(struct iommu_domain *domain,
+ dma_addr_t iova,
+ size_t *mapped_length)
{
+ if (mapped_length)
+ *mapped_length = 0;
+
if (domain->type == IOMMU_DOMAIN_IDENTITY)
return iova;
if (domain->type == IOMMU_DOMAIN_BLOCKED)
return 0;
Any domain that doesn't have an op should fail, blocked is one example
In accordance with the implementation of iommu_iova_to_phys, it returns a
phy value of 0 in invalid states.
Detect the invalid states by looking at ops not domain->type
I suggest you approach the patch plan a little differently, the first
patches should implement the new function and an iommput
implementation
Arrange things so the normal iova_to_phys calls the new function if it
is available and discards the length.
Then convert callers that can take advantage of it. Have the fallback
path also compute the length by iterating internally.
Finally one patch per driver implementing the new op, this could even
be a second series.
Don't remove iova_to_phys(), it is fine for things that don't need the
length.
Does this mean retaining the iommu_iova_to_phys implementation but
implementing it through domain->ops->iova_to_phys_length (mapped_length is
NULL)?
Yes
Jason