Messages in this thread Patch in this message | | | From | Oded Gabbay <> | Subject | [PATCH 07/12] habanalabs/gaudi2: map virtual MSI-X doorbell memory for user | Date | Mon, 11 Jul 2022 09:29:58 +0300 |
| |
From: Tomer Tayar <ttayar@habana.ai>
Upon the initialization of a user context, map the host memory page of the virtual MSI-X doorbell in the device MMU. A reserved VA is used for this purpose, so user can use it directly without any allocation/map operation.
Signed-off-by: Tomer Tayar <ttayar@habana.ai> Reviewed-by: Oded Gabbay <ogabbay@kernel.org> Signed-off-by: Oded Gabbay <ogabbay@kernel.org> --- drivers/misc/habanalabs/gaudi2/gaudi2.c | 43 ++++++++++++++++++- .../misc/habanalabs/include/gaudi2/gaudi2.h | 3 ++ 2 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/drivers/misc/habanalabs/gaudi2/gaudi2.c b/drivers/misc/habanalabs/gaudi2/gaudi2.c index 760ce5b7f955..eba8b0d674c3 100644 --- a/drivers/misc/habanalabs/gaudi2/gaudi2.c +++ b/drivers/misc/habanalabs/gaudi2/gaudi2.c @@ -1920,7 +1920,7 @@ static int gaudi2_set_fixed_properties(struct hl_device *hdev) prop->pmmu.hop_table_size = prop->mmu_hop_table_size; prop->pmmu.hop0_tables_total_size = prop->mmu_hop0_tables_total_size; - prop->hints_host_reserved_va_range.start_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HOST_START; + prop->hints_host_reserved_va_range.start_addr = RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START; prop->hints_host_reserved_va_range.end_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HOST_END; prop->hints_host_hpage_reserved_va_range.start_addr = RESERVED_VA_RANGE_FOR_ARC_ON_HOST_HPAGE_START; @@ -9241,6 +9241,35 @@ static void gaudi2_restore_user_registers(struct hl_device *hdev) gaudi2_restore_user_qm_registers(hdev); } +static int gaudi2_map_virtual_msix_doorbell_memory(struct hl_ctx *ctx) +{ + struct hl_device *hdev = ctx->hdev; + struct asic_fixed_properties *prop = &hdev->asic_prop; + struct gaudi2_device *gaudi2 = hdev->asic_specific; + int rc; + + rc = hl_mmu_map_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START, + gaudi2->virt_msix_db_dma_addr, prop->pmmu.page_size, true); + if (rc) + dev_err(hdev->dev, "Failed to map VA %#llx for virtual MSI-X doorbell memory\n", + RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START); + + return rc; +} + +static void gaudi2_unmap_virtual_msix_doorbell_memory(struct hl_ctx *ctx) +{ + struct hl_device *hdev = ctx->hdev; + struct asic_fixed_properties *prop = &hdev->asic_prop; + int rc; + + rc = hl_mmu_unmap_page(ctx, RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START, + prop->pmmu.page_size, true); + if (rc) + dev_err(hdev->dev, "Failed to unmap VA %#llx of virtual MSI-X doorbell memory\n", + RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START); +} + static int gaudi2_ctx_init(struct hl_ctx *ctx) { int rc; @@ -9257,7 +9286,15 @@ static int gaudi2_ctx_init(struct hl_ctx *ctx) else gaudi2_restore_user_registers(ctx->hdev); - return gaudi2_internal_cb_pool_init(ctx->hdev, ctx); + rc = gaudi2_internal_cb_pool_init(ctx->hdev, ctx); + if (rc) + return rc; + + rc = gaudi2_map_virtual_msix_doorbell_memory(ctx); + if (rc) + gaudi2_internal_cb_pool_fini(ctx->hdev, ctx); + + return rc; } static void gaudi2_ctx_fini(struct hl_ctx *ctx) @@ -9266,6 +9303,8 @@ static void gaudi2_ctx_fini(struct hl_ctx *ctx) return; gaudi2_internal_cb_pool_fini(ctx->hdev, ctx); + + gaudi2_unmap_virtual_msix_doorbell_memory(ctx); } static int gaudi2_pre_schedule_cs(struct hl_cs *cs) diff --git a/drivers/misc/habanalabs/include/gaudi2/gaudi2.h b/drivers/misc/habanalabs/include/gaudi2/gaudi2.h index 071fc5a820f7..5b4f9e108798 100644 --- a/drivers/misc/habanalabs/include/gaudi2/gaudi2.h +++ b/drivers/misc/habanalabs/include/gaudi2/gaudi2.h @@ -54,6 +54,9 @@ #define RESERVED_VA_RANGE_FOR_ARC_ON_HBM_START 0x1001500000000000ull #define RESERVED_VA_RANGE_FOR_ARC_ON_HBM_END 0x10016FFFFFFFFFFFull +#define RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_START 0xFFF077FFFFFF0000ull +#define RESERVED_VA_FOR_VIRTUAL_MSIX_DOORBELL_END 0xFFF077FFFFFFFFFFull + #define RESERVED_VA_RANGE_FOR_ARC_ON_HOST_START 0xFFF0780000000000ull #define RESERVED_VA_RANGE_FOR_ARC_ON_HOST_END 0xFFF07FFFFFFFFFFFull -- 2.25.1
| |