aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2009-05-05 09:48:10 -0400
committerJoerg Roedel <joerg.roedel@amd.com>2009-05-28 12:10:43 -0400
commit7d7a110c6127b7fc683dc6d764555f2dbd22b054 (patch)
treee507db8006ad708189a2dbccc65c595f3ecda504
parentbfd1be1857e5a3385bf146e02e6dc3dd4241bec1 (diff)
amd-iommu: add function to flush tlb for all devices
This function is required for suspend/resume support with AMD IOMMU enabled. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
-rw-r--r--arch/x86/include/asm/amd_iommu.h1
-rw-r--r--arch/x86/kernel/amd_iommu.c18
2 files changed, 19 insertions, 0 deletions
diff --git a/arch/x86/include/asm/amd_iommu.h b/arch/x86/include/asm/amd_iommu.h
index 1750e1f85d3c..262e02820049 100644
--- a/arch/x86/include/asm/amd_iommu.h
+++ b/arch/x86/include/asm/amd_iommu.h
@@ -28,6 +28,7 @@ extern int amd_iommu_init_dma_ops(void);
28extern void amd_iommu_detect(void); 28extern void amd_iommu_detect(void);
29extern irqreturn_t amd_iommu_int_handler(int irq, void *data); 29extern irqreturn_t amd_iommu_int_handler(int irq, void *data);
30extern void amd_iommu_flush_all_domains(void); 30extern void amd_iommu_flush_all_domains(void);
31extern void amd_iommu_flush_all_devices(void);
31#else 32#else
32static inline int amd_iommu_init(void) { return -ENODEV; } 33static inline int amd_iommu_init(void) { return -ENODEV; }
33static inline void amd_iommu_detect(void) { } 34static inline void amd_iommu_detect(void) { }
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
index 826ad079efc4..92b0e1881e09 100644
--- a/arch/x86/kernel/amd_iommu.c
+++ b/arch/x86/kernel/amd_iommu.c
@@ -460,6 +460,24 @@ void amd_iommu_flush_all_domains(void)
460 } 460 }
461} 461}
462 462
463void amd_iommu_flush_all_devices(void)
464{
465 struct amd_iommu *iommu;
466 int i;
467
468 for (i = 0; i <= amd_iommu_last_bdf; ++i) {
469 if (amd_iommu_pd_table[i] == NULL)
470 continue;
471
472 iommu = amd_iommu_rlookup_table[i];
473 if (!iommu)
474 continue;
475
476 iommu_queue_inv_dev_entry(iommu, i);
477 iommu_completion_wait(iommu);
478 }
479}
480
463/**************************************************************************** 481/****************************************************************************
464 * 482 *
465 * The functions below are used the create the page table mappings for 483 * The functions below are used the create the page table mappings for