aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iommu
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2012-06-21 10:46:04 -0400
committerJoerg Roedel <joerg.roedel@amd.com>2012-09-28 11:41:22 -0400
commit7ef2798deb695f112f25e348b199dca79eb1ea68 (patch)
tree04564334f60fd0b4d7d377f164297dcc39c026e5 /drivers/iommu
parentf6fec00a9202987f1be2ae0a722518b742a9a799 (diff)
iommu/amd: Add IRTE invalidation routine
Add routine to invalidate the IOMMU cache for interupt translations. Also include the IRTE caches when flushing all IOMMU caches. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'drivers/iommu')
-rw-r--r--drivers/iommu/amd_iommu.c27
-rw-r--r--drivers/iommu/amd_iommu_types.h3
2 files changed, 30 insertions, 0 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index b6a8079ff7b..e27b354c3e9 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -902,6 +902,13 @@ static void build_inv_all(struct iommu_cmd *cmd)
902 CMD_SET_TYPE(cmd, CMD_INV_ALL); 902 CMD_SET_TYPE(cmd, CMD_INV_ALL);
903} 903}
904 904
905static void build_inv_irt(struct iommu_cmd *cmd, u16 devid)
906{
907 memset(cmd, 0, sizeof(*cmd));
908 cmd->data[0] = devid;
909 CMD_SET_TYPE(cmd, CMD_INV_IRT);
910}
911
905/* 912/*
906 * Writes the command to the IOMMUs command buffer and informs the 913 * Writes the command to the IOMMUs command buffer and informs the
907 * hardware about the new command. 914 * hardware about the new command.
@@ -1023,12 +1030,32 @@ static void iommu_flush_all(struct amd_iommu *iommu)
1023 iommu_completion_wait(iommu); 1030 iommu_completion_wait(iommu);
1024} 1031}
1025 1032
1033static void iommu_flush_irt(struct amd_iommu *iommu, u16 devid)
1034{
1035 struct iommu_cmd cmd;
1036
1037 build_inv_irt(&cmd, devid);
1038
1039 iommu_queue_command(iommu, &cmd);
1040}
1041
1042static void iommu_flush_irt_all(struct amd_iommu *iommu)
1043{
1044 u32 devid;
1045
1046 for (devid = 0; devid <= MAX_DEV_TABLE_ENTRIES; devid++)
1047 iommu_flush_irt(iommu, devid);
1048
1049 iommu_completion_wait(iommu);
1050}
1051
1026void iommu_flush_all_caches(struct amd_iommu *iommu) 1052void iommu_flush_all_caches(struct amd_iommu *iommu)
1027{ 1053{
1028 if (iommu_feature(iommu, FEATURE_IA)) { 1054 if (iommu_feature(iommu, FEATURE_IA)) {
1029 iommu_flush_all(iommu); 1055 iommu_flush_all(iommu);
1030 } else { 1056 } else {
1031 iommu_flush_dte_all(iommu); 1057 iommu_flush_dte_all(iommu);
1058 iommu_flush_irt_all(iommu);
1032 iommu_flush_tlb_all(iommu); 1059 iommu_flush_tlb_all(iommu);
1033 } 1060 }
1034} 1061}
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h
index 1a7d48078d3..90afccb1237 100644
--- a/drivers/iommu/amd_iommu_types.h
+++ b/drivers/iommu/amd_iommu_types.h
@@ -152,6 +152,7 @@
152#define CMD_INV_DEV_ENTRY 0x02 152#define CMD_INV_DEV_ENTRY 0x02
153#define CMD_INV_IOMMU_PAGES 0x03 153#define CMD_INV_IOMMU_PAGES 0x03
154#define CMD_INV_IOTLB_PAGES 0x04 154#define CMD_INV_IOTLB_PAGES 0x04
155#define CMD_INV_IRT 0x05
155#define CMD_COMPLETE_PPR 0x07 156#define CMD_COMPLETE_PPR 0x07
156#define CMD_INV_ALL 0x08 157#define CMD_INV_ALL 0x08
157 158
@@ -184,6 +185,8 @@
184#define DEV_ENTRY_MODE_MASK 0x07 185#define DEV_ENTRY_MODE_MASK 0x07
185#define DEV_ENTRY_MODE_SHIFT 0x09 186#define DEV_ENTRY_MODE_SHIFT 0x09
186 187
188#define MAX_DEV_TABLE_ENTRIES 0xffff
189
187/* constants to configure the command buffer */ 190/* constants to configure the command buffer */
188#define CMD_BUFFER_SIZE 8192 191#define CMD_BUFFER_SIZE 8192
189#define CMD_BUFFER_UNINITIALIZED 1 192#define CMD_BUFFER_UNINITIALIZED 1