]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/mana_ib: support of the zero based MRs
authorKonstantin Taranov <kotaranov@microsoft.com>
Mon, 14 Apr 2025 09:00:33 +0000 (02:00 -0700)
committerLeon Romanovsky <leon@kernel.org>
Sun, 20 Apr 2025 10:32:35 +0000 (06:32 -0400)
Add IB_ZERO_BASED to the valid flags and use
the corresponding MR creation request for the zero
based memory.

Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>
Link: https://patch.msgid.link/1744621234-26114-3-git-send-email-kotaranov@linux.microsoft.com
Reviewed-by: Long Li <longli@microsoft.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/mana/mr.c
include/net/mana/gdma.h

index e4a9f537a6d094023cd74b2f03b3dfce1f493568..6d974d0a8400318fe00300339cf8e30bb11fc19a 100644 (file)
@@ -6,7 +6,7 @@
 #include "mana_ib.h"
 
 #define VALID_MR_FLAGS (IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_WRITE | IB_ACCESS_REMOTE_READ |\
-                       IB_ACCESS_REMOTE_ATOMIC)
+                       IB_ACCESS_REMOTE_ATOMIC | IB_ZERO_BASED)
 
 #define VALID_DMA_MR_FLAGS (IB_ACCESS_LOCAL_WRITE)
 
@@ -51,7 +51,10 @@ static int mana_ib_gd_create_mr(struct mana_ib_dev *dev, struct mana_ib_mr *mr,
                req.gva.virtual_address = mr_params->gva.virtual_address;
                req.gva.access_flags = mr_params->gva.access_flags;
                break;
-
+       case GDMA_MR_TYPE_ZBVA:
+               req.zbva.dma_region_handle = mr_params->zbva.dma_region_handle;
+               req.zbva.access_flags = mr_params->zbva.access_flags;
+               break;
        default:
                ibdev_dbg(&dev->ib_dev,
                          "invalid param (GDMA_MR_TYPE) passed, type %d\n",
@@ -147,11 +150,18 @@ struct ib_mr *mana_ib_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 length,
                  dma_region_handle);
 
        mr_params.pd_handle = pd->pd_handle;
-       mr_params.mr_type = GDMA_MR_TYPE_GVA;
-       mr_params.gva.dma_region_handle = dma_region_handle;
-       mr_params.gva.virtual_address = iova;
-       mr_params.gva.access_flags =
-               mana_ib_verbs_to_gdma_access_flags(access_flags);
+       if (access_flags & IB_ZERO_BASED) {
+               mr_params.mr_type = GDMA_MR_TYPE_ZBVA;
+               mr_params.zbva.dma_region_handle = dma_region_handle;
+               mr_params.zbva.access_flags =
+                       mana_ib_verbs_to_gdma_access_flags(access_flags);
+       } else {
+               mr_params.mr_type = GDMA_MR_TYPE_GVA;
+               mr_params.gva.dma_region_handle = dma_region_handle;
+               mr_params.gva.virtual_address = iova;
+               mr_params.gva.access_flags =
+                       mana_ib_verbs_to_gdma_access_flags(access_flags);
+       }
 
        err = mana_ib_gd_create_mr(dev, mr, &mr_params);
        if (err)
index 228603bf03f26dc2754e6ec882a70916d72698bc..239a7003255092df85ac19cc3470bcd7713fa527 100644 (file)
@@ -815,6 +815,8 @@ enum gdma_mr_type {
         * address that is set up in the MST
         */
        GDMA_MR_TYPE_GVA = 2,
+       /* Guest zero-based address MRs */
+       GDMA_MR_TYPE_ZBVA = 4,
 };
 
 struct gdma_create_mr_params {
@@ -826,6 +828,10 @@ struct gdma_create_mr_params {
                        u64 virtual_address;
                        enum gdma_mr_access_flags access_flags;
                } gva;
+               struct {
+                       u64 dma_region_handle;
+                       enum gdma_mr_access_flags access_flags;
+               } zbva;
        };
 };
 
@@ -841,7 +847,10 @@ struct gdma_create_mr_request {
                        u64 virtual_address;
                        enum gdma_mr_access_flags access_flags;
                } gva;
-
+               struct {
+                       u64 dma_region_handle;
+                       enum gdma_mr_access_flags access_flags;
+               } zbva;
        };
        u32 reserved_2;
 };/* HW DATA */