Messages in this thread Patch in this message | | | From | Suravee Suthikulpanit <> | Subject | [PATCH 5/9] iommu/amd: Convert Event Log pointer to use struct amd_iommu_mem | Date | Tue, 30 Apr 2024 15:24:26 +0000 |
| |
And specify the memory to be 4K-aligned when running in SNP host, and to be decrypted when running in an SEV guest so that the VMM can access the memory successfully.
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> --- drivers/iommu/amd/amd_iommu_types.h | 2 +- drivers/iommu/amd/init.c | 20 +++++++++++++------- drivers/iommu/amd/iommu.c | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h index e671e9220a21..af4e9ca6414e 100644 --- a/drivers/iommu/amd/amd_iommu_types.h +++ b/drivers/iommu/amd/amd_iommu_types.h @@ -738,7 +738,7 @@ struct amd_iommu { u32 cmd_buf_tail; /* event buffer virtual address */ - u8 *evt_buf; + struct amd_iommu_mem evt_buf_mem; /* Name for event log interrupt */ unsigned char evt_irq_name[16]; diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c index 51861874656e..5242a9a16946 100644 --- a/drivers/iommu/amd/init.c +++ b/drivers/iommu/amd/init.c @@ -860,19 +860,25 @@ void *__init iommu_alloc_4k_pages(struct amd_iommu *iommu, gfp_t gfp, /* allocates the memory where the IOMMU will log its events to */ static int __init alloc_event_buffer(struct amd_iommu *iommu) { - iommu->evt_buf = iommu_alloc_4k_pages(iommu, GFP_KERNEL, - EVT_BUFFER_SIZE); + struct amd_iommu_mem *mem = &iommu->evt_buf_mem; - return iommu->evt_buf ? 0 : -ENOMEM; + mem->modes = ALLOC_MODE_4K | ALLOC_MODE_GUEST_MEM_DECRYPT; + mem->order = get_order(EVT_BUFFER_SIZE); + mem->buf = amd_iommu_get_zeroed_mem(GFP_KERNEL, mem); + if (!mem->buf) + return -ENOMEM; + + return 0; } static void iommu_enable_event_buffer(struct amd_iommu *iommu) { u64 entry; - BUG_ON(iommu->evt_buf == NULL); + BUG_ON(iommu->evt_buf_mem.buf == NULL); - entry = iommu_virt_to_phys(iommu->evt_buf) | EVT_LEN_MASK; + entry = amd_iommu_mem_to_phys(&iommu->evt_buf_mem); + entry |= EVT_LEN_MASK; memcpy_toio(iommu->mmio_base + MMIO_EVT_BUF_OFFSET, &entry, sizeof(entry)); @@ -894,7 +900,7 @@ static void iommu_disable_event_buffer(struct amd_iommu *iommu) static void __init free_event_buffer(struct amd_iommu *iommu) { - iommu_free_pages(iommu->evt_buf, get_order(EVT_BUFFER_SIZE)); + amd_iommu_free_mem(&iommu->evt_buf_mem); } static void free_ga_log(struct amd_iommu *iommu) @@ -3838,7 +3844,7 @@ int amd_iommu_snp_disable(void) return 0; for_each_iommu(iommu) { - ret = iommu_make_shared(iommu->evt_buf, EVT_BUFFER_SIZE); + ret = iommu_make_shared(iommu->evt_buf_mem.buf, EVT_BUFFER_SIZE); if (ret) return ret; diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index bd29d26c8d44..4f95c726e139 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -890,7 +890,7 @@ static void iommu_poll_events(struct amd_iommu *iommu) tail = readl(iommu->mmio_base + MMIO_EVT_TAIL_OFFSET); while (head != tail) { - iommu_print_event(iommu, iommu->evt_buf + head); + iommu_print_event(iommu, (u8 *)iommu->evt_buf_mem.buf + head); head = (head + EVENT_ENTRY_SIZE) % EVT_BUFFER_SIZE; } -- 2.34.1
| |