diff options
| -rw-r--r-- | arch/x86/kernel/amd_iommu.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index e3363fd5eef5..41c4ebecced4 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -494,6 +494,17 @@ static int iommu_queue_inv_dev_entry(struct amd_iommu *iommu, u16 devid) | |||
| 494 | return ret; | 494 | return ret; |
| 495 | } | 495 | } |
| 496 | 496 | ||
| 497 | static int iommu_flush_device(struct device *dev) | ||
| 498 | { | ||
| 499 | struct amd_iommu *iommu; | ||
| 500 | u16 devid; | ||
| 501 | |||
| 502 | devid = get_device_id(dev); | ||
| 503 | iommu = amd_iommu_rlookup_table[devid]; | ||
| 504 | |||
| 505 | return iommu_queue_inv_dev_entry(iommu, devid); | ||
| 506 | } | ||
| 507 | |||
| 497 | static void __iommu_build_inv_iommu_pages(struct iommu_cmd *cmd, u64 address, | 508 | static void __iommu_build_inv_iommu_pages(struct iommu_cmd *cmd, u64 address, |
| 498 | u16 domid, int pde, int s) | 509 | u16 domid, int pde, int s) |
| 499 | { | 510 | { |
| @@ -1382,7 +1393,7 @@ static void do_attach(struct device *dev, struct protection_domain *domain) | |||
| 1382 | domain->dev_cnt += 1; | 1393 | domain->dev_cnt += 1; |
| 1383 | 1394 | ||
| 1384 | /* Flush the DTE entry */ | 1395 | /* Flush the DTE entry */ |
| 1385 | iommu_queue_inv_dev_entry(iommu, devid); | 1396 | iommu_flush_device(dev); |
| 1386 | } | 1397 | } |
| 1387 | 1398 | ||
| 1388 | static void do_detach(struct device *dev) | 1399 | static void do_detach(struct device *dev) |
| @@ -1405,7 +1416,7 @@ static void do_detach(struct device *dev) | |||
| 1405 | clear_dte_entry(devid); | 1416 | clear_dte_entry(devid); |
| 1406 | 1417 | ||
| 1407 | /* Flush the DTE entry */ | 1418 | /* Flush the DTE entry */ |
| 1408 | iommu_queue_inv_dev_entry(iommu, devid); | 1419 | iommu_flush_device(dev); |
| 1409 | } | 1420 | } |
| 1410 | 1421 | ||
| 1411 | /* | 1422 | /* |
| @@ -1610,7 +1621,7 @@ static int device_change_notifier(struct notifier_block *nb, | |||
| 1610 | goto out; | 1621 | goto out; |
| 1611 | } | 1622 | } |
| 1612 | 1623 | ||
| 1613 | iommu_queue_inv_dev_entry(iommu, devid); | 1624 | iommu_flush_device(dev); |
| 1614 | iommu_completion_wait(iommu); | 1625 | iommu_completion_wait(iommu); |
| 1615 | 1626 | ||
| 1616 | out: | 1627 | out: |
| @@ -2393,7 +2404,7 @@ static void amd_iommu_detach_device(struct iommu_domain *dom, | |||
| 2393 | if (!iommu) | 2404 | if (!iommu) |
| 2394 | return; | 2405 | return; |
| 2395 | 2406 | ||
| 2396 | iommu_queue_inv_dev_entry(iommu, devid); | 2407 | iommu_flush_device(dev); |
| 2397 | iommu_completion_wait(iommu); | 2408 | iommu_completion_wait(iommu); |
| 2398 | } | 2409 | } |
| 2399 | 2410 | ||
