xref: /openbmc/linux/drivers/crypto/marvell/octeontx2/otx2_cpt_mbox_common.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
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