Lines Matching refs:fmr

972 static inline int mlx4_check_fmr(struct mlx4_fmr *fmr, u64 *page_list,  in mlx4_check_fmr()  argument
977 if (npages > fmr->max_pages) in mlx4_check_fmr()
980 page_mask = (1 << fmr->page_shift) - 1; in mlx4_check_fmr()
993 if (fmr->maps >= fmr->max_maps) in mlx4_check_fmr()
999 int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list, in mlx4_map_phys_fmr() argument
1005 err = mlx4_check_fmr(fmr, page_list, npages, iova); in mlx4_map_phys_fmr()
1009 ++fmr->maps; in mlx4_map_phys_fmr()
1011 key = key_to_hw_index(fmr->mr.key); in mlx4_map_phys_fmr()
1013 *lkey = *rkey = fmr->mr.key = hw_index_to_key(key); in mlx4_map_phys_fmr()
1015 *(u8 *) fmr->mpt = MLX4_MPT_STATUS_SW; in mlx4_map_phys_fmr()
1020 dma_sync_single_for_cpu(&dev->persist->pdev->dev, fmr->dma_handle, in mlx4_map_phys_fmr()
1024 fmr->mtts[i] = cpu_to_be64(page_list[i] | MLX4_MTT_FLAG_PRESENT); in mlx4_map_phys_fmr()
1026 dma_sync_single_for_device(&dev->persist->pdev->dev, fmr->dma_handle, in mlx4_map_phys_fmr()
1029 fmr->mpt->key = cpu_to_be32(key); in mlx4_map_phys_fmr()
1030 fmr->mpt->lkey = cpu_to_be32(key); in mlx4_map_phys_fmr()
1031 fmr->mpt->length = cpu_to_be64(npages * (1ull << fmr->page_shift)); in mlx4_map_phys_fmr()
1032 fmr->mpt->start = cpu_to_be64(iova); in mlx4_map_phys_fmr()
1037 *(u8 *) fmr->mpt = MLX4_MPT_STATUS_HW; in mlx4_map_phys_fmr()
1047 int max_maps, u8 page_shift, struct mlx4_fmr *fmr) in mlx4_fmr_alloc() argument
1059 if (max_pages * sizeof *fmr->mtts > PAGE_SIZE) in mlx4_fmr_alloc()
1062 fmr->page_shift = page_shift; in mlx4_fmr_alloc()
1063 fmr->max_pages = max_pages; in mlx4_fmr_alloc()
1064 fmr->max_maps = max_maps; in mlx4_fmr_alloc()
1065 fmr->maps = 0; in mlx4_fmr_alloc()
1068 page_shift, &fmr->mr); in mlx4_fmr_alloc()
1072 fmr->mtts = mlx4_table_find(&priv->mr_table.mtt_table, in mlx4_fmr_alloc()
1073 fmr->mr.mtt.offset, in mlx4_fmr_alloc()
1074 &fmr->dma_handle); in mlx4_fmr_alloc()
1076 if (!fmr->mtts) { in mlx4_fmr_alloc()
1084 (void) mlx4_mr_free(dev, &fmr->mr); in mlx4_fmr_alloc()
1089 int mlx4_fmr_enable(struct mlx4_dev *dev, struct mlx4_fmr *fmr) in mlx4_fmr_enable() argument
1094 err = mlx4_mr_enable(dev, &fmr->mr); in mlx4_fmr_enable()
1098 fmr->mpt = mlx4_table_find(&priv->mr_table.dmpt_table, in mlx4_fmr_enable()
1099 key_to_hw_index(fmr->mr.key), NULL); in mlx4_fmr_enable()
1100 if (!fmr->mpt) in mlx4_fmr_enable()
1107 void mlx4_fmr_unmap(struct mlx4_dev *dev, struct mlx4_fmr *fmr, in mlx4_fmr_unmap() argument
1113 if (!fmr->maps) in mlx4_fmr_unmap()
1116 fmr->maps = 0; in mlx4_fmr_unmap()
1126 key_to_hw_index(fmr->mr.key) & in mlx4_fmr_unmap()
1133 fmr->mr.enabled = MLX4_MPT_EN_SW; in mlx4_fmr_unmap()
1137 int mlx4_fmr_free(struct mlx4_dev *dev, struct mlx4_fmr *fmr) in mlx4_fmr_free() argument
1141 if (fmr->maps) in mlx4_fmr_free()
1144 ret = mlx4_mr_free(dev, &fmr->mr); in mlx4_fmr_free()
1147 fmr->mr.enabled = MLX4_MPT_DISABLED; in mlx4_fmr_free()