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>
This commit is contained in:
Joerg Roedel 2012-06-21 16:46:04 +02:00
parent f6fec00a92
commit 7ef2798deb
2 changed files with 30 additions and 0 deletions

View File

@ -902,6 +902,13 @@ static void build_inv_all(struct iommu_cmd *cmd)
CMD_SET_TYPE(cmd, CMD_INV_ALL); 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 * Writes the command to the IOMMUs command buffer and informs the
* hardware about the new command. * hardware about the new command.
@ -1023,12 +1030,32 @@ static void iommu_flush_all(struct amd_iommu *iommu)
iommu_completion_wait(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) void iommu_flush_all_caches(struct amd_iommu *iommu)
{ {
if (iommu_feature(iommu, FEATURE_IA)) { if (iommu_feature(iommu, FEATURE_IA)) {
iommu_flush_all(iommu); iommu_flush_all(iommu);
} else { } else {
iommu_flush_dte_all(iommu); iommu_flush_dte_all(iommu);
iommu_flush_irt_all(iommu);
iommu_flush_tlb_all(iommu); iommu_flush_tlb_all(iommu);
} }
} }

View File

@ -152,6 +152,7 @@
#define CMD_INV_DEV_ENTRY 0x02 #define CMD_INV_DEV_ENTRY 0x02
#define CMD_INV_IOMMU_PAGES 0x03 #define CMD_INV_IOMMU_PAGES 0x03
#define CMD_INV_IOTLB_PAGES 0x04 #define CMD_INV_IOTLB_PAGES 0x04
#define CMD_INV_IRT 0x05
#define CMD_COMPLETE_PPR 0x07 #define CMD_COMPLETE_PPR 0x07
#define CMD_INV_ALL 0x08 #define CMD_INV_ALL 0x08
@ -184,6 +185,8 @@
#define DEV_ENTRY_MODE_MASK 0x07 #define DEV_ENTRY_MODE_MASK 0x07
#define DEV_ENTRY_MODE_SHIFT 0x09 #define DEV_ENTRY_MODE_SHIFT 0x09
#define MAX_DEV_TABLE_ENTRIES 0xffff
/* constants to configure the command buffer */ /* constants to configure the command buffer */
#define CMD_BUFFER_SIZE 8192 #define CMD_BUFFER_SIZE 8192
#define CMD_BUFFER_UNINITIALIZED 1 #define CMD_BUFFER_UNINITIALIZED 1