]> Pileus Git - ~andy/linux/commitdiff
iommu/amd: Add IRTE invalidation routine
authorJoerg Roedel <joerg.roedel@amd.com>
Thu, 21 Jun 2012 14:46:04 +0000 (16:46 +0200)
committerJoerg Roedel <joerg.roedel@amd.com>
Fri, 28 Sep 2012 15:41:22 +0000 (17:41 +0200)
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>
drivers/iommu/amd_iommu.c
drivers/iommu/amd_iommu_types.h

index b6a8079ff7bb01e98f380467d46f2b6b990df747..e27b354c3e9b553a723290b988d1114df67579a0 100644 (file)
@@ -902,6 +902,13 @@ static void build_inv_all(struct iommu_cmd *cmd)
        CMD_SET_TYPE(cmd, CMD_INV_ALL);
 }
 
+static void build_inv_irt(struct iommu_cmd *cmd, u16 devid)
+{
+       memset(cmd, 0, sizeof(*cmd));
+       cmd->data[0] = devid;
+       CMD_SET_TYPE(cmd, CMD_INV_IRT);
+}
+
 /*
  * Writes the command to the IOMMUs command buffer and informs the
  * hardware about the new command.
@@ -1023,12 +1030,32 @@ static void iommu_flush_all(struct amd_iommu *iommu)
        iommu_completion_wait(iommu);
 }
 
+static void iommu_flush_irt(struct amd_iommu *iommu, u16 devid)
+{
+       struct iommu_cmd cmd;
+
+       build_inv_irt(&cmd, devid);
+
+       iommu_queue_command(iommu, &cmd);
+}
+
+static void iommu_flush_irt_all(struct amd_iommu *iommu)
+{
+       u32 devid;
+
+       for (devid = 0; devid <= MAX_DEV_TABLE_ENTRIES; devid++)
+               iommu_flush_irt(iommu, devid);
+
+       iommu_completion_wait(iommu);
+}
+
 void iommu_flush_all_caches(struct amd_iommu *iommu)
 {
        if (iommu_feature(iommu, FEATURE_IA)) {
                iommu_flush_all(iommu);
        } else {
                iommu_flush_dte_all(iommu);
+               iommu_flush_irt_all(iommu);
                iommu_flush_tlb_all(iommu);
        }
 }
index 1a7d48078d3f980b6caf4b1f04f6a186aabca9b7..90afccb1237bea7ba750e8184ead66e73568a540 100644 (file)
 #define CMD_INV_DEV_ENTRY       0x02
 #define CMD_INV_IOMMU_PAGES    0x03
 #define CMD_INV_IOTLB_PAGES    0x04
+#define CMD_INV_IRT            0x05
 #define CMD_COMPLETE_PPR       0x07
 #define CMD_INV_ALL            0x08
 
 #define DEV_ENTRY_MODE_MASK    0x07
 #define DEV_ENTRY_MODE_SHIFT   0x09
 
+#define MAX_DEV_TABLE_ENTRIES  0xffff
+
 /* constants to configure the command buffer */
 #define CMD_BUFFER_SIZE    8192
 #define CMD_BUFFER_UNINITIALIZED 1