]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/dpdk/drivers/crypto/octeontx/otx_cryptodev_mbox.c
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / dpdk / drivers / crypto / octeontx / otx_cryptodev_mbox.c
CommitLineData
9f95a23c
TL
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Cavium, Inc
3 */
4
5#include <unistd.h>
6
7#include "otx_cryptodev_hw_access.h"
8#include "otx_cryptodev_mbox.h"
9
10void
11otx_cpt_handle_mbox_intr(struct cpt_vf *cptvf)
12{
13 struct cpt_mbox mbx = {0, 0};
14
15 /*
16 * MBOX[0] contains msg
17 * MBOX[1] contains data
18 */
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));
23
24 CPT_LOG_DP_DEBUG("%s: Mailbox msg 0x%lx from PF",
25 cptvf->dev_name, (unsigned int long)mbx.msg);
26 switch (mbx.msg) {
f67539c2
TL
27 case OTX_CPT_MSG_VF_UP:
28 cptvf->pf_acked = true;
29 break;
9f95a23c
TL
30 case OTX_CPT_MSG_READY:
31 {
32 otx_cpt_chipid_vfid_t cid;
33
34 cid.u64 = mbx.data;
35 cptvf->pf_acked = true;
36 cptvf->vfid = cid.s.vfid;
37 CPT_LOG_DP_DEBUG("%s: Received VFID %d chip_id %d",
38 cptvf->dev_name,
39 cptvf->vfid, cid.s.chip_id);
40 }
41 break;
42 case OTX_CPT_MSG_QBIND_GRP:
43 cptvf->pf_acked = true;
44 cptvf->vftype = mbx.data;
f67539c2 45 CPT_LOG_DP_DEBUG("%s: VF %d group %d",
9f95a23c 46 cptvf->dev_name, cptvf->vfid,
9f95a23c
TL
47 cptvf->vfgrp);
48 break;
f67539c2
TL
49 case OTX_CPT_MSG_PF_TYPE:
50 cptvf->pf_acked = true;
51 if (mbx.data == OTX_CPT_PF_TYPE_AE)
52 cptvf->vftype = OTX_CPT_VF_TYPE_AE;
53 else if (mbx.data == OTX_CPT_PF_TYPE_SE)
54 cptvf->vftype = OTX_CPT_VF_TYPE_SE;
55 else
56 cptvf->vftype = OTX_CPT_VF_TYPE_INVALID;
57 break;
9f95a23c
TL
58 case OTX_CPT_MBOX_MSG_TYPE_ACK:
59 cptvf->pf_acked = true;
60 break;
61 case OTX_CPT_MBOX_MSG_TYPE_NACK:
62 cptvf->pf_nacked = true;
63 break;
64 default:
65 CPT_LOG_DP_DEBUG("%s: Invalid msg from PF, msg 0x%lx",
66 cptvf->dev_name, (unsigned int long)mbx.msg);
67 break;
68 }
69}
70
71/* Send a mailbox message to PF
72 * @vf: vf from which this message to be sent
73 * @mbx: Message to be sent
74 */
75static void
76otx_cpt_send_msg_to_pf(struct cpt_vf *cptvf, struct cpt_mbox *mbx)
77{
78 /* Writing mbox(1) causes interrupt */
79 CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
80 CPTX_VFX_PF_MBOXX(0, 0, 0), mbx->msg);
81 CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
82 CPTX_VFX_PF_MBOXX(0, 0, 1), mbx->data);
83}
84
85static int32_t
86otx_cpt_send_msg_to_pf_timeout(struct cpt_vf *cptvf, struct cpt_mbox *mbx)
87{
88 int timeout = OTX_CPT_MBOX_MSG_TIMEOUT;
89 int sleep_ms = 10;
90
91 cptvf->pf_acked = false;
92 cptvf->pf_nacked = false;
93
94 otx_cpt_send_msg_to_pf(cptvf, mbx);
95
96 /* Wait for previous message to be acked, timeout 2sec */
97 while (!cptvf->pf_acked) {
98 if (cptvf->pf_nacked)
99 return -EINVAL;
100 usleep(sleep_ms * 1000);
101 otx_cpt_poll_misc(cptvf);
102 if (cptvf->pf_acked)
103 break;
104 timeout -= sleep_ms;
105 if (!timeout) {
106 CPT_LOG_ERR("%s: PF didn't ack mbox msg %lx(vfid %u)",
107 cptvf->dev_name,
108 (unsigned int long)(mbx->msg & 0xFF),
109 cptvf->vfid);
110 return -EBUSY;
111 }
112 }
113 return 0;
114}
115
116int
117otx_cpt_check_pf_ready(struct cpt_vf *cptvf)
118{
119 struct cpt_mbox mbx = {0, 0};
120
121 mbx.msg = OTX_CPT_MSG_READY;
122 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
123 CPT_LOG_ERR("%s: PF didn't respond to READY msg",
124 cptvf->dev_name);
125 return 1;
126 }
127 return 0;
128}
129
f67539c2
TL
130int
131otx_cpt_get_dev_type(struct cpt_vf *cptvf)
132{
133 struct cpt_mbox mbx = {0, 0};
134
135 mbx.msg = OTX_CPT_MSG_PF_TYPE;
136 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
137 CPT_LOG_ERR("%s: PF didn't respond to query msg",
138 cptvf->dev_name);
139 return 1;
140 }
141 return 0;
142}
143
9f95a23c
TL
144int
145otx_cpt_send_vq_size_msg(struct cpt_vf *cptvf)
146{
147 struct cpt_mbox mbx = {0, 0};
148
149 mbx.msg = OTX_CPT_MSG_QLEN;
150
151 mbx.data = cptvf->qsize;
152 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
153 CPT_LOG_ERR("%s: PF didn't respond to vq_size msg",
154 cptvf->dev_name);
155 return 1;
156 }
157 return 0;
158}
159
160int
161otx_cpt_send_vf_grp_msg(struct cpt_vf *cptvf, uint32_t group)
162{
163 struct cpt_mbox mbx = {0, 0};
164
165 mbx.msg = OTX_CPT_MSG_QBIND_GRP;
166
167 /* Convey group of the VF */
168 mbx.data = group;
169 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
170 CPT_LOG_ERR("%s: PF didn't respond to vf_type msg",
171 cptvf->dev_name);
172 return 1;
173 }
174 return 0;
175}
176
177int
178otx_cpt_send_vf_up(struct cpt_vf *cptvf)
179{
180 struct cpt_mbox mbx = {0, 0};
181
182 mbx.msg = OTX_CPT_MSG_VF_UP;
183 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
184 CPT_LOG_ERR("%s: PF didn't respond to UP msg",
185 cptvf->dev_name);
186 return 1;
187 }
188 return 0;
189}
190
191int
192otx_cpt_send_vf_down(struct cpt_vf *cptvf)
193{
194 struct cpt_mbox mbx = {0, 0};
195
196 mbx.msg = OTX_CPT_MSG_VF_DOWN;
197 if (otx_cpt_send_msg_to_pf_timeout(cptvf, &mbx)) {
198 CPT_LOG_ERR("%s: PF didn't respond to DOWN msg",
199 cptvf->dev_name);
200 return 1;
201 }
202 return 0;
203}