Lines Matching defs:pf
22 static bool cn10k_cpt_device_set_inuse(struct otx2_nic *pf)
27 state = atomic_cmpxchg(&pf->ipsec.cpt_state,
39 static void cn10k_cpt_device_set_available(struct otx2_nic *pf)
41 atomic_set(&pf->ipsec.cpt_state, CN10K_CPT_HW_AVAILABLE);
44 static void cn10k_cpt_device_set_unavailable(struct otx2_nic *pf)
46 atomic_set(&pf->ipsec.cpt_state, CN10K_CPT_HW_UNAVAILABLE);
49 static int cn10k_outb_cptlf_attach(struct otx2_nic *pf)
54 mutex_lock(&pf->mbox.lock);
56 attach = otx2_mbox_alloc_msg_attach_resources(&pf->mbox);
64 ret = otx2_sync_mbox_msg(&pf->mbox);
67 mutex_unlock(&pf->mbox.lock);
71 static int cn10k_outb_cptlf_detach(struct otx2_nic *pf)
76 mutex_lock(&pf->mbox.lock);
77 detach = otx2_mbox_alloc_msg_detach_resources(&pf->mbox);
85 ret = otx2_sync_mbox_msg(&pf->mbox);
88 mutex_unlock(&pf->mbox.lock);
92 static int cn10k_outb_cptlf_alloc(struct otx2_nic *pf)
97 mutex_lock(&pf->mbox.lock);
98 req = otx2_mbox_alloc_msg_cpt_lf_alloc(&pf->mbox);
103 req->nix_pf_func = pf->pcifunc;
107 ret = otx2_sync_mbox_msg(&pf->mbox);
110 mutex_unlock(&pf->mbox.lock);
114 static void cn10k_outb_cptlf_free(struct otx2_nic *pf)
116 mutex_lock(&pf->mbox.lock);
117 otx2_mbox_alloc_msg_cpt_lf_free(&pf->mbox);
118 otx2_sync_mbox_msg(&pf->mbox);
119 mutex_unlock(&pf->mbox.lock);
122 static int cn10k_outb_cptlf_config(struct otx2_nic *pf)
127 mutex_lock(&pf->mbox.lock);
128 req = otx2_mbox_alloc_msg_cpt_inline_ipsec_cfg(&pf->mbox);
134 req->nix_pf_func = pf->pcifunc;
135 ret = otx2_sync_mbox_msg(&pf->mbox);
137 mutex_unlock(&pf->mbox.lock);
141 static void cn10k_outb_cptlf_iq_enable(struct otx2_nic *pf)
146 reg_val = otx2_read64(pf, CN10K_CPT_LF_INPROG);
148 otx2_write64(pf, CN10K_CPT_LF_INPROG, reg_val);
151 reg_val = otx2_read64(pf, CN10K_CPT_LF_CTL);
153 otx2_write64(pf, CN10K_CPT_LF_CTL, reg_val);
156 static void cn10k_outb_cptlf_iq_disable(struct otx2_nic *pf)
165 otx2_write64(pf, CN10K_CPT_LF_CTL, 0ull);
171 reg_val = otx2_read64(pf, CN10K_CPT_LF_INPROG);
178 netdev_err(pf->netdev, "Timeout to cleanup CPT IQ\n");
187 otx2_write64(pf, CN10K_CPT_LF_INPROG, reg_val);
192 reg_val = otx2_read64(pf, CN10K_CPT_LF_INPROG);
197 reg_val = otx2_read64(pf, CN10K_CPT_LF_Q_GRP_PTR);
204 reg_val = otx2_read64(pf, CN10K_CPT_LF_INPROG);
233 static int cn10k_outb_cptlf_iq_alloc(struct otx2_nic *pf)
235 struct cn10k_cpt_inst_queue *iq = &pf->ipsec.iq;
240 iq->real_vaddr = dma_alloc_coherent(pf->dev, iq->size,
255 static void cn10k_outb_cptlf_iq_free(struct otx2_nic *pf)
257 struct cn10k_cpt_inst_queue *iq = &pf->ipsec.iq;
260 dma_free_coherent(pf->dev, iq->size, iq->real_vaddr,
267 static int cn10k_outb_cptlf_iq_init(struct otx2_nic *pf)
273 ret = cn10k_outb_cptlf_iq_alloc(pf);
278 cn10k_outb_cptlf_iq_disable(pf);
281 otx2_write64(pf, CN10K_CPT_LF_Q_BASE, pf->ipsec.iq.dma_addr);
286 otx2_write64(pf, CN10K_CPT_LF_Q_SIZE, reg_val);
291 static int cn10k_outb_cptlf_init(struct otx2_nic *pf)
296 ret = cn10k_outb_cptlf_iq_init(pf);
301 ret = cn10k_outb_cptlf_config(pf);
306 cn10k_outb_cptlf_iq_enable(pf);
309 cn10k_outb_cptlf_iq_free(pf);
315 struct otx2_nic *pf = netdev_priv(netdev);
319 ret = cn10k_outb_cptlf_attach(pf);
324 ret = cn10k_outb_cptlf_alloc(pf);
329 ret = cn10k_outb_cptlf_init(pf);
333 pf->ipsec.io_addr = (__force u64)otx2_get_regaddr(pf,
337 pf->flags |= OTX2_FLAG_IPSEC_OFFLOAD_ENABLED;
339 cn10k_cpt_device_set_available(pf);
343 cn10k_outb_cptlf_free(pf);
345 cn10k_outb_cptlf_detach(pf);
349 static int cn10k_outb_cpt_clean(struct otx2_nic *pf)
353 if (!cn10k_cpt_device_set_inuse(pf)) {
354 netdev_err(pf->netdev, "CPT LF device unavailable\n");
359 pf->flags &= ~OTX2_FLAG_IPSEC_OFFLOAD_ENABLED;
362 cn10k_outb_cptlf_iq_disable(pf);
365 otx2_write64(pf, CN10K_CPT_LF_Q_BASE, 0);
366 otx2_write64(pf, CN10K_CPT_LF_Q_SIZE, 0);
369 cn10k_outb_cptlf_iq_free(pf);
372 cn10k_outb_cptlf_free(pf);
373 ret = cn10k_outb_cptlf_detach(pf);
375 netdev_err(pf->netdev, "Failed to detach CPT LF\n");
377 cn10k_cpt_device_set_unavailable(pf);
381 static void cn10k_cpt_inst_flush(struct otx2_nic *pf, struct cpt_inst_s *inst,
387 lmt_info = per_cpu_ptr(pf->hw.lmt_info, smp_processor_id());
397 tar_addr |= pf->ipsec.io_addr | (((size / 16) - 1) & 0x7) << 4;
403 static int cn10k_wait_for_cpt_respose(struct otx2_nic *pf,
411 netdev_err(pf->netdev, "CPT response timeout\n");
419 netdev_err(pf->netdev, "compcode=%x doneint=%x\n",
421 netdev_err(pf->netdev, "uc_compcode=%x uc_info=%llx esn=%llx\n",
427 static int cn10k_outb_write_sa(struct otx2_nic *pf, struct qmem *sa_info)
442 res = dma_alloc_coherent(pf->dev, sizeof(struct cpt_res_s),
448 sa_dptr = dma_alloc_coherent(pf->dev, sa_size, &dptr_iova, GFP_ATOMIC);
450 dma_free_coherent(pf->dev, sizeof(struct cpt_res_s), res,
472 if (!cn10k_cpt_device_set_inuse(pf)) {
477 cn10k_cpt_inst_flush(pf, &inst, sizeof(struct cpt_inst_s));
479 ret = cn10k_wait_for_cpt_respose(pf, res);
485 otx2_write64(pf, CN10K_CPT_LF_CTX_FLUSH, reg_val);
488 cn10k_cpt_device_set_available(pf);
490 dma_free_coherent(pf->dev, sa_size, sa_dptr, dptr_iova);
491 dma_free_coherent(pf->dev, sizeof(struct cpt_res_s), res, res_iova);
526 struct otx2_nic *pf;
534 pf = netdev_priv(netdev);
535 sa_entry->ctx_size = (pf->ipsec.sa_size / OTX2_ALIGN) & 0xF;
672 struct otx2_nic *pf;
679 pf = netdev_priv(dev);
681 err = qmem_alloc(pf->dev, &sa_info, pf->ipsec.sa_size, OTX2_ALIGN);
688 err = cn10k_outb_write_sa(pf, sa_info);
691 qmem_free(pf->dev, sa_info);
697 if (!pf->ipsec.outb_sa_count)
699 pf->ipsec.outb_sa_count++;
717 struct otx2_nic *pf;
723 pf = netdev_priv(dev);
730 sa_entry->ctx_size = (pf->ipsec.sa_size / OTX2_ALIGN) & 0xF;
733 err = cn10k_outb_write_sa(pf, sa_info);
738 qmem_free(pf->dev, sa_info);
743 if (!--pf->ipsec.outb_sa_count)
744 queue_work(pf->ipsec.sa_workq, &pf->ipsec.sa_work);
756 struct otx2_nic *pf = container_of(ipsec, struct otx2_nic, ipsec);
761 netdev_update_features(pf->netdev);
767 struct otx2_nic *pf = netdev_priv(netdev);
770 if (!is_dev_support_ipsec_offload(pf->pdev))
778 if (pf->ipsec.outb_sa_count) {
779 netdev_err(pf->netdev, "SA installed on this device\n");
783 return cn10k_outb_cpt_clean(pf);
788 struct otx2_nic *pf = netdev_priv(netdev);
791 if (!is_dev_support_ipsec_offload(pf->pdev))
798 pf->ipsec.sa_size = sa_size;
800 INIT_WORK(&pf->ipsec.sa_work, cn10k_ipsec_sa_wq_handler);
801 pf->ipsec.sa_workq = alloc_workqueue("cn10k_ipsec_sa_workq", 0, 0);
802 if (!pf->ipsec.sa_workq) {
803 netdev_err(pf->netdev, "SA alloc workqueue failed\n");
812 cn10k_cpt_device_set_unavailable(pf);
817 void cn10k_ipsec_clean(struct otx2_nic *pf)
819 if (!is_dev_support_ipsec_offload(pf->pdev))
822 if (!(pf->flags & OTX2_FLAG_IPSEC_OFFLOAD_ENABLED))
825 if (pf->ipsec.sa_workq) {
826 destroy_workqueue(pf->ipsec.sa_workq);
827 pf->ipsec.sa_workq = NULL;
830 cn10k_outb_cpt_clean(pf);
930 bool cn10k_ipsec_transmit(struct otx2_nic *pf, struct netdev_queue *txq,
947 if (!(pf->flags & OTX2_FLAG_IPSEC_OFFLOAD_ENABLED))
963 if (dlen == 0 && netif_msg_tx_err(pf)) {
964 netdev_err(pf->netdev, "Invalid IP header, ip-length zero\n");
992 inst.rvu_pf_func = pf->pcifunc;
1036 cn10k_cpt_inst_flush(pf, &inst, sizeof(struct cpt_inst_s));