diff options
Diffstat (limited to 'arch/x86/kernel/amd_iommu.c')
-rw-r--r-- | arch/x86/kernel/amd_iommu.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index bcf58ea55cf..d6192bcf9f0 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
@@ -463,6 +463,12 @@ static void build_inv_iommu_pages(struct iommu_cmd *cmd, u64 address, | |||
463 | cmd->data[2] |= CMD_INV_IOMMU_PAGES_PDE_MASK; | 463 | cmd->data[2] |= CMD_INV_IOMMU_PAGES_PDE_MASK; |
464 | } | 464 | } |
465 | 465 | ||
466 | static void build_inv_all(struct iommu_cmd *cmd) | ||
467 | { | ||
468 | memset(cmd, 0, sizeof(*cmd)); | ||
469 | CMD_SET_TYPE(cmd, CMD_INV_ALL); | ||
470 | } | ||
471 | |||
466 | /* | 472 | /* |
467 | * Writes the command to the IOMMUs command buffer and informs the | 473 | * Writes the command to the IOMMUs command buffer and informs the |
468 | * hardware about the new command. | 474 | * hardware about the new command. |
@@ -567,10 +573,24 @@ static void iommu_flush_tlb_all(struct amd_iommu *iommu) | |||
567 | iommu_completion_wait(iommu); | 573 | iommu_completion_wait(iommu); |
568 | } | 574 | } |
569 | 575 | ||
576 | static void iommu_flush_all(struct amd_iommu *iommu) | ||
577 | { | ||
578 | struct iommu_cmd cmd; | ||
579 | |||
580 | build_inv_all(&cmd); | ||
581 | |||
582 | iommu_queue_command(iommu, &cmd); | ||
583 | iommu_completion_wait(iommu); | ||
584 | } | ||
585 | |||
570 | void iommu_flush_all_caches(struct amd_iommu *iommu) | 586 | void iommu_flush_all_caches(struct amd_iommu *iommu) |
571 | { | 587 | { |
572 | iommu_flush_dte_all(iommu); | 588 | if (iommu_feature(iommu, FEATURE_IA)) { |
573 | iommu_flush_tlb_all(iommu); | 589 | iommu_flush_all(iommu); |
590 | } else { | ||
591 | iommu_flush_dte_all(iommu); | ||
592 | iommu_flush_tlb_all(iommu); | ||
593 | } | ||
574 | } | 594 | } |
575 | 595 | ||
576 | /* | 596 | /* |