Skip to content

Commit 0860788

Browse files
jpbruckerjoergroedel
authored andcommitted
uacce: Enable IOMMU_DEV_FEAT_IOPF
The IOPF (I/O Page Fault) feature is now enabled independently from the SVA feature, because some IOPF implementations are device-specific and do not require IOMMU support for PCIe PRI or Arm SMMU stall. Enable IOPF unconditionally when enabling SVA for now. In the future, if a device driver implementing a uacce interface doesn't need IOPF support, it will need to tell the uacce module, for example with a new flag. Acked-by: Zhangfei Gao <[email protected]> Signed-off-by: Jean-Philippe Brucker <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Joerg Roedel <[email protected]>
1 parent 9003351 commit 0860788

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed

drivers/misc/uacce/uacce.c

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,33 @@ static void uacce_release(struct device *dev)
385385
kfree(uacce);
386386
}
387387

388+
static unsigned int uacce_enable_sva(struct device *parent, unsigned int flags)
389+
{
390+
if (!(flags & UACCE_DEV_SVA))
391+
return flags;
392+
393+
flags &= ~UACCE_DEV_SVA;
394+
395+
if (iommu_dev_enable_feature(parent, IOMMU_DEV_FEAT_IOPF))
396+
return flags;
397+
398+
if (iommu_dev_enable_feature(parent, IOMMU_DEV_FEAT_SVA)) {
399+
iommu_dev_disable_feature(parent, IOMMU_DEV_FEAT_IOPF);
400+
return flags;
401+
}
402+
403+
return flags | UACCE_DEV_SVA;
404+
}
405+
406+
static void uacce_disable_sva(struct uacce_device *uacce)
407+
{
408+
if (!(uacce->flags & UACCE_DEV_SVA))
409+
return;
410+
411+
iommu_dev_disable_feature(uacce->parent, IOMMU_DEV_FEAT_SVA);
412+
iommu_dev_disable_feature(uacce->parent, IOMMU_DEV_FEAT_IOPF);
413+
}
414+
388415
/**
389416
* uacce_alloc() - alloc an accelerator
390417
* @parent: pointer of uacce parent device
@@ -404,11 +431,7 @@ struct uacce_device *uacce_alloc(struct device *parent,
404431
if (!uacce)
405432
return ERR_PTR(-ENOMEM);
406433

407-
if (flags & UACCE_DEV_SVA) {
408-
ret = iommu_dev_enable_feature(parent, IOMMU_DEV_FEAT_SVA);
409-
if (ret)
410-
flags &= ~UACCE_DEV_SVA;
411-
}
434+
flags = uacce_enable_sva(parent, flags);
412435

413436
uacce->parent = parent;
414437
uacce->flags = flags;
@@ -432,8 +455,7 @@ struct uacce_device *uacce_alloc(struct device *parent,
432455
return uacce;
433456

434457
err_with_uacce:
435-
if (flags & UACCE_DEV_SVA)
436-
iommu_dev_disable_feature(uacce->parent, IOMMU_DEV_FEAT_SVA);
458+
uacce_disable_sva(uacce);
437459
kfree(uacce);
438460
return ERR_PTR(ret);
439461
}
@@ -487,8 +509,7 @@ void uacce_remove(struct uacce_device *uacce)
487509
mutex_unlock(&uacce->queues_lock);
488510

489511
/* disable sva now since no opened queues */
490-
if (uacce->flags & UACCE_DEV_SVA)
491-
iommu_dev_disable_feature(uacce->parent, IOMMU_DEV_FEAT_SVA);
512+
uacce_disable_sva(uacce);
492513

493514
if (uacce->cdev)
494515
cdev_device_del(uacce->cdev, &uacce->dev);

0 commit comments

Comments
 (0)