1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Cavium, Inc
7 #include "otx_cryptodev_hw_access.h"
8 #include "otx_cryptodev_mbox.h"
11 otx_cpt_handle_mbox_intr(struct cpt_vf *cptvf)
13 struct cpt_mbox mbx = {0, 0};
16 * MBOX[0] contains msg
17 * MBOX[1] contains data
19 mbx.msg = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
20 CPTX_VFX_PF_MBOXX(0, 0, 0));
21 mbx.data = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
22 CPTX_VFX_PF_MBOXX(0, 0, 1));
24 CPT_LOG_DP_DEBUG("%s: Mailbox msg 0x%lx from PF",
25 cptvf->dev_name, (unsigned int long)mbx.msg);
27 case OTX_CPT_MSG_VF_UP:
28 cptvf->pf_acked = true;
30 case OTX_CPT_MSG_READY:
32 otx_cpt_chipid_vfid_t cid;
35 cptvf->pf_acked = true;
36 cptvf->vfid = cid.s.vfid;
37 CPT_LOG_DP_DEBUG("%s: Received VFID %d chip_id %d",
39 cptvf->vfid, cid.s.chip_id);
42 case OTX_CPT_MSG_QBIND_GRP:
43 cptvf->pf_acked = true;
44 cptvf->vftype = mbx.data;
45 CPT_LOG_DP_DEBUG("%s: VF %d type %s group %d",
46 cptvf->dev_name, cptvf->vfid,
47 ((mbx.data == SE_TYPE) ? "SE" : "AE"),
50 case OTX_CPT_MBOX_MSG_TYPE_ACK:
51 cptvf->pf_acked = true;
53 case OTX_CPT_MBOX_MSG_TYPE_NACK:
54 cptvf->pf_nacked = true;
57 CPT_LOG_DP_DEBUG("%s: Invalid msg from PF, msg 0x%lx",
58 cptvf->dev_name, (unsigned int long)mbx.msg);
63 /* Send a mailbox message to PF
64 * @vf: vf from which this message to be sent
65 * @mbx: Message to be sent
68 otx_cpt_send_msg_to_pf(struct cpt_vf *cptvf, struct cpt_mbox *mbx)
70 /* Writing mbox(1) causes interrupt */
71 CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
72 CPTX_VFX_PF_MBOXX(0, 0, 0), mbx->msg);
73 CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
74 CPTX_VFX_PF_MBOXX(0, 0, 1), mbx->data);
78 otx_cpt_send_msg_to_pf_timeout(struct cpt_vf *cptvf, struct cpt_mbox *mbx)
80 int timeout = OTX_CPT_MBOX_MSG_TIMEOUT;
83 cptvf->pf_acked = false;
84 cptvf->pf_nacked = false;
86 otx_cpt_send_msg_to_pf(cptvf, mbx);
88 /* Wait for previous message to be acked, timeout 2sec */
89 while (!cptvf->pf_acked) {
92 usleep(sleep_ms * 1000);
93 otx_cpt_poll_misc(cptvf);
98 CPT_LOG_ERR("%s: PF didn't ack mbox msg %lx(vfid %u)",
100 (unsigned int long)(mbx->msg & 0xFF),
109 otx_cpt_check_pf_ready(struct cpt_vf *cptvf)
111 struct cpt_mbox mbx = {0, 0};
113 mbx.msg = OTX_CPT_MSG_READY;
114 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
115 CPT_LOG_ERR("%s: PF didn't respond to READY msg",
123 otx_cpt_send_vq_size_msg(struct cpt_vf *cptvf)
125 struct cpt_mbox mbx = {0, 0};
127 mbx.msg = OTX_CPT_MSG_QLEN;
129 mbx.data = cptvf->qsize;
130 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
131 CPT_LOG_ERR("%s: PF didn't respond to vq_size msg",
139 otx_cpt_send_vf_grp_msg(struct cpt_vf *cptvf, uint32_t group)
141 struct cpt_mbox mbx = {0, 0};
143 mbx.msg = OTX_CPT_MSG_QBIND_GRP;
145 /* Convey group of the VF */
147 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
148 CPT_LOG_ERR("%s: PF didn't respond to vf_type msg",
156 otx_cpt_send_vf_up(struct cpt_vf *cptvf)
158 struct cpt_mbox mbx = {0, 0};
160 mbx.msg = OTX_CPT_MSG_VF_UP;
161 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
162 CPT_LOG_ERR("%s: PF didn't respond to UP msg",
170 otx_cpt_send_vf_down(struct cpt_vf *cptvf)
172 struct cpt_mbox mbx = {0, 0};
174 mbx.msg = OTX_CPT_MSG_VF_DOWN;
175 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
176 CPT_LOG_ERR("%s: PF didn't respond to DOWN msg",