Signed-off-by: Baoquan He <b...@redhat.com> --- 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 iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu