RDMA/hns: Fix return in hns_roce_rereg_user_mr()
[linux-2.6-microblaze.git] / drivers / infiniband / hw / hns / hns_roce_cq.c
1 /*
2  * Copyright (c) 2016 Hisilicon Limited.
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * OpenIB.org BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
18  *      - Redistributions in binary form must reproduce the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer in the documentation and/or other materials
21  *        provided with the distribution.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30  * SOFTWARE.
31  */
32
33 #include <linux/platform_device.h>
34 #include <rdma/ib_umem.h>
35 #include <rdma/uverbs_ioctl.h>
36 #include "hns_roce_device.h"
37 #include "hns_roce_cmd.h"
38 #include "hns_roce_hem.h"
39 #include "hns_roce_common.h"
40
41 static u8 get_least_load_bankid_for_cq(struct hns_roce_bank *bank)
42 {
43         u32 least_load = bank[0].inuse;
44         u8 bankid = 0;
45         u32 bankcnt;
46         u8 i;
47
48         for (i = 1; i < HNS_ROCE_CQ_BANK_NUM; i++) {
49                 bankcnt = bank[i].inuse;
50                 if (bankcnt < least_load) {
51                         least_load = bankcnt;
52                         bankid = i;
53                 }
54         }
55
56         return bankid;
57 }
58
59 static int alloc_cqn(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)
60 {
61         struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;
62         struct hns_roce_bank *bank;
63         u8 bankid;
64         int id;
65
66         mutex_lock(&cq_table->bank_mutex);
67         bankid = get_least_load_bankid_for_cq(cq_table->bank);
68         bank = &cq_table->bank[bankid];
69
70         id = ida_alloc_range(&bank->ida, bank->min, bank->max, GFP_KERNEL);
71         if (id < 0) {
72                 mutex_unlock(&cq_table->bank_mutex);
73                 return id;
74         }
75
76         /* the lower 2 bits is bankid */
77         hr_cq->cqn = (id << CQ_BANKID_SHIFT) | bankid;
78         bank->inuse++;
79         mutex_unlock(&cq_table->bank_mutex);
80
81         return 0;
82 }
83
84 static inline u8 get_cq_bankid(unsigned long cqn)
85 {
86         /* The lower 2 bits of CQN are used to hash to different banks */
87         return (u8)(cqn & GENMASK(1, 0));
88 }
89
90 static void free_cqn(struct hns_roce_dev *hr_dev, unsigned long cqn)
91 {
92         struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;
93         struct hns_roce_bank *bank;
94
95         bank = &cq_table->bank[get_cq_bankid(cqn)];
96
97         ida_free(&bank->ida, cqn >> CQ_BANKID_SHIFT);
98
99         mutex_lock(&cq_table->bank_mutex);
100         bank->inuse--;
101         mutex_unlock(&cq_table->bank_mutex);
102 }
103
104 static int alloc_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)
105 {
106         struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;
107         struct ib_device *ibdev = &hr_dev->ib_dev;
108         struct hns_roce_cmd_mailbox *mailbox;
109         u64 mtts[MTT_MIN_COUNT] = { 0 };
110         dma_addr_t dma_handle;
111         int ret;
112
113         ret = hns_roce_mtr_find(hr_dev, &hr_cq->mtr, 0, mtts, ARRAY_SIZE(mtts),
114                                 &dma_handle);
115         if (!ret) {
116                 ibdev_err(ibdev, "failed to find CQ mtr, ret = %d.\n", ret);
117                 return -EINVAL;
118         }
119
120         /* Get CQC memory HEM(Hardware Entry Memory) table */
121         ret = hns_roce_table_get(hr_dev, &cq_table->table, hr_cq->cqn);
122         if (ret) {
123                 ibdev_err(ibdev, "failed to get CQ(0x%lx) context, ret = %d.\n",
124                           hr_cq->cqn, ret);
125                 goto err_out;
126         }
127
128         ret = xa_err(xa_store(&cq_table->array, hr_cq->cqn, hr_cq, GFP_KERNEL));
129         if (ret) {
130                 ibdev_err(ibdev, "failed to xa_store CQ, ret = %d.\n", ret);
131                 goto err_put;
132         }
133
134         /* Allocate mailbox memory */
135         mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
136         if (IS_ERR(mailbox)) {
137                 ret = PTR_ERR(mailbox);
138                 goto err_xa;
139         }
140
141         hr_dev->hw->write_cqc(hr_dev, hr_cq, mailbox->buf, mtts, dma_handle);
142
143         /* Send mailbox to hw */
144         ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, hr_cq->cqn, 0,
145                         HNS_ROCE_CMD_CREATE_CQC, HNS_ROCE_CMD_TIMEOUT_MSECS);
146         hns_roce_free_cmd_mailbox(hr_dev, mailbox);
147         if (ret) {
148                 ibdev_err(ibdev,
149                           "failed to send create cmd for CQ(0x%lx), ret = %d.\n",
150                           hr_cq->cqn, ret);
151                 goto err_xa;
152         }
153
154         hr_cq->cons_index = 0;
155         hr_cq->arm_sn = 1;
156
157         refcount_set(&hr_cq->refcount, 1);
158         init_completion(&hr_cq->free);
159
160         return 0;
161
162 err_xa:
163         xa_erase(&cq_table->array, hr_cq->cqn);
164
165 err_put:
166         hns_roce_table_put(hr_dev, &cq_table->table, hr_cq->cqn);
167
168 err_out:
169         return ret;
170 }
171
172 static void free_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)
173 {
174         struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;
175         struct device *dev = hr_dev->dev;
176         int ret;
177
178         ret = hns_roce_cmd_mbox(hr_dev, 0, 0, hr_cq->cqn, 1,
179                                 HNS_ROCE_CMD_DESTROY_CQC,
180                                 HNS_ROCE_CMD_TIMEOUT_MSECS);
181         if (ret)
182                 dev_err(dev, "DESTROY_CQ failed (%d) for CQN %06lx\n", ret,
183                         hr_cq->cqn);
184
185         xa_erase(&cq_table->array, hr_cq->cqn);
186
187         /* Waiting interrupt process procedure carried out */
188         synchronize_irq(hr_dev->eq_table.eq[hr_cq->vector].irq);
189
190         /* wait for all interrupt processed */
191         if (refcount_dec_and_test(&hr_cq->refcount))
192                 complete(&hr_cq->free);
193         wait_for_completion(&hr_cq->free);
194
195         hns_roce_table_put(hr_dev, &cq_table->table, hr_cq->cqn);
196 }
197
198 static int alloc_cq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq,
199                         struct ib_udata *udata, unsigned long addr)
200 {
201         struct ib_device *ibdev = &hr_dev->ib_dev;
202         struct hns_roce_buf_attr buf_attr = {};
203         int ret;
204
205         buf_attr.page_shift = hr_dev->caps.cqe_buf_pg_sz + PAGE_SHIFT;
206         buf_attr.region[0].size = hr_cq->cq_depth * hr_cq->cqe_size;
207         buf_attr.region[0].hopnum = hr_dev->caps.cqe_hop_num;
208         buf_attr.region_count = 1;
209
210         ret = hns_roce_mtr_create(hr_dev, &hr_cq->mtr, &buf_attr,
211                                   hr_dev->caps.cqe_ba_pg_sz + PAGE_SHIFT,
212                                   udata, addr);
213         if (ret)
214                 ibdev_err(ibdev, "failed to alloc CQ mtr, ret = %d.\n", ret);
215
216         return ret;
217 }
218
219 static void free_cq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)
220 {
221         hns_roce_mtr_destroy(hr_dev, &hr_cq->mtr);
222 }
223
224 static int alloc_cq_db(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq,
225                        struct ib_udata *udata, unsigned long addr,
226                        struct hns_roce_ib_create_cq_resp *resp)
227 {
228         bool has_db = hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_CQ_RECORD_DB;
229         struct hns_roce_ucontext *uctx;
230         int err;
231
232         if (udata) {
233                 if (has_db &&
234                     udata->outlen >= offsetofend(typeof(*resp), cap_flags)) {
235                         uctx = rdma_udata_to_drv_context(udata,
236                                         struct hns_roce_ucontext, ibucontext);
237                         err = hns_roce_db_map_user(uctx, addr, &hr_cq->db);
238                         if (err)
239                                 return err;
240                         hr_cq->flags |= HNS_ROCE_CQ_FLAG_RECORD_DB;
241                         resp->cap_flags |= HNS_ROCE_CQ_FLAG_RECORD_DB;
242                 }
243         } else {
244                 if (has_db) {
245                         err = hns_roce_alloc_db(hr_dev, &hr_cq->db, 1);
246                         if (err)
247                                 return err;
248                         hr_cq->set_ci_db = hr_cq->db.db_record;
249                         *hr_cq->set_ci_db = 0;
250                         hr_cq->flags |= HNS_ROCE_CQ_FLAG_RECORD_DB;
251                 }
252                 hr_cq->db_reg = hr_dev->reg_base + hr_dev->odb_offset +
253                                 DB_REG_OFFSET * hr_dev->priv_uar.index;
254         }
255
256         return 0;
257 }
258
259 static void free_cq_db(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq,
260                        struct ib_udata *udata)
261 {
262         struct hns_roce_ucontext *uctx;
263
264         if (!(hr_cq->flags & HNS_ROCE_CQ_FLAG_RECORD_DB))
265                 return;
266
267         hr_cq->flags &= ~HNS_ROCE_CQ_FLAG_RECORD_DB;
268         if (udata) {
269                 uctx = rdma_udata_to_drv_context(udata,
270                                                  struct hns_roce_ucontext,
271                                                  ibucontext);
272                 hns_roce_db_unmap_user(uctx, &hr_cq->db);
273         } else {
274                 hns_roce_free_db(hr_dev, &hr_cq->db);
275         }
276 }
277
278 static int verify_cq_create_attr(struct hns_roce_dev *hr_dev,
279                                  const struct ib_cq_init_attr *attr)
280 {
281         struct ib_device *ibdev = &hr_dev->ib_dev;
282
283         if (!attr->cqe || attr->cqe > hr_dev->caps.max_cqes) {
284                 ibdev_err(ibdev, "failed to check CQ count %u, max = %u.\n",
285                           attr->cqe, hr_dev->caps.max_cqes);
286                 return -EINVAL;
287         }
288
289         if (attr->comp_vector >= hr_dev->caps.num_comp_vectors) {
290                 ibdev_err(ibdev, "failed to check CQ vector = %u, max = %d.\n",
291                           attr->comp_vector, hr_dev->caps.num_comp_vectors);
292                 return -EINVAL;
293         }
294
295         return 0;
296 }
297
298 static int get_cq_ucmd(struct hns_roce_cq *hr_cq, struct ib_udata *udata,
299                        struct hns_roce_ib_create_cq *ucmd)
300 {
301         struct ib_device *ibdev = hr_cq->ib_cq.device;
302         int ret;
303
304         ret = ib_copy_from_udata(ucmd, udata, min(udata->inlen, sizeof(*ucmd)));
305         if (ret) {
306                 ibdev_err(ibdev, "failed to copy CQ udata, ret = %d.\n", ret);
307                 return ret;
308         }
309
310         return 0;
311 }
312
313 static void set_cq_param(struct hns_roce_cq *hr_cq, u32 cq_entries, int vector,
314                          struct hns_roce_ib_create_cq *ucmd)
315 {
316         struct hns_roce_dev *hr_dev = to_hr_dev(hr_cq->ib_cq.device);
317
318         cq_entries = max(cq_entries, hr_dev->caps.min_cqes);
319         cq_entries = roundup_pow_of_two(cq_entries);
320         hr_cq->ib_cq.cqe = cq_entries - 1; /* used as cqe index */
321         hr_cq->cq_depth = cq_entries;
322         hr_cq->vector = vector;
323
324         spin_lock_init(&hr_cq->lock);
325         INIT_LIST_HEAD(&hr_cq->sq_list);
326         INIT_LIST_HEAD(&hr_cq->rq_list);
327 }
328
329 static void set_cqe_size(struct hns_roce_cq *hr_cq, struct ib_udata *udata,
330                          struct hns_roce_ib_create_cq *ucmd)
331 {
332         struct hns_roce_dev *hr_dev = to_hr_dev(hr_cq->ib_cq.device);
333
334         if (udata) {
335                 if (udata->inlen >= offsetofend(typeof(*ucmd), cqe_size))
336                         hr_cq->cqe_size = ucmd->cqe_size;
337                 else
338                         hr_cq->cqe_size = HNS_ROCE_V2_CQE_SIZE;
339         } else {
340                 hr_cq->cqe_size = hr_dev->caps.cqe_sz;
341         }
342 }
343
344 int hns_roce_create_cq(struct ib_cq *ib_cq, const struct ib_cq_init_attr *attr,
345                        struct ib_udata *udata)
346 {
347         struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device);
348         struct hns_roce_ib_create_cq_resp resp = {};
349         struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq);
350         struct ib_device *ibdev = &hr_dev->ib_dev;
351         struct hns_roce_ib_create_cq ucmd = {};
352         int ret;
353
354         if (attr->flags)
355                 return -EOPNOTSUPP;
356
357         ret = verify_cq_create_attr(hr_dev, attr);
358         if (ret)
359                 return ret;
360
361         if (udata) {
362                 ret = get_cq_ucmd(hr_cq, udata, &ucmd);
363                 if (ret)
364                         return ret;
365         }
366
367         set_cq_param(hr_cq, attr->cqe, attr->comp_vector, &ucmd);
368
369         set_cqe_size(hr_cq, udata, &ucmd);
370
371         ret = alloc_cq_buf(hr_dev, hr_cq, udata, ucmd.buf_addr);
372         if (ret) {
373                 ibdev_err(ibdev, "failed to alloc CQ buf, ret = %d.\n", ret);
374                 return ret;
375         }
376
377         ret = alloc_cq_db(hr_dev, hr_cq, udata, ucmd.db_addr, &resp);
378         if (ret) {
379                 ibdev_err(ibdev, "failed to alloc CQ db, ret = %d.\n", ret);
380                 goto err_cq_buf;
381         }
382
383         ret = alloc_cqn(hr_dev, hr_cq);
384         if (ret) {
385                 ibdev_err(ibdev, "failed to alloc CQN, ret = %d.\n", ret);
386                 goto err_cq_db;
387         }
388
389         ret = alloc_cqc(hr_dev, hr_cq);
390         if (ret) {
391                 ibdev_err(ibdev,
392                           "failed to alloc CQ context, ret = %d.\n", ret);
393                 goto err_cqn;
394         }
395
396         /*
397          * For the QP created by kernel space, tptr value should be initialized
398          * to zero; For the QP created by user space, it will cause synchronous
399          * problems if tptr is set to zero here, so we initialize it in user
400          * space.
401          */
402         if (!udata && hr_cq->tptr_addr)
403                 *hr_cq->tptr_addr = 0;
404
405         if (udata) {
406                 resp.cqn = hr_cq->cqn;
407                 ret = ib_copy_to_udata(udata, &resp,
408                                        min(udata->outlen, sizeof(resp)));
409                 if (ret)
410                         goto err_cqc;
411         }
412
413         return 0;
414
415 err_cqc:
416         free_cqc(hr_dev, hr_cq);
417 err_cqn:
418         free_cqn(hr_dev, hr_cq->cqn);
419 err_cq_db:
420         free_cq_db(hr_dev, hr_cq, udata);
421 err_cq_buf:
422         free_cq_buf(hr_dev, hr_cq);
423         return ret;
424 }
425
426 int hns_roce_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
427 {
428         struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device);
429         struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq);
430
431         if (hr_dev->hw->destroy_cq)
432                 hr_dev->hw->destroy_cq(ib_cq, udata);
433
434         free_cqc(hr_dev, hr_cq);
435         free_cqn(hr_dev, hr_cq->cqn);
436         free_cq_db(hr_dev, hr_cq, udata);
437         free_cq_buf(hr_dev, hr_cq);
438
439         return 0;
440 }
441
442 void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn)
443 {
444         struct hns_roce_cq *hr_cq;
445         struct ib_cq *ibcq;
446
447         hr_cq = xa_load(&hr_dev->cq_table.array,
448                         cqn & (hr_dev->caps.num_cqs - 1));
449         if (!hr_cq) {
450                 dev_warn(hr_dev->dev, "Completion event for bogus CQ 0x%06x\n",
451                          cqn);
452                 return;
453         }
454
455         ++hr_cq->arm_sn;
456         ibcq = &hr_cq->ib_cq;
457         if (ibcq->comp_handler)
458                 ibcq->comp_handler(ibcq, ibcq->cq_context);
459 }
460
461 void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type)
462 {
463         struct device *dev = hr_dev->dev;
464         struct hns_roce_cq *hr_cq;
465         struct ib_event event;
466         struct ib_cq *ibcq;
467
468         hr_cq = xa_load(&hr_dev->cq_table.array,
469                         cqn & (hr_dev->caps.num_cqs - 1));
470         if (!hr_cq) {
471                 dev_warn(dev, "Async event for bogus CQ 0x%06x\n", cqn);
472                 return;
473         }
474
475         if (event_type != HNS_ROCE_EVENT_TYPE_CQ_ID_INVALID &&
476             event_type != HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR &&
477             event_type != HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW) {
478                 dev_err(dev, "Unexpected event type 0x%x on CQ 0x%06x\n",
479                         event_type, cqn);
480                 return;
481         }
482
483         refcount_inc(&hr_cq->refcount);
484
485         ibcq = &hr_cq->ib_cq;
486         if (ibcq->event_handler) {
487                 event.device = ibcq->device;
488                 event.element.cq = ibcq;
489                 event.event = IB_EVENT_CQ_ERR;
490                 ibcq->event_handler(&event, ibcq->cq_context);
491         }
492
493         if (refcount_dec_and_test(&hr_cq->refcount))
494                 complete(&hr_cq->free);
495 }
496
497 void hns_roce_init_cq_table(struct hns_roce_dev *hr_dev)
498 {
499         struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;
500         unsigned int reserved_from_bot;
501         unsigned int i;
502
503         mutex_init(&cq_table->bank_mutex);
504         xa_init(&cq_table->array);
505
506         reserved_from_bot = hr_dev->caps.reserved_cqs;
507
508         for (i = 0; i < reserved_from_bot; i++) {
509                 cq_table->bank[get_cq_bankid(i)].inuse++;
510                 cq_table->bank[get_cq_bankid(i)].min++;
511         }
512
513         for (i = 0; i < HNS_ROCE_CQ_BANK_NUM; i++) {
514                 ida_init(&cq_table->bank[i].ida);
515                 cq_table->bank[i].max = hr_dev->caps.num_cqs /
516                                         HNS_ROCE_CQ_BANK_NUM - 1;
517         }
518 }
519
520 void hns_roce_cleanup_cq_table(struct hns_roce_dev *hr_dev)
521 {
522         int i;
523
524         for (i = 0; i < HNS_ROCE_CQ_BANK_NUM; i++)
525                 ida_destroy(&hr_dev->cq_table.bank[i].ida);
526 }