Lines Matching +full:mbox +full:- +full:dir

1 // SPDX-License-Identifier: GPL-2.0-only
35 mutex_lock(&cptpf->lock); in forward_to_af()
36 msg = otx2_mbox_alloc_msg(&cptpf->afpf_mbox, 0, size); in forward_to_af()
38 mutex_unlock(&cptpf->lock); in forward_to_af()
39 return -ENOMEM; in forward_to_af()
44 msg->id = req->id; in forward_to_af()
45 msg->pcifunc = req->pcifunc; in forward_to_af()
46 msg->sig = req->sig; in forward_to_af()
47 msg->ver = req->ver; in forward_to_af()
49 ret = otx2_cpt_sync_mbox_msg(&cptpf->afpf_mbox); in forward_to_af()
50 /* Error code -EIO indicate there is a communication failure in forward_to_af()
55 if (ret == -EIO) { in forward_to_af()
56 dev_warn(&cptpf->pdev->dev, in forward_to_af()
57 "AF not responding to VF%d messages\n", vf->vf_id); in forward_to_af()
58 mutex_unlock(&cptpf->lock); in forward_to_af()
61 mutex_unlock(&cptpf->lock); in forward_to_af()
72 otx2_mbox_alloc_msg(&cptpf->vfpf_mbox, vf->vf_id, in handle_msg_get_caps()
75 return -ENOMEM; in handle_msg_get_caps()
77 rsp->hdr.id = MBOX_MSG_GET_CAPS; in handle_msg_get_caps()
78 rsp->hdr.sig = OTX2_MBOX_RSP_SIG; in handle_msg_get_caps()
79 rsp->hdr.pcifunc = req->pcifunc; in handle_msg_get_caps()
80 rsp->cpt_pf_drv_version = OTX2_CPT_PF_DRV_VERSION; in handle_msg_get_caps()
81 rsp->cpt_revision = cptpf->eng_grps.rid; in handle_msg_get_caps()
82 memcpy(&rsp->eng_caps, &cptpf->eng_caps, sizeof(rsp->eng_caps)); in handle_msg_get_caps()
96 otx2_mbox_alloc_msg(&cptpf->vfpf_mbox, vf->vf_id, sizeof(*rsp)); in handle_msg_get_eng_grp_num()
98 return -ENOMEM; in handle_msg_get_eng_grp_num()
100 rsp->hdr.id = MBOX_MSG_GET_ENG_GRP_NUM; in handle_msg_get_eng_grp_num()
101 rsp->hdr.sig = OTX2_MBOX_RSP_SIG; in handle_msg_get_eng_grp_num()
102 rsp->hdr.pcifunc = req->pcifunc; in handle_msg_get_eng_grp_num()
103 rsp->eng_type = grp_req->eng_type; in handle_msg_get_eng_grp_num()
104 rsp->eng_grp_num = otx2_cpt_get_eng_grp(&cptpf->eng_grps, in handle_msg_get_eng_grp_num()
105 grp_req->eng_type); in handle_msg_get_eng_grp_num()
117 otx2_mbox_alloc_msg(&cptpf->vfpf_mbox, vf->vf_id, sizeof(*rsp)); in handle_msg_kvf_limits()
119 return -ENOMEM; in handle_msg_kvf_limits()
121 rsp->hdr.id = MBOX_MSG_GET_KVF_LIMITS; in handle_msg_kvf_limits()
122 rsp->hdr.sig = OTX2_MBOX_RSP_SIG; in handle_msg_kvf_limits()
123 rsp->hdr.pcifunc = req->pcifunc; in handle_msg_kvf_limits()
124 rsp->kvf_limits = cptpf->kvf_limits; in handle_msg_kvf_limits()
133 struct pci_dev *pdev = cptpf->pdev; in send_inline_ipsec_inbound_msg()
136 otx2_mbox_alloc_msg_rsp(&cptpf->afpf_mbox, 0, in send_inline_ipsec_inbound_msg()
139 dev_err(&pdev->dev, "RVU MBOX failed to get message.\n"); in send_inline_ipsec_inbound_msg()
140 return -EFAULT; in send_inline_ipsec_inbound_msg()
143 req->hdr.id = MBOX_MSG_CPT_INLINE_IPSEC_CFG; in send_inline_ipsec_inbound_msg()
144 req->hdr.sig = OTX2_MBOX_REQ_SIG; in send_inline_ipsec_inbound_msg()
145 req->hdr.pcifunc = OTX2_CPT_RVU_PFFUNC(cptpf->pdev, cptpf->pf_id, 0); in send_inline_ipsec_inbound_msg()
146 req->dir = CPT_INLINE_INBOUND; in send_inline_ipsec_inbound_msg()
147 req->slot = slot; in send_inline_ipsec_inbound_msg()
148 req->sso_pf_func_ovrd = cptpf->sso_pf_func_ovrd; in send_inline_ipsec_inbound_msg()
149 req->sso_pf_func = sso_pf_func; in send_inline_ipsec_inbound_msg()
150 req->enable = 1; in send_inline_ipsec_inbound_msg()
152 return otx2_cpt_send_mbox_msg(&cptpf->afpf_mbox, pdev); in send_inline_ipsec_inbound_msg()
159 struct pci_dev *pdev = cptpf->pdev; in rx_inline_ipsec_lf_cfg()
163 otx2_mbox_alloc_msg_rsp(&cptpf->afpf_mbox, 0, in rx_inline_ipsec_lf_cfg()
167 dev_err(&pdev->dev, "RVU MBOX failed to get message.\n"); in rx_inline_ipsec_lf_cfg()
168 return -EFAULT; in rx_inline_ipsec_lf_cfg()
171 nix_req->hdr.id = MBOX_MSG_NIX_INLINE_IPSEC_CFG; in rx_inline_ipsec_lf_cfg()
172 nix_req->hdr.sig = OTX2_MBOX_REQ_SIG; in rx_inline_ipsec_lf_cfg()
173 nix_req->enable = 1; in rx_inline_ipsec_lf_cfg()
174 nix_req->credit_th = req->credit_th; in rx_inline_ipsec_lf_cfg()
175 nix_req->bpid = req->bpid; in rx_inline_ipsec_lf_cfg()
176 if (!req->credit || req->credit > OTX2_CPT_INST_QLEN_MSGS) in rx_inline_ipsec_lf_cfg()
177 nix_req->cpt_credit = OTX2_CPT_INST_QLEN_MSGS - 1; in rx_inline_ipsec_lf_cfg()
179 nix_req->cpt_credit = req->credit - 1; in rx_inline_ipsec_lf_cfg()
180 nix_req->gen_cfg.egrp = egrp; in rx_inline_ipsec_lf_cfg()
181 if (req->opcode) in rx_inline_ipsec_lf_cfg()
182 nix_req->gen_cfg.opcode = req->opcode; in rx_inline_ipsec_lf_cfg()
184 nix_req->gen_cfg.opcode = cpt_inline_rx_opcode(pdev); in rx_inline_ipsec_lf_cfg()
185 nix_req->gen_cfg.param1 = req->param1; in rx_inline_ipsec_lf_cfg()
186 nix_req->gen_cfg.param2 = req->param2; in rx_inline_ipsec_lf_cfg()
187 nix_req->inst_qsel.cpt_pf_func = in rx_inline_ipsec_lf_cfg()
188 OTX2_CPT_RVU_PFFUNC(cptpf->pdev, cptpf->pf_id, 0); in rx_inline_ipsec_lf_cfg()
189 nix_req->inst_qsel.cpt_slot = 0; in rx_inline_ipsec_lf_cfg()
190 ret = otx2_cpt_send_mbox_msg(&cptpf->afpf_mbox, pdev); in rx_inline_ipsec_lf_cfg()
194 if (cptpf->has_cpt1) { in rx_inline_ipsec_lf_cfg()
195 ret = send_inline_ipsec_inbound_msg(cptpf, req->sso_pf_func, 1); in rx_inline_ipsec_lf_cfg()
200 return send_inline_ipsec_inbound_msg(cptpf, req->sso_pf_func, 0); in rx_inline_ipsec_lf_cfg()
211 dev_err(&cptpf->pdev->dev, in otx2_inline_cptlf_setup()
252 if (cptpf->lfs.lfs_num) { in handle_msg_rx_inline_ipsec_lf_cfg()
253 dev_err(&cptpf->pdev->dev, in handle_msg_rx_inline_ipsec_lf_cfg()
255 return -EEXIST; in handle_msg_rx_inline_ipsec_lf_cfg()
261 egrp = otx2_cpt_get_eng_grp(&cptpf->eng_grps, OTX2_CPT_IE_TYPES); in handle_msg_rx_inline_ipsec_lf_cfg()
263 dev_err(&cptpf->pdev->dev, in handle_msg_rx_inline_ipsec_lf_cfg()
265 return -ENOENT; in handle_msg_rx_inline_ipsec_lf_cfg()
268 cptpf->lfs.global_slot = 0; in handle_msg_rx_inline_ipsec_lf_cfg()
269 cptpf->lfs.ctx_ilen_ovrd = cfg_req->ctx_ilen_valid; in handle_msg_rx_inline_ipsec_lf_cfg()
270 cptpf->lfs.ctx_ilen = cfg_req->ctx_ilen; in handle_msg_rx_inline_ipsec_lf_cfg()
272 ret = otx2_inline_cptlf_setup(cptpf, &cptpf->lfs, egrp, num_lfs); in handle_msg_rx_inline_ipsec_lf_cfg()
274 dev_err(&cptpf->pdev->dev, "Inline-Ipsec CPT0 LF setup failed.\n"); in handle_msg_rx_inline_ipsec_lf_cfg()
278 if (cptpf->has_cpt1) { in handle_msg_rx_inline_ipsec_lf_cfg()
279 cptpf->rsrc_req_blkaddr = BLKADDR_CPT1; in handle_msg_rx_inline_ipsec_lf_cfg()
280 cptpf->cpt1_lfs.global_slot = num_lfs; in handle_msg_rx_inline_ipsec_lf_cfg()
281 cptpf->cpt1_lfs.ctx_ilen_ovrd = cfg_req->ctx_ilen_valid; in handle_msg_rx_inline_ipsec_lf_cfg()
282 cptpf->cpt1_lfs.ctx_ilen = cfg_req->ctx_ilen; in handle_msg_rx_inline_ipsec_lf_cfg()
283 ret = otx2_inline_cptlf_setup(cptpf, &cptpf->cpt1_lfs, egrp, in handle_msg_rx_inline_ipsec_lf_cfg()
286 dev_err(&cptpf->pdev->dev, "Inline CPT1 LF setup failed.\n"); in handle_msg_rx_inline_ipsec_lf_cfg()
289 cptpf->rsrc_req_blkaddr = 0; in handle_msg_rx_inline_ipsec_lf_cfg()
299 otx2_inline_cptlf_cleanup(&cptpf->cpt1_lfs); in handle_msg_rx_inline_ipsec_lf_cfg()
301 otx2_inline_cptlf_cleanup(&cptpf->lfs); in handle_msg_rx_inline_ipsec_lf_cfg()
312 if (req->sig != OTX2_MBOX_REQ_SIG) in cptpf_handle_vf_req()
315 switch (req->id) { in cptpf_handle_vf_req()
336 otx2_reply_invalid_msg(&cptpf->vfpf_mbox, vf->vf_id, 0, req->id); in cptpf_handle_vf_req()
337 otx2_mbox_msg_send(&cptpf->vfpf_mbox, vf->vf_id); in cptpf_handle_vf_req()
354 intr = otx2_cpt_read64(cptpf->reg_base, BLKADDR_RVUM, 0, in otx2_cptpf_vfpf_mbox_intr()
357 for (vf_idx = i * 64; vf_idx < cptpf->enabled_vfs; vf_idx++) { in otx2_cptpf_vfpf_mbox_intr()
358 vf = &cptpf->vf[vf_idx]; in otx2_cptpf_vfpf_mbox_intr()
359 if (intr & (1ULL << vf->intr_idx)) { in otx2_cptpf_vfpf_mbox_intr()
360 queue_work(cptpf->vfpf_mbox_wq, in otx2_cptpf_vfpf_mbox_intr()
361 &vf->vfpf_mbox_work); in otx2_cptpf_vfpf_mbox_intr()
363 otx2_cpt_write64(cptpf->reg_base, BLKADDR_RVUM, in otx2_cptpf_vfpf_mbox_intr()
365 BIT_ULL(vf->intr_idx)); in otx2_cptpf_vfpf_mbox_intr()
379 struct otx2_mbox *mbox; in otx2_cptpf_vfpf_mbox_handler() local
383 cptpf = vf->cptpf; in otx2_cptpf_vfpf_mbox_handler()
384 mbox = &cptpf->vfpf_mbox; in otx2_cptpf_vfpf_mbox_handler()
385 /* sync with mbox memory region */ in otx2_cptpf_vfpf_mbox_handler()
387 mdev = &mbox->dev[vf->vf_id]; in otx2_cptpf_vfpf_mbox_handler()
388 /* Process received mbox messages */ in otx2_cptpf_vfpf_mbox_handler()
389 req_hdr = (struct mbox_hdr *)(mdev->mbase + mbox->rx_start); in otx2_cptpf_vfpf_mbox_handler()
390 offset = mbox->rx_start + ALIGN(sizeof(*req_hdr), MBOX_MSG_ALIGN); in otx2_cptpf_vfpf_mbox_handler()
392 for (i = 0; i < req_hdr->num_msgs; i++) { in otx2_cptpf_vfpf_mbox_handler()
393 msg = (struct mbox_msghdr *)(mdev->mbase + offset); in otx2_cptpf_vfpf_mbox_handler()
395 /* Set which VF sent this message based on mbox IRQ */ in otx2_cptpf_vfpf_mbox_handler()
396 msg->pcifunc = rvu_make_pcifunc(cptpf->pdev, cptpf->pf_id, in otx2_cptpf_vfpf_mbox_handler()
397 (vf->vf_id + 1)); in otx2_cptpf_vfpf_mbox_handler()
399 msg->next_msgoff - offset); in otx2_cptpf_vfpf_mbox_handler()
404 if (err == -ENOMEM || err == -EIO) in otx2_cptpf_vfpf_mbox_handler()
406 offset = msg->next_msgoff; in otx2_cptpf_vfpf_mbox_handler()
412 /* Send mbox responses to VF */ in otx2_cptpf_vfpf_mbox_handler()
413 if (mdev->num_msgs) in otx2_cptpf_vfpf_mbox_handler()
414 otx2_mbox_msg_send(mbox, vf->vf_id); in otx2_cptpf_vfpf_mbox_handler()
421 struct otx2_mbox *mbox; in otx2_cptpf_afpf_mbox_intr() local
426 intr = otx2_cpt_read64(cptpf->reg_base, BLKADDR_RVUM, 0, RVU_PF_INT); in otx2_cptpf_afpf_mbox_intr()
429 mbox = &cptpf->afpf_mbox; in otx2_cptpf_afpf_mbox_intr()
430 mdev = &mbox->dev[0]; in otx2_cptpf_afpf_mbox_intr()
431 hdr = mdev->mbase + mbox->rx_start; in otx2_cptpf_afpf_mbox_intr()
432 if (hdr->num_msgs) in otx2_cptpf_afpf_mbox_intr()
433 /* Schedule work queue function to process the MBOX request */ in otx2_cptpf_afpf_mbox_intr()
434 queue_work(cptpf->afpf_mbox_wq, &cptpf->afpf_mbox_work); in otx2_cptpf_afpf_mbox_intr()
436 mbox = &cptpf->afpf_mbox_up; in otx2_cptpf_afpf_mbox_intr()
437 mdev = &mbox->dev[0]; in otx2_cptpf_afpf_mbox_intr()
438 hdr = mdev->mbase + mbox->rx_start; in otx2_cptpf_afpf_mbox_intr()
439 if (hdr->num_msgs) in otx2_cptpf_afpf_mbox_intr()
440 /* Schedule work queue function to process the MBOX request */ in otx2_cptpf_afpf_mbox_intr()
441 queue_work(cptpf->afpf_mbox_wq, &cptpf->afpf_mbox_up_work); in otx2_cptpf_afpf_mbox_intr()
443 otx2_cpt_write64(cptpf->reg_base, BLKADDR_RVUM, 0, RVU_PF_INT, in otx2_cptpf_afpf_mbox_intr()
452 struct otx2_cptlfs_info *lfs = &cptpf->lfs; in process_afpf_mbox_msg()
453 struct device *dev = &cptpf->pdev->dev; in process_afpf_mbox_msg()
458 if (msg->id >= MBOX_MSG_MAX) { in process_afpf_mbox_msg()
459 dev_err(dev, "MBOX msg with unknown ID %d\n", msg->id); in process_afpf_mbox_msg()
462 if (msg->sig != OTX2_MBOX_RSP_SIG) { in process_afpf_mbox_msg()
463 dev_err(dev, "MBOX msg with wrong signature %x, ID %d\n", in process_afpf_mbox_msg()
464 msg->sig, msg->id); in process_afpf_mbox_msg()
467 if (cptpf->rsrc_req_blkaddr == BLKADDR_CPT1) in process_afpf_mbox_msg()
468 lfs = &cptpf->cpt1_lfs; in process_afpf_mbox_msg()
470 switch (msg->id) { in process_afpf_mbox_msg()
472 cptpf->pf_id = rvu_get_pf(cptpf->pdev, msg->pcifunc); in process_afpf_mbox_msg()
476 for (i = 0; i < rsp_msix->cptlfs; i++) in process_afpf_mbox_msg()
477 lfs->lf[i].msix_offset = rsp_msix->cptlf_msixoff[i]; in process_afpf_mbox_msg()
479 for (i = 0; i < rsp_msix->cpt1_lfs; i++) in process_afpf_mbox_msg()
480 lfs->lf[i].msix_offset = rsp_msix->cpt1_lf_msixoff[i]; in process_afpf_mbox_msg()
484 if (msg->rc) { in process_afpf_mbox_msg()
486 rsp_rd_wr->reg_offset, rsp_rd_wr->is_write, in process_afpf_mbox_msg()
487 msg->rc); in process_afpf_mbox_msg()
490 if (!rsp_rd_wr->is_write) in process_afpf_mbox_msg()
491 *rsp_rd_wr->ret_val = rsp_rd_wr->val; in process_afpf_mbox_msg()
494 if (!msg->rc) in process_afpf_mbox_msg()
495 lfs->are_lfs_attached = 1; in process_afpf_mbox_msg()
498 if (!msg->rc) in process_afpf_mbox_msg()
499 lfs->are_lfs_attached = 0; in process_afpf_mbox_msg()
509 "Unsupported msg %d received.\n", msg->id); in process_afpf_mbox_msg()
520 if (msg->id >= MBOX_MSG_MAX) { in forward_to_vf()
521 dev_err(&cptpf->pdev->dev, in forward_to_vf()
522 "MBOX msg with unknown ID %d\n", msg->id); in forward_to_vf()
525 if (msg->sig != OTX2_MBOX_RSP_SIG) { in forward_to_vf()
526 dev_err(&cptpf->pdev->dev, in forward_to_vf()
527 "MBOX msg with wrong signature %x, ID %d\n", in forward_to_vf()
528 msg->sig, msg->id); in forward_to_vf()
531 vfpf_mbox = &cptpf->vfpf_mbox; in forward_to_vf()
532 vf_id--; in forward_to_vf()
533 if (vf_id >= cptpf->enabled_vfs) { in forward_to_vf()
534 dev_err(&cptpf->pdev->dev, in forward_to_vf()
535 "MBOX msg to unknown VF: %d >= %d\n", in forward_to_vf()
536 vf_id, cptpf->enabled_vfs); in forward_to_vf()
539 if (msg->id == MBOX_MSG_VF_FLR) in forward_to_vf()
544 dev_err(&cptpf->pdev->dev, in forward_to_vf()
550 fwd->id = msg->id; in forward_to_vf()
551 fwd->pcifunc = msg->pcifunc; in forward_to_vf()
552 fwd->sig = msg->sig; in forward_to_vf()
553 fwd->ver = msg->ver; in forward_to_vf()
554 fwd->rc = msg->rc; in forward_to_vf()
568 afpf_mbox = &cptpf->afpf_mbox; in otx2_cptpf_afpf_mbox_handler()
569 mdev = &afpf_mbox->dev[0]; in otx2_cptpf_afpf_mbox_handler()
570 /* Sync mbox data into memory */ in otx2_cptpf_afpf_mbox_handler()
573 rsp_hdr = (struct mbox_hdr *)(mdev->mbase + afpf_mbox->rx_start); in otx2_cptpf_afpf_mbox_handler()
576 for (i = 0; i < rsp_hdr->num_msgs; i++) { in otx2_cptpf_afpf_mbox_handler()
577 msg = (struct mbox_msghdr *)(mdev->mbase + afpf_mbox->rx_start + in otx2_cptpf_afpf_mbox_handler()
579 vf_id = (msg->pcifunc >> RVU_PFVF_FUNC_SHIFT) & in otx2_cptpf_afpf_mbox_handler()
583 msg->next_msgoff - offset); in otx2_cptpf_afpf_mbox_handler()
587 offset = msg->next_msgoff; in otx2_cptpf_afpf_mbox_handler()
590 mdev->msgs_acked++; in otx2_cptpf_afpf_mbox_handler()
599 struct otx2_cptlfs_info *lfs = &cptpf->lfs; in handle_msg_cpt_inst_lmtst()
602 if (cptpf->lfs.lfs_num) in handle_msg_cpt_inst_lmtst()
603 lfs->ops->send_cmd((union otx2_cpt_inst_s *)req->inst, 1, in handle_msg_cpt_inst_lmtst()
604 &lfs->lf[0]); in handle_msg_cpt_inst_lmtst()
606 rsp = (struct msg_rsp *)otx2_mbox_alloc_msg(&cptpf->afpf_mbox_up, 0, in handle_msg_cpt_inst_lmtst()
611 rsp->hdr.id = msg->id; in handle_msg_cpt_inst_lmtst()
612 rsp->hdr.sig = OTX2_MBOX_RSP_SIG; in handle_msg_cpt_inst_lmtst()
613 rsp->hdr.pcifunc = 0; in handle_msg_cpt_inst_lmtst()
614 rsp->hdr.rc = 0; in handle_msg_cpt_inst_lmtst()
620 if (msg->id >= MBOX_MSG_MAX) { in process_afpf_mbox_up_msg()
621 dev_err(&cptpf->pdev->dev, in process_afpf_mbox_up_msg()
622 "MBOX msg with unknown ID %d\n", msg->id); in process_afpf_mbox_up_msg()
626 switch (msg->id) { in process_afpf_mbox_up_msg()
631 otx2_reply_invalid_msg(&cptpf->afpf_mbox_up, 0, 0, msg->id); in process_afpf_mbox_up_msg()
641 struct otx2_mbox *mbox; in otx2_cptpf_afpf_mbox_up_handler() local
645 mbox = &cptpf->afpf_mbox_up; in otx2_cptpf_afpf_mbox_up_handler()
646 mdev = &mbox->dev[0]; in otx2_cptpf_afpf_mbox_up_handler()
647 /* Sync mbox data into memory */ in otx2_cptpf_afpf_mbox_up_handler()
650 rsp_hdr = (struct mbox_hdr *)(mdev->mbase + mbox->rx_start); in otx2_cptpf_afpf_mbox_up_handler()
651 offset = mbox->rx_start + ALIGN(sizeof(*rsp_hdr), MBOX_MSG_ALIGN); in otx2_cptpf_afpf_mbox_up_handler()
653 for (i = 0; i < rsp_hdr->num_msgs; i++) { in otx2_cptpf_afpf_mbox_up_handler()
654 msg = (struct mbox_msghdr *)(mdev->mbase + offset); in otx2_cptpf_afpf_mbox_up_handler()
658 offset = mbox->rx_start + msg->next_msgoff; in otx2_cptpf_afpf_mbox_up_handler()
660 otx2_mbox_msg_send(mbox, 0); in otx2_cptpf_afpf_mbox_up_handler()