common/cnxk: add NIX Tx queue management API
[dpdk.git] / drivers / common / cnxk / roc_dev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #include <fcntl.h>
6 #include <inttypes.h>
7 #include <string.h>
8 #include <sys/mman.h>
9 #include <unistd.h>
10
11 #include "roc_api.h"
12 #include "roc_priv.h"
13
14 /* PCI Extended capability ID */
15 #define ROC_PCI_EXT_CAP_ID_SRIOV 0x10 /* SRIOV cap */
16
17 /* Single Root I/O Virtualization */
18 #define ROC_PCI_SRIOV_TOTAL_VF 0x0e /* Total VFs */
19
20 static void *
21 mbox_mem_map(off_t off, size_t size)
22 {
23         void *va = MAP_FAILED;
24         int mem_fd;
25
26         if (size <= 0 || !off) {
27                 plt_err("Invalid mbox area off 0x%lx size %lu", off, size);
28                 goto error;
29         }
30
31         mem_fd = open("/dev/mem", O_RDWR);
32         if (mem_fd < 0)
33                 goto error;
34
35         va = plt_mmap(NULL, size, PLT_PROT_READ | PLT_PROT_WRITE,
36                       PLT_MAP_SHARED, mem_fd, off);
37         close(mem_fd);
38
39         if (va == MAP_FAILED)
40                 plt_err("Failed to mmap sz=0x%zx, fd=%d, off=%jd", size, mem_fd,
41                         (intmax_t)off);
42 error:
43         return va;
44 }
45
46 static void
47 mbox_mem_unmap(void *va, size_t size)
48 {
49         if (va)
50                 munmap(va, size);
51 }
52
53 static int
54 pf_af_sync_msg(struct dev *dev, struct mbox_msghdr **rsp)
55 {
56         uint32_t timeout = 0, sleep = 1;
57         struct mbox *mbox = dev->mbox;
58         struct mbox_dev *mdev = &mbox->dev[0];
59
60         volatile uint64_t int_status;
61         struct mbox_msghdr *msghdr;
62         uint64_t off;
63         int rc = 0;
64
65         /* We need to disable PF interrupts. We are in timer interrupt */
66         plt_write64(~0ull, dev->bar2 + RVU_PF_INT_ENA_W1C);
67
68         /* Send message */
69         mbox_msg_send(mbox, 0);
70
71         do {
72                 plt_delay_ms(sleep);
73                 timeout += sleep;
74                 if (timeout >= mbox->rsp_tmo) {
75                         plt_err("Message timeout: %dms", mbox->rsp_tmo);
76                         rc = -EIO;
77                         break;
78                 }
79                 int_status = plt_read64(dev->bar2 + RVU_PF_INT);
80         } while ((int_status & 0x1) != 0x1);
81
82         /* Clear */
83         plt_write64(int_status, dev->bar2 + RVU_PF_INT);
84
85         /* Enable interrupts */
86         plt_write64(~0ull, dev->bar2 + RVU_PF_INT_ENA_W1S);
87
88         if (rc == 0) {
89                 /* Get message */
90                 off = mbox->rx_start +
91                       PLT_ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
92                 msghdr = (struct mbox_msghdr *)((uintptr_t)mdev->mbase + off);
93                 if (rsp)
94                         *rsp = msghdr;
95                 rc = msghdr->rc;
96         }
97
98         return rc;
99 }
100
101 static int
102 af_pf_wait_msg(struct dev *dev, uint16_t vf, int num_msg)
103 {
104         uint32_t timeout = 0, sleep = 1;
105         struct mbox *mbox = dev->mbox;
106         struct mbox_dev *mdev = &mbox->dev[0];
107         volatile uint64_t int_status;
108         struct mbox_hdr *req_hdr;
109         struct mbox_msghdr *msg;
110         struct mbox_msghdr *rsp;
111         uint64_t offset;
112         size_t size;
113         int i;
114
115         /* We need to disable PF interrupts. We are in timer interrupt */
116         plt_write64(~0ull, dev->bar2 + RVU_PF_INT_ENA_W1C);
117
118         /* Send message */
119         mbox_msg_send(mbox, 0);
120
121         do {
122                 plt_delay_ms(sleep);
123                 timeout++;
124                 if (timeout >= mbox->rsp_tmo) {
125                         plt_err("Routed messages %d timeout: %dms", num_msg,
126                                 mbox->rsp_tmo);
127                         break;
128                 }
129                 int_status = plt_read64(dev->bar2 + RVU_PF_INT);
130         } while ((int_status & 0x1) != 0x1);
131
132         /* Clear */
133         plt_write64(~0ull, dev->bar2 + RVU_PF_INT);
134
135         /* Enable interrupts */
136         plt_write64(~0ull, dev->bar2 + RVU_PF_INT_ENA_W1S);
137
138         plt_spinlock_lock(&mdev->mbox_lock);
139
140         req_hdr = (struct mbox_hdr *)((uintptr_t)mdev->mbase + mbox->rx_start);
141         if (req_hdr->num_msgs != num_msg)
142                 plt_err("Routed messages: %d received: %d", num_msg,
143                         req_hdr->num_msgs);
144
145         /* Get messages from mbox */
146         offset = mbox->rx_start +
147                  PLT_ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
148         for (i = 0; i < req_hdr->num_msgs; i++) {
149                 msg = (struct mbox_msghdr *)((uintptr_t)mdev->mbase + offset);
150                 size = mbox->rx_start + msg->next_msgoff - offset;
151
152                 /* Reserve PF/VF mbox message */
153                 size = PLT_ALIGN(size, MBOX_MSG_ALIGN);
154                 rsp = mbox_alloc_msg(&dev->mbox_vfpf, vf, size);
155                 mbox_rsp_init(msg->id, rsp);
156
157                 /* Copy message from AF<->PF mbox to PF<->VF mbox */
158                 mbox_memcpy((uint8_t *)rsp + sizeof(struct mbox_msghdr),
159                             (uint8_t *)msg + sizeof(struct mbox_msghdr),
160                             size - sizeof(struct mbox_msghdr));
161
162                 /* Set status and sender pf_func data */
163                 rsp->rc = msg->rc;
164                 rsp->pcifunc = msg->pcifunc;
165
166                 offset = mbox->rx_start + msg->next_msgoff;
167         }
168         plt_spinlock_unlock(&mdev->mbox_lock);
169
170         return req_hdr->num_msgs;
171 }
172
173 static int
174 vf_pf_process_msgs(struct dev *dev, uint16_t vf)
175 {
176         struct mbox *mbox = &dev->mbox_vfpf;
177         struct mbox_dev *mdev = &mbox->dev[vf];
178         struct mbox_hdr *req_hdr;
179         struct mbox_msghdr *msg;
180         int offset, routed = 0;
181         size_t size;
182         uint16_t i;
183
184         req_hdr = (struct mbox_hdr *)((uintptr_t)mdev->mbase + mbox->rx_start);
185         if (!req_hdr->num_msgs)
186                 return 0;
187
188         offset = mbox->rx_start + PLT_ALIGN(sizeof(*req_hdr), MBOX_MSG_ALIGN);
189
190         for (i = 0; i < req_hdr->num_msgs; i++) {
191                 msg = (struct mbox_msghdr *)((uintptr_t)mdev->mbase + offset);
192                 size = mbox->rx_start + msg->next_msgoff - offset;
193
194                 /* RVU_PF_FUNC_S */
195                 msg->pcifunc = dev_pf_func(dev->pf, vf);
196
197                 if (msg->id == MBOX_MSG_READY) {
198                         struct ready_msg_rsp *rsp;
199                         uint16_t max_bits = sizeof(dev->active_vfs[0]) * 8;
200
201                         /* Handle READY message in PF */
202                         dev->active_vfs[vf / max_bits] |=
203                                 BIT_ULL(vf % max_bits);
204                         rsp = (struct ready_msg_rsp *)mbox_alloc_msg(
205                                 mbox, vf, sizeof(*rsp));
206                         mbox_rsp_init(msg->id, rsp);
207
208                         /* PF/VF function ID */
209                         rsp->hdr.pcifunc = msg->pcifunc;
210                         rsp->hdr.rc = 0;
211                 } else {
212                         struct mbox_msghdr *af_req;
213                         /* Reserve AF/PF mbox message */
214                         size = PLT_ALIGN(size, MBOX_MSG_ALIGN);
215                         af_req = mbox_alloc_msg(dev->mbox, 0, size);
216                         if (af_req == NULL)
217                                 return -ENOSPC;
218                         mbox_req_init(msg->id, af_req);
219
220                         /* Copy message from VF<->PF mbox to PF<->AF mbox */
221                         mbox_memcpy((uint8_t *)af_req +
222                                             sizeof(struct mbox_msghdr),
223                                     (uint8_t *)msg + sizeof(struct mbox_msghdr),
224                                     size - sizeof(struct mbox_msghdr));
225                         af_req->pcifunc = msg->pcifunc;
226                         routed++;
227                 }
228                 offset = mbox->rx_start + msg->next_msgoff;
229         }
230
231         if (routed > 0) {
232                 plt_base_dbg("pf:%d routed %d messages from vf:%d to AF",
233                              dev->pf, routed, vf);
234                 af_pf_wait_msg(dev, vf, routed);
235                 mbox_reset(dev->mbox, 0);
236         }
237
238         /* Send mbox responses to VF */
239         if (mdev->num_msgs) {
240                 plt_base_dbg("pf:%d reply %d messages to vf:%d", dev->pf,
241                              mdev->num_msgs, vf);
242                 mbox_msg_send(mbox, vf);
243         }
244
245         return i;
246 }
247
248 static int
249 vf_pf_process_up_msgs(struct dev *dev, uint16_t vf)
250 {
251         struct mbox *mbox = &dev->mbox_vfpf_up;
252         struct mbox_dev *mdev = &mbox->dev[vf];
253         struct mbox_hdr *req_hdr;
254         struct mbox_msghdr *msg;
255         int msgs_acked = 0;
256         int offset;
257         uint16_t i;
258
259         req_hdr = (struct mbox_hdr *)((uintptr_t)mdev->mbase + mbox->rx_start);
260         if (req_hdr->num_msgs == 0)
261                 return 0;
262
263         offset = mbox->rx_start + PLT_ALIGN(sizeof(*req_hdr), MBOX_MSG_ALIGN);
264
265         for (i = 0; i < req_hdr->num_msgs; i++) {
266                 msg = (struct mbox_msghdr *)((uintptr_t)mdev->mbase + offset);
267
268                 msgs_acked++;
269                 /* RVU_PF_FUNC_S */
270                 msg->pcifunc = dev_pf_func(dev->pf, vf);
271
272                 switch (msg->id) {
273                 case MBOX_MSG_CGX_LINK_EVENT:
274                         plt_base_dbg("PF: Msg 0x%x (%s) fn:0x%x (pf:%d,vf:%d)",
275                                      msg->id, mbox_id2name(msg->id),
276                                      msg->pcifunc, dev_get_pf(msg->pcifunc),
277                                      dev_get_vf(msg->pcifunc));
278                         break;
279                 case MBOX_MSG_CGX_PTP_RX_INFO:
280                         plt_base_dbg("PF: Msg 0x%x (%s) fn:0x%x (pf:%d,vf:%d)",
281                                      msg->id, mbox_id2name(msg->id),
282                                      msg->pcifunc, dev_get_pf(msg->pcifunc),
283                                      dev_get_vf(msg->pcifunc));
284                         break;
285                 default:
286                         plt_err("Not handled UP msg 0x%x (%s) func:0x%x",
287                                 msg->id, mbox_id2name(msg->id), msg->pcifunc);
288                 }
289                 offset = mbox->rx_start + msg->next_msgoff;
290         }
291         mbox_reset(mbox, vf);
292         mdev->msgs_acked = msgs_acked;
293         plt_wmb();
294
295         return i;
296 }
297
298 static void
299 roc_vf_pf_mbox_handle_msg(void *param)
300 {
301         uint16_t vf, max_vf, max_bits;
302         struct dev *dev = param;
303
304         max_bits = sizeof(dev->intr.bits[0]) * sizeof(uint64_t);
305         max_vf = max_bits * MAX_VFPF_DWORD_BITS;
306
307         for (vf = 0; vf < max_vf; vf++) {
308                 if (dev->intr.bits[vf / max_bits] & BIT_ULL(vf % max_bits)) {
309                         plt_base_dbg("Process vf:%d request (pf:%d, vf:%d)", vf,
310                                      dev->pf, dev->vf);
311                         vf_pf_process_msgs(dev, vf);
312                         /* UP messages */
313                         vf_pf_process_up_msgs(dev, vf);
314                         dev->intr.bits[vf / max_bits] &=
315                                 ~(BIT_ULL(vf % max_bits));
316                 }
317         }
318         dev->timer_set = 0;
319 }
320
321 static void
322 roc_vf_pf_mbox_irq(void *param)
323 {
324         struct dev *dev = param;
325         bool alarm_set = false;
326         uint64_t intr;
327         int vfpf;
328
329         for (vfpf = 0; vfpf < MAX_VFPF_DWORD_BITS; ++vfpf) {
330                 intr = plt_read64(dev->bar2 + RVU_PF_VFPF_MBOX_INTX(vfpf));
331                 if (!intr)
332                         continue;
333
334                 plt_base_dbg("vfpf: %d intr: 0x%" PRIx64 " (pf:%d, vf:%d)",
335                              vfpf, intr, dev->pf, dev->vf);
336
337                 /* Save and clear intr bits */
338                 dev->intr.bits[vfpf] |= intr;
339                 plt_write64(intr, dev->bar2 + RVU_PF_VFPF_MBOX_INTX(vfpf));
340                 alarm_set = true;
341         }
342
343         if (!dev->timer_set && alarm_set) {
344                 dev->timer_set = 1;
345                 /* Start timer to handle messages */
346                 plt_alarm_set(VF_PF_MBOX_TIMER_MS, roc_vf_pf_mbox_handle_msg,
347                               dev);
348         }
349 }
350
351 static void
352 process_msgs(struct dev *dev, struct mbox *mbox)
353 {
354         struct mbox_dev *mdev = &mbox->dev[0];
355         struct mbox_hdr *req_hdr;
356         struct mbox_msghdr *msg;
357         int msgs_acked = 0;
358         int offset;
359         uint16_t i;
360
361         req_hdr = (struct mbox_hdr *)((uintptr_t)mdev->mbase + mbox->rx_start);
362         if (req_hdr->num_msgs == 0)
363                 return;
364
365         offset = mbox->rx_start + PLT_ALIGN(sizeof(*req_hdr), MBOX_MSG_ALIGN);
366         for (i = 0; i < req_hdr->num_msgs; i++) {
367                 msg = (struct mbox_msghdr *)((uintptr_t)mdev->mbase + offset);
368
369                 msgs_acked++;
370                 plt_base_dbg("Message 0x%x (%s) pf:%d/vf:%d", msg->id,
371                              mbox_id2name(msg->id), dev_get_pf(msg->pcifunc),
372                              dev_get_vf(msg->pcifunc));
373
374                 switch (msg->id) {
375                         /* Add message id's that are handled here */
376                 case MBOX_MSG_READY:
377                         /* Get our identity */
378                         dev->pf_func = msg->pcifunc;
379                         break;
380
381                 default:
382                         if (msg->rc)
383                                 plt_err("Message (%s) response has err=%d",
384                                         mbox_id2name(msg->id), msg->rc);
385                         break;
386                 }
387                 offset = mbox->rx_start + msg->next_msgoff;
388         }
389
390         mbox_reset(mbox, 0);
391         /* Update acked if someone is waiting a message */
392         mdev->msgs_acked = msgs_acked;
393         plt_wmb();
394 }
395
396 /* Copies the message received from AF and sends it to VF */
397 static void
398 pf_vf_mbox_send_up_msg(struct dev *dev, void *rec_msg)
399 {
400         uint16_t max_bits = sizeof(dev->active_vfs[0]) * sizeof(uint64_t);
401         struct mbox *vf_mbox = &dev->mbox_vfpf_up;
402         struct msg_req *msg = rec_msg;
403         struct mbox_msghdr *vf_msg;
404         uint16_t vf;
405         size_t size;
406
407         size = PLT_ALIGN(mbox_id2size(msg->hdr.id), MBOX_MSG_ALIGN);
408         /* Send UP message to all VF's */
409         for (vf = 0; vf < vf_mbox->ndevs; vf++) {
410                 /* VF active */
411                 if (!(dev->active_vfs[vf / max_bits] & (BIT_ULL(vf))))
412                         continue;
413
414                 plt_base_dbg("(%s) size: %zx to VF: %d",
415                              mbox_id2name(msg->hdr.id), size, vf);
416
417                 /* Reserve PF/VF mbox message */
418                 vf_msg = mbox_alloc_msg(vf_mbox, vf, size);
419                 if (!vf_msg) {
420                         plt_err("Failed to alloc VF%d UP message", vf);
421                         continue;
422                 }
423                 mbox_req_init(msg->hdr.id, vf_msg);
424
425                 /*
426                  * Copy message from AF<->PF UP mbox
427                  * to PF<->VF UP mbox
428                  */
429                 mbox_memcpy((uint8_t *)vf_msg + sizeof(struct mbox_msghdr),
430                             (uint8_t *)msg + sizeof(struct mbox_msghdr),
431                             size - sizeof(struct mbox_msghdr));
432
433                 vf_msg->rc = msg->hdr.rc;
434                 /* Set PF to be a sender */
435                 vf_msg->pcifunc = dev->pf_func;
436
437                 /* Send to VF */
438                 mbox_msg_send(vf_mbox, vf);
439         }
440 }
441
442 static int
443 mbox_up_handler_cgx_link_event(struct dev *dev, struct cgx_link_info_msg *msg,
444                                struct msg_rsp *rsp)
445 {
446         struct cgx_link_user_info *linfo = &msg->link_info;
447         void *roc_nix = dev->roc_nix;
448
449         plt_base_dbg("pf:%d/vf:%d NIC Link %s --> 0x%x (%s) from: pf:%d/vf:%d",
450                      dev_get_pf(dev->pf_func), dev_get_vf(dev->pf_func),
451                      linfo->link_up ? "UP" : "DOWN", msg->hdr.id,
452                      mbox_id2name(msg->hdr.id), dev_get_pf(msg->hdr.pcifunc),
453                      dev_get_vf(msg->hdr.pcifunc));
454
455         /* PF gets link notification from AF */
456         if (dev_get_pf(msg->hdr.pcifunc) == 0) {
457                 if (dev->ops && dev->ops->link_status_update)
458                         dev->ops->link_status_update(roc_nix, linfo);
459
460                 /* Forward the same message as received from AF to VF */
461                 pf_vf_mbox_send_up_msg(dev, msg);
462         } else {
463                 /* VF gets link up notification */
464                 if (dev->ops && dev->ops->link_status_update)
465                         dev->ops->link_status_update(roc_nix, linfo);
466         }
467
468         rsp->hdr.rc = 0;
469         return 0;
470 }
471
472 static int
473 mbox_up_handler_cgx_ptp_rx_info(struct dev *dev,
474                                 struct cgx_ptp_rx_info_msg *msg,
475                                 struct msg_rsp *rsp)
476 {
477         void *roc_nix = dev->roc_nix;
478
479         plt_base_dbg("pf:%d/vf:%d PTP mode %s --> 0x%x (%s) from: pf:%d/vf:%d",
480                      dev_get_pf(dev->pf_func), dev_get_vf(dev->pf_func),
481                      msg->ptp_en ? "ENABLED" : "DISABLED", msg->hdr.id,
482                      mbox_id2name(msg->hdr.id), dev_get_pf(msg->hdr.pcifunc),
483                      dev_get_vf(msg->hdr.pcifunc));
484
485         /* PF gets PTP notification from AF */
486         if (dev_get_pf(msg->hdr.pcifunc) == 0) {
487                 if (dev->ops && dev->ops->ptp_info_update)
488                         dev->ops->ptp_info_update(roc_nix, msg->ptp_en);
489
490                 /* Forward the same message as received from AF to VF */
491                 pf_vf_mbox_send_up_msg(dev, msg);
492         } else {
493                 /* VF gets PTP notification */
494                 if (dev->ops && dev->ops->ptp_info_update)
495                         dev->ops->ptp_info_update(roc_nix, msg->ptp_en);
496         }
497
498         rsp->hdr.rc = 0;
499         return 0;
500 }
501
502 static int
503 mbox_process_msgs_up(struct dev *dev, struct mbox_msghdr *req)
504 {
505         /* Check if valid, if not reply with a invalid msg */
506         if (req->sig != MBOX_REQ_SIG)
507                 return -EIO;
508
509         switch (req->id) {
510         default:
511                 reply_invalid_msg(&dev->mbox_up, 0, 0, req->id);
512                 break;
513 #define M(_name, _id, _fn_name, _req_type, _rsp_type)                          \
514         case _id: {                                                            \
515                 struct _rsp_type *rsp;                                         \
516                 int err;                                                       \
517                 rsp = (struct _rsp_type *)mbox_alloc_msg(                      \
518                         &dev->mbox_up, 0, sizeof(struct _rsp_type));           \
519                 if (!rsp)                                                      \
520                         return -ENOMEM;                                        \
521                 rsp->hdr.id = _id;                                             \
522                 rsp->hdr.sig = MBOX_RSP_SIG;                                   \
523                 rsp->hdr.pcifunc = dev->pf_func;                               \
524                 rsp->hdr.rc = 0;                                               \
525                 err = mbox_up_handler_##_fn_name(dev, (struct _req_type *)req, \
526                                                  rsp);                         \
527                 return err;                                                    \
528         }
529                 MBOX_UP_CGX_MESSAGES
530 #undef M
531         }
532
533         return -ENODEV;
534 }
535
536 static void
537 process_msgs_up(struct dev *dev, struct mbox *mbox)
538 {
539         struct mbox_dev *mdev = &mbox->dev[0];
540         struct mbox_hdr *req_hdr;
541         struct mbox_msghdr *msg;
542         int i, err, offset;
543
544         req_hdr = (struct mbox_hdr *)((uintptr_t)mdev->mbase + mbox->rx_start);
545         if (req_hdr->num_msgs == 0)
546                 return;
547
548         offset = mbox->rx_start + PLT_ALIGN(sizeof(*req_hdr), MBOX_MSG_ALIGN);
549         for (i = 0; i < req_hdr->num_msgs; i++) {
550                 msg = (struct mbox_msghdr *)((uintptr_t)mdev->mbase + offset);
551
552                 plt_base_dbg("Message 0x%x (%s) pf:%d/vf:%d", msg->id,
553                              mbox_id2name(msg->id), dev_get_pf(msg->pcifunc),
554                              dev_get_vf(msg->pcifunc));
555                 err = mbox_process_msgs_up(dev, msg);
556                 if (err)
557                         plt_err("Error %d handling 0x%x (%s)", err, msg->id,
558                                 mbox_id2name(msg->id));
559                 offset = mbox->rx_start + msg->next_msgoff;
560         }
561         /* Send mbox responses */
562         if (mdev->num_msgs) {
563                 plt_base_dbg("Reply num_msgs:%d", mdev->num_msgs);
564                 mbox_msg_send(mbox, 0);
565         }
566 }
567
568 static void
569 roc_pf_vf_mbox_irq(void *param)
570 {
571         struct dev *dev = param;
572         uint64_t intr;
573
574         intr = plt_read64(dev->bar2 + RVU_VF_INT);
575         if (intr == 0)
576                 plt_base_dbg("Proceeding to check mbox UP messages if any");
577
578         plt_write64(intr, dev->bar2 + RVU_VF_INT);
579         plt_base_dbg("Irq 0x%" PRIx64 "(pf:%d,vf:%d)", intr, dev->pf, dev->vf);
580
581         /* First process all configuration messages */
582         process_msgs(dev, dev->mbox);
583
584         /* Process Uplink messages */
585         process_msgs_up(dev, &dev->mbox_up);
586 }
587
588 static void
589 roc_af_pf_mbox_irq(void *param)
590 {
591         struct dev *dev = param;
592         uint64_t intr;
593
594         intr = plt_read64(dev->bar2 + RVU_PF_INT);
595         if (intr == 0)
596                 plt_base_dbg("Proceeding to check mbox UP messages if any");
597
598         plt_write64(intr, dev->bar2 + RVU_PF_INT);
599         plt_base_dbg("Irq 0x%" PRIx64 "(pf:%d,vf:%d)", intr, dev->pf, dev->vf);
600
601         /* First process all configuration messages */
602         process_msgs(dev, dev->mbox);
603
604         /* Process Uplink messages */
605         process_msgs_up(dev, &dev->mbox_up);
606 }
607
608 static int
609 mbox_register_pf_irq(struct plt_pci_device *pci_dev, struct dev *dev)
610 {
611         struct plt_intr_handle *intr_handle = &pci_dev->intr_handle;
612         int i, rc;
613
614         /* HW clear irq */
615         for (i = 0; i < MAX_VFPF_DWORD_BITS; ++i)
616                 plt_write64(~0ull,
617                             dev->bar2 + RVU_PF_VFPF_MBOX_INT_ENA_W1CX(i));
618
619         plt_write64(~0ull, dev->bar2 + RVU_PF_INT_ENA_W1C);
620
621         dev->timer_set = 0;
622
623         /* MBOX interrupt for VF(0...63) <-> PF */
624         rc = dev_irq_register(intr_handle, roc_vf_pf_mbox_irq, dev,
625                               RVU_PF_INT_VEC_VFPF_MBOX0);
626
627         if (rc) {
628                 plt_err("Fail to register PF(VF0-63) mbox irq");
629                 return rc;
630         }
631         /* MBOX interrupt for VF(64...128) <-> PF */
632         rc = dev_irq_register(intr_handle, roc_vf_pf_mbox_irq, dev,
633                               RVU_PF_INT_VEC_VFPF_MBOX1);
634
635         if (rc) {
636                 plt_err("Fail to register PF(VF64-128) mbox irq");
637                 return rc;
638         }
639         /* MBOX interrupt AF <-> PF */
640         rc = dev_irq_register(intr_handle, roc_af_pf_mbox_irq, dev,
641                               RVU_PF_INT_VEC_AFPF_MBOX);
642         if (rc) {
643                 plt_err("Fail to register AF<->PF mbox irq");
644                 return rc;
645         }
646
647         /* HW enable intr */
648         for (i = 0; i < MAX_VFPF_DWORD_BITS; ++i)
649                 plt_write64(~0ull,
650                             dev->bar2 + RVU_PF_VFPF_MBOX_INT_ENA_W1SX(i));
651
652         plt_write64(~0ull, dev->bar2 + RVU_PF_INT);
653         plt_write64(~0ull, dev->bar2 + RVU_PF_INT_ENA_W1S);
654
655         return rc;
656 }
657
658 static int
659 mbox_register_vf_irq(struct plt_pci_device *pci_dev, struct dev *dev)
660 {
661         struct plt_intr_handle *intr_handle = &pci_dev->intr_handle;
662         int rc;
663
664         /* Clear irq */
665         plt_write64(~0ull, dev->bar2 + RVU_VF_INT_ENA_W1C);
666
667         /* MBOX interrupt PF <-> VF */
668         rc = dev_irq_register(intr_handle, roc_pf_vf_mbox_irq, dev,
669                               RVU_VF_INT_VEC_MBOX);
670         if (rc) {
671                 plt_err("Fail to register PF<->VF mbox irq");
672                 return rc;
673         }
674
675         /* HW enable intr */
676         plt_write64(~0ull, dev->bar2 + RVU_VF_INT);
677         plt_write64(~0ull, dev->bar2 + RVU_VF_INT_ENA_W1S);
678
679         return rc;
680 }
681
682 static int
683 mbox_register_irq(struct plt_pci_device *pci_dev, struct dev *dev)
684 {
685         if (dev_is_vf(dev))
686                 return mbox_register_vf_irq(pci_dev, dev);
687         else
688                 return mbox_register_pf_irq(pci_dev, dev);
689 }
690
691 static void
692 mbox_unregister_pf_irq(struct plt_pci_device *pci_dev, struct dev *dev)
693 {
694         struct plt_intr_handle *intr_handle = &pci_dev->intr_handle;
695         int i;
696
697         /* HW clear irq */
698         for (i = 0; i < MAX_VFPF_DWORD_BITS; ++i)
699                 plt_write64(~0ull,
700                             dev->bar2 + RVU_PF_VFPF_MBOX_INT_ENA_W1CX(i));
701
702         plt_write64(~0ull, dev->bar2 + RVU_PF_INT_ENA_W1C);
703
704         dev->timer_set = 0;
705
706         plt_alarm_cancel(roc_vf_pf_mbox_handle_msg, dev);
707
708         /* Unregister the interrupt handler for each vectors */
709         /* MBOX interrupt for VF(0...63) <-> PF */
710         dev_irq_unregister(intr_handle, roc_vf_pf_mbox_irq, dev,
711                            RVU_PF_INT_VEC_VFPF_MBOX0);
712
713         /* MBOX interrupt for VF(64...128) <-> PF */
714         dev_irq_unregister(intr_handle, roc_vf_pf_mbox_irq, dev,
715                            RVU_PF_INT_VEC_VFPF_MBOX1);
716
717         /* MBOX interrupt AF <-> PF */
718         dev_irq_unregister(intr_handle, roc_af_pf_mbox_irq, dev,
719                            RVU_PF_INT_VEC_AFPF_MBOX);
720 }
721
722 static void
723 mbox_unregister_vf_irq(struct plt_pci_device *pci_dev, struct dev *dev)
724 {
725         struct plt_intr_handle *intr_handle = &pci_dev->intr_handle;
726
727         /* Clear irq */
728         plt_write64(~0ull, dev->bar2 + RVU_VF_INT_ENA_W1C);
729
730         /* Unregister the interrupt handler */
731         dev_irq_unregister(intr_handle, roc_pf_vf_mbox_irq, dev,
732                            RVU_VF_INT_VEC_MBOX);
733 }
734
735 static void
736 mbox_unregister_irq(struct plt_pci_device *pci_dev, struct dev *dev)
737 {
738         if (dev_is_vf(dev))
739                 mbox_unregister_vf_irq(pci_dev, dev);
740         else
741                 mbox_unregister_pf_irq(pci_dev, dev);
742 }
743
744 static int
745 vf_flr_send_msg(struct dev *dev, uint16_t vf)
746 {
747         struct mbox *mbox = dev->mbox;
748         struct msg_req *req;
749         int rc;
750
751         req = mbox_alloc_msg_vf_flr(mbox);
752         if (req == NULL)
753                 return -ENOSPC;
754         /* Overwrite pcifunc to indicate VF */
755         req->hdr.pcifunc = dev_pf_func(dev->pf, vf);
756
757         /* Sync message in interrupt context */
758         rc = pf_af_sync_msg(dev, NULL);
759         if (rc)
760                 plt_err("Failed to send VF FLR mbox msg, rc=%d", rc);
761
762         return rc;
763 }
764
765 static void
766 roc_pf_vf_flr_irq(void *param)
767 {
768         struct dev *dev = (struct dev *)param;
769         uint16_t max_vf = 64, vf;
770         uintptr_t bar2;
771         uint64_t intr;
772         int i;
773
774         max_vf = (dev->maxvf > 0) ? dev->maxvf : 64;
775         bar2 = dev->bar2;
776
777         plt_base_dbg("FLR VF interrupt: max_vf: %d", max_vf);
778
779         for (i = 0; i < MAX_VFPF_DWORD_BITS; ++i) {
780                 intr = plt_read64(bar2 + RVU_PF_VFFLR_INTX(i));
781                 if (!intr)
782                         continue;
783
784                 for (vf = 0; vf < max_vf; vf++) {
785                         if (!(intr & (1ULL << vf)))
786                                 continue;
787
788                         plt_base_dbg("FLR: i :%d intr: 0x%" PRIx64 ", vf-%d", i,
789                                      intr, (64 * i + vf));
790                         /* Clear interrupt */
791                         plt_write64(BIT_ULL(vf), bar2 + RVU_PF_VFFLR_INTX(i));
792                         /* Disable the interrupt */
793                         plt_write64(BIT_ULL(vf),
794                                     bar2 + RVU_PF_VFFLR_INT_ENA_W1CX(i));
795                         /* Inform AF about VF reset */
796                         vf_flr_send_msg(dev, vf);
797
798                         /* Signal FLR finish */
799                         plt_write64(BIT_ULL(vf), bar2 + RVU_PF_VFTRPENDX(i));
800                         /* Enable interrupt */
801                         plt_write64(~0ull, bar2 + RVU_PF_VFFLR_INT_ENA_W1SX(i));
802                 }
803         }
804 }
805
806 static int
807 vf_flr_unregister_irqs(struct plt_pci_device *pci_dev, struct dev *dev)
808 {
809         struct plt_intr_handle *intr_handle = &pci_dev->intr_handle;
810         int i;
811
812         plt_base_dbg("Unregister VF FLR interrupts for %s", pci_dev->name);
813
814         /* HW clear irq */
815         for (i = 0; i < MAX_VFPF_DWORD_BITS; i++)
816                 plt_write64(~0ull, dev->bar2 + RVU_PF_VFFLR_INT_ENA_W1CX(i));
817
818         dev_irq_unregister(intr_handle, roc_pf_vf_flr_irq, dev,
819                            RVU_PF_INT_VEC_VFFLR0);
820
821         dev_irq_unregister(intr_handle, roc_pf_vf_flr_irq, dev,
822                            RVU_PF_INT_VEC_VFFLR1);
823
824         return 0;
825 }
826
827 static int
828 vf_flr_register_irqs(struct plt_pci_device *pci_dev, struct dev *dev)
829 {
830         struct plt_intr_handle *handle = &pci_dev->intr_handle;
831         int i, rc;
832
833         plt_base_dbg("Register VF FLR interrupts for %s", pci_dev->name);
834
835         rc = dev_irq_register(handle, roc_pf_vf_flr_irq, dev,
836                               RVU_PF_INT_VEC_VFFLR0);
837         if (rc)
838                 plt_err("Failed to init RVU_PF_INT_VEC_VFFLR0 rc=%d", rc);
839
840         rc = dev_irq_register(handle, roc_pf_vf_flr_irq, dev,
841                               RVU_PF_INT_VEC_VFFLR1);
842         if (rc)
843                 plt_err("Failed to init RVU_PF_INT_VEC_VFFLR1 rc=%d", rc);
844
845         /* Enable HW interrupt */
846         for (i = 0; i < MAX_VFPF_DWORD_BITS; ++i) {
847                 plt_write64(~0ull, dev->bar2 + RVU_PF_VFFLR_INTX(i));
848                 plt_write64(~0ull, dev->bar2 + RVU_PF_VFTRPENDX(i));
849                 plt_write64(~0ull, dev->bar2 + RVU_PF_VFFLR_INT_ENA_W1SX(i));
850         }
851         return 0;
852 }
853
854 int
855 dev_active_vfs(struct dev *dev)
856 {
857         int i, count = 0;
858
859         for (i = 0; i < MAX_VFPF_DWORD_BITS; i++)
860                 count += __builtin_popcount(dev->active_vfs[i]);
861
862         return count;
863 }
864
865 static void
866 dev_vf_hwcap_update(struct plt_pci_device *pci_dev, struct dev *dev)
867 {
868         switch (pci_dev->id.device_id) {
869         case PCI_DEVID_CNXK_RVU_PF:
870                 break;
871         case PCI_DEVID_CNXK_RVU_SSO_TIM_VF:
872         case PCI_DEVID_CNXK_RVU_NPA_VF:
873         case PCI_DEVID_CNXK_RVU_AF_VF:
874         case PCI_DEVID_CNXK_RVU_VF:
875         case PCI_DEVID_CNXK_RVU_SDP_VF:
876                 dev->hwcap |= DEV_HWCAP_F_VF;
877                 break;
878         }
879 }
880
881 static uintptr_t
882 dev_vf_mbase_get(struct plt_pci_device *pci_dev, struct dev *dev)
883 {
884         void *vf_mbase = NULL;
885         uintptr_t pa;
886
887         if (dev_is_vf(dev))
888                 return 0;
889
890         /* For CN10K onwards, it is just after PF MBOX */
891         if (!roc_model_is_cn9k())
892                 return dev->bar4 + MBOX_SIZE;
893
894         pa = plt_read64(dev->bar2 + RVU_PF_VF_BAR4_ADDR);
895         if (!pa) {
896                 plt_err("Invalid VF mbox base pa");
897                 return pa;
898         }
899
900         vf_mbase = mbox_mem_map(pa, MBOX_SIZE * pci_dev->max_vfs);
901         if (vf_mbase == MAP_FAILED) {
902                 plt_err("Failed to mmap vf mbase at pa 0x%lx, rc=%d", pa,
903                         errno);
904                 return 0;
905         }
906         return (uintptr_t)vf_mbase;
907 }
908
909 static void
910 dev_vf_mbase_put(struct plt_pci_device *pci_dev, uintptr_t vf_mbase)
911 {
912         if (!vf_mbase || !pci_dev->max_vfs || !roc_model_is_cn9k())
913                 return;
914
915         mbox_mem_unmap((void *)vf_mbase, MBOX_SIZE * pci_dev->max_vfs);
916 }
917
918 static uint16_t
919 dev_pf_total_vfs(struct plt_pci_device *pci_dev)
920 {
921         uint16_t total_vfs = 0;
922         int sriov_pos, rc;
923
924         sriov_pos =
925                 plt_pci_find_ext_capability(pci_dev, ROC_PCI_EXT_CAP_ID_SRIOV);
926         if (sriov_pos <= 0) {
927                 plt_warn("Unable to find SRIOV cap, rc=%d", sriov_pos);
928                 return 0;
929         }
930
931         rc = plt_pci_read_config(pci_dev, &total_vfs, 2,
932                                  sriov_pos + ROC_PCI_SRIOV_TOTAL_VF);
933         if (rc < 0) {
934                 plt_warn("Unable to read SRIOV cap, rc=%d", rc);
935                 return 0;
936         }
937
938         return total_vfs;
939 }
940
941 static int
942 dev_setup_shared_lmt_region(struct mbox *mbox)
943 {
944         struct lmtst_tbl_setup_req *req;
945
946         req = mbox_alloc_msg_lmtst_tbl_setup(mbox);
947         req->pcifunc = idev_lmt_pffunc_get();
948
949         return mbox_process(mbox);
950 }
951
952 static int
953 dev_lmt_setup(struct plt_pci_device *pci_dev, struct dev *dev)
954 {
955         struct idev_cfg *idev;
956         int rc;
957
958         if (roc_model_is_cn9k()) {
959                 dev->lmt_base = dev->bar2 + (RVU_BLOCK_ADDR_LMT << 20);
960                 return 0;
961         }
962
963         /* [CN10K, .) */
964
965         /* Set common lmt region from second pf_func onwards. */
966         if (!dev->disable_shared_lmt && idev_lmt_pffunc_get() &&
967             dev->pf_func != idev_lmt_pffunc_get()) {
968                 rc = dev_setup_shared_lmt_region(dev->mbox);
969                 if (!rc) {
970                         dev->lmt_base = roc_idev_lmt_base_addr_get();
971                         return rc;
972                 }
973                 plt_err("Failed to setup shared lmt region, pf_func %d err %d "
974                         "Using respective LMT region per pf func",
975                         dev->pf_func, rc);
976         }
977
978         if (dev_is_vf(dev)) {
979                 /* VF BAR4 should always be sufficient enough to
980                  * hold LMT lines.
981                  */
982                 if (pci_dev->mem_resource[4].len <
983                     (RVU_LMT_LINE_MAX * RVU_LMT_SZ)) {
984                         plt_err("Not enough bar4 space for lmt lines");
985                         return -EFAULT;
986                 }
987
988                 dev->lmt_base = dev->bar4;
989         } else {
990                 uint64_t bar4_mbox_sz = MBOX_SIZE;
991
992                 /* PF BAR4 should always be sufficient enough to
993                  * hold PF-AF MBOX + PF-VF MBOX + LMT lines.
994                  */
995                 if (pci_dev->mem_resource[4].len <
996                     (bar4_mbox_sz + (RVU_LMT_LINE_MAX * RVU_LMT_SZ))) {
997                         plt_err("Not enough bar4 space for lmt lines and mbox");
998                         return -EFAULT;
999                 }
1000
1001                 /* LMT base is just after total VF MBOX area */
1002                 bar4_mbox_sz += (MBOX_SIZE * dev_pf_total_vfs(pci_dev));
1003                 dev->lmt_base = dev->bar4 + bar4_mbox_sz;
1004         }
1005
1006         /* Base LMT address should be chosen from only those pci funcs which
1007          * participate in LMT shared mode.
1008          */
1009         if (!dev->disable_shared_lmt) {
1010                 idev = idev_get_cfg();
1011                 if (!__atomic_load_n(&idev->lmt_pf_func, __ATOMIC_ACQUIRE)) {
1012                         idev->lmt_base_addr = dev->lmt_base;
1013                         idev->lmt_pf_func = dev->pf_func;
1014                         idev->num_lmtlines = RVU_LMT_LINE_MAX;
1015                 }
1016         }
1017
1018         return 0;
1019 }
1020
1021 int
1022 dev_init(struct dev *dev, struct plt_pci_device *pci_dev)
1023 {
1024         int direction, up_direction, rc;
1025         uintptr_t bar2, bar4, mbox;
1026         uintptr_t vf_mbase = 0;
1027         uint64_t intr_offset;
1028
1029         bar2 = (uintptr_t)pci_dev->mem_resource[2].addr;
1030         bar4 = (uintptr_t)pci_dev->mem_resource[4].addr;
1031         if (bar2 == 0 || bar4 == 0) {
1032                 plt_err("Failed to get PCI bars");
1033                 rc = -ENODEV;
1034                 goto error;
1035         }
1036
1037         /* Trigger fault on bar2 and bar4 regions
1038          * to avoid BUG_ON in remap_pfn_range()
1039          * in latest kernel.
1040          */
1041         *(volatile uint64_t *)bar2;
1042         *(volatile uint64_t *)bar4;
1043
1044         /* Check ROC model supported */
1045         if (roc_model->flag == 0) {
1046                 rc = UTIL_ERR_INVALID_MODEL;
1047                 goto error;
1048         }
1049
1050         dev->maxvf = pci_dev->max_vfs;
1051         dev->bar2 = bar2;
1052         dev->bar4 = bar4;
1053         dev_vf_hwcap_update(pci_dev, dev);
1054
1055         if (dev_is_vf(dev)) {
1056                 mbox = (roc_model_is_cn9k() ?
1057                         bar4 : (bar2 + RVU_VF_MBOX_REGION));
1058                 direction = MBOX_DIR_VFPF;
1059                 up_direction = MBOX_DIR_VFPF_UP;
1060                 intr_offset = RVU_VF_INT;
1061         } else {
1062                 mbox = bar4;
1063                 direction = MBOX_DIR_PFAF;
1064                 up_direction = MBOX_DIR_PFAF_UP;
1065                 intr_offset = RVU_PF_INT;
1066         }
1067
1068         /* Initialize the local mbox */
1069         rc = mbox_init(&dev->mbox_local, mbox, bar2, direction, 1, intr_offset);
1070         if (rc)
1071                 goto error;
1072         dev->mbox = &dev->mbox_local;
1073
1074         rc = mbox_init(&dev->mbox_up, mbox, bar2, up_direction, 1, intr_offset);
1075         if (rc)
1076                 goto mbox_fini;
1077
1078         /* Register mbox interrupts */
1079         rc = mbox_register_irq(pci_dev, dev);
1080         if (rc)
1081                 goto mbox_fini;
1082
1083         /* Check the readiness of PF/VF */
1084         rc = send_ready_msg(dev->mbox, &dev->pf_func);
1085         if (rc)
1086                 goto mbox_unregister;
1087
1088         dev->pf = dev_get_pf(dev->pf_func);
1089         dev->vf = dev_get_vf(dev->pf_func);
1090         memset(&dev->active_vfs, 0, sizeof(dev->active_vfs));
1091
1092         /* Allocate memory for device ops */
1093         dev->ops = plt_zmalloc(sizeof(struct dev_ops), 0);
1094         if (dev->ops == NULL) {
1095                 rc = -ENOMEM;
1096                 goto mbox_unregister;
1097         }
1098
1099         /* Found VF devices in a PF device */
1100         if (pci_dev->max_vfs > 0) {
1101                 /* Remap mbox area for all vf's */
1102                 vf_mbase = dev_vf_mbase_get(pci_dev, dev);
1103                 if (!vf_mbase) {
1104                         rc = -ENODEV;
1105                         goto mbox_unregister;
1106                 }
1107                 /* Init mbox object */
1108                 rc = mbox_init(&dev->mbox_vfpf, vf_mbase, bar2, MBOX_DIR_PFVF,
1109                                pci_dev->max_vfs, intr_offset);
1110                 if (rc)
1111                         goto iounmap;
1112
1113                 /* PF -> VF UP messages */
1114                 rc = mbox_init(&dev->mbox_vfpf_up, vf_mbase, bar2,
1115                                MBOX_DIR_PFVF_UP, pci_dev->max_vfs, intr_offset);
1116                 if (rc)
1117                         goto iounmap;
1118         }
1119
1120         /* Register VF-FLR irq handlers */
1121         if (!dev_is_vf(dev)) {
1122                 rc = vf_flr_register_irqs(pci_dev, dev);
1123                 if (rc)
1124                         goto iounmap;
1125         }
1126         dev->mbox_active = 1;
1127
1128         rc = npa_lf_init(dev, pci_dev);
1129         if (rc)
1130                 goto iounmap;
1131
1132         /* Setup LMT line base */
1133         rc = dev_lmt_setup(pci_dev, dev);
1134         if (rc)
1135                 goto iounmap;
1136
1137         return rc;
1138 iounmap:
1139         dev_vf_mbase_put(pci_dev, vf_mbase);
1140 mbox_unregister:
1141         mbox_unregister_irq(pci_dev, dev);
1142         if (dev->ops)
1143                 plt_free(dev->ops);
1144 mbox_fini:
1145         mbox_fini(dev->mbox);
1146         mbox_fini(&dev->mbox_up);
1147 error:
1148         return rc;
1149 }
1150
1151 int
1152 dev_fini(struct dev *dev, struct plt_pci_device *pci_dev)
1153 {
1154         struct plt_intr_handle *intr_handle = &pci_dev->intr_handle;
1155         struct mbox *mbox;
1156
1157         /* Check if this dev hosts npalf and has 1+ refs */
1158         if (idev_npa_lf_active(dev) > 1)
1159                 return -EAGAIN;
1160
1161         /* Clear references to this pci dev */
1162         npa_lf_fini();
1163
1164         mbox_unregister_irq(pci_dev, dev);
1165
1166         if (!dev_is_vf(dev))
1167                 vf_flr_unregister_irqs(pci_dev, dev);
1168         /* Release PF - VF */
1169         mbox = &dev->mbox_vfpf;
1170         if (mbox->hwbase && mbox->dev)
1171                 dev_vf_mbase_put(pci_dev, mbox->hwbase);
1172
1173         if (dev->ops)
1174                 plt_free(dev->ops);
1175
1176         mbox_fini(mbox);
1177         mbox = &dev->mbox_vfpf_up;
1178         mbox_fini(mbox);
1179
1180         /* Release PF - AF */
1181         mbox = dev->mbox;
1182         mbox_fini(mbox);
1183         mbox = &dev->mbox_up;
1184         mbox_fini(mbox);
1185         dev->mbox_active = 0;
1186
1187         /* Disable MSIX vectors */
1188         dev_irqs_disable(intr_handle);
1189         return 0;
1190 }