@@ -501,11 +501,18 @@ static int idxd_probe(struct idxd_device *idxd)
501
501
dev_dbg (dev , "IDXD reset complete\n" );
502
502
503
503
if (IS_ENABLED (CONFIG_INTEL_IDXD_SVM ) && sva ) {
504
- rc = idxd_enable_system_pasid (idxd );
505
- if (rc < 0 )
506
- dev_warn (dev , "Failed to enable PASID. No SVA support: %d\n" , rc );
507
- else
508
- set_bit (IDXD_FLAG_PASID_ENABLED , & idxd -> flags );
504
+ rc = iommu_dev_enable_feature (dev , IOMMU_DEV_FEAT_SVA );
505
+ if (rc == 0 ) {
506
+ rc = idxd_enable_system_pasid (idxd );
507
+ if (rc < 0 ) {
508
+ iommu_dev_disable_feature (dev , IOMMU_DEV_FEAT_SVA );
509
+ dev_warn (dev , "Failed to enable PASID. No SVA support: %d\n" , rc );
510
+ } else {
511
+ set_bit (IDXD_FLAG_PASID_ENABLED , & idxd -> flags );
512
+ }
513
+ } else {
514
+ dev_warn (dev , "Unable to turn on SVA feature.\n" );
515
+ }
509
516
} else if (!sva ) {
510
517
dev_warn (dev , "User forced SVA off via module param.\n" );
511
518
}
@@ -539,6 +546,7 @@ static int idxd_probe(struct idxd_device *idxd)
539
546
err :
540
547
if (device_pasid_enabled (idxd ))
541
548
idxd_disable_system_pasid (idxd );
549
+ iommu_dev_disable_feature (dev , IOMMU_DEV_FEAT_SVA );
542
550
return rc ;
543
551
}
544
552
@@ -699,6 +707,7 @@ static void idxd_remove(struct pci_dev *pdev)
699
707
if (device_pasid_enabled (idxd ))
700
708
idxd_disable_system_pasid (idxd );
701
709
idxd_unregister_devices (idxd );
710
+ iommu_dev_disable_feature (& pdev -> dev , IOMMU_DEV_FEAT_SVA );
702
711
}
703
712
704
713
static struct pci_driver idxd_pci_driver = {
0 commit comments