cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

otx2_cpt_mbox_common.c (4985B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/* 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}
     22
     23int otx2_cpt_send_ready_msg(struct otx2_mbox *mbox, struct pci_dev *pdev)
     24{
     25	struct mbox_msghdr *req;
     26
     27	req = otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),
     28				      sizeof(struct ready_msg_rsp));
     29	if (req == NULL) {
     30		dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");
     31		return -EFAULT;
     32	}
     33	req->id = MBOX_MSG_READY;
     34	req->sig = OTX2_MBOX_REQ_SIG;
     35	req->pcifunc = 0;
     36
     37	return otx2_cpt_send_mbox_msg(mbox, pdev);
     38}
     39
     40int otx2_cpt_send_af_reg_requests(struct otx2_mbox *mbox, struct pci_dev *pdev)
     41{
     42	return otx2_cpt_send_mbox_msg(mbox, pdev);
     43}
     44
     45int otx2_cpt_add_read_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
     46			     u64 reg, u64 *val, int blkaddr)
     47{
     48	struct cpt_rd_wr_reg_msg *reg_msg;
     49
     50	reg_msg = (struct cpt_rd_wr_reg_msg *)
     51			otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*reg_msg),
     52						sizeof(*reg_msg));
     53	if (reg_msg == NULL) {
     54		dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");
     55		return -EFAULT;
     56	}
     57
     58	reg_msg->hdr.id = MBOX_MSG_CPT_RD_WR_REGISTER;
     59	reg_msg->hdr.sig = OTX2_MBOX_REQ_SIG;
     60	reg_msg->hdr.pcifunc = 0;
     61
     62	reg_msg->is_write = 0;
     63	reg_msg->reg_offset = reg;
     64	reg_msg->ret_val = val;
     65	reg_msg->blkaddr = blkaddr;
     66
     67	return 0;
     68}
     69
     70int otx2_cpt_add_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
     71			      u64 reg, u64 val, int blkaddr)
     72{
     73	struct cpt_rd_wr_reg_msg *reg_msg;
     74
     75	reg_msg = (struct cpt_rd_wr_reg_msg *)
     76			otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*reg_msg),
     77						sizeof(*reg_msg));
     78	if (reg_msg == NULL) {
     79		dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");
     80		return -EFAULT;
     81	}
     82
     83	reg_msg->hdr.id = MBOX_MSG_CPT_RD_WR_REGISTER;
     84	reg_msg->hdr.sig = OTX2_MBOX_REQ_SIG;
     85	reg_msg->hdr.pcifunc = 0;
     86
     87	reg_msg->is_write = 1;
     88	reg_msg->reg_offset = reg;
     89	reg_msg->val = val;
     90	reg_msg->blkaddr = blkaddr;
     91
     92	return 0;
     93}
     94
     95int otx2_cpt_read_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
     96			 u64 reg, u64 *val, int blkaddr)
     97{
     98	int ret;
     99
    100	ret = otx2_cpt_add_read_af_reg(mbox, pdev, reg, val, blkaddr);
    101	if (ret)
    102		return ret;
    103
    104	return otx2_cpt_send_mbox_msg(mbox, pdev);
    105}
    106
    107int otx2_cpt_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,
    108			  u64 reg, u64 val, int blkaddr)
    109{
    110	int ret;
    111
    112	ret = otx2_cpt_add_write_af_reg(mbox, pdev, reg, val, blkaddr);
    113	if (ret)
    114		return ret;
    115
    116	return otx2_cpt_send_mbox_msg(mbox, pdev);
    117}
    118
    119int otx2_cpt_attach_rscrs_msg(struct otx2_cptlfs_info *lfs)
    120{
    121	struct otx2_mbox *mbox = lfs->mbox;
    122	struct rsrc_attach *req;
    123	int ret;
    124
    125	req = (struct rsrc_attach *)
    126			otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),
    127						sizeof(struct msg_rsp));
    128	if (req == NULL) {
    129		dev_err(&lfs->pdev->dev, "RVU MBOX failed to get message.\n");
    130		return -EFAULT;
    131	}
    132
    133	req->hdr.id = MBOX_MSG_ATTACH_RESOURCES;
    134	req->hdr.sig = OTX2_MBOX_REQ_SIG;
    135	req->hdr.pcifunc = 0;
    136	req->cptlfs = lfs->lfs_num;
    137	ret = otx2_cpt_send_mbox_msg(mbox, lfs->pdev);
    138	if (ret)
    139		return ret;
    140
    141	if (!lfs->are_lfs_attached)
    142		ret = -EINVAL;
    143
    144	return ret;
    145}
    146
    147int otx2_cpt_detach_rsrcs_msg(struct otx2_cptlfs_info *lfs)
    148{
    149	struct otx2_mbox *mbox = lfs->mbox;
    150	struct rsrc_detach *req;
    151	int ret;
    152
    153	req = (struct rsrc_detach *)
    154				otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),
    155							sizeof(struct msg_rsp));
    156	if (req == NULL) {
    157		dev_err(&lfs->pdev->dev, "RVU MBOX failed to get message.\n");
    158		return -EFAULT;
    159	}
    160
    161	req->hdr.id = MBOX_MSG_DETACH_RESOURCES;
    162	req->hdr.sig = OTX2_MBOX_REQ_SIG;
    163	req->hdr.pcifunc = 0;
    164	ret = otx2_cpt_send_mbox_msg(mbox, lfs->pdev);
    165	if (ret)
    166		return ret;
    167
    168	if (lfs->are_lfs_attached)
    169		ret = -EINVAL;
    170
    171	return ret;
    172}
    173
    174int otx2_cpt_msix_offset_msg(struct otx2_cptlfs_info *lfs)
    175{
    176	struct otx2_mbox *mbox = lfs->mbox;
    177	struct pci_dev *pdev = lfs->pdev;
    178	struct mbox_msghdr *req;
    179	int ret, i;
    180
    181	req = otx2_mbox_alloc_msg_rsp(mbox, 0, sizeof(*req),
    182				      sizeof(struct msix_offset_rsp));
    183	if (req == NULL) {
    184		dev_err(&pdev->dev, "RVU MBOX failed to get message.\n");
    185		return -EFAULT;
    186	}
    187
    188	req->id = MBOX_MSG_MSIX_OFFSET;
    189	req->sig = OTX2_MBOX_REQ_SIG;
    190	req->pcifunc = 0;
    191	ret = otx2_cpt_send_mbox_msg(mbox, pdev);
    192	if (ret)
    193		return ret;
    194
    195	for (i = 0; i < lfs->lfs_num; i++) {
    196		if (lfs->lf[i].msix_offset == MSIX_VECTOR_INVALID) {
    197			dev_err(&pdev->dev,
    198				"Invalid msix offset %d for LF %d\n",
    199				lfs->lf[i].msix_offset, i);
    200			return -EINVAL;
    201		}
    202	}
    203	return ret;
    204}
    205
    206int otx2_cpt_sync_mbox_msg(struct otx2_mbox *mbox)
    207{
    208	int err;
    209
    210	if (!otx2_mbox_nonempty(mbox, 0))
    211		return 0;
    212	otx2_mbox_msg_send(mbox, 0);
    213	err = otx2_mbox_wait_for_rsp(mbox, 0);
    214	if (err)
    215		return err;
    216
    217	return otx2_mbox_check_rsp_msgs(mbox, 0);
    218}