Lines Matching defs:hr_dev

53 static int alloc_mr_key(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr)
55 struct hns_roce_ida *mtpt_ida = &hr_dev->mr_table.mtpt_ida;
56 struct ib_device *ibdev = &hr_dev->ib_dev;
70 err = hns_roce_table_get(hr_dev, &hr_dev->mr_table.mtpt_table,
83 static void free_mr_key(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr)
87 hns_roce_table_put(hr_dev, &hr_dev->mr_table.mtpt_table, obj);
88 ida_free(&hr_dev->mr_table.mtpt_ida.ida, (int)obj);
91 static int alloc_mr_pbl(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr,
94 struct ib_device *ibdev = &hr_dev->ib_dev;
99 mr->pbl_hop_num = is_fast ? 1 : hr_dev->caps.pbl_hop_num;
101 hr_dev->caps.pbl_buf_pg_sz + PAGE_SHIFT;
113 err = hns_roce_mtr_create(hr_dev, &mr->pbl_mtr, &buf_attr,
114 hr_dev->caps.pbl_ba_pg_sz + PAGE_SHIFT,
127 static void free_mr_pbl(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr)
129 hns_roce_mtr_destroy(hr_dev, &mr->pbl_mtr);
132 static void hns_roce_mr_free(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mr)
134 struct ib_device *ibdev = &hr_dev->ib_dev;
138 ret = hns_roce_destroy_hw_ctx(hr_dev, HNS_ROCE_CMD_DESTROY_MPT,
140 (hr_dev->caps.num_mtpts - 1));
146 free_mr_pbl(hr_dev, mr);
147 free_mr_key(hr_dev, mr);
150 static int hns_roce_mr_enable(struct hns_roce_dev *hr_dev,
155 struct device *dev = hr_dev->dev;
159 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
165 ret = hr_dev->hw->write_mtpt(hr_dev, mailbox->buf, mr);
167 ret = hr_dev->hw->frmr_write_mtpt(mailbox->buf, mr);
173 ret = hns_roce_create_hw_ctx(hr_dev, mailbox, HNS_ROCE_CMD_CREATE_MPT,
174 mtpt_idx & (hr_dev->caps.num_mtpts - 1));
183 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
188 void hns_roce_init_mr_table(struct hns_roce_dev *hr_dev)
190 struct hns_roce_ida *mtpt_ida = &hr_dev->mr_table.mtpt_ida;
193 mtpt_ida->max = hr_dev->caps.num_mtpts - 1;
194 mtpt_ida->min = hr_dev->caps.reserved_mrws;
199 struct hns_roce_dev *hr_dev = to_hr_dev(pd->device);
213 ret = alloc_mr_key(hr_dev, mr);
217 ret = hns_roce_mr_enable(hr_dev, mr);
225 free_mr_key(hr_dev, mr);
237 struct hns_roce_dev *hr_dev = to_hr_dev(pd->device);
258 ret = alloc_mr_key(hr_dev, mr);
262 ret = alloc_mr_pbl(hr_dev, mr, udata, start);
266 ret = hns_roce_mr_enable(hr_dev, mr);
275 free_mr_pbl(hr_dev, mr);
277 free_mr_key(hr_dev, mr);
281 atomic64_inc(&hr_dev->dfx_cnt[HNS_ROCE_DFX_MR_REG_ERR_CNT]);
291 struct hns_roce_dev *hr_dev = to_hr_dev(ibmr->device);
292 struct ib_device *ib_dev = &hr_dev->ib_dev;
303 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
308 mtpt_idx = key_to_hw_index(mr->key) & (hr_dev->caps.num_mtpts - 1);
310 ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, HNS_ROCE_CMD_QUERY_MPT,
315 ret = hns_roce_destroy_hw_ctx(hr_dev, HNS_ROCE_CMD_DESTROY_MPT,
331 free_mr_pbl(hr_dev, mr);
332 ret = alloc_mr_pbl(hr_dev, mr, udata, start);
340 ret = hr_dev->hw->rereg_write_mtpt(hr_dev, mr, flags, mailbox->buf);
346 ret = hns_roce_create_hw_ctx(hr_dev, mailbox, HNS_ROCE_CMD_CREATE_MPT,
356 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
360 atomic64_inc(&hr_dev->dfx_cnt[HNS_ROCE_DFX_MR_REREG_ERR_CNT]);
369 struct hns_roce_dev *hr_dev = to_hr_dev(ibmr->device);
372 if (hr_dev->hw->dereg_mr)
373 hr_dev->hw->dereg_mr(hr_dev);
375 hns_roce_mr_free(hr_dev, mr);
384 struct hns_roce_dev *hr_dev = to_hr_dev(pd->device);
385 struct device *dev = hr_dev->dev;
407 ret = alloc_mr_key(hr_dev, mr);
411 ret = alloc_mr_pbl(hr_dev, mr, NULL, 0);
415 ret = hns_roce_mr_enable(hr_dev, mr);
425 free_mr_pbl(hr_dev, mr);
427 free_mr_key(hr_dev, mr);
449 struct hns_roce_dev *hr_dev = to_hr_dev(ibmr->device);
450 struct ib_device *ibdev = &hr_dev->ib_dev;
477 ret = hns_roce_mtr_map(hr_dev, mtr, mr->page_list, mr->npages);
492 static int mtr_map_region(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
507 mtts = hns_roce_hem_list_find_mtt(hr_dev, &mtr->hem_list,
568 static void mtr_free_bufs(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr)
578 hns_roce_buf_free(hr_dev, mtr->kmem);
583 static int mtr_alloc_bufs(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
587 struct ib_device *ibdev = &hr_dev->ib_dev;
603 mtr->kmem = hns_roce_buf_alloc(hr_dev, total_size,
641 static int mtr_map_bufs(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr)
643 struct ib_device *ibdev = &hr_dev->ib_dev;
661 npage = hns_roce_get_kmem_bufs(hr_dev, pages, page_count,
681 ret = hns_roce_mtr_map(hr_dev, mtr, pages, page_count);
691 int hns_roce_mtr_map(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
694 struct ib_device *ibdev = &hr_dev->ib_dev;
720 ret = mtr_map_region(hr_dev, mtr, r, &pages[r->offset],
771 static int hns_roce_get_mhop_mtt(struct hns_roce_dev *hr_dev,
783 mtts = hns_roce_hem_list_find_mtt(hr_dev, &mtr->hem_list,
801 int hns_roce_mtr_find(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
818 ret = hns_roce_get_mhop_mtt(hr_dev, mtr, start_index,
824 static int get_best_page_shift(struct hns_roce_dev *hr_dev,
834 hr_dev->caps.page_size_cap,
843 static int get_best_hop_num(struct hns_roce_dev *hr_dev,
851 struct ib_device *ibdev = &hr_dev->ib_dev;
887 static bool is_buf_attr_valid(struct hns_roce_dev *hr_dev,
890 struct ib_device *ibdev = &hr_dev->ib_dev;
903 static int mtr_init_buf_cfg(struct hns_roce_dev *hr_dev,
914 if (!is_buf_attr_valid(hr_dev, attr))
961 static unsigned int cal_best_bt_pg_sz(struct hns_roce_dev *hr_dev,
965 unsigned long cap = hr_dev->caps.page_size_cap;
994 static int mtr_alloc_mtt(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
1002 ba_page_shift = cal_best_bt_pg_sz(hr_dev, mtr, ba_page_shift);
1006 ret = hns_roce_hem_list_request(hr_dev, &mtr->hem_list,
1020 static void mtr_free_mtt(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr)
1022 hns_roce_hem_list_release(hr_dev, &mtr->hem_list);
1028 * @hr_dev: RoCE device struct pointer
1035 int hns_roce_mtr_create(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
1040 struct ib_device *ibdev = &hr_dev->ib_dev;
1051 ret = mtr_alloc_bufs(hr_dev, mtr, buf_attr, udata, user_addr);
1058 ret = get_best_page_shift(hr_dev, mtr, buf_attr);
1062 ret = get_best_hop_num(hr_dev, mtr, buf_attr, ba_page_shift);
1067 ret = mtr_init_buf_cfg(hr_dev, mtr, buf_attr);
1071 ret = mtr_alloc_mtt(hr_dev, mtr, ba_page_shift);
1081 ret = mtr_map_bufs(hr_dev, mtr);
1090 mtr_free_mtt(hr_dev, mtr);
1092 mtr_free_bufs(hr_dev, mtr);
1097 void hns_roce_mtr_destroy(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr)
1100 hns_roce_hem_list_release(hr_dev, &mtr->hem_list);
1103 mtr_free_bufs(hr_dev, mtr);