Messages in this thread | | | Date | Mon, 23 Nov 2020 22:12:27 +0530 | From | Sai Prakash Ranjan <> | Subject | Re: [PATCHv8 2/8] iommu/arm-smmu: Add domain attribute for pagetable configuration |
| |
On 2020-11-23 20:48, Will Deacon wrote: > On Tue, Nov 17, 2020 at 08:00:41PM +0530, Sai Prakash Ranjan wrote: >> Add iommu domain attribute for pagetable configuration which >> initially will be used to set quirks like for system cache aka >> last level cache to be used by client drivers like GPU to set >> right attributes for caching the hardware pagetables into the >> system cache and later can be extended to include other page >> table configuration data. >> >> Signed-off-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org> >> --- >> drivers/iommu/arm/arm-smmu/arm-smmu.c | 25 +++++++++++++++++++++++++ >> drivers/iommu/arm/arm-smmu/arm-smmu.h | 1 + >> include/linux/io-pgtable.h | 4 ++++ >> include/linux/iommu.h | 1 + >> 4 files changed, 31 insertions(+) >> >> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c >> b/drivers/iommu/arm/arm-smmu/arm-smmu.c >> index 0f28a8614da3..7b05782738e2 100644 >> --- a/drivers/iommu/arm/arm-smmu/arm-smmu.c >> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c >> @@ -789,6 +789,9 @@ static int arm_smmu_init_domain_context(struct >> iommu_domain *domain, >> if (smmu_domain->non_strict) >> pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_NON_STRICT; >> >> + if (smmu_domain->pgtbl_cfg.quirks) >> + pgtbl_cfg.quirks |= smmu_domain->pgtbl_cfg.quirks; >> + >> pgtbl_ops = alloc_io_pgtable_ops(fmt, &pgtbl_cfg, smmu_domain); >> if (!pgtbl_ops) { >> ret = -ENOMEM; >> @@ -1511,6 +1514,12 @@ static int arm_smmu_domain_get_attr(struct >> iommu_domain *domain, >> case DOMAIN_ATTR_NESTING: >> *(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED); >> return 0; >> + case DOMAIN_ATTR_IO_PGTABLE_CFG: { >> + struct domain_attr_io_pgtbl_cfg *pgtbl_cfg = data; >> + *pgtbl_cfg = smmu_domain->pgtbl_cfg; >> + >> + return 0; >> + } >> default: >> return -ENODEV; >> } >> @@ -1551,6 +1560,22 @@ static int arm_smmu_domain_set_attr(struct >> iommu_domain *domain, >> else >> smmu_domain->stage = ARM_SMMU_DOMAIN_S1; >> break; >> + case DOMAIN_ATTR_IO_PGTABLE_CFG: { >> + struct domain_attr_io_pgtbl_cfg *pgtbl_cfg = data; >> + >> + if (smmu_domain->smmu) { >> + ret = -EPERM; >> + goto out_unlock; >> + } >> + >> + if (!pgtbl_cfg) { > > Do we really need to check this? If somebody passed us a NULL pointer > then > they have a bug and we don't check this for other domain attributes > afaict. >
True, I'll drop it.
>> + ret = -ENODEV; >> + goto out_unlock; >> + } >> + >> + smmu_domain->pgtbl_cfg = *pgtbl_cfg; >> + break; >> + } >> default: >> ret = -ENODEV; >> } >> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.h >> b/drivers/iommu/arm/arm-smmu/arm-smmu.h >> index 04288b6fc619..18fbed376afb 100644 >> --- a/drivers/iommu/arm/arm-smmu/arm-smmu.h >> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu.h >> @@ -364,6 +364,7 @@ enum arm_smmu_domain_stage { >> struct arm_smmu_domain { >> struct arm_smmu_device *smmu; >> struct io_pgtable_ops *pgtbl_ops; >> + struct domain_attr_io_pgtbl_cfg pgtbl_cfg; >> const struct iommu_flush_ops *flush_ops; >> struct arm_smmu_cfg cfg; >> enum arm_smmu_domain_stage stage; >> diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h >> index a9a2c59fab37..686b37d48743 100644 >> --- a/include/linux/io-pgtable.h >> +++ b/include/linux/io-pgtable.h >> @@ -212,6 +212,10 @@ struct io_pgtable { >> >> #define io_pgtable_ops_to_pgtable(x) container_of((x), struct >> io_pgtable, ops) >> >> +struct domain_attr_io_pgtbl_cfg { >> + unsigned long quirks; >> +}; > > nit: Can you rename this to 'struct io_pgtable_domain_attr' please? >
Done, thanks.
-- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
| |