On Mon, Jul 27, 2015 at 07:18:10PM +0100, Robin Murphy wrote:
> With the correct DMA API calls now integrated into the io-pgtable code,
> let that handle the flushing of non-coherent page table updates.
> 
> Signed-off-by: Robin Murphy <robin.mur...@arm.com>
> ---
>  drivers/iommu/arm-smmu.c | 23 +++++++----------------
>  1 file changed, 7 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
> index 9a59bef..9501668 100644
> --- a/drivers/iommu/arm-smmu.c
> +++ b/drivers/iommu/arm-smmu.c
> @@ -610,24 +610,13 @@ static void arm_smmu_tlb_inv_range_nosync(unsigned long 
> iova, size_t size,
>  static void arm_smmu_flush_pgtable(void *addr, size_t size, void *cookie)
>  {
>       struct arm_smmu_domain *smmu_domain = cookie;
> -     struct arm_smmu_device *smmu = smmu_domain->smmu;
> -     unsigned long offset = (unsigned long)addr & ~PAGE_MASK;
>  
> -
> -     /* Ensure new page tables are visible to the hardware walker */
> -     if (smmu->features & ARM_SMMU_FEAT_COHERENT_WALK) {
> +     /*
> +      * Ensure new page tables are visible to a coherent hardware walker.
> +      * The page table code deals with flushing for the non-coherent case.
> +      */
> +     if (smmu_domain->smmu->features & ARM_SMMU_FEAT_COHERENT_WALK)
>               dsb(ishst);
> -     } else {
> -             /*
> -              * If the SMMU can't walk tables in the CPU caches, treat them
> -              * like non-coherent DMA since we need to flush the new entries
> -              * all the way out to memory. There's no possibility of
> -              * recursion here as the SMMU table walker will not be wired
> -              * through another SMMU.
> -              */
> -             dma_map_page(smmu->dev, virt_to_page(addr), offset, size,
> -                          DMA_TO_DEVICE);
> -     }
>  }
>  
>  static struct iommu_gather_ops arm_smmu_gather_ops = {
> @@ -899,6 +888,8 @@ static int arm_smmu_init_domain_context(struct 
> iommu_domain *domain,
>               .oas            = oas,
>               .tlb            = &arm_smmu_gather_ops,
>       };
> +     if (!(smmu->features & ARM_SMMU_FEAT_COHERENT_WALK))
> +             pgtbl_cfg.iommu_dev = smmu->dev;

Ideally, I'd like to set the dev unconditionally and kill the flush_pgtable
callback. See my comments on the other patch.

Will
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to