xref: /openbmc/linux/drivers/net/ethernet/marvell/octeontx2/af/rvu_sdp.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1fe1939bbSRadha Mohan Chintakuntla // SPDX-License-Identifier: GPL-2.0
2c7cd6c5aSSunil Goutham /* Marvell RVU Admin Function driver
3fe1939bbSRadha Mohan Chintakuntla  *
4fe1939bbSRadha Mohan Chintakuntla  * Copyright (C) 2021 Marvell.
5fe1939bbSRadha Mohan Chintakuntla  *
6fe1939bbSRadha Mohan Chintakuntla  */
7fe1939bbSRadha Mohan Chintakuntla 
8fe1939bbSRadha Mohan Chintakuntla #include <linux/pci.h>
9fe1939bbSRadha Mohan Chintakuntla #include "rvu.h"
10fe1939bbSRadha Mohan Chintakuntla 
11fe1939bbSRadha Mohan Chintakuntla /* SDP PF device id */
12fe1939bbSRadha Mohan Chintakuntla #define PCI_DEVID_OTX2_SDP_PF   0xA0F6
13fe1939bbSRadha Mohan Chintakuntla 
14fe1939bbSRadha Mohan Chintakuntla /* Maximum SDP blocks in a chip */
15fe1939bbSRadha Mohan Chintakuntla #define MAX_SDP		2
16fe1939bbSRadha Mohan Chintakuntla 
17fe1939bbSRadha Mohan Chintakuntla /* SDP PF number */
18fe1939bbSRadha Mohan Chintakuntla static int sdp_pf_num[MAX_SDP] = {-1, -1};
19fe1939bbSRadha Mohan Chintakuntla 
is_sdp_pfvf(u16 pcifunc)20fe1939bbSRadha Mohan Chintakuntla bool is_sdp_pfvf(u16 pcifunc)
21fe1939bbSRadha Mohan Chintakuntla {
22fe1939bbSRadha Mohan Chintakuntla 	u16 pf = rvu_get_pf(pcifunc);
23fe1939bbSRadha Mohan Chintakuntla 	u32 found = 0, i = 0;
24fe1939bbSRadha Mohan Chintakuntla 
25fe1939bbSRadha Mohan Chintakuntla 	while (i < MAX_SDP) {
26fe1939bbSRadha Mohan Chintakuntla 		if (pf == sdp_pf_num[i])
27fe1939bbSRadha Mohan Chintakuntla 			found = 1;
28fe1939bbSRadha Mohan Chintakuntla 		i++;
29fe1939bbSRadha Mohan Chintakuntla 	}
30fe1939bbSRadha Mohan Chintakuntla 
31fe1939bbSRadha Mohan Chintakuntla 	if (!found)
32fe1939bbSRadha Mohan Chintakuntla 		return false;
33fe1939bbSRadha Mohan Chintakuntla 
34fe1939bbSRadha Mohan Chintakuntla 	return true;
35fe1939bbSRadha Mohan Chintakuntla }
36fe1939bbSRadha Mohan Chintakuntla 
is_sdp_pf(u16 pcifunc)37fe1939bbSRadha Mohan Chintakuntla bool is_sdp_pf(u16 pcifunc)
38fe1939bbSRadha Mohan Chintakuntla {
39fe1939bbSRadha Mohan Chintakuntla 	return (is_sdp_pfvf(pcifunc) &&
40fe1939bbSRadha Mohan Chintakuntla 		!(pcifunc & RVU_PFVF_FUNC_MASK));
41fe1939bbSRadha Mohan Chintakuntla }
42fe1939bbSRadha Mohan Chintakuntla 
is_sdp_vf(u16 pcifunc)43fe1939bbSRadha Mohan Chintakuntla bool is_sdp_vf(u16 pcifunc)
44fe1939bbSRadha Mohan Chintakuntla {
45fe1939bbSRadha Mohan Chintakuntla 	return (is_sdp_pfvf(pcifunc) &&
46fe1939bbSRadha Mohan Chintakuntla 		!!(pcifunc & RVU_PFVF_FUNC_MASK));
47fe1939bbSRadha Mohan Chintakuntla }
48fe1939bbSRadha Mohan Chintakuntla 
rvu_sdp_init(struct rvu * rvu)49fe1939bbSRadha Mohan Chintakuntla int rvu_sdp_init(struct rvu *rvu)
50fe1939bbSRadha Mohan Chintakuntla {
51fe1939bbSRadha Mohan Chintakuntla 	struct pci_dev *pdev = NULL;
52fe1939bbSRadha Mohan Chintakuntla 	struct rvu_pfvf *pfvf;
53fe1939bbSRadha Mohan Chintakuntla 	u32 i = 0;
54fe1939bbSRadha Mohan Chintakuntla 
55fe1939bbSRadha Mohan Chintakuntla 	while ((i < MAX_SDP) && (pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
56fe1939bbSRadha Mohan Chintakuntla 						       PCI_DEVID_OTX2_SDP_PF,
57fe1939bbSRadha Mohan Chintakuntla 						       pdev)) != NULL) {
58fe1939bbSRadha Mohan Chintakuntla 		/* The RVU PF number is one less than bus number */
59fe1939bbSRadha Mohan Chintakuntla 		sdp_pf_num[i] = pdev->bus->number - 1;
60fe1939bbSRadha Mohan Chintakuntla 		pfvf = &rvu->pf[sdp_pf_num[i]];
61fe1939bbSRadha Mohan Chintakuntla 
62fe1939bbSRadha Mohan Chintakuntla 		pfvf->sdp_info = devm_kzalloc(rvu->dev,
63fe1939bbSRadha Mohan Chintakuntla 					      sizeof(struct sdp_node_info),
64fe1939bbSRadha Mohan Chintakuntla 					      GFP_KERNEL);
65*ad17c2a3SXiongfeng Wang 		if (!pfvf->sdp_info) {
66*ad17c2a3SXiongfeng Wang 			pci_dev_put(pdev);
67fe1939bbSRadha Mohan Chintakuntla 			return -ENOMEM;
68*ad17c2a3SXiongfeng Wang 		}
69fe1939bbSRadha Mohan Chintakuntla 
70fe1939bbSRadha Mohan Chintakuntla 		dev_info(rvu->dev, "SDP PF number:%d\n", sdp_pf_num[i]);
71fe1939bbSRadha Mohan Chintakuntla 
72fe1939bbSRadha Mohan Chintakuntla 		i++;
73fe1939bbSRadha Mohan Chintakuntla 	}
74fe1939bbSRadha Mohan Chintakuntla 
75*ad17c2a3SXiongfeng Wang 	pci_dev_put(pdev);
76*ad17c2a3SXiongfeng Wang 
77fe1939bbSRadha Mohan Chintakuntla 	return 0;
78fe1939bbSRadha Mohan Chintakuntla }
79fe1939bbSRadha Mohan Chintakuntla 
80fe1939bbSRadha Mohan Chintakuntla int
rvu_mbox_handler_set_sdp_chan_info(struct rvu * rvu,struct sdp_chan_info_msg * req,struct msg_rsp * rsp)81fe1939bbSRadha Mohan Chintakuntla rvu_mbox_handler_set_sdp_chan_info(struct rvu *rvu,
82fe1939bbSRadha Mohan Chintakuntla 				   struct sdp_chan_info_msg *req,
83fe1939bbSRadha Mohan Chintakuntla 				   struct msg_rsp *rsp)
84fe1939bbSRadha Mohan Chintakuntla {
85fe1939bbSRadha Mohan Chintakuntla 	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, req->hdr.pcifunc);
86fe1939bbSRadha Mohan Chintakuntla 
87fe1939bbSRadha Mohan Chintakuntla 	memcpy(pfvf->sdp_info, &req->info, sizeof(struct sdp_node_info));
88fe1939bbSRadha Mohan Chintakuntla 	dev_info(rvu->dev, "AF: SDP%d max_vfs %d num_pf_rings %d pf_srn %d\n",
89fe1939bbSRadha Mohan Chintakuntla 		 req->info.node_id, req->info.max_vfs, req->info.num_pf_rings,
90fe1939bbSRadha Mohan Chintakuntla 		 req->info.pf_srn);
91fe1939bbSRadha Mohan Chintakuntla 	return 0;
92fe1939bbSRadha Mohan Chintakuntla }
93fe1939bbSRadha Mohan Chintakuntla 
94fe1939bbSRadha Mohan Chintakuntla int
rvu_mbox_handler_get_sdp_chan_info(struct rvu * rvu,struct msg_req * req,struct sdp_get_chan_info_msg * rsp)95fe1939bbSRadha Mohan Chintakuntla rvu_mbox_handler_get_sdp_chan_info(struct rvu *rvu, struct msg_req *req,
96fe1939bbSRadha Mohan Chintakuntla 				   struct sdp_get_chan_info_msg *rsp)
97fe1939bbSRadha Mohan Chintakuntla {
98fe1939bbSRadha Mohan Chintakuntla 	struct rvu_hwinfo *hw = rvu->hw;
99fe1939bbSRadha Mohan Chintakuntla 	int blkaddr;
100fe1939bbSRadha Mohan Chintakuntla 
101fe1939bbSRadha Mohan Chintakuntla 	if (!hw->cap.programmable_chans) {
102fe1939bbSRadha Mohan Chintakuntla 		rsp->chan_base = NIX_CHAN_SDP_CH_START;
103fe1939bbSRadha Mohan Chintakuntla 		rsp->num_chan = NIX_CHAN_SDP_NUM_CHANS;
104fe1939bbSRadha Mohan Chintakuntla 	} else {
105fe1939bbSRadha Mohan Chintakuntla 		blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, 0);
106fe1939bbSRadha Mohan Chintakuntla 		rsp->chan_base = hw->sdp_chan_base;
107fe1939bbSRadha Mohan Chintakuntla 		rsp->num_chan = rvu_read64(rvu, blkaddr, NIX_AF_CONST1) & 0xFFFUL;
108fe1939bbSRadha Mohan Chintakuntla 	}
109fe1939bbSRadha Mohan Chintakuntla 
110fe1939bbSRadha Mohan Chintakuntla 	return 0;
111fe1939bbSRadha Mohan Chintakuntla }
112