lkml.org 
[lkml]   [2022]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 07/12] habanalabs/gaudi2: map virtual MSI-X doorbell memory for user
    Date
    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
    \
     
     \ /
      Last update: 2022-07-11 08:31    [W:7.234 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site