Lines Matching +full:smmu +full:- +full:v3

1 // SPDX-License-Identifier: GPL-2.0
10 #include "arm-smmu-v3.h"
11 #include "../../io-pgtable-arm.h"
16 * Check if the CPU ASID is available on the SMMU side. If a private context
25 struct arm_smmu_device *smmu; in arm_smmu_share_asid() local
32 if (cd->mm) { in arm_smmu_share_asid()
33 if (WARN_ON(cd->mm != mm)) in arm_smmu_share_asid()
34 return ERR_PTR(-EINVAL); in arm_smmu_share_asid()
36 refcount_inc(&cd->refs); in arm_smmu_share_asid()
41 smmu = smmu_domain->smmu; in arm_smmu_share_asid()
44 XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); in arm_smmu_share_asid()
46 return ERR_PTR(-ENOSPC); in arm_smmu_share_asid()
49 * which isn't assigned yet. We'll do an invalidate-all on the old ASID in arm_smmu_share_asid()
52 cd->asid = new_asid; in arm_smmu_share_asid()
61 arm_smmu_tlb_inv_asid(smmu, asid); in arm_smmu_share_asid()
78 return ERR_PTR(-ESRCH); in arm_smmu_alloc_shared_cd()
82 err = -ENOMEM; in arm_smmu_alloc_shared_cd()
86 refcount_set(&cd->refs, 1); in arm_smmu_alloc_shared_cd()
101 tcr = FIELD_PREP(CTXDESC_CD_0_TCR_T0SZ, 64ULL - vabits_actual) | in arm_smmu_alloc_shared_cd()
119 err = -EINVAL; in arm_smmu_alloc_shared_cd()
127 cd->ttbr = virt_to_phys(mm->pgd); in arm_smmu_alloc_shared_cd()
128 cd->tcr = tcr; in arm_smmu_alloc_shared_cd()
133 cd->mair = read_sysreg(mair_el1); in arm_smmu_alloc_shared_cd()
134 cd->asid = asid; in arm_smmu_alloc_shared_cd()
135 cd->mm = mm; in arm_smmu_alloc_shared_cd()
153 arm64_mm_context_put(cd->mm); in arm_smmu_free_shared_cd()
158 bool arm_smmu_sva_supported(struct arm_smmu_device *smmu) in arm_smmu_sva_supported() argument
168 if ((smmu->features & feat_mask) != feat_mask) in arm_smmu_sva_supported()
171 if (!(smmu->pgsize_bitmap & PAGE_SIZE)) in arm_smmu_sva_supported()
182 if (smmu->oas < oas) in arm_smmu_sva_supported()
188 if (smmu->asid_bits < asid_bits) in arm_smmu_sva_supported()
196 asid_bits--; in arm_smmu_sva_supported()
197 dev_dbg(smmu->dev, "%d shared contexts\n", (1 << asid_bits) - in arm_smmu_sva_supported()
198 num_possible_cpus() - 2); in arm_smmu_sva_supported()
210 if (!(master->smmu->features & ARM_SMMU_FEAT_SVA)) in arm_smmu_master_sva_supported()
214 return master->ssid_bits && arm_smmu_iopf_supported(master); in arm_smmu_master_sva_supported()
222 enabled = master->sva_enabled; in arm_smmu_master_sva_enabled()
230 master->sva_enabled = true; in arm_smmu_master_enable_sva()
239 if (!list_empty(&master->bonds)) { in arm_smmu_master_disable_sva()
240 dev_err(master->dev, "cannot disable SVA, device is bound\n"); in arm_smmu_master_disable_sva()
242 return -EBUSY; in arm_smmu_master_disable_sva()
244 master->sva_enabled = false; in arm_smmu_master_disable_sva()