@@ -2032,7 +2032,6 @@ static int do_attach(struct iommu_dev_data *dev_data,
2032
2032
struct protection_domain * domain )
2033
2033
{
2034
2034
struct amd_iommu * iommu = get_amd_iommu_from_dev_data (dev_data );
2035
- struct pci_dev * pdev ;
2036
2035
int ret = 0 ;
2037
2036
2038
2037
/* Update data structures */
@@ -2047,30 +2046,13 @@ static int do_attach(struct iommu_dev_data *dev_data,
2047
2046
domain -> dev_iommu [iommu -> index ] += 1 ;
2048
2047
domain -> dev_cnt += 1 ;
2049
2048
2050
- pdev = dev_is_pci ( dev_data -> dev ) ? to_pci_dev ( dev_data -> dev ) : NULL ;
2049
+ /* Setup GCR3 table */
2051
2050
if (pdom_is_sva_capable (domain )) {
2052
2051
ret = init_gcr3_table (dev_data , domain );
2053
2052
if (ret )
2054
2053
return ret ;
2055
-
2056
- if (pdev ) {
2057
- pdev_enable_caps (pdev );
2058
-
2059
- /*
2060
- * Device can continue to function even if IOPF
2061
- * enablement failed. Hence in error path just
2062
- * disable device PRI support.
2063
- */
2064
- if (amd_iommu_iopf_add_device (iommu , dev_data ))
2065
- pdev_disable_cap_pri (pdev );
2066
- }
2067
- } else if (pdev ) {
2068
- pdev_enable_cap_ats (pdev );
2069
2054
}
2070
2055
2071
- /* Update device table */
2072
- amd_iommu_dev_update_dte (dev_data , true);
2073
-
2074
2056
return ret ;
2075
2057
}
2076
2058
@@ -2163,17 +2145,18 @@ static void detach_device(struct device *dev)
2163
2145
2164
2146
do_detach (dev_data );
2165
2147
2148
+ out :
2149
+ spin_unlock (& dev_data -> lock );
2150
+
2151
+ spin_unlock_irqrestore (& domain -> lock , flags );
2152
+
2166
2153
/* Remove IOPF handler */
2167
2154
if (ppr )
2168
2155
amd_iommu_iopf_remove_device (iommu , dev_data );
2169
2156
2170
2157
if (dev_is_pci (dev ))
2171
2158
pdev_disable_caps (to_pci_dev (dev ));
2172
2159
2173
- out :
2174
- spin_unlock (& dev_data -> lock );
2175
-
2176
- spin_unlock_irqrestore (& domain -> lock , flags );
2177
2160
}
2178
2161
2179
2162
static struct iommu_device * amd_iommu_probe_device (struct device * dev )
@@ -2485,6 +2468,7 @@ static int amd_iommu_attach_device(struct iommu_domain *dom,
2485
2468
struct iommu_dev_data * dev_data = dev_iommu_priv_get (dev );
2486
2469
struct protection_domain * domain = to_pdomain (dom );
2487
2470
struct amd_iommu * iommu = get_amd_iommu_from_dev (dev );
2471
+ struct pci_dev * pdev ;
2488
2472
int ret ;
2489
2473
2490
2474
/*
@@ -2517,7 +2501,23 @@ static int amd_iommu_attach_device(struct iommu_domain *dom,
2517
2501
}
2518
2502
#endif
2519
2503
2520
- iommu_completion_wait (iommu );
2504
+ pdev = dev_is_pci (dev_data -> dev ) ? to_pci_dev (dev_data -> dev ) : NULL ;
2505
+ if (pdev && pdom_is_sva_capable (domain )) {
2506
+ pdev_enable_caps (pdev );
2507
+
2508
+ /*
2509
+ * Device can continue to function even if IOPF
2510
+ * enablement failed. Hence in error path just
2511
+ * disable device PRI support.
2512
+ */
2513
+ if (amd_iommu_iopf_add_device (iommu , dev_data ))
2514
+ pdev_disable_cap_pri (pdev );
2515
+ } else if (pdev ) {
2516
+ pdev_enable_cap_ats (pdev );
2517
+ }
2518
+
2519
+ /* Update device table */
2520
+ amd_iommu_dev_update_dte (dev_data , true);
2521
2521
2522
2522
return ret ;
2523
2523
}
0 commit comments