brintos

brintos / linux-shallow public Read only

0
0
Text · 6.2 KiB · 5be0103 Raw
258 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/* Copyright (C) 2020 Marvell. */3 4#include "otx2_cpt_common.h"5#include "otx2_cptlf.h"6 7int otx2_cpt_send_mbox_msg(struct otx2_mbox *mbox, struct pci_dev *pdev)8{9	int ret;10 11	otx2_mbox_msg_send(mbox, 0);12	ret = otx2_mbox_wait_for_rsp(mbox, 0);13	if (ret == -EIO) {14		dev_err(&pdev->dev, "RVU MBOX timeout.\n");15		return ret;16	} else if (ret) {17		dev_err(&pdev->dev, "RVU MBOX error: %d.\n", ret);18		return -EFAULT;19	}20	return ret;21}22EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_mbox_msg, CRYPTO_DEV_OCTEONTX2_CPT);23 24int otx2_cpt_send_ready_msg(struct otx2_mbox *mbox, struct pci_dev *pdev)25{26	struct mbox_msghdr *req;27 28	req = otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),29				      sizeof(struct ready_msg_rsp));30	if (req == NULL) {31		dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");32		return -EFAULT;33	}34	req->id = MBOX_MSG_READY;35	req->sig = OTX2_MBOX_REQ_SIG;36	req->pcifunc = 0;37 38	return otx2_cpt_send_mbox_msg(mbox, pdev);39}40EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_ready_msg, CRYPTO_DEV_OCTEONTX2_CPT);41 42int otx2_cpt_send_af_reg_requests(struct otx2_mbox *mbox, struct pci_dev *pdev)43{44	return otx2_cpt_send_mbox_msg(mbox, pdev);45}46EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_af_reg_requests, CRYPTO_DEV_OCTEONTX2_CPT);47 48static int otx2_cpt_add_read_af_reg(struct otx2_mbox *mbox,49				    struct pci_dev *pdev, u64 reg,50				    u64 *val, int blkaddr)51{52	struct cpt_rd_wr_reg_msg *reg_msg;53 54	reg_msg = (struct cpt_rd_wr_reg_msg *)55			otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*reg_msg),56						sizeof(*reg_msg));57	if (reg_msg == NULL) {58		dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");59		return -EFAULT;60	}61 62	reg_msg->hdr.id = MBOX_MSG_CPT_RD_WR_REGISTER;63	reg_msg->hdr.sig = OTX2_MBOX_REQ_SIG;64	reg_msg->hdr.pcifunc = 0;65 66	reg_msg->is_write = 0;67	reg_msg->reg_offset = reg;68	reg_msg->ret_val = val;69	reg_msg->blkaddr = blkaddr;70 71	return 0;72}73 74int otx2_cpt_add_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,75			      u64 reg, u64 val, int blkaddr)76{77	struct cpt_rd_wr_reg_msg *reg_msg;78 79	reg_msg = (struct cpt_rd_wr_reg_msg *)80			otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*reg_msg),81						sizeof(*reg_msg));82	if (reg_msg == NULL) {83		dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");84		return -EFAULT;85	}86 87	reg_msg->hdr.id = MBOX_MSG_CPT_RD_WR_REGISTER;88	reg_msg->hdr.sig = OTX2_MBOX_REQ_SIG;89	reg_msg->hdr.pcifunc = 0;90 91	reg_msg->is_write = 1;92	reg_msg->reg_offset = reg;93	reg_msg->val = val;94	reg_msg->blkaddr = blkaddr;95 96	return 0;97}98EXPORT_SYMBOL_NS_GPL(otx2_cpt_add_write_af_reg, CRYPTO_DEV_OCTEONTX2_CPT);99 100int otx2_cpt_read_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,101			 u64 reg, u64 *val, int blkaddr)102{103	int ret;104 105	ret = otx2_cpt_add_read_af_reg(mbox, pdev, reg, val, blkaddr);106	if (ret)107		return ret;108 109	return otx2_cpt_send_mbox_msg(mbox, pdev);110}111EXPORT_SYMBOL_NS_GPL(otx2_cpt_read_af_reg, CRYPTO_DEV_OCTEONTX2_CPT);112 113int otx2_cpt_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,114			  u64 reg, u64 val, int blkaddr)115{116	int ret;117 118	ret = otx2_cpt_add_write_af_reg(mbox, pdev, reg, val, blkaddr);119	if (ret)120		return ret;121 122	return otx2_cpt_send_mbox_msg(mbox, pdev);123}124EXPORT_SYMBOL_NS_GPL(otx2_cpt_write_af_reg, CRYPTO_DEV_OCTEONTX2_CPT);125 126int otx2_cpt_attach_rscrs_msg(struct otx2_cptlfs_info *lfs)127{128	struct otx2_mbox *mbox = lfs->mbox;129	struct rsrc_attach *req;130	int ret;131 132	req = (struct rsrc_attach *)133			otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),134						sizeof(struct msg_rsp));135	if (req == NULL) {136		dev_err(&lfs->pdev->dev, "RVU MBOX failed to get message.\n");137		return -EFAULT;138	}139 140	req->hdr.id = MBOX_MSG_ATTACH_RESOURCES;141	req->hdr.sig = OTX2_MBOX_REQ_SIG;142	req->hdr.pcifunc = 0;143	req->cptlfs = lfs->lfs_num;144	req->cpt_blkaddr = lfs->blkaddr;145	req->modify = 1;146	ret = otx2_cpt_send_mbox_msg(mbox, lfs->pdev);147	if (ret)148		return ret;149 150	if (!lfs->are_lfs_attached)151		ret = -EINVAL;152 153	return ret;154}155 156int otx2_cpt_detach_rsrcs_msg(struct otx2_cptlfs_info *lfs)157{158	struct otx2_mbox *mbox = lfs->mbox;159	struct rsrc_detach *req;160	int ret;161 162	req = (struct rsrc_detach *)163				otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),164							sizeof(struct msg_rsp));165	if (req == NULL) {166		dev_err(&lfs->pdev->dev, "RVU MBOX failed to get message.\n");167		return -EFAULT;168	}169 170	req->hdr.id = MBOX_MSG_DETACH_RESOURCES;171	req->hdr.sig = OTX2_MBOX_REQ_SIG;172	req->hdr.pcifunc = 0;173	req->cptlfs = 1;174	ret = otx2_cpt_send_mbox_msg(mbox, lfs->pdev);175	if (ret)176		return ret;177 178	if (lfs->are_lfs_attached)179		ret = -EINVAL;180 181	return ret;182}183EXPORT_SYMBOL_NS_GPL(otx2_cpt_detach_rsrcs_msg, CRYPTO_DEV_OCTEONTX2_CPT);184 185int otx2_cpt_msix_offset_msg(struct otx2_cptlfs_info *lfs)186{187	struct otx2_mbox *mbox = lfs->mbox;188	struct pci_dev *pdev = lfs->pdev;189	struct mbox_msghdr *req;190	int ret, i;191 192	req = otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),193				      sizeof(struct msix_offset_rsp));194	if (req == NULL) {195		dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");196		return -EFAULT;197	}198 199	req->id = MBOX_MSG_MSIX_OFFSET;200	req->sig = OTX2_MBOX_REQ_SIG;201	req->pcifunc = 0;202	ret = otx2_cpt_send_mbox_msg(mbox, pdev);203	if (ret)204		return ret;205 206	for (i = 0; i < lfs->lfs_num; i++) {207		if (lfs->lf[i].msix_offset == MSIX_VECTOR_INVALID) {208			dev_err(&pdev->dev,209				"Invalid msix offset %d for LF %d\n",210				lfs->lf[i].msix_offset, i);211			return -EINVAL;212		}213	}214	return ret;215}216EXPORT_SYMBOL_NS_GPL(otx2_cpt_msix_offset_msg, CRYPTO_DEV_OCTEONTX2_CPT);217 218int otx2_cpt_sync_mbox_msg(struct otx2_mbox *mbox)219{220	int err;221 222	if (!otx2_mbox_nonempty(mbox, 0))223		return 0;224	otx2_mbox_msg_send(mbox, 0);225	err = otx2_mbox_wait_for_rsp(mbox, 0);226	if (err)227		return err;228 229	return otx2_mbox_check_rsp_msgs(mbox, 0);230}231EXPORT_SYMBOL_NS_GPL(otx2_cpt_sync_mbox_msg, CRYPTO_DEV_OCTEONTX2_CPT);232 233int otx2_cpt_lf_reset_msg(struct otx2_cptlfs_info *lfs, int slot)234{235	struct otx2_mbox *mbox = lfs->mbox;236	struct pci_dev *pdev = lfs->pdev;237	struct cpt_lf_rst_req *req;238	int ret;239 240	req = (struct cpt_lf_rst_req *)otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),241							       sizeof(struct msg_rsp));242	if (!req) {243		dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");244		return -EFAULT;245	}246 247	req->hdr.id = MBOX_MSG_CPT_LF_RESET;248	req->hdr.sig = OTX2_MBOX_REQ_SIG;249	req->hdr.pcifunc = 0;250	req->slot = slot;251	ret = otx2_cpt_send_mbox_msg(mbox, pdev);252	if (ret)253		return ret;254 255	return ret;256}257EXPORT_SYMBOL_NS_GPL(otx2_cpt_lf_reset_msg, CRYPTO_DEV_OCTEONTX2_CPT);258