mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 15:31:14 +07:00
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:
parent
f6fec00a92
commit
7ef2798deb
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user