(1ull << IB_USER_VERBS_CMD_CREATE_XSRQ) |
(1ull << IB_USER_VERBS_CMD_OPEN_QP) |
(1ull << IB_USER_VERBS_CMD_ALLOC_SHPD) |
- (1ull << IB_USER_VERBS_CMD_SHARE_PD);
+ (1ull << IB_USER_VERBS_CMD_SHARE_PD) |
+ (1ull << IB_USER_VERBS_CMD_REG_MR_RELAXED) |
+ (1ull << IB_USER_VERBS_CMD_DEREG_MR_RELAXED) |
+ (1ull << IB_USER_VERBS_CMD_FLUSH_RELAXED_MR);
ibdev->ib_dev.query_device = mlx4_ib_query_device;
ibdev->ib_dev.query_port = mlx4_ib_query_port;
ibdev->ib_dev.alloc_shpd = mlx4_ib_alloc_shpd;
ibdev->ib_dev.share_pd = mlx4_ib_share_pd;
ibdev->ib_dev.remove_shpd = mlx4_ib_remove_shpd;
+ ibdev->ib_dev.set_fmr_pd = mlx4_ib_set_fmr_pd;
if (!mlx4_is_slave(ibdev->dev)) {
ibdev->ib_dev.alloc_fmr = mlx4_ib_fmr_alloc;
struct ib_fmr *mlx4_ib_fmr_alloc(struct ib_pd *pd, int mr_access_flags,
struct ib_fmr_attr *fmr_attr);
+int mlx4_ib_set_fmr_pd(struct ib_fmr *ibfmr, struct ib_pd *pd);
int mlx4_ib_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list, int npages,
u64 iova);
int mlx4_ib_unmap_fmr(struct list_head *fmr_list);
return ERR_PTR(err);
}
+int mlx4_ib_set_fmr_pd(struct ib_fmr *ibfmr, struct ib_pd *pd)
+{
+ struct mlx4_ib_fmr *ifmr = to_mfmr(ibfmr);
+ u32 pdn = to_mpd(pd)->pdn;
+
+ return mlx4_set_fmr_pd(&ifmr->mfmr, pdn);
+}
+
int mlx4_ib_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list,
int npages, u64 iova)
{
return 0;
}
+int mlx4_set_fmr_pd(struct mlx4_fmr *fmr, u32 pd)
+{
+ fmr->mr.pd = pd;
+ return 0;
+}
+EXPORT_SYMBOL_GPL(mlx4_set_fmr_pd);
+
int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list,
int npages, u64 iova, u32 *lkey, u32 *rkey)
{
fmr->mpt->length = cpu_to_be64(npages * (1ull << fmr->page_shift));
fmr->mpt->start = cpu_to_be64(iova);
+ fmr->mpt->pd_flags = cpu_to_be32(fmr->mr.pd | MLX4_MPT_PD_FLAG_EN_INV);
+ if (fmr->mr.mtt.order >= 0 && fmr->mr.mtt.page_shift == 0) {
+ fmr->mpt->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG |
+ MLX4_MPT_PD_FLAG_RAE);
+ }
+
/* Make MTT entries are visible before setting MPT status */
wmb();
int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index);
void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, u16 vlan);
+int mlx4_set_fmr_pd(struct mlx4_fmr *fmr, u32 pd);
int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list,
int npages, u64 iova, u32 *lkey, u32 *rkey);
int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages,