net/mlx5: Mkey creation command adjustments
authorAriel Levkovich <lariel@mellanox.com>
Thu, 5 Apr 2018 15:53:28 +0000 (18:53 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 5 Apr 2018 19:04:49 +0000 (13:04 -0600)
This change updates the mlx5 interface to create mkey
on the device.

The updates in the command mailbox include increasing the
access mode type field to 5 bits in order to support additional
types such as MLX5_MKC_ACCESS_MODE_MEMIC which represents device
memory access type and will be used when registering MR on allocated
device memory.

All the places that use the old access mode format are adjusted as
well.

Signed-off-by: Ariel Levkovich <lariel@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/cmd.c
drivers/infiniband/hw/mlx5/mr.c
drivers/net/ethernet/mellanox/mlx5/core/en_common.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/fpga/conn.c
include/linux/mlx5/mlx5_ifc.h

index 55a227cc86096e4f80d8ce8459f60fbcdc2baefe..188512bf46e63210e478a0527bc225c075dcf28a 100644 (file)
@@ -99,23 +99,21 @@ int mlx5_cmd_alloc_memic(struct mlx5_memic *memic, phys_addr_t *addr,
        MLX5_SET(alloc_memic_in, in, log_memic_addr_alignment,
                 mlx5_alignment);
 
-       do {
+       while (page_idx < num_memic_hw_pages) {
                spin_lock(&memic->memic_lock);
                page_idx = bitmap_find_next_zero_area(memic->memic_alloc_pages,
                                                      num_memic_hw_pages,
                                                      page_idx,
                                                      num_pages, 0);
 
-               if (page_idx + num_pages <= num_memic_hw_pages)
+               if (page_idx < num_memic_hw_pages)
                        bitmap_set(memic->memic_alloc_pages,
                                   page_idx, num_pages);
-               else
-                       ret = -ENOMEM;
 
                spin_unlock(&memic->memic_lock);
 
-               if (ret)
-                       return ret;
+               if (page_idx >= num_memic_hw_pages)
+                       break;
 
                MLX5_SET64(alloc_memic_in, in, range_start_addr,
                           hw_start_addr + (page_idx * PAGE_SIZE));
@@ -138,10 +136,10 @@ int mlx5_cmd_alloc_memic(struct mlx5_memic *memic, phys_addr_t *addr,
                *addr = pci_resource_start(dev->pdev, 0) +
                        MLX5_GET64(alloc_memic_out, out, memic_start_addr);
 
-               return ret;
-       } while (page_idx < num_memic_hw_pages);
+               return 0;
+       }
 
-       return ret;
+       return -ENOMEM;
 }
 
 int mlx5_cmd_dealloc_memic(struct mlx5_memic *memic, u64 addr, u64 length)
index 60683090d138579e8a7e40201ae50fbb911ffd06..d3f7ce97c3a5a7600bde8081b163fe2b66237a0d 100644 (file)
@@ -204,7 +204,9 @@ static int add_keys(struct mlx5_ib_dev *dev, int c, int num)
 
                MLX5_SET(mkc, mkc, free, 1);
                MLX5_SET(mkc, mkc, umr_en, 1);
-               MLX5_SET(mkc, mkc, access_mode, ent->access_mode);
+               MLX5_SET(mkc, mkc, access_mode_1_0, ent->access_mode & 0x3);
+               MLX5_SET(mkc, mkc, access_mode_4_2,
+                        (ent->access_mode >> 2) & 0x7);
 
                MLX5_SET(mkc, mkc, qpn, 0xffffff);
                MLX5_SET(mkc, mkc, translations_octword_size, ent->xlt);
@@ -804,7 +806,7 @@ struct ib_mr *mlx5_ib_get_dma_mr(struct ib_pd *pd, int acc)
 
        mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
 
-       MLX5_SET(mkc, mkc, access_mode, MLX5_MKC_ACCESS_MODE_PA);
+       MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
        MLX5_SET(mkc, mkc, a, !!(acc & IB_ACCESS_REMOTE_ATOMIC));
        MLX5_SET(mkc, mkc, rw, !!(acc & IB_ACCESS_REMOTE_WRITE));
        MLX5_SET(mkc, mkc, rr, !!(acc & IB_ACCESS_REMOTE_READ));
@@ -1171,7 +1173,7 @@ static struct mlx5_ib_mr *reg_create(struct ib_mr *ibmr, struct ib_pd *pd,
 
        mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
        MLX5_SET(mkc, mkc, free, !populate);
-       MLX5_SET(mkc, mkc, access_mode, MLX5_MKC_ACCESS_MODE_MTT);
+       MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_MTT);
        MLX5_SET(mkc, mkc, a, !!(access_flags & IB_ACCESS_REMOTE_ATOMIC));
        MLX5_SET(mkc, mkc, rw, !!(access_flags & IB_ACCESS_REMOTE_WRITE));
        MLX5_SET(mkc, mkc, rr, !!(access_flags & IB_ACCESS_REMOTE_READ));
@@ -1668,7 +1670,8 @@ struct ib_mr *mlx5_ib_alloc_mr(struct ib_pd *pd,
                goto err_free_in;
        }
 
-       MLX5_SET(mkc, mkc, access_mode, mr->access_mode);
+       MLX5_SET(mkc, mkc, access_mode_1_0, mr->access_mode & 0x3);
+       MLX5_SET(mkc, mkc, access_mode_4_2, (mr->access_mode >> 2) & 0x7);
        MLX5_SET(mkc, mkc, umr_en, 1);
 
        mr->ibmr.device = pd->device;
@@ -1749,7 +1752,7 @@ struct ib_mw *mlx5_ib_alloc_mw(struct ib_pd *pd, enum ib_mw_type type,
        MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn);
        MLX5_SET(mkc, mkc, umr_en, 1);
        MLX5_SET(mkc, mkc, lr, 1);
-       MLX5_SET(mkc, mkc, access_mode, MLX5_MKC_ACCESS_MODE_KLMS);
+       MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_KLMS);
        MLX5_SET(mkc, mkc, en_rinval, !!((type == IB_MW_TYPE_2)));
        MLX5_SET(mkc, mkc, qpn, 0xffffff);
 
index 784e282803db1a71706628e7a1381da0388885c0..db3278cc052ba3639fb8e74cdf4cf610637c8201 100644 (file)
@@ -70,7 +70,7 @@ static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn,
                return -ENOMEM;
 
        mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
-       MLX5_SET(mkc, mkc, access_mode, MLX5_MKC_ACCESS_MODE_PA);
+       MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
        MLX5_SET(mkc, mkc, lw, 1);
        MLX5_SET(mkc, mkc, lr, 1);
 
index 2ee4ffbddd5f4166b6d12ea3adf1234bc57aac9e..7bafa78a6c37359ba8e61a0f02f864d37d98a9cc 100644 (file)
@@ -360,7 +360,7 @@ static int mlx5e_create_umr_mkey(struct mlx5_core_dev *mdev,
        MLX5_SET(mkc, mkc, umr_en, 1);
        MLX5_SET(mkc, mkc, lw, 1);
        MLX5_SET(mkc, mkc, lr, 1);
-       MLX5_SET(mkc, mkc, access_mode, MLX5_MKC_ACCESS_MODE_MTT);
+       MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_MTT);
 
        MLX5_SET(mkc, mkc, qpn, 0xffffff);
        MLX5_SET(mkc, mkc, pd, mdev->mlx5e_res.pdn);
index e6175f8ac0e4fad1c0ee30553ddedafc3bbac929..de7fe087d6fe904432dd7a72e04ec977290696f0 100644 (file)
@@ -232,7 +232,7 @@ static int mlx5_fpga_conn_create_mkey(struct mlx5_core_dev *mdev, u32 pdn,
                return -ENOMEM;
 
        mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
-       MLX5_SET(mkc, mkc, access_mode, MLX5_MKC_ACCESS_MODE_PA);
+       MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
        MLX5_SET(mkc, mkc, lw, 1);
        MLX5_SET(mkc, mkc, lr, 1);
 
index a64e59b65a335a956fd66cc8e6f3b4192de568ba..fa6f134c85d7124f3a242e2df14fd06f8cea9e81 100644 (file)
@@ -2720,12 +2720,17 @@ enum {
        MLX5_MKC_ACCESS_MODE_MTT   = 0x1,
        MLX5_MKC_ACCESS_MODE_KLMS  = 0x2,
        MLX5_MKC_ACCESS_MODE_KSM   = 0x3,
+       MLX5_MKC_ACCESS_MODE_MEMIC = 0x5,
 };
 
 struct mlx5_ifc_mkc_bits {
        u8         reserved_at_0[0x1];
        u8         free[0x1];
-       u8         reserved_at_2[0xd];
+       u8         reserved_at_2[0x1];
+       u8         access_mode_4_2[0x3];
+       u8         reserved_at_6[0x7];
+       u8         relaxed_ordering_write[0x1];
+       u8         reserved_at_e[0x1];
        u8         small_fence_on_rdma_read_response[0x1];
        u8         umr_en[0x1];
        u8         a[0x1];
@@ -2733,7 +2738,7 @@ struct mlx5_ifc_mkc_bits {
        u8         rr[0x1];
        u8         lw[0x1];
        u8         lr[0x1];
-       u8         access_mode[0x2];
+       u8         access_mode_1_0[0x2];
        u8         reserved_at_18[0x8];
 
        u8         qpn[0x18];