diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2012-06-21 10:46:04 -0400 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2012-09-28 11:41:22 -0400 |
commit | 7ef2798deb695f112f25e348b199dca79eb1ea68 (patch) | |
tree | 04564334f60fd0b4d7d377f164297dcc39c026e5 /drivers/iommu | |
parent | f6fec00a9202987f1be2ae0a722518b742a9a799 (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.c | 27 | ||||
-rw-r--r-- | drivers/iommu/amd_iommu_types.h | 3 |
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 | ||
905 | static 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 | ||
1033 | static 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 | |||
1042 | static 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 | |||
1026 | void iommu_flush_all_caches(struct amd_iommu *iommu) | 1052 | void 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 |