habanalabs/gaudi2: map virtual MSI-X doorbell memory for user
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>
This commit is contained in:
parent
3f043b3192
commit
168fc71857
@ -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;
|
||||
@ -9236,6 +9236,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;
|
||||
@ -9252,7 +9281,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)
|
||||
@ -9261,6 +9298,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)
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user