Lines Matching defs:fmr

804 static inline int mlx4_check_fmr(struct mlx4_fmr *fmr, u64 *page_list,
809 if (npages > fmr->max_pages)
812 page_mask = (1 << fmr->page_shift) - 1;
825 if (fmr->maps >= fmr->max_maps)
831 int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list,
837 err = mlx4_check_fmr(fmr, page_list, npages, iova);
841 ++fmr->maps;
843 key = key_to_hw_index(fmr->mr.key);
845 *lkey = *rkey = fmr->mr.key = hw_index_to_key(key);
847 *(u8 *) fmr->mpt = MLX4_MPT_STATUS_SW;
852 dma_sync_single_for_cpu(&dev->pdev->dev, fmr->dma_handle,
856 fmr->mtts[i] = cpu_to_be64(page_list[i] | MLX4_MTT_FLAG_PRESENT);
858 dma_sync_single_for_device(&dev->pdev->dev, fmr->dma_handle,
861 fmr->mpt->key = cpu_to_be32(key);
862 fmr->mpt->lkey = cpu_to_be32(key);
863 fmr->mpt->length = cpu_to_be64(npages * (1ull << fmr->page_shift));
864 fmr->mpt->start = cpu_to_be64(iova);
869 *(u8 *) fmr->mpt = MLX4_MPT_STATUS_HW;
879 int max_maps, u8 page_shift, struct mlx4_fmr *fmr)
891 if (max_pages * sizeof *fmr->mtts > PAGE_SIZE)
894 fmr->page_shift = page_shift;
895 fmr->max_pages = max_pages;
896 fmr->max_maps = max_maps;
897 fmr->maps = 0;
900 page_shift, &fmr->mr);
904 fmr->mtts = mlx4_table_find(&priv->mr_table.mtt_table,
905 fmr->mr.mtt.offset,
906 &fmr->dma_handle);
908 if (!fmr->mtts) {
916 ret = mlx4_mr_free(dev, &fmr->mr);
923 int mlx4_fmr_enable(struct mlx4_dev *dev, struct mlx4_fmr *fmr)
928 err = mlx4_mr_enable(dev, &fmr->mr);
932 fmr->mpt = mlx4_table_find(&priv->mr_table.dmpt_table,
933 key_to_hw_index(fmr->mr.key), NULL);
934 if (!fmr->mpt)
941 void mlx4_fmr_unmap(struct mlx4_dev *dev, struct mlx4_fmr *fmr,
946 if (!fmr->maps)
949 key = key_to_hw_index(fmr->mr.key) & (dev->caps.num_mpts - 1);
951 *(u8 *)fmr->mpt = MLX4_MPT_STATUS_SW;
956 fmr->mr.key = hw_index_to_key(key);
958 fmr->mpt->key = cpu_to_be32(key);
959 fmr->mpt->lkey = cpu_to_be32(key);
960 fmr->mpt->length = 0;
961 fmr->mpt->start = 0;
966 *(u8 *)fmr->mpt = MLX4_MPT_STATUS_HW;
971 fmr->maps = 0;
975 int mlx4_fmr_free(struct mlx4_dev *dev, struct mlx4_fmr *fmr)
979 if (fmr->maps)
982 ret = mlx4_mr_free(dev, &fmr->mr);
985 fmr->mr.enabled = MLX4_MPT_DISABLED;