Signed-off-by: Baoquan He <[email protected]>
---
drivers/iommu/amd_iommu_init.c | 39 +++++++++++++++++++++++++++++++++++++++
drivers/iommu/amd_iommu_types.h | 1 +
2 files changed, 40 insertions(+)
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
index 16aea93..9c414f0 100644
--- a/drivers/iommu/amd_iommu_init.c
+++ b/drivers/iommu/amd_iommu_init.c
@@ -739,6 +739,45 @@ static void copy_dev_tables(void)
}
}
+static void copy_command_buffer(void)
+{
+ u64 entry;
+ u32 lo, hi;
+ phys_addr_t old_phys;
+ u64 old_virt;
+ struct amd_iommu *iommu;
+
+ for_each_iommu(iommu) {
+ lo = readl(iommu->mmio_base + MMIO_CMD_BUF_OFFSET);
+ hi = readl(iommu->mmio_base + MMIO_CMD_BUF_OFFSET + 4);
+ entry = (((u64) hi) << 32) + lo;
+ old_phys &= (1<<MMIO_CMD_SIZE_SHIFT) -1;
+ old_virt = ioremap_cache(old_phys, CMD_BUFFER_SIZE);
+ memcpy(iommu->cmd_buf, old_virt, CMD_BUFFER_SIZE);
+ iommu->cmd_buf_size &= ~(CMD_BUFFER_UNINITIALIZED);
+ iounmap(old_virt);
+ }
+}
+
+static void copy_event_buffer(void)
+{
+ u64 entry;
+ u32 lo, hi;
+ phys_addr_t old_phys;
+ u64 old_virt;
+ struct amd_iommu *iommu;
+
+ for_each_iommu(iommu) {
+ lo = readl(iommu->mmio_base + MMIO_EVT_BUF_OFFSET);
+ hi = readl(iommu->mmio_base + MMIO_EVT_BUF_OFFSET + 4);
+ entry = (((u64) hi) << 32) + lo;
+ old_phys &= (1<<MMIO_EVT_SIZE_SHIFT) -1;
+ old_virt = ioremap_cache(old_phys, EVT_BUFFER_SIZE);
+ memcpy(iommu->evt_buf, old_virt, EVT_BUFFER_SIZE);
+ iounmap(old_virt);
+ }
+}
+
/* sets a specific bit in the device table entry. */
static void set_dev_entry_bit(u16 devid, u8 bit)
{
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h
index a481c74..4277cc9 100644
--- a/drivers/iommu/amd_iommu_types.h
+++ b/drivers/iommu/amd_iommu_types.h
@@ -209,6 +209,7 @@
/* constants for event buffer handling */
#define EVT_BUFFER_SIZE 8192 /* 512 entries */
#define EVT_LEN_MASK (0x9ULL << 56)
+#define MMIO_EVT_SIZE_SHIFT 56
/* Constants for PPR Log handling */
#define PPR_LOG_ENTRIES 512
--
2.4.0
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu