habanalabs/gaudi2: map virtual MSI-X doorbell memory for user
authorTomer Tayar <ttayar@habana.ai>
Thu, 30 Jun 2022 19:05:51 +0000 (22:05 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Tue, 12 Jul 2022 06:09:31 +0000 (09:09 +0300)
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
drivers/misc/habanalabs/include/gaudi2/gaudi2.h

index ba70fd4..8392961 100644 (file)
@@ -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)
index 071fc5a..5b4f9e1 100644 (file)
@@ -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