static void kgsl_iommu_setstate(struct kgsl_mmu *mmu, struct kgsl_pagetable *pagetable, unsigned int context_id) { if (mmu->flags & KGSL_FLAGS_STARTED) { if (mmu->hwpagetable != pagetable) { unsigned int flags = 0; mmu->hwpagetable = pagetable; flags |= kgsl_mmu_pt_get_flags(mmu->hwpagetable, mmu->device->id) | KGSL_MMUFLAGS_TLBFLUSH; kgsl_setstate(mmu, context_id, KGSL_MMUFLAGS_PTUPDATE | flags); } } }
static void kgsl_iommu_setstate(struct kgsl_mmu *mmu, struct kgsl_pagetable *pagetable, unsigned int context_id) { if (mmu->flags & KGSL_FLAGS_STARTED) { struct kgsl_iommu *iommu = mmu->priv; struct kgsl_iommu_pt *iommu_pt = pagetable->priv; /* page table not current, then setup mmu to use new * specified page table */ if (mmu->hwpagetable != pagetable) { unsigned int flags = 0; mmu->hwpagetable = pagetable; /* force tlb flush if asid is reused */ if (iommu->asid_reuse && (KGSL_IOMMU_ASID_REUSE == iommu_pt->asid)) flags |= KGSL_MMUFLAGS_TLBFLUSH; flags |= kgsl_mmu_pt_get_flags(mmu->hwpagetable, mmu->device->id); kgsl_setstate(mmu, context_id, KGSL_MMUFLAGS_PTUPDATE | flags); } } }