/* * kgsl_iommu_get_pt_base_addr - Get the address of the pagetable that the * IOMMU ttbr0 register is programmed with * @mmu - Pointer to mmu * @pt - kgsl pagetable pointer that contains the IOMMU domain pointer * * Return - actual pagetable address that the ttbr0 register is programmed * with */ static unsigned int kgsl_iommu_get_pt_base_addr(struct kgsl_mmu *mmu, struct kgsl_pagetable *pt) { struct kgsl_iommu *iommu = mmu->priv; struct kgsl_iommu_pt *iommu_pt = pt->priv; return iommu_get_pt_base_addr(iommu_pt->domain) & (iommu->iommu_reg_list[KGSL_IOMMU_CTX_TTBR0].reg_mask << iommu->iommu_reg_list[KGSL_IOMMU_CTX_TTBR0].reg_shift); }
/* * kgsl_iommu_pt_equal - Check if pagetables are equal * @pt - Pointer to pagetable * @pt_base - Address of a pagetable that the IOMMU register is * programmed with * * Checks whether the pt_base is equal to the base address of * the pagetable which is contained in the pt structure * Return - Non-zero if the pagetable addresses are equal else 0 */ static int kgsl_iommu_pt_equal(struct kgsl_pagetable *pt, unsigned int pt_base) { struct kgsl_iommu_pt *iommu_pt = pt ? pt->priv : NULL; unsigned int domain_ptbase = iommu_pt ? iommu_get_pt_base_addr(iommu_pt->domain) : 0; /* Only compare the valid address bits of the pt_base */ domain_ptbase &= (KGSL_IOMMU_TTBR0_PA_MASK << KGSL_IOMMU_TTBR0_PA_SHIFT); pt_base &= (KGSL_IOMMU_TTBR0_PA_MASK << KGSL_IOMMU_TTBR0_PA_SHIFT); return domain_ptbase && pt_base && (domain_ptbase == pt_base); }
/* * kgsl_iommu_pt_equal - Check if pagetables are equal * @mmu - Pointer to mmu structure * @pt - Pointer to pagetable * @pt_base - Address of a pagetable that the IOMMU register is * programmed with * * Checks whether the pt_base is equal to the base address of * the pagetable which is contained in the pt structure * Return - Non-zero if the pagetable addresses are equal else 0 */ static int kgsl_iommu_pt_equal(struct kgsl_mmu *mmu, struct kgsl_pagetable *pt, unsigned int pt_base) { struct kgsl_iommu *iommu = mmu->priv; struct kgsl_iommu_pt *iommu_pt = pt ? pt->priv : NULL; unsigned int domain_ptbase = iommu_pt ? iommu_get_pt_base_addr(iommu_pt->domain) : 0; /* Only compare the valid address bits of the pt_base */ domain_ptbase &= (iommu->iommu_reg_list[KGSL_IOMMU_CTX_TTBR0].reg_mask << iommu->iommu_reg_list[KGSL_IOMMU_CTX_TTBR0].reg_shift); pt_base &= (iommu->iommu_reg_list[KGSL_IOMMU_CTX_TTBR0].reg_mask << iommu->iommu_reg_list[KGSL_IOMMU_CTX_TTBR0].reg_shift); return domain_ptbase && pt_base && (domain_ptbase == pt_base); }
/* * kgsl_iommu_pt_get_base_addr - Get the address of the pagetable that the * IOMMU ttbr0 register is programmed with * @pt - kgsl pagetable pointer that contains the IOMMU domain pointer * * Return - actual pagetable address that the ttbr0 register is programmed * with */ static unsigned int kgsl_iommu_pt_get_base_addr(struct kgsl_pagetable *pt) { struct kgsl_iommu_pt *iommu_pt = pt->priv; return iommu_get_pt_base_addr(iommu_pt->domain); }