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

Reply via email to