183ffcf78SSrujana Challa // SPDX-License-Identifier: GPL-2.0-only
283ffcf78SSrujana Challa /* Copyright (C) 2020 Marvell. */
383ffcf78SSrujana Challa
483ffcf78SSrujana Challa #include "otx2_cpt_common.h"
564506017SSrujana Challa #include "otx2_cptlf.h"
683ffcf78SSrujana Challa
otx2_cpt_send_mbox_msg(struct otx2_mbox * mbox,struct pci_dev * pdev)783ffcf78SSrujana Challa int otx2_cpt_send_mbox_msg(struct otx2_mbox *mbox, struct pci_dev *pdev)
883ffcf78SSrujana Challa {
983ffcf78SSrujana Challa int ret;
1083ffcf78SSrujana Challa
1183ffcf78SSrujana Challa otx2_mbox_msg_send(mbox, 0);
1283ffcf78SSrujana Challa ret = otx2_mbox_wait_for_rsp(mbox, 0);
1383ffcf78SSrujana Challa if (ret == -EIO) {
1483ffcf78SSrujana Challa dev_err(&pdev->dev, "RVU MBOX timeout.\n");
1583ffcf78SSrujana Challa return ret;
1683ffcf78SSrujana Challa } else if (ret) {
1783ffcf78SSrujana Challa dev_err(&pdev->dev, "RVU MBOX error: %d.\n", ret);
1883ffcf78SSrujana Challa return -EFAULT;
1983ffcf78SSrujana Challa }
2083ffcf78SSrujana Challa return ret;
2183ffcf78SSrujana Challa }
2272bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_mbox_msg, CRYPTO_DEV_OCTEONTX2_CPT);
2383ffcf78SSrujana Challa
otx2_cpt_send_ready_msg(struct otx2_mbox * mbox,struct pci_dev * pdev)2483ffcf78SSrujana Challa int otx2_cpt_send_ready_msg(struct otx2_mbox *mbox, struct pci_dev *pdev)
2583ffcf78SSrujana Challa {
2683ffcf78SSrujana Challa struct mbox_msghdr *req;
2783ffcf78SSrujana Challa
2883ffcf78SSrujana Challa req = otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),
2983ffcf78SSrujana Challa sizeof(struct ready_msg_rsp));
3083ffcf78SSrujana Challa if (req == NULL) {
3183ffcf78SSrujana Challa dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");
3283ffcf78SSrujana Challa return -EFAULT;
3383ffcf78SSrujana Challa }
3483ffcf78SSrujana Challa req->id = MBOX_MSG_READY;
3583ffcf78SSrujana Challa req->sig = OTX2_MBOX_REQ_SIG;
3683ffcf78SSrujana Challa req->pcifunc = 0;
3783ffcf78SSrujana Challa
3883ffcf78SSrujana Challa return otx2_cpt_send_mbox_msg(mbox, pdev);
3983ffcf78SSrujana Challa }
4072bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_ready_msg, CRYPTO_DEV_OCTEONTX2_CPT);
4143ac0b82SSrujana Challa
otx2_cpt_send_af_reg_requests(struct otx2_mbox * mbox,struct pci_dev * pdev)4243ac0b82SSrujana Challa int otx2_cpt_send_af_reg_requests(struct otx2_mbox *mbox, struct pci_dev *pdev)
4343ac0b82SSrujana Challa {
4443ac0b82SSrujana Challa return otx2_cpt_send_mbox_msg(mbox, pdev);
4543ac0b82SSrujana Challa }
4672bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_af_reg_requests, CRYPTO_DEV_OCTEONTX2_CPT);
4743ac0b82SSrujana Challa
otx2_cpt_add_read_af_reg(struct otx2_mbox * mbox,struct pci_dev * pdev,u64 reg,u64 * val,int blkaddr)4872bc4e71SAlexander Lobakin static int otx2_cpt_add_read_af_reg(struct otx2_mbox *mbox,
4972bc4e71SAlexander Lobakin struct pci_dev *pdev, u64 reg,
5072bc4e71SAlexander Lobakin u64 *val, int blkaddr)
5143ac0b82SSrujana Challa {
5243ac0b82SSrujana Challa struct cpt_rd_wr_reg_msg *reg_msg;
5343ac0b82SSrujana Challa
5443ac0b82SSrujana Challa reg_msg = (struct cpt_rd_wr_reg_msg *)
5543ac0b82SSrujana Challa otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*reg_msg),
5643ac0b82SSrujana Challa sizeof(*reg_msg));
5743ac0b82SSrujana Challa if (reg_msg == NULL) {
5843ac0b82SSrujana Challa dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");
5943ac0b82SSrujana Challa return -EFAULT;
6043ac0b82SSrujana Challa }
6143ac0b82SSrujana Challa
6243ac0b82SSrujana Challa reg_msg->hdr.id = MBOX_MSG_CPT_RD_WR_REGISTER;
6343ac0b82SSrujana Challa reg_msg->hdr.sig = OTX2_MBOX_REQ_SIG;
6443ac0b82SSrujana Challa reg_msg->hdr.pcifunc = 0;
6543ac0b82SSrujana Challa
6643ac0b82SSrujana Challa reg_msg->is_write = 0;
6743ac0b82SSrujana Challa reg_msg->reg_offset = reg;
6843ac0b82SSrujana Challa reg_msg->ret_val = val;
69b2d17df3SSrujana Challa reg_msg->blkaddr = blkaddr;
7043ac0b82SSrujana Challa
7143ac0b82SSrujana Challa return 0;
7243ac0b82SSrujana Challa }
7343ac0b82SSrujana Challa
otx2_cpt_add_write_af_reg(struct otx2_mbox * mbox,struct pci_dev * pdev,u64 reg,u64 val,int blkaddr)7443ac0b82SSrujana Challa int otx2_cpt_add_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
75b2d17df3SSrujana Challa u64 reg, u64 val, int blkaddr)
7643ac0b82SSrujana Challa {
7743ac0b82SSrujana Challa struct cpt_rd_wr_reg_msg *reg_msg;
7843ac0b82SSrujana Challa
7943ac0b82SSrujana Challa reg_msg = (struct cpt_rd_wr_reg_msg *)
8043ac0b82SSrujana Challa otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*reg_msg),
8143ac0b82SSrujana Challa sizeof(*reg_msg));
8243ac0b82SSrujana Challa if (reg_msg == NULL) {
8343ac0b82SSrujana Challa dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");
8443ac0b82SSrujana Challa return -EFAULT;
8543ac0b82SSrujana Challa }
8643ac0b82SSrujana Challa
8743ac0b82SSrujana Challa reg_msg->hdr.id = MBOX_MSG_CPT_RD_WR_REGISTER;
8843ac0b82SSrujana Challa reg_msg->hdr.sig = OTX2_MBOX_REQ_SIG;
8943ac0b82SSrujana Challa reg_msg->hdr.pcifunc = 0;
9043ac0b82SSrujana Challa
9143ac0b82SSrujana Challa reg_msg->is_write = 1;
9243ac0b82SSrujana Challa reg_msg->reg_offset = reg;
9343ac0b82SSrujana Challa reg_msg->val = val;
94b2d17df3SSrujana Challa reg_msg->blkaddr = blkaddr;
9543ac0b82SSrujana Challa
9643ac0b82SSrujana Challa return 0;
9743ac0b82SSrujana Challa }
9872bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(otx2_cpt_add_write_af_reg, CRYPTO_DEV_OCTEONTX2_CPT);
9943ac0b82SSrujana Challa
otx2_cpt_read_af_reg(struct otx2_mbox * mbox,struct pci_dev * pdev,u64 reg,u64 * val,int blkaddr)10043ac0b82SSrujana Challa int otx2_cpt_read_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
101b2d17df3SSrujana Challa u64 reg, u64 *val, int blkaddr)
10243ac0b82SSrujana Challa {
10343ac0b82SSrujana Challa int ret;
10443ac0b82SSrujana Challa
105b2d17df3SSrujana Challa ret = otx2_cpt_add_read_af_reg(mbox, pdev, reg, val, blkaddr);
10643ac0b82SSrujana Challa if (ret)
10743ac0b82SSrujana Challa return ret;
10843ac0b82SSrujana Challa
10943ac0b82SSrujana Challa return otx2_cpt_send_mbox_msg(mbox, pdev);
11043ac0b82SSrujana Challa }
11172bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(otx2_cpt_read_af_reg, CRYPTO_DEV_OCTEONTX2_CPT);
11243ac0b82SSrujana Challa
otx2_cpt_write_af_reg(struct otx2_mbox * mbox,struct pci_dev * pdev,u64 reg,u64 val,int blkaddr)11343ac0b82SSrujana Challa int otx2_cpt_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
114b2d17df3SSrujana Challa u64 reg, u64 val, int blkaddr)
11543ac0b82SSrujana Challa {
11643ac0b82SSrujana Challa int ret;
11743ac0b82SSrujana Challa
118b2d17df3SSrujana Challa ret = otx2_cpt_add_write_af_reg(mbox, pdev, reg, val, blkaddr);
11943ac0b82SSrujana Challa if (ret)
12043ac0b82SSrujana Challa return ret;
12143ac0b82SSrujana Challa
12243ac0b82SSrujana Challa return otx2_cpt_send_mbox_msg(mbox, pdev);
12343ac0b82SSrujana Challa }
12472bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(otx2_cpt_write_af_reg, CRYPTO_DEV_OCTEONTX2_CPT);
12564506017SSrujana Challa
otx2_cpt_attach_rscrs_msg(struct otx2_cptlfs_info * lfs)12664506017SSrujana Challa int otx2_cpt_attach_rscrs_msg(struct otx2_cptlfs_info *lfs)
12764506017SSrujana Challa {
12864506017SSrujana Challa struct otx2_mbox *mbox = lfs->mbox;
12964506017SSrujana Challa struct rsrc_attach *req;
13064506017SSrujana Challa int ret;
13164506017SSrujana Challa
13264506017SSrujana Challa req = (struct rsrc_attach *)
13364506017SSrujana Challa otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),
13464506017SSrujana Challa sizeof(struct msg_rsp));
13564506017SSrujana Challa if (req == NULL) {
13664506017SSrujana Challa dev_err(&lfs->pdev->dev, "RVU MBOX failed to get message.\n");
13764506017SSrujana Challa return -EFAULT;
13864506017SSrujana Challa }
13964506017SSrujana Challa
14064506017SSrujana Challa req->hdr.id = MBOX_MSG_ATTACH_RESOURCES;
14164506017SSrujana Challa req->hdr.sig = OTX2_MBOX_REQ_SIG;
14264506017SSrujana Challa req->hdr.pcifunc = 0;
14364506017SSrujana Challa req->cptlfs = lfs->lfs_num;
144*a4855a8cSSrujana Challa req->cpt_blkaddr = lfs->blkaddr;
145*a4855a8cSSrujana Challa req->modify = 1;
14664506017SSrujana Challa ret = otx2_cpt_send_mbox_msg(mbox, lfs->pdev);
14764506017SSrujana Challa if (ret)
14864506017SSrujana Challa return ret;
14964506017SSrujana Challa
15064506017SSrujana Challa if (!lfs->are_lfs_attached)
15164506017SSrujana Challa ret = -EINVAL;
15264506017SSrujana Challa
15364506017SSrujana Challa return ret;
15464506017SSrujana Challa }
15564506017SSrujana Challa
otx2_cpt_detach_rsrcs_msg(struct otx2_cptlfs_info * lfs)15664506017SSrujana Challa int otx2_cpt_detach_rsrcs_msg(struct otx2_cptlfs_info *lfs)
15764506017SSrujana Challa {
15864506017SSrujana Challa struct otx2_mbox *mbox = lfs->mbox;
15964506017SSrujana Challa struct rsrc_detach *req;
16064506017SSrujana Challa int ret;
16164506017SSrujana Challa
16264506017SSrujana Challa req = (struct rsrc_detach *)
16364506017SSrujana Challa otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),
16464506017SSrujana Challa sizeof(struct msg_rsp));
16564506017SSrujana Challa if (req == NULL) {
16664506017SSrujana Challa dev_err(&lfs->pdev->dev, "RVU MBOX failed to get message.\n");
16764506017SSrujana Challa return -EFAULT;
16864506017SSrujana Challa }
16964506017SSrujana Challa
17064506017SSrujana Challa req->hdr.id = MBOX_MSG_DETACH_RESOURCES;
17164506017SSrujana Challa req->hdr.sig = OTX2_MBOX_REQ_SIG;
17264506017SSrujana Challa req->hdr.pcifunc = 0;
173*a4855a8cSSrujana Challa req->cptlfs = 1;
17464506017SSrujana Challa ret = otx2_cpt_send_mbox_msg(mbox, lfs->pdev);
17564506017SSrujana Challa if (ret)
17664506017SSrujana Challa return ret;
17764506017SSrujana Challa
17864506017SSrujana Challa if (lfs->are_lfs_attached)
17964506017SSrujana Challa ret = -EINVAL;
18064506017SSrujana Challa
18164506017SSrujana Challa return ret;
18264506017SSrujana Challa }
18372bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(otx2_cpt_detach_rsrcs_msg, CRYPTO_DEV_OCTEONTX2_CPT);
18419d8e8c7SSrujana Challa
otx2_cpt_msix_offset_msg(struct otx2_cptlfs_info * lfs)18519d8e8c7SSrujana Challa int otx2_cpt_msix_offset_msg(struct otx2_cptlfs_info *lfs)
18619d8e8c7SSrujana Challa {
18719d8e8c7SSrujana Challa struct otx2_mbox *mbox = lfs->mbox;
18819d8e8c7SSrujana Challa struct pci_dev *pdev = lfs->pdev;
18919d8e8c7SSrujana Challa struct mbox_msghdr *req;
19019d8e8c7SSrujana Challa int ret, i;
19119d8e8c7SSrujana Challa
19219d8e8c7SSrujana Challa req = otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),
19319d8e8c7SSrujana Challa sizeof(struct msix_offset_rsp));
19419d8e8c7SSrujana Challa if (req == NULL) {
19519d8e8c7SSrujana Challa dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");
19619d8e8c7SSrujana Challa return -EFAULT;
19719d8e8c7SSrujana Challa }
19819d8e8c7SSrujana Challa
19919d8e8c7SSrujana Challa req->id = MBOX_MSG_MSIX_OFFSET;
20019d8e8c7SSrujana Challa req->sig = OTX2_MBOX_REQ_SIG;
20119d8e8c7SSrujana Challa req->pcifunc = 0;
20219d8e8c7SSrujana Challa ret = otx2_cpt_send_mbox_msg(mbox, pdev);
20319d8e8c7SSrujana Challa if (ret)
20419d8e8c7SSrujana Challa return ret;
20519d8e8c7SSrujana Challa
20619d8e8c7SSrujana Challa for (i = 0; i < lfs->lfs_num; i++) {
20719d8e8c7SSrujana Challa if (lfs->lf[i].msix_offset == MSIX_VECTOR_INVALID) {
20819d8e8c7SSrujana Challa dev_err(&pdev->dev,
20919d8e8c7SSrujana Challa "Invalid msix offset %d for LF %d\n",
21019d8e8c7SSrujana Challa lfs->lf[i].msix_offset, i);
21119d8e8c7SSrujana Challa return -EINVAL;
21219d8e8c7SSrujana Challa }
21319d8e8c7SSrujana Challa }
21419d8e8c7SSrujana Challa return ret;
21519d8e8c7SSrujana Challa }
21672bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(otx2_cpt_msix_offset_msg, CRYPTO_DEV_OCTEONTX2_CPT);
2174363f3d3SHarman Kalra
otx2_cpt_sync_mbox_msg(struct otx2_mbox * mbox)2184363f3d3SHarman Kalra int otx2_cpt_sync_mbox_msg(struct otx2_mbox *mbox)
2194363f3d3SHarman Kalra {
2204363f3d3SHarman Kalra int err;
2214363f3d3SHarman Kalra
2224363f3d3SHarman Kalra if (!otx2_mbox_nonempty(mbox, 0))
2234363f3d3SHarman Kalra return 0;
2244363f3d3SHarman Kalra otx2_mbox_msg_send(mbox, 0);
2254363f3d3SHarman Kalra err = otx2_mbox_wait_for_rsp(mbox, 0);
2264363f3d3SHarman Kalra if (err)
2274363f3d3SHarman Kalra return err;
2284363f3d3SHarman Kalra
2294363f3d3SHarman Kalra return otx2_mbox_check_rsp_msgs(mbox, 0);
2304363f3d3SHarman Kalra }
23172bc4e71SAlexander Lobakin EXPORT_SYMBOL_NS_GPL(otx2_cpt_sync_mbox_msg, CRYPTO_DEV_OCTEONTX2_CPT);
232