Lines Matching refs:mr

69 static int alloc_mr_key(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr)  in alloc_mr_key()  argument
84 mr->key = hw_index_to_key(id); /* MR key */ in alloc_mr_key()
99 static void free_mr_key(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr) in free_mr_key() argument
101 unsigned long obj = key_to_hw_index(mr->key); in free_mr_key()
107 static int alloc_mr_pbl(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr, in alloc_mr_pbl() argument
111 bool is_fast = mr->type == MR_TYPE_FRMR; in alloc_mr_pbl()
115 mr->pbl_hop_num = is_fast ? 1 : hr_dev->caps.pbl_hop_num; in alloc_mr_pbl()
118 buf_attr.region[0].size = mr->size; in alloc_mr_pbl()
119 buf_attr.region[0].hopnum = mr->pbl_hop_num; in alloc_mr_pbl()
121 buf_attr.user_access = mr->access; in alloc_mr_pbl()
125 err = hns_roce_mtr_create(hr_dev, &mr->pbl_mtr, &buf_attr, in alloc_mr_pbl()
131 mr->npages = mr->pbl_mtr.hem_cfg.buf_pg_count; in alloc_mr_pbl()
136 static void free_mr_pbl(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr) in free_mr_pbl() argument
138 hns_roce_mtr_destroy(hr_dev, &mr->pbl_mtr); in free_mr_pbl()
142 struct hns_roce_mr *mr) in hns_roce_mr_free() argument
147 if (mr->enabled) { in hns_roce_mr_free()
149 key_to_hw_index(mr->key) & in hns_roce_mr_free()
156 free_mr_pbl(hr_dev, mr); in hns_roce_mr_free()
157 free_mr_key(hr_dev, mr); in hns_roce_mr_free()
161 struct hns_roce_mr *mr) in hns_roce_mr_enable() argument
163 unsigned long mtpt_idx = key_to_hw_index(mr->key); in hns_roce_mr_enable()
175 if (mr->type != MR_TYPE_FRMR) in hns_roce_mr_enable()
176 ret = hr_dev->hw->write_mtpt(hr_dev, mailbox->buf, mr, in hns_roce_mr_enable()
179 ret = hr_dev->hw->frmr_write_mtpt(hr_dev, mailbox->buf, mr); in hns_roce_mr_enable()
192 mr->enabled = 1; in hns_roce_mr_enable()
212 struct hns_roce_mr *mr; in hns_roce_get_dma_mr() local
215 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in hns_roce_get_dma_mr()
216 if (mr == NULL) in hns_roce_get_dma_mr()
219 mr->type = MR_TYPE_DMA; in hns_roce_get_dma_mr()
220 mr->pd = to_hr_pd(pd)->pdn; in hns_roce_get_dma_mr()
221 mr->access = acc; in hns_roce_get_dma_mr()
224 hns_roce_hem_list_init(&mr->pbl_mtr.hem_list); in hns_roce_get_dma_mr()
225 ret = alloc_mr_key(hr_dev, mr); in hns_roce_get_dma_mr()
229 ret = hns_roce_mr_enable(hr_dev, mr); in hns_roce_get_dma_mr()
233 mr->ibmr.rkey = mr->ibmr.lkey = mr->key; in hns_roce_get_dma_mr()
235 return &mr->ibmr; in hns_roce_get_dma_mr()
237 free_mr_key(hr_dev, mr); in hns_roce_get_dma_mr()
240 kfree(mr); in hns_roce_get_dma_mr()
249 struct hns_roce_mr *mr; in hns_roce_reg_user_mr() local
252 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in hns_roce_reg_user_mr()
253 if (!mr) in hns_roce_reg_user_mr()
256 mr->iova = virt_addr; in hns_roce_reg_user_mr()
257 mr->size = length; in hns_roce_reg_user_mr()
258 mr->pd = to_hr_pd(pd)->pdn; in hns_roce_reg_user_mr()
259 mr->access = access_flags; in hns_roce_reg_user_mr()
260 mr->type = MR_TYPE_MR; in hns_roce_reg_user_mr()
262 ret = alloc_mr_key(hr_dev, mr); in hns_roce_reg_user_mr()
266 ret = alloc_mr_pbl(hr_dev, mr, udata, start); in hns_roce_reg_user_mr()
270 ret = hns_roce_mr_enable(hr_dev, mr); in hns_roce_reg_user_mr()
274 mr->ibmr.rkey = mr->ibmr.lkey = mr->key; in hns_roce_reg_user_mr()
275 mr->ibmr.length = length; in hns_roce_reg_user_mr()
277 return &mr->ibmr; in hns_roce_reg_user_mr()
280 free_mr_pbl(hr_dev, mr); in hns_roce_reg_user_mr()
282 free_mr_key(hr_dev, mr); in hns_roce_reg_user_mr()
284 kfree(mr); in hns_roce_reg_user_mr()
295 struct hns_roce_mr *mr = to_hr_mr(ibmr); in hns_roce_rereg_user_mr() local
300 if (!mr->enabled) in hns_roce_rereg_user_mr()
307 mtpt_idx = key_to_hw_index(mr->key) & (hr_dev->caps.num_mtpts - 1); in hns_roce_rereg_user_mr()
318 mr->enabled = 0; in hns_roce_rereg_user_mr()
319 mr->iova = virt_addr; in hns_roce_rereg_user_mr()
320 mr->size = length; in hns_roce_rereg_user_mr()
323 mr->pd = to_hr_pd(pd)->pdn; in hns_roce_rereg_user_mr()
326 mr->access = mr_access_flags; in hns_roce_rereg_user_mr()
329 free_mr_pbl(hr_dev, mr); in hns_roce_rereg_user_mr()
330 ret = alloc_mr_pbl(hr_dev, mr, udata, start); in hns_roce_rereg_user_mr()
338 ret = hr_dev->hw->rereg_write_mtpt(hr_dev, mr, flags, mailbox->buf); in hns_roce_rereg_user_mr()
350 mr->enabled = 1; in hns_roce_rereg_user_mr()
363 struct hns_roce_mr *mr = to_hr_mr(ibmr); in hns_roce_dereg_mr() local
367 ret = hr_dev->hw->dereg_mr(hr_dev, mr, udata); in hns_roce_dereg_mr()
369 hns_roce_mr_free(hr_dev, mr); in hns_roce_dereg_mr()
370 kfree(mr); in hns_roce_dereg_mr()
381 struct hns_roce_mr *mr; in hns_roce_alloc_mr() local
393 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in hns_roce_alloc_mr()
394 if (!mr) in hns_roce_alloc_mr()
397 mr->type = MR_TYPE_FRMR; in hns_roce_alloc_mr()
398 mr->pd = to_hr_pd(pd)->pdn; in hns_roce_alloc_mr()
399 mr->size = max_num_sg * (1 << PAGE_SHIFT); in hns_roce_alloc_mr()
402 ret = alloc_mr_key(hr_dev, mr); in hns_roce_alloc_mr()
406 ret = alloc_mr_pbl(hr_dev, mr, NULL, 0); in hns_roce_alloc_mr()
410 ret = hns_roce_mr_enable(hr_dev, mr); in hns_roce_alloc_mr()
414 mr->ibmr.rkey = mr->ibmr.lkey = mr->key; in hns_roce_alloc_mr()
415 mr->ibmr.length = mr->size; in hns_roce_alloc_mr()
417 return &mr->ibmr; in hns_roce_alloc_mr()
420 free_mr_key(hr_dev, mr); in hns_roce_alloc_mr()
422 free_mr_pbl(hr_dev, mr); in hns_roce_alloc_mr()
424 kfree(mr); in hns_roce_alloc_mr()
430 struct hns_roce_mr *mr = to_hr_mr(ibmr); in hns_roce_set_page() local
432 if (likely(mr->npages < mr->pbl_mtr.hem_cfg.buf_pg_count)) { in hns_roce_set_page()
433 mr->page_list[mr->npages++] = addr; in hns_roce_set_page()
445 struct hns_roce_mr *mr = to_hr_mr(ibmr); in hns_roce_map_mr_sg() local
446 struct hns_roce_mtr *mtr = &mr->pbl_mtr; in hns_roce_map_mr_sg()
449 mr->npages = 0; in hns_roce_map_mr_sg()
450 mr->page_list = kvcalloc(mr->pbl_mtr.hem_cfg.buf_pg_count, in hns_roce_map_mr_sg()
452 if (!mr->page_list) in hns_roce_map_mr_sg()
458 mr->npages, mr->pbl_mtr.hem_cfg.buf_pg_count, ret); in hns_roce_map_mr_sg()
463 mtr->hem_cfg.region[0].count = mr->npages; in hns_roce_map_mr_sg()
464 mtr->hem_cfg.region[0].hopnum = mr->pbl_hop_num; in hns_roce_map_mr_sg()
466 ret = hns_roce_mtr_map(hr_dev, mtr, mr->page_list, mr->npages); in hns_roce_map_mr_sg()
471 mr->pbl_mtr.hem_cfg.buf_pg_shift = (u32)ilog2(ibmr->page_size); in hns_roce_map_mr_sg()
472 ret = mr->npages; in hns_roce_map_mr_sg()
476 kvfree(mr->page_list); in hns_roce_map_mr_sg()
477 mr->page_list = NULL; in hns_roce_map_mr_sg()