common/cnxk: add CPT LF configuration
[dpdk.git] / drivers / common / cnxk / roc_cpt.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #include "roc_api.h"
6 #include "roc_priv.h"
7
8 #define CPT_IQ_FC_LEN  128
9 #define CPT_IQ_GRP_LEN 16
10
11 #define CPT_IQ_NB_DESC_MULTIPLIER 40
12
13 /* The effective queue size to software is (CPT_LF_Q_SIZE[SIZE_DIV40] - 1 - 8).
14  *
15  * CPT requires 320 free entries (+8). And 40 entries are required for
16  * allowing CPT to discard packet when the queues are full (+1).
17  */
18 #define CPT_IQ_NB_DESC_SIZE_DIV40(nb_desc)                                     \
19         (PLT_DIV_CEIL(nb_desc, CPT_IQ_NB_DESC_MULTIPLIER) + 1 + 8)
20
21 #define CPT_IQ_GRP_SIZE(nb_desc)                                               \
22         (CPT_IQ_NB_DESC_SIZE_DIV40(nb_desc) * CPT_IQ_GRP_LEN)
23
24 #define CPT_LF_MAX_NB_DESC     128000
25 #define CPT_LF_DEFAULT_NB_DESC 1024
26
27 static void
28 cpt_lf_misc_intr_enb_dis(struct roc_cpt_lf *lf, bool enb)
29 {
30         /* Enable all cpt lf error irqs except RQ_DISABLED and CQ_DISABLED */
31         if (enb)
32                 plt_write64((BIT_ULL(6) | BIT_ULL(5) | BIT_ULL(3) | BIT_ULL(2) |
33                              BIT_ULL(1)),
34                             lf->rbase + CPT_LF_MISC_INT_ENA_W1S);
35         else
36                 plt_write64((BIT_ULL(6) | BIT_ULL(5) | BIT_ULL(3) | BIT_ULL(2) |
37                              BIT_ULL(1)),
38                             lf->rbase + CPT_LF_MISC_INT_ENA_W1C);
39 }
40
41 static void
42 cpt_lf_misc_irq(void *param)
43 {
44         struct roc_cpt_lf *lf = (struct roc_cpt_lf *)param;
45         struct dev *dev = lf->dev;
46         uint64_t intr;
47
48         intr = plt_read64(lf->rbase + CPT_LF_MISC_INT);
49         if (intr == 0)
50                 return;
51
52         plt_err("Err_irq=0x%" PRIx64 " pf=%d, vf=%d", intr, dev->pf, dev->vf);
53
54         /* Clear interrupt */
55         plt_write64(intr, lf->rbase + CPT_LF_MISC_INT);
56 }
57
58 static int
59 cpt_lf_register_misc_irq(struct roc_cpt_lf *lf)
60 {
61         struct plt_pci_device *pci_dev = lf->pci_dev;
62         struct plt_intr_handle *handle;
63         int rc, vec;
64
65         handle = &pci_dev->intr_handle;
66
67         vec = lf->msixoff + CPT_LF_INT_VEC_MISC;
68         /* Clear err interrupt */
69         cpt_lf_misc_intr_enb_dis(lf, false);
70         /* Set used interrupt vectors */
71         rc = dev_irq_register(handle, cpt_lf_misc_irq, lf, vec);
72         /* Enable all dev interrupt except for RQ_DISABLED */
73         cpt_lf_misc_intr_enb_dis(lf, true);
74
75         return rc;
76 }
77
78 static void
79 cpt_lf_unregister_misc_irq(struct roc_cpt_lf *lf)
80 {
81         struct plt_pci_device *pci_dev = lf->pci_dev;
82         struct plt_intr_handle *handle;
83         int vec;
84
85         handle = &pci_dev->intr_handle;
86
87         vec = lf->msixoff + CPT_LF_INT_VEC_MISC;
88         /* Clear err interrupt */
89         cpt_lf_misc_intr_enb_dis(lf, false);
90         dev_irq_unregister(handle, cpt_lf_misc_irq, lf, vec);
91 }
92
93 static void
94 cpt_lf_done_intr_enb_dis(struct roc_cpt_lf *lf, bool enb)
95 {
96         if (enb)
97                 plt_write64(0x1, lf->rbase + CPT_LF_DONE_INT_ENA_W1S);
98         else
99                 plt_write64(0x1, lf->rbase + CPT_LF_DONE_INT_ENA_W1C);
100 }
101
102 static void
103 cpt_lf_done_irq(void *param)
104 {
105         struct roc_cpt_lf *lf = param;
106         uint64_t done_wait;
107         uint64_t intr;
108
109         /* Read the number of completed requests */
110         intr = plt_read64(lf->rbase + CPT_LF_DONE);
111         if (intr == 0)
112                 return;
113
114         done_wait = plt_read64(lf->rbase + CPT_LF_DONE_WAIT);
115
116         /* Acknowledge the number of completed requests */
117         plt_write64(intr, lf->rbase + CPT_LF_DONE_ACK);
118
119         plt_write64(done_wait, lf->rbase + CPT_LF_DONE_WAIT);
120 }
121
122 static int
123 cpt_lf_register_done_irq(struct roc_cpt_lf *lf)
124 {
125         struct plt_pci_device *pci_dev = lf->pci_dev;
126         struct plt_intr_handle *handle;
127         int rc, vec;
128
129         handle = &pci_dev->intr_handle;
130
131         vec = lf->msixoff + CPT_LF_INT_VEC_DONE;
132
133         /* Clear done interrupt */
134         cpt_lf_done_intr_enb_dis(lf, false);
135
136         /* Set used interrupt vectors */
137         rc = dev_irq_register(handle, cpt_lf_done_irq, lf, vec);
138
139         /* Enable done interrupt */
140         cpt_lf_done_intr_enb_dis(lf, true);
141
142         return rc;
143 }
144
145 static void
146 cpt_lf_unregister_done_irq(struct roc_cpt_lf *lf)
147 {
148         struct plt_pci_device *pci_dev = lf->pci_dev;
149         struct plt_intr_handle *handle;
150         int vec;
151
152         handle = &pci_dev->intr_handle;
153
154         vec = lf->msixoff + CPT_LF_INT_VEC_DONE;
155
156         /* Clear done interrupt */
157         cpt_lf_done_intr_enb_dis(lf, false);
158         dev_irq_unregister(handle, cpt_lf_done_irq, lf, vec);
159 }
160
161 static int
162 cpt_lf_register_irqs(struct roc_cpt_lf *lf)
163 {
164         int rc;
165
166         if (lf->msixoff == MSIX_VECTOR_INVALID) {
167                 plt_err("Invalid CPTLF MSIX vector offset vector: 0x%x",
168                         lf->msixoff);
169                 return -EINVAL;
170         }
171
172         /* Register lf err interrupt */
173         rc = cpt_lf_register_misc_irq(lf);
174         if (rc)
175                 plt_err("Error registering IRQs");
176
177         rc = cpt_lf_register_done_irq(lf);
178         if (rc)
179                 plt_err("Error registering IRQs");
180
181         return rc;
182 }
183
184 static void
185 cpt_lf_unregister_irqs(struct roc_cpt_lf *lf)
186 {
187         cpt_lf_unregister_misc_irq(lf);
188         cpt_lf_unregister_done_irq(lf);
189 }
190
191 int
192 roc_cpt_rxc_time_cfg(struct roc_cpt *roc_cpt, struct roc_cpt_rxc_time_cfg *cfg)
193 {
194         struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
195         struct cpt_rxc_time_cfg_req *req;
196         struct dev *dev = &cpt->dev;
197
198         req = mbox_alloc_msg_cpt_rxc_time_cfg(dev->mbox);
199         if (req == NULL)
200                 return -ENOSPC;
201
202         req->blkaddr = 0;
203
204         /* The step value is in microseconds. */
205         req->step = cfg->step;
206
207         /* The timeout will be: limit * step microseconds */
208         req->zombie_limit = cfg->zombie_limit;
209         req->zombie_thres = cfg->zombie_thres;
210
211         /* The timeout will be: limit * step microseconds */
212         req->active_limit = cfg->active_limit;
213         req->active_thres = cfg->active_thres;
214
215         return mbox_process(dev->mbox);
216 }
217
218 int
219 cpt_get_msix_offset(struct dev *dev, struct msix_offset_rsp **msix_rsp)
220 {
221         struct mbox *mbox = dev->mbox;
222         int rc;
223
224         /* Get MSIX vector offsets */
225         mbox_alloc_msg_msix_offset(mbox);
226         rc = mbox_process_msg(mbox, (void *)msix_rsp);
227
228         return rc;
229 }
230
231 int
232 cpt_lfs_attach(struct dev *dev, uint8_t blkaddr, bool modify, uint16_t nb_lf)
233 {
234         struct mbox *mbox = dev->mbox;
235         struct rsrc_attach_req *req;
236
237         if (blkaddr != RVU_BLOCK_ADDR_CPT0 && blkaddr != RVU_BLOCK_ADDR_CPT1)
238                 return -EINVAL;
239
240         /* Attach CPT(lf) */
241         req = mbox_alloc_msg_attach_resources(mbox);
242         if (req == NULL)
243                 return -ENOSPC;
244
245         req->cptlfs = nb_lf;
246         req->modify = modify;
247         req->cpt_blkaddr = blkaddr;
248
249         return mbox_process(mbox);
250 }
251
252 int
253 cpt_lfs_detach(struct dev *dev)
254 {
255         struct mbox *mbox = dev->mbox;
256         struct rsrc_detach_req *req;
257
258         req = mbox_alloc_msg_detach_resources(mbox);
259         if (req == NULL)
260                 return -ENOSPC;
261
262         req->cptlfs = 1;
263         req->partial = 1;
264
265         return mbox_process(mbox);
266 }
267
268 static int
269 cpt_available_lfs_get(struct dev *dev, uint16_t *nb_lf)
270 {
271         struct mbox *mbox = dev->mbox;
272         struct free_rsrcs_rsp *rsp;
273         int rc;
274
275         mbox_alloc_msg_free_rsrc_cnt(mbox);
276
277         rc = mbox_process_msg(mbox, (void *)&rsp);
278         if (rc)
279                 return -EIO;
280
281         *nb_lf = rsp->cpt;
282         return 0;
283 }
284
285 int
286 cpt_lfs_alloc(struct dev *dev, uint8_t eng_grpmsk, uint8_t blkaddr,
287               bool inl_dev_sso)
288 {
289         struct cpt_lf_alloc_req_msg *req;
290         struct mbox *mbox = dev->mbox;
291
292         if (blkaddr != RVU_BLOCK_ADDR_CPT0 && blkaddr != RVU_BLOCK_ADDR_CPT1)
293                 return -EINVAL;
294
295         PLT_SET_USED(inl_dev_sso);
296
297         req = mbox_alloc_msg_cpt_lf_alloc(mbox);
298         req->nix_pf_func = 0;
299         req->sso_pf_func = idev_sso_pffunc_get();
300         req->eng_grpmsk = eng_grpmsk;
301         req->blkaddr = blkaddr;
302
303         return mbox_process(mbox);
304 }
305
306 int
307 cpt_lfs_free(struct dev *dev)
308 {
309         mbox_alloc_msg_cpt_lf_free(dev->mbox);
310
311         return mbox_process(dev->mbox);
312 }
313
314 static int
315 cpt_hardware_caps_get(struct dev *dev, union cpt_eng_caps *hw_caps)
316 {
317         struct cpt_caps_rsp_msg *rsp;
318         int ret;
319
320         mbox_alloc_msg_cpt_caps_get(dev->mbox);
321
322         ret = mbox_process_msg(dev->mbox, (void *)&rsp);
323         if (ret)
324                 return -EIO;
325
326         mbox_memcpy(hw_caps, rsp->eng_caps,
327                     sizeof(union cpt_eng_caps) * CPT_MAX_ENG_TYPES);
328
329         return 0;
330 }
331
332 static uint32_t
333 cpt_lf_iq_mem_calc(uint32_t nb_desc)
334 {
335         uint32_t len;
336
337         /* Space for instruction group memory */
338         len = CPT_IQ_GRP_SIZE(nb_desc);
339
340         /* Align to 128B */
341         len = PLT_ALIGN(len, ROC_ALIGN);
342
343         /* Space for FC */
344         len += CPT_IQ_FC_LEN;
345
346         /* For instruction queues */
347         len += CPT_IQ_NB_DESC_SIZE_DIV40(nb_desc) * CPT_IQ_NB_DESC_MULTIPLIER *
348                sizeof(struct cpt_inst_s);
349
350         return len;
351 }
352
353 static inline void
354 cpt_iq_init(struct roc_cpt_lf *lf)
355 {
356         union cpt_lf_q_size lf_q_size = {.u = 0x0};
357         union cpt_lf_q_base lf_q_base = {.u = 0x0};
358         union cpt_lf_inprog lf_inprog;
359         union cpt_lf_ctl lf_ctl;
360         uintptr_t addr;
361
362         lf->io_addr = lf->rbase + CPT_LF_NQX(0);
363
364         /* Disable command queue */
365         roc_cpt_iq_disable(lf);
366
367         /* Set command queue base address */
368         addr = (uintptr_t)lf->iq_vaddr +
369                PLT_ALIGN(CPT_IQ_GRP_SIZE(lf->nb_desc), ROC_ALIGN);
370
371         lf_q_base.u = addr;
372
373         plt_write64(lf_q_base.u, lf->rbase + CPT_LF_Q_BASE);
374
375         /* Set command queue size */
376         lf_q_size.s.size_div40 = CPT_IQ_NB_DESC_SIZE_DIV40(lf->nb_desc);
377         plt_write64(lf_q_size.u, lf->rbase + CPT_LF_Q_SIZE);
378
379         /* Enable command queue execution */
380         lf_inprog.u = plt_read64(lf->rbase + CPT_LF_INPROG);
381         lf_inprog.s.eena = 1;
382         plt_write64(lf_inprog.u, lf->rbase + CPT_LF_INPROG);
383
384         /* Enable instruction queue enqueuing */
385         lf_ctl.u = plt_read64(lf->rbase + CPT_LF_CTL);
386         lf_ctl.s.ena = 1;
387         lf_ctl.s.fc_ena = 1;
388         lf_ctl.s.fc_up_crossing = 1;
389         lf_ctl.s.fc_hyst_bits = CPT_FC_NUM_HYST_BITS;
390         plt_write64(lf_ctl.u, lf->rbase + CPT_LF_CTL);
391
392         lf->fc_addr = (uint64_t *)addr;
393 }
394
395 int
396 roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf)
397 {
398         struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
399         uint8_t blkaddr = RVU_BLOCK_ADDR_CPT0;
400         struct msix_offset_rsp *rsp;
401         uint8_t eng_grpmsk;
402         int rc, i;
403
404         /* Request LF resources */
405         rc = cpt_lfs_attach(&cpt->dev, blkaddr, false, nb_lf);
406         if (rc)
407                 return rc;
408
409         eng_grpmsk = (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_AE]) |
410                      (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_SE]) |
411                      (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_IE]);
412
413         rc = cpt_lfs_alloc(&cpt->dev, eng_grpmsk, blkaddr, false);
414         if (rc)
415                 goto lfs_detach;
416
417         rc = cpt_get_msix_offset(&cpt->dev, &rsp);
418         if (rc)
419                 goto lfs_free;
420
421         for (i = 0; i < nb_lf; i++)
422                 cpt->lf_msix_off[i] =
423                         (cpt->lf_blkaddr[i] == RVU_BLOCK_ADDR_CPT1) ?
424                                 rsp->cpt1_lf_msixoff[i] :
425                                 rsp->cptlf_msixoff[i];
426
427         roc_cpt->nb_lf = nb_lf;
428
429         return 0;
430
431 lfs_free:
432         cpt_lfs_free(&cpt->dev);
433 lfs_detach:
434         cpt_lfs_detach(&cpt->dev);
435         return rc;
436 }
437
438 uint64_t
439 cpt_get_blkaddr(struct dev *dev)
440 {
441         uint64_t reg;
442         uint64_t off;
443
444         /* Reading the discovery register to know which CPT is the LF
445          * attached to. Assume CPT LF's of only one block are attached
446          * to a pffunc.
447          */
448         if (dev_is_vf(dev))
449                 off = RVU_VF_BLOCK_ADDRX_DISC(RVU_BLOCK_ADDR_CPT1);
450         else
451                 off = RVU_PF_BLOCK_ADDRX_DISC(RVU_BLOCK_ADDR_CPT1);
452
453         reg = plt_read64(dev->bar2 + off);
454
455         return reg & 0x1FFULL ? RVU_BLOCK_ADDR_CPT1 : RVU_BLOCK_ADDR_CPT0;
456 }
457
458 int
459 cpt_lf_init(struct roc_cpt_lf *lf)
460 {
461         struct dev *dev = lf->dev;
462         uint64_t blkaddr;
463         void *iq_mem;
464         int rc;
465
466         if (lf->nb_desc == 0 || lf->nb_desc > CPT_LF_MAX_NB_DESC)
467                 lf->nb_desc = CPT_LF_DEFAULT_NB_DESC;
468
469         /* Allocate memory for instruction queue for CPT LF. */
470         iq_mem = plt_zmalloc(cpt_lf_iq_mem_calc(lf->nb_desc), ROC_ALIGN);
471         if (iq_mem == NULL)
472                 return -ENOMEM;
473
474         blkaddr = cpt_get_blkaddr(dev);
475         lf->rbase = dev->bar2 + ((blkaddr << 20) | (lf->lf_id << 12));
476         lf->iq_vaddr = iq_mem;
477         lf->lmt_base = dev->lmt_base;
478         lf->pf_func = dev->pf_func;
479
480         /* Initialize instruction queue */
481         cpt_iq_init(lf);
482
483         rc = cpt_lf_register_irqs(lf);
484         if (rc)
485                 goto disable_iq;
486
487         return 0;
488
489 disable_iq:
490         roc_cpt_iq_disable(lf);
491         plt_free(iq_mem);
492         return rc;
493 }
494
495 int
496 roc_cpt_lf_init(struct roc_cpt *roc_cpt, struct roc_cpt_lf *lf)
497 {
498         struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
499         int rc;
500
501         lf->dev = &cpt->dev;
502         lf->roc_cpt = roc_cpt;
503         lf->msixoff = cpt->lf_msix_off[lf->lf_id];
504         lf->pci_dev = cpt->pci_dev;
505
506         rc = cpt_lf_init(lf);
507         if (rc)
508                 return rc;
509
510         /* LF init successful */
511         roc_cpt->lf[lf->lf_id] = lf;
512         return rc;
513 }
514
515 int
516 roc_cpt_dev_init(struct roc_cpt *roc_cpt)
517 {
518         struct plt_pci_device *pci_dev;
519         uint16_t nb_lf_avail;
520         struct dev *dev;
521         struct cpt *cpt;
522         int rc;
523
524         if (roc_cpt == NULL || roc_cpt->pci_dev == NULL)
525                 return -EINVAL;
526
527         PLT_STATIC_ASSERT(sizeof(struct cpt) <= ROC_CPT_MEM_SZ);
528
529         cpt = roc_cpt_to_cpt_priv(roc_cpt);
530         memset(cpt, 0, sizeof(*cpt));
531         pci_dev = roc_cpt->pci_dev;
532         dev = &cpt->dev;
533
534         /* Initialize device  */
535         rc = dev_init(dev, pci_dev);
536         if (rc) {
537                 plt_err("Failed to init roc device");
538                 goto fail;
539         }
540
541         cpt->pci_dev = pci_dev;
542         roc_cpt->lmt_base = dev->lmt_base;
543
544         rc = cpt_hardware_caps_get(dev, roc_cpt->hw_caps);
545         if (rc) {
546                 plt_err("Could not determine hardware capabilities");
547                 goto fail;
548         }
549
550         rc = cpt_available_lfs_get(&cpt->dev, &nb_lf_avail);
551         if (rc) {
552                 plt_err("Could not get available lfs");
553                 goto fail;
554         }
555
556         /* Reserve 1 CPT LF for inline inbound */
557         nb_lf_avail = PLT_MIN(nb_lf_avail, ROC_CPT_MAX_LFS - 1);
558
559         roc_cpt->nb_lf_avail = nb_lf_avail;
560
561         dev->roc_cpt = roc_cpt;
562
563         /* Set it to idev if not already present */
564         if (!roc_idev_cpt_get())
565                 roc_idev_cpt_set(roc_cpt);
566
567         return 0;
568
569 fail:
570         return rc;
571 }
572
573 void
574 cpt_lf_fini(struct roc_cpt_lf *lf)
575 {
576         /* Unregister IRQ's */
577         cpt_lf_unregister_irqs(lf);
578
579         /* Disable IQ */
580         roc_cpt_iq_disable(lf);
581
582         /* Free memory */
583         plt_free(lf->iq_vaddr);
584         lf->iq_vaddr = NULL;
585 }
586
587 void
588 roc_cpt_lf_fini(struct roc_cpt_lf *lf)
589 {
590         if (lf == NULL)
591                 return;
592         lf->roc_cpt->lf[lf->lf_id] = NULL;
593         cpt_lf_fini(lf);
594 }
595
596 int
597 roc_cpt_dev_fini(struct roc_cpt *roc_cpt)
598 {
599         struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
600
601         if (cpt == NULL)
602                 return -EINVAL;
603
604         /* Remove idev references */
605         if (roc_idev_cpt_get() == roc_cpt)
606                 roc_idev_cpt_set(NULL);
607
608         roc_cpt->nb_lf_avail = 0;
609
610         roc_cpt->lmt_base = 0;
611
612         return dev_fini(&cpt->dev, cpt->pci_dev);
613 }
614
615 void
616 roc_cpt_dev_clear(struct roc_cpt *roc_cpt)
617 {
618         struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
619         int i;
620
621         if (cpt == NULL)
622                 return;
623
624         for (i = 0; i < roc_cpt->nb_lf; i++)
625                 cpt->lf_msix_off[i] = 0;
626
627         roc_cpt->nb_lf = 0;
628
629         cpt_lfs_free(&cpt->dev);
630
631         cpt_lfs_detach(&cpt->dev);
632 }
633
634 int
635 roc_cpt_eng_grp_add(struct roc_cpt *roc_cpt, enum cpt_eng_type eng_type)
636 {
637         struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
638         struct dev *dev = &cpt->dev;
639         struct cpt_eng_grp_req *req;
640         struct cpt_eng_grp_rsp *rsp;
641         int ret;
642
643         req = mbox_alloc_msg_cpt_eng_grp_get(dev->mbox);
644         if (req == NULL)
645                 return -EIO;
646
647         switch (eng_type) {
648         case CPT_ENG_TYPE_AE:
649         case CPT_ENG_TYPE_SE:
650         case CPT_ENG_TYPE_IE:
651                 break;
652         default:
653                 return -EINVAL;
654         }
655
656         req->eng_type = eng_type;
657         ret = mbox_process_msg(dev->mbox, (void *)&rsp);
658         if (ret)
659                 return -EIO;
660
661         if (rsp->eng_grp_num > 8) {
662                 plt_err("Invalid CPT engine group");
663                 return -ENOTSUP;
664         }
665
666         roc_cpt->eng_grp[eng_type] = rsp->eng_grp_num;
667
668         return rsp->eng_grp_num;
669 }
670
671 void
672 roc_cpt_iq_disable(struct roc_cpt_lf *lf)
673 {
674         union cpt_lf_ctl lf_ctl = {.u = 0x0};
675         union cpt_lf_inprog lf_inprog;
676         int timeout = 20;
677
678         /* Disable instructions enqueuing */
679         plt_write64(lf_ctl.u, lf->rbase + CPT_LF_CTL);
680
681         /* Wait for instruction queue to become empty */
682         do {
683                 lf_inprog.u = plt_read64(lf->rbase + CPT_LF_INPROG);
684                 if (!lf_inprog.s.inflight)
685                         break;
686
687                 plt_delay_ms(20);
688                 if (timeout-- < 0) {
689                         plt_err("CPT LF %d is still busy", lf->lf_id);
690                         break;
691                 }
692
693         } while (1);
694
695         /* Disable executions in the LF's queue.
696          * The queue should be empty at this point
697          */
698         lf_inprog.s.eena = 0x0;
699         plt_write64(lf_inprog.u, lf->rbase + CPT_LF_INPROG);
700 }