Lines Matching refs:fmr

975 static inline int mlx4_check_fmr(struct mlx4_fmr *fmr, u64 *page_list,
980 if (npages > fmr->max_pages)
983 page_mask = (1 << fmr->page_shift) - 1;
996 if (fmr->maps >= fmr->max_maps)
1002 int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list,
1008 err = mlx4_check_fmr(fmr, page_list, npages, iova);
1012 ++fmr->maps;
1014 key = key_to_hw_index(fmr->mr.key);
1016 *lkey = *rkey = fmr->mr.key = hw_index_to_key(key);
1018 *(u8 *) fmr->mpt = MLX4_MPT_STATUS_SW;
1023 dma_sync_single_for_cpu(&dev->persist->pdev->dev, fmr->dma_handle,
1027 fmr->mtts[i] = cpu_to_be64(page_list[i] | MLX4_MTT_FLAG_PRESENT);
1029 dma_sync_single_for_device(&dev->persist->pdev->dev, fmr->dma_handle,
1032 fmr->mpt->key = cpu_to_be32(key);
1033 fmr->mpt->lkey = cpu_to_be32(key);
1034 fmr->mpt->length = cpu_to_be64(npages * (1ull << fmr->page_shift));
1035 fmr->mpt->start = cpu_to_be64(iova);
1040 *(u8 *) fmr->mpt = MLX4_MPT_STATUS_HW;
1050 int max_maps, u8 page_shift, struct mlx4_fmr *fmr)
1062 if (max_pages * sizeof *fmr->mtts > PAGE_SIZE)
1065 fmr->page_shift = page_shift;
1066 fmr->max_pages = max_pages;
1067 fmr->max_maps = max_maps;
1068 fmr->maps = 0;
1071 page_shift, &fmr->mr);
1075 fmr->mtts = mlx4_table_find(&priv->mr_table.mtt_table,
1076 fmr->mr.mtt.offset,
1077 &fmr->dma_handle);
1079 if (!fmr->mtts) {
1087 (void) mlx4_mr_free(dev, &fmr->mr);
1092 int mlx4_fmr_enable(struct mlx4_dev *dev, struct mlx4_fmr *fmr)
1097 err = mlx4_mr_enable(dev, &fmr->mr);
1101 fmr->mpt = mlx4_table_find(&priv->mr_table.dmpt_table,
1102 key_to_hw_index(fmr->mr.key), NULL);
1103 if (!fmr->mpt)
1110 void mlx4_fmr_unmap(struct mlx4_dev *dev, struct mlx4_fmr *fmr,
1116 if (!fmr->maps)
1119 fmr->maps = 0;
1129 key_to_hw_index(fmr->mr.key) &
1136 fmr->mr.enabled = MLX4_MPT_EN_SW;
1140 int mlx4_fmr_free(struct mlx4_dev *dev, struct mlx4_fmr *fmr)
1144 if (fmr->maps)
1147 ret = mlx4_mr_free(dev, &fmr->mr);
1150 fmr->mr.enabled = MLX4_MPT_DISABLED;