Skip to content

Commit 09b5dff

Browse files
committed
iommu/qcom: Use accessor functions for iommu private data
Make use of dev_iommu_priv_set/get() functions. Signed-off-by: Joerg Roedel <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 3524b55 commit 09b5dff

File tree

1 file changed

+36
-25
lines changed

1 file changed

+36
-25
lines changed

drivers/iommu/qcom_iommu.c

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,19 @@ static struct qcom_iommu_domain *to_qcom_iommu_domain(struct iommu_domain *dom)
7474

7575
static const struct iommu_ops qcom_iommu_ops;
7676

77-
static struct qcom_iommu_dev * to_iommu(struct iommu_fwspec *fwspec)
77+
static struct qcom_iommu_dev * to_iommu(struct device *dev)
7878
{
79+
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
80+
7981
if (!fwspec || fwspec->ops != &qcom_iommu_ops)
8082
return NULL;
81-
return fwspec->iommu_priv;
83+
84+
return dev_iommu_priv_get(dev);
8285
}
8386

84-
static struct qcom_iommu_ctx * to_ctx(struct iommu_fwspec *fwspec, unsigned asid)
87+
static struct qcom_iommu_ctx * to_ctx(struct device *dev, unsigned asid)
8588
{
86-
struct qcom_iommu_dev *qcom_iommu = to_iommu(fwspec);
89+
struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
8790
if (!qcom_iommu)
8891
return NULL;
8992
return qcom_iommu->ctxs[asid - 1];
@@ -115,11 +118,14 @@ iommu_readq(struct qcom_iommu_ctx *ctx, unsigned reg)
115118

116119
static void qcom_iommu_tlb_sync(void *cookie)
117120
{
118-
struct iommu_fwspec *fwspec = cookie;
121+
struct iommu_fwspec *fwspec;
122+
struct device *dev = cookie;
119123
unsigned i;
120124

125+
fwspec = dev_iommu_fwspec_get(dev);
126+
121127
for (i = 0; i < fwspec->num_ids; i++) {
122-
struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
128+
struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
123129
unsigned int val, ret;
124130

125131
iommu_writel(ctx, ARM_SMMU_CB_TLBSYNC, 0);
@@ -133,11 +139,14 @@ static void qcom_iommu_tlb_sync(void *cookie)
133139

134140
static void qcom_iommu_tlb_inv_context(void *cookie)
135141
{
136-
struct iommu_fwspec *fwspec = cookie;
142+
struct device *dev = cookie;
143+
struct iommu_fwspec *fwspec;
137144
unsigned i;
138145

146+
fwspec = dev_iommu_fwspec_get(dev);
147+
139148
for (i = 0; i < fwspec->num_ids; i++) {
140-
struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
149+
struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
141150
iommu_writel(ctx, ARM_SMMU_CB_S1_TLBIASID, ctx->asid);
142151
}
143152

@@ -147,13 +156,16 @@ static void qcom_iommu_tlb_inv_context(void *cookie)
147156
static void qcom_iommu_tlb_inv_range_nosync(unsigned long iova, size_t size,
148157
size_t granule, bool leaf, void *cookie)
149158
{
150-
struct iommu_fwspec *fwspec = cookie;
159+
struct device *dev = cookie;
160+
struct iommu_fwspec *fwspec;
151161
unsigned i, reg;
152162

153163
reg = leaf ? ARM_SMMU_CB_S1_TLBIVAL : ARM_SMMU_CB_S1_TLBIVA;
154164

165+
fwspec = dev_iommu_fwspec_get(dev);
166+
155167
for (i = 0; i < fwspec->num_ids; i++) {
156-
struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
168+
struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
157169
size_t s = size;
158170

159171
iova = (iova >> 12) << 12;
@@ -222,9 +234,10 @@ static irqreturn_t qcom_iommu_fault(int irq, void *dev)
222234

223235
static int qcom_iommu_init_domain(struct iommu_domain *domain,
224236
struct qcom_iommu_dev *qcom_iommu,
225-
struct iommu_fwspec *fwspec)
237+
struct device *dev)
226238
{
227239
struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
240+
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
228241
struct io_pgtable_ops *pgtbl_ops;
229242
struct io_pgtable_cfg pgtbl_cfg;
230243
int i, ret = 0;
@@ -243,7 +256,7 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain,
243256
};
244257

245258
qcom_domain->iommu = qcom_iommu;
246-
pgtbl_ops = alloc_io_pgtable_ops(ARM_32_LPAE_S1, &pgtbl_cfg, fwspec);
259+
pgtbl_ops = alloc_io_pgtable_ops(ARM_32_LPAE_S1, &pgtbl_cfg, dev);
247260
if (!pgtbl_ops) {
248261
dev_err(qcom_iommu->dev, "failed to allocate pagetable ops\n");
249262
ret = -ENOMEM;
@@ -256,7 +269,7 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain,
256269
domain->geometry.force_aperture = true;
257270

258271
for (i = 0; i < fwspec->num_ids; i++) {
259-
struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
272+
struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
260273

261274
if (!ctx->secure_init) {
262275
ret = qcom_scm_restore_sec_cfg(qcom_iommu->sec_id, ctx->asid);
@@ -363,8 +376,7 @@ static void qcom_iommu_domain_free(struct iommu_domain *domain)
363376

364377
static int qcom_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
365378
{
366-
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
367-
struct qcom_iommu_dev *qcom_iommu = to_iommu(fwspec);
379+
struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
368380
struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
369381
int ret;
370382

@@ -375,7 +387,7 @@ static int qcom_iommu_attach_dev(struct iommu_domain *domain, struct device *dev
375387

376388
/* Ensure that the domain is finalized */
377389
pm_runtime_get_sync(qcom_iommu->dev);
378-
ret = qcom_iommu_init_domain(domain, qcom_iommu, fwspec);
390+
ret = qcom_iommu_init_domain(domain, qcom_iommu, dev);
379391
pm_runtime_put_sync(qcom_iommu->dev);
380392
if (ret < 0)
381393
return ret;
@@ -397,17 +409,17 @@ static int qcom_iommu_attach_dev(struct iommu_domain *domain, struct device *dev
397409

398410
static void qcom_iommu_detach_dev(struct iommu_domain *domain, struct device *dev)
399411
{
400-
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
401-
struct qcom_iommu_dev *qcom_iommu = to_iommu(fwspec);
402412
struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
413+
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
414+
struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
403415
unsigned i;
404416

405417
if (WARN_ON(!qcom_domain->iommu))
406418
return;
407419

408420
pm_runtime_get_sync(qcom_iommu->dev);
409421
for (i = 0; i < fwspec->num_ids; i++) {
410-
struct qcom_iommu_ctx *ctx = to_ctx(fwspec, fwspec->ids[i]);
422+
struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
411423

412424
/* Disable the context bank: */
413425
iommu_writel(ctx, ARM_SMMU_CB_SCTLR, 0);
@@ -514,7 +526,7 @@ static bool qcom_iommu_capable(enum iommu_cap cap)
514526

515527
static int qcom_iommu_add_device(struct device *dev)
516528
{
517-
struct qcom_iommu_dev *qcom_iommu = to_iommu(dev_iommu_fwspec_get(dev));
529+
struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
518530
struct iommu_group *group;
519531
struct device_link *link;
520532

@@ -545,7 +557,7 @@ static int qcom_iommu_add_device(struct device *dev)
545557

546558
static void qcom_iommu_remove_device(struct device *dev)
547559
{
548-
struct qcom_iommu_dev *qcom_iommu = to_iommu(dev_iommu_fwspec_get(dev));
560+
struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
549561

550562
if (!qcom_iommu)
551563
return;
@@ -557,7 +569,6 @@ static void qcom_iommu_remove_device(struct device *dev)
557569

558570
static int qcom_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)
559571
{
560-
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
561572
struct qcom_iommu_dev *qcom_iommu;
562573
struct platform_device *iommu_pdev;
563574
unsigned asid = args->args[0];
@@ -583,14 +594,14 @@ static int qcom_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)
583594
WARN_ON(asid > qcom_iommu->num_ctxs))
584595
return -EINVAL;
585596

586-
if (!fwspec->iommu_priv) {
587-
fwspec->iommu_priv = qcom_iommu;
597+
if (!dev_iommu_priv_get(dev)) {
598+
dev_iommu_priv_set(dev, qcom_iommu);
588599
} else {
589600
/* make sure devices iommus dt node isn't referring to
590601
* multiple different iommu devices. Multiple context
591602
* banks are ok, but multiple devices are not:
592603
*/
593-
if (WARN_ON(qcom_iommu != fwspec->iommu_priv))
604+
if (WARN_ON(qcom_iommu != dev_iommu_priv_get(dev)))
594605
return -EINVAL;
595606
}
596607

0 commit comments

Comments
 (0)