On Tue, Jun 02, 2026 at 06:46:08PM +0800, Guanghui Feng 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 PHYS_ADDR_MAX if no
> translation.
> + */
> +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;
This doesn't seem right. It needs to return a mapped_length of
something that is not zero..
> - if (domain->type == IOMMU_DOMAIN_BLOCKED)
> - return 0;
> + if (!domain->ops->iova_to_phys_length) {
> + /* Fallback to legacy iova_to_phys without length info */
> + if (domain->ops->iova_to_phys) {
> + phys_addr_t phys = domain->ops->iova_to_phys(domain,
> iova);
> + if (phys && mapped_length)
> + *mapped_length = PAGE_SIZE;
> + return phys ? phys : PHYS_ADDR_MAX;
> + }
Follow success oriented flow..
Jason