Lines Matching refs:iwmr
2328 * @iwmr: iwmr for IB's user page addresses
2332 static void irdma_copy_user_pgaddrs(struct irdma_mr *iwmr, u64 *pbl,
2335 struct ib_umem *region = iwmr->region;
2336 struct irdma_pbl *iwpbl = &iwmr->iwpbl;
2345 if (iwmr->type == IRDMA_MEMREG_TYPE_QP)
2348 rdma_umem_for_each_dma_block(region, &biter, iwmr->page_size) {
2414 * @iwmr: mr pointer for this memory registration
2417 static int irdma_setup_pbles(struct irdma_pci_f *rf, struct irdma_mr *iwmr,
2420 struct irdma_pbl *iwpbl = &iwmr->iwpbl;
2428 status = irdma_get_pble(rf->pble_rsrc, palloc, iwmr->page_cnt,
2439 pbl = iwmr->pgaddrmem;
2442 irdma_copy_user_pgaddrs(iwmr, pbl, level);
2445 iwmr->pgaddrmem[0] = *pbl;
2462 struct irdma_mr *iwmr = iwpbl->iwmr;
2466 u64 *arr = iwmr->pgaddrmem;
2471 pg_size = iwmr->page_size;
2472 err = irdma_setup_pbles(iwdev->rf, iwmr, lvl);
2479 switch (iwmr->type) {
2535 * @iwmr: pointer to memory window info
2537 static int irdma_hw_alloc_mw(struct irdma_device *iwdev, struct irdma_mr *iwmr)
2540 struct irdma_pd *iwpd = to_iwpd(iwmr->ibmr.pd);
2552 if (iwmr->ibmw.type == IB_MW_TYPE_1)
2556 info->mw_stag_index = iwmr->stag >> IRDMA_CQPSQ_STAG_IDX_S;
2577 struct irdma_mr *iwmr = to_iwmw(ibmw);
2585 iwmr->stag = stag;
2588 err_code = irdma_hw_alloc_mw(iwdev, iwmr);
2605 struct irdma_mr *iwmr = to_iwmr((struct ib_mr *)ibmw);
2627 irdma_free_stag(iwdev, iwmr->stag);
2635 * @iwmr: irdma mr pointer
2638 struct irdma_mr *iwmr)
2641 struct ib_pd *pd = iwmr->ibmr.pd;
2655 info->stag_idx = iwmr->stag >> IRDMA_CQPSQ_STAG_IDX_S;
2657 info->total_len = iwmr->len;
2682 struct irdma_mr *iwmr;
2686 iwmr = kzalloc(sizeof(*iwmr), GFP_KERNEL);
2687 if (!iwmr)
2696 iwmr->stag = stag;
2697 iwmr->ibmr.rkey = stag;
2698 iwmr->ibmr.lkey = stag;
2699 iwmr->ibmr.pd = pd;
2700 iwmr->ibmr.device = pd->device;
2701 iwpbl = &iwmr->iwpbl;
2702 iwpbl->iwmr = iwmr;
2703 iwmr->type = IRDMA_MEMREG_TYPE_MEM;
2705 iwmr->page_cnt = max_num_sg;
2707 iwmr->len = max_num_sg * PAGE_SIZE;
2708 err_code = irdma_get_pble(iwdev->rf->pble_rsrc, palloc, iwmr->page_cnt,
2713 err_code = irdma_hw_alloc_stag(iwdev, iwmr);
2719 return &iwmr->ibmr;
2725 kfree(iwmr);
2737 struct irdma_mr *iwmr = to_iwmr(ibmr);
2738 struct irdma_pbl *iwpbl = &iwmr->iwpbl;
2742 if (unlikely(iwmr->npages == iwmr->page_cnt))
2747 palloc->level2.leaf + (iwmr->npages >> PBLE_512_SHIFT);
2749 palloc_info->addr[iwmr->npages & (PBLE_PER_PAGE - 1)] = addr;
2752 pbl[iwmr->npages] = addr;
2754 iwmr->npages++;
2769 struct irdma_mr *iwmr = to_iwmr(ibmr);
2771 iwmr->npages = 0;
2779 * @iwmr: irdma mr pointer
2782 static int irdma_hwreg_mr(struct irdma_device *iwdev, struct irdma_mr *iwmr,
2785 struct irdma_pbl *iwpbl = &iwmr->iwpbl;
2787 struct ib_pd *pd = iwmr->ibmr.pd;
2802 stag_info->stag_idx = iwmr->stag >> IRDMA_CQPSQ_STAG_IDX_S;
2803 stag_info->stag_key = (u8)iwmr->stag;
2804 stag_info->total_len = iwmr->len;
2812 stag_info->page_size = iwmr->page_size;
2823 stag_info->reg_addr_pa = iwmr->pgaddrmem[0];
2836 static int irdma_reg_user_mr_type_mem(struct irdma_mr *iwmr, int access)
2838 struct irdma_device *iwdev = to_iwdev(iwmr->ibmr.device);
2839 struct irdma_pbl *iwpbl = &iwmr->iwpbl;
2844 lvl = iwmr->page_cnt != 1 ? PBLE_LEVEL_1 | PBLE_LEVEL_2 : PBLE_LEVEL_0;
2846 err = irdma_setup_pbles(iwdev->rf, iwmr, lvl);
2852 iwmr->page_size);
2865 iwmr->stag = stag;
2866 iwmr->ibmr.rkey = stag;
2867 iwmr->ibmr.lkey = stag;
2868 err = irdma_hwreg_mr(iwdev, iwmr, access);
2890 struct irdma_mr *iwmr;
2893 iwmr = kzalloc(sizeof(*iwmr), GFP_KERNEL);
2894 if (!iwmr)
2897 iwpbl = &iwmr->iwpbl;
2898 iwpbl->iwmr = iwmr;
2899 iwmr->region = region;
2900 iwmr->ibmr.pd = pd;
2901 iwmr->ibmr.device = pd->device;
2902 iwmr->ibmr.iova = virt;
2903 iwmr->type = reg_type;
2908 iwmr->page_size = ib_umem_find_best_pgsz(region, pgsz_bitmap, virt);
2909 if (unlikely(!iwmr->page_size)) {
2910 kfree(iwmr);
2914 iwmr->len = region->length;
2916 iwmr->page_cnt = ib_umem_num_dma_blocks(region, iwmr->page_size);
2918 return iwmr;
2921 static void irdma_free_iwmr(struct irdma_mr *iwmr)
2923 kfree(iwmr);
2928 struct irdma_mr *iwmr)
2930 struct irdma_device *iwdev = to_iwdev(iwmr->ibmr.device);
2931 struct irdma_pbl *iwpbl = &iwmr->iwpbl;
2940 ib_umem_offset(iwmr->region))
2944 if (total > iwmr->page_cnt)
2965 struct irdma_mr *iwmr)
2967 struct irdma_device *iwdev = to_iwdev(iwmr->ibmr.device);
2968 struct irdma_pbl *iwpbl = &iwmr->iwpbl;
2979 if (total > iwmr->page_cnt)
3014 struct irdma_mr *iwmr = NULL;
3036 iwmr = irdma_alloc_iwmr(region, pd, virt, req.reg_type);
3037 if (IS_ERR(iwmr)) {
3039 return (struct ib_mr *)iwmr;
3044 err = irdma_reg_user_mr_type_qp(req, udata, iwmr);
3050 err = irdma_reg_user_mr_type_cq(req, udata, iwmr);
3055 err = irdma_reg_user_mr_type_mem(iwmr, access);
3065 return &iwmr->ibmr;
3068 irdma_free_iwmr(iwmr);
3080 struct irdma_mr *iwmr;
3093 iwmr = irdma_alloc_iwmr(&umem_dmabuf->umem, pd, virt, IRDMA_MEMREG_TYPE_MEM);
3094 if (IS_ERR(iwmr)) {
3095 err = PTR_ERR(iwmr);
3099 err = irdma_reg_user_mr_type_mem(iwmr, access);
3103 return &iwmr->ibmr;
3106 irdma_free_iwmr(iwmr);
3127 struct irdma_mr *iwmr;
3131 iwmr = kzalloc(sizeof(*iwmr), GFP_KERNEL);
3132 if (!iwmr)
3135 iwmr->ibmr.pd = pd;
3136 iwmr->ibmr.device = pd->device;
3137 iwpbl = &iwmr->iwpbl;
3138 iwpbl->iwmr = iwmr;
3139 iwmr->type = IRDMA_MEMREG_TYPE_MEM;
3147 iwmr->stag = stag;
3148 iwmr->ibmr.iova = *iova_start;
3149 iwmr->ibmr.rkey = stag;
3150 iwmr->ibmr.lkey = stag;
3151 iwmr->page_cnt = 1;
3152 iwmr->pgaddrmem[0] = addr;
3153 iwmr->len = size;
3154 iwmr->page_size = SZ_4K;
3155 ret = irdma_hwreg_mr(iwdev, iwmr, access);
3161 return &iwmr->ibmr;
3164 kfree(iwmr);
3183 * @iwmr: iwmr for IB's user page addresses
3186 static void irdma_del_memlist(struct irdma_mr *iwmr,
3189 struct irdma_pbl *iwpbl = &iwmr->iwpbl;
3192 switch (iwmr->type) {
3223 struct irdma_mr *iwmr = to_iwmr(ib_mr);
3226 struct irdma_pbl *iwpbl = &iwmr->iwpbl;
3232 if (iwmr->type != IRDMA_MEMREG_TYPE_MEM) {
3233 if (iwmr->region) {
3239 irdma_del_memlist(iwmr, ucontext);
3266 irdma_free_stag(iwdev, iwmr->stag);
3270 ib_umem_release(iwmr->region);
3271 kfree(iwmr);
3397 struct irdma_mr *iwmr = to_iwmr(reg_wr(ib_wr)->mr);
3398 struct irdma_pble_alloc *palloc = &iwmr->iwpbl.pble_alloc;
3409 stag_info.va = (void *)(uintptr_t)iwmr->ibmr.iova;
3410 stag_info.total_len = iwmr->ibmr.length;
3414 if (iwmr->npages > IRDMA_MIN_PAGES_PER_FMR)