xref: /dpdk/drivers/net/octeontx/base/octeontx_pkivf.c (revision 1f37cb2bb46b1fd403faa7c3bf8884e6a4dfde66)
1aaf4363eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause
2aaf4363eSJerin Jacob  * Copyright(c) 2017 Cavium, Inc
3445371e8SJerin Jacob  */
4aaf4363eSJerin Jacob 
5445371e8SJerin Jacob #include <string.h>
6445371e8SJerin Jacob 
7445371e8SJerin Jacob #include <rte_eal.h>
8*1f37cb2bSDavid Marchand #include <bus_pci_driver.h>
9445371e8SJerin Jacob 
10a6d6f0afSPavan Nikhilesh #include "../octeontx_logs.h"
11a6d6f0afSPavan Nikhilesh #include "octeontx_io.h"
12b95c3413SJerin Jacob #include "octeontx_pkivf.h"
13b95c3413SJerin Jacob 
14a6d6f0afSPavan Nikhilesh 
15a6d6f0afSPavan Nikhilesh struct octeontx_pkivf {
16a6d6f0afSPavan Nikhilesh 	uint8_t		*bar0;
17a6d6f0afSPavan Nikhilesh 	uint8_t		status;
18a6d6f0afSPavan Nikhilesh 	uint16_t	domain;
19a6d6f0afSPavan Nikhilesh 	uint16_t	vfid;
20a6d6f0afSPavan Nikhilesh };
21a6d6f0afSPavan Nikhilesh 
22a6d6f0afSPavan Nikhilesh struct octeontx_pki_vf_ctl_s {
23a6d6f0afSPavan Nikhilesh 	struct octeontx_pkivf pki[PKI_VF_MAX];
24a6d6f0afSPavan Nikhilesh };
25a6d6f0afSPavan Nikhilesh 
26a6d6f0afSPavan Nikhilesh static struct octeontx_pki_vf_ctl_s pki_vf_ctl;
27a6d6f0afSPavan Nikhilesh 
28b95c3413SJerin Jacob int
octeontx_pki_port_open(int port)29b95c3413SJerin Jacob octeontx_pki_port_open(int port)
30b95c3413SJerin Jacob {
31a6d6f0afSPavan Nikhilesh 	uint16_t global_domain = octeontx_get_global_domain();
32b95c3413SJerin Jacob 	struct octeontx_mbox_hdr hdr;
3391c0c978SPavan Nikhilesh 	pki_port_type_t port_type;
34a6d6f0afSPavan Nikhilesh 	int i, res;
35a6d6f0afSPavan Nikhilesh 
36a6d6f0afSPavan Nikhilesh 	/* Check if atleast one PKI vf is in application domain. */
37a6d6f0afSPavan Nikhilesh 	for (i = 0; i < PKI_VF_MAX; i++) {
38a6d6f0afSPavan Nikhilesh 		if (pki_vf_ctl.pki[i].domain != global_domain)
39a6d6f0afSPavan Nikhilesh 			continue;
40a6d6f0afSPavan Nikhilesh 		break;
41a6d6f0afSPavan Nikhilesh 	}
42a6d6f0afSPavan Nikhilesh 
43a6d6f0afSPavan Nikhilesh 	if (i == PKI_VF_MAX)
44a6d6f0afSPavan Nikhilesh 		return -ENODEV;
45b95c3413SJerin Jacob 
4691c0c978SPavan Nikhilesh 	port_type.port_type = OCTTX_PORT_TYPE_NET;
47b95c3413SJerin Jacob 	hdr.coproc = OCTEONTX_PKI_COPROC;
48b95c3413SJerin Jacob 	hdr.msg = MBOX_PKI_PORT_OPEN;
49b95c3413SJerin Jacob 	hdr.vfid = port;
50b95c3413SJerin Jacob 
5191c0c978SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, &port_type, sizeof(pki_port_type_t),
52a6d6f0afSPavan Nikhilesh 				 NULL, 0);
53b95c3413SJerin Jacob 	if (res < 0)
54b95c3413SJerin Jacob 		return -EACCES;
55b95c3413SJerin Jacob 	return res;
56b95c3413SJerin Jacob }
57b95c3413SJerin Jacob 
58b95c3413SJerin Jacob int
octeontx_pki_port_hash_config(int port,pki_hash_cfg_t * hash_cfg)596d28968eSJerin Jacob octeontx_pki_port_hash_config(int port, pki_hash_cfg_t *hash_cfg)
606d28968eSJerin Jacob {
616d28968eSJerin Jacob 	struct octeontx_mbox_hdr hdr;
626d28968eSJerin Jacob 	int res;
636d28968eSJerin Jacob 
6491c0c978SPavan Nikhilesh 	pki_hash_cfg_t h_cfg = *(pki_hash_cfg_t *)hash_cfg;
6591c0c978SPavan Nikhilesh 	int len = sizeof(pki_hash_cfg_t);
666d28968eSJerin Jacob 
676d28968eSJerin Jacob 	hdr.coproc = OCTEONTX_PKI_COPROC;
686d28968eSJerin Jacob 	hdr.msg = MBOX_PKI_PORT_HASH_CONFIG;
696d28968eSJerin Jacob 	hdr.vfid = port;
706d28968eSJerin Jacob 
71d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, &h_cfg, len, NULL, 0);
726d28968eSJerin Jacob 	if (res < 0)
736d28968eSJerin Jacob 		return -EACCES;
746d28968eSJerin Jacob 
756d28968eSJerin Jacob 	return res;
766d28968eSJerin Jacob }
776d28968eSJerin Jacob 
786d28968eSJerin Jacob int
octeontx_pki_port_pktbuf_config(int port,pki_pktbuf_cfg_t * buf_cfg)796d28968eSJerin Jacob octeontx_pki_port_pktbuf_config(int port, pki_pktbuf_cfg_t *buf_cfg)
806d28968eSJerin Jacob {
816d28968eSJerin Jacob 	struct octeontx_mbox_hdr hdr;
826d28968eSJerin Jacob 	int res;
836d28968eSJerin Jacob 
8491c0c978SPavan Nikhilesh 	pki_pktbuf_cfg_t b_cfg = *(pki_pktbuf_cfg_t *)buf_cfg;
8591c0c978SPavan Nikhilesh 	int len = sizeof(pki_pktbuf_cfg_t);
866d28968eSJerin Jacob 
876d28968eSJerin Jacob 	hdr.coproc = OCTEONTX_PKI_COPROC;
886d28968eSJerin Jacob 	hdr.msg = MBOX_PKI_PORT_PKTBUF_CONFIG;
896d28968eSJerin Jacob 	hdr.vfid = port;
906d28968eSJerin Jacob 
91d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, &b_cfg, len, NULL, 0);
926d28968eSJerin Jacob 	if (res < 0)
936d28968eSJerin Jacob 		return -EACCES;
946d28968eSJerin Jacob 	return res;
956d28968eSJerin Jacob }
966d28968eSJerin Jacob 
976d28968eSJerin Jacob int
octeontx_pki_port_create_qos(int port,pki_qos_cfg_t * qos_cfg)986d28968eSJerin Jacob octeontx_pki_port_create_qos(int port, pki_qos_cfg_t *qos_cfg)
996d28968eSJerin Jacob {
1006d28968eSJerin Jacob 	struct octeontx_mbox_hdr hdr;
1016d28968eSJerin Jacob 	int res;
1026d28968eSJerin Jacob 
10391c0c978SPavan Nikhilesh 	pki_qos_cfg_t q_cfg = *(pki_qos_cfg_t *)qos_cfg;
10491c0c978SPavan Nikhilesh 	int len = sizeof(pki_qos_cfg_t);
1056d28968eSJerin Jacob 
1066d28968eSJerin Jacob 	hdr.coproc = OCTEONTX_PKI_COPROC;
1076d28968eSJerin Jacob 	hdr.msg = MBOX_PKI_PORT_CREATE_QOS;
1086d28968eSJerin Jacob 	hdr.vfid = port;
1096d28968eSJerin Jacob 
110d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, &q_cfg, len, NULL, 0);
1116d28968eSJerin Jacob 	if (res < 0)
1126d28968eSJerin Jacob 		return -EACCES;
1136d28968eSJerin Jacob 
1146d28968eSJerin Jacob 	return res;
1156d28968eSJerin Jacob }
1166d28968eSJerin Jacob 
117b95c3413SJerin Jacob 
1186d28968eSJerin Jacob int
octeontx_pki_port_errchk_config(int port,pki_errchk_cfg_t * cfg)1196d28968eSJerin Jacob octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg)
1206d28968eSJerin Jacob {
1216d28968eSJerin Jacob 	struct octeontx_mbox_hdr hdr;
1226d28968eSJerin Jacob 	int res;
1236d28968eSJerin Jacob 
12491c0c978SPavan Nikhilesh 	pki_errchk_cfg_t e_cfg;
12591c0c978SPavan Nikhilesh 	e_cfg = *((pki_errchk_cfg_t *)(cfg));
12691c0c978SPavan Nikhilesh 	int len = sizeof(pki_errchk_cfg_t);
1276d28968eSJerin Jacob 
1286d28968eSJerin Jacob 	hdr.coproc = OCTEONTX_PKI_COPROC;
1296d28968eSJerin Jacob 	hdr.msg = MBOX_PKI_PORT_ERRCHK_CONFIG;
1306d28968eSJerin Jacob 	hdr.vfid = port;
1316d28968eSJerin Jacob 
132d8dd3165SPavan Nikhilesh 	res = octeontx_mbox_send(&hdr, &e_cfg, len, NULL, 0);
1336d28968eSJerin Jacob 	if (res < 0)
1346d28968eSJerin Jacob 		return -EACCES;
1356d28968eSJerin Jacob 
1366d28968eSJerin Jacob 	return res;
1376d28968eSJerin Jacob }
1386d28968eSJerin Jacob 
13956139e85SVamsi Attunuru int
octeontx_pki_port_vlan_fltr_config(int port,pki_port_vlan_filter_config_t * fltr_cfg)14056139e85SVamsi Attunuru octeontx_pki_port_vlan_fltr_config(int port,
14156139e85SVamsi Attunuru 				   pki_port_vlan_filter_config_t *fltr_cfg)
14256139e85SVamsi Attunuru {
14356139e85SVamsi Attunuru 	struct octeontx_mbox_hdr hdr;
14456139e85SVamsi Attunuru 	int res;
14556139e85SVamsi Attunuru 
14656139e85SVamsi Attunuru 	pki_port_vlan_filter_config_t cfg = *fltr_cfg;
14756139e85SVamsi Attunuru 	int len = sizeof(pki_port_vlan_filter_config_t);
14856139e85SVamsi Attunuru 
14956139e85SVamsi Attunuru 	hdr.coproc = OCTEONTX_PKI_COPROC;
15056139e85SVamsi Attunuru 	hdr.msg = MBOX_PKI_PORT_VLAN_FILTER_CONFIG;
15156139e85SVamsi Attunuru 	hdr.vfid = port;
15256139e85SVamsi Attunuru 
15356139e85SVamsi Attunuru 	res = octeontx_mbox_send(&hdr, &cfg, len, NULL, 0);
15456139e85SVamsi Attunuru 	if (res < 0)
15556139e85SVamsi Attunuru 		return -EACCES;
15656139e85SVamsi Attunuru 	return res;
15756139e85SVamsi Attunuru }
15856139e85SVamsi Attunuru 
15956139e85SVamsi Attunuru int
octeontx_pki_port_vlan_fltr_entry_config(int port,pki_port_vlan_filter_entry_config_t * e_cfg)16056139e85SVamsi Attunuru octeontx_pki_port_vlan_fltr_entry_config(int port,
16156139e85SVamsi Attunuru 				   pki_port_vlan_filter_entry_config_t *e_cfg)
16256139e85SVamsi Attunuru {
16356139e85SVamsi Attunuru 	struct octeontx_mbox_hdr hdr;
16456139e85SVamsi Attunuru 	int res;
16556139e85SVamsi Attunuru 
16656139e85SVamsi Attunuru 	pki_port_vlan_filter_entry_config_t cfg = *e_cfg;
16756139e85SVamsi Attunuru 	int len = sizeof(pki_port_vlan_filter_entry_config_t);
16856139e85SVamsi Attunuru 
16956139e85SVamsi Attunuru 	hdr.coproc = OCTEONTX_PKI_COPROC;
17056139e85SVamsi Attunuru 	hdr.msg = MBOX_PKI_PORT_VLAN_FILTER_ENTRY_CONFIG;
17156139e85SVamsi Attunuru 	hdr.vfid = port;
17256139e85SVamsi Attunuru 
17356139e85SVamsi Attunuru 	res = octeontx_mbox_send(&hdr, &cfg, len, NULL, 0);
17456139e85SVamsi Attunuru 	if (res < 0)
17556139e85SVamsi Attunuru 		return -EACCES;
17656139e85SVamsi Attunuru 	return res;
17756139e85SVamsi Attunuru }
17856139e85SVamsi Attunuru 
179445371e8SJerin Jacob #define PCI_VENDOR_ID_CAVIUM               0x177D
180445371e8SJerin Jacob #define PCI_DEVICE_ID_OCTEONTX_PKI_VF      0xA0DD
181445371e8SJerin Jacob 
182445371e8SJerin Jacob /* PKIVF pcie device */
183445371e8SJerin Jacob static int
pkivf_probe(struct rte_pci_driver * pci_drv,struct rte_pci_device * pci_dev)184445371e8SJerin Jacob pkivf_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
185445371e8SJerin Jacob {
186a6d6f0afSPavan Nikhilesh 	struct octeontx_pkivf *res;
187a6d6f0afSPavan Nikhilesh 	static uint8_t vf_cnt;
188a6d6f0afSPavan Nikhilesh 	uint16_t domain;
189a6d6f0afSPavan Nikhilesh 	uint16_t vfid;
190a6d6f0afSPavan Nikhilesh 	uint8_t *bar0;
191a6d6f0afSPavan Nikhilesh 	uint64_t val;
192445371e8SJerin Jacob 
193a6d6f0afSPavan Nikhilesh 	RTE_SET_USED(pci_drv);
194445371e8SJerin Jacob 	/* For secondary processes, the primary has done all the work */
195445371e8SJerin Jacob 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
196445371e8SJerin Jacob 		return 0;
197445371e8SJerin Jacob 
198a6d6f0afSPavan Nikhilesh 	if (pci_dev->mem_resource[0].addr == NULL) {
199a6d6f0afSPavan Nikhilesh 		octeontx_log_err("PKI Empty bar[0] %p",
200a6d6f0afSPavan Nikhilesh 				 pci_dev->mem_resource[0].addr);
201a6d6f0afSPavan Nikhilesh 		return -ENODEV;
202a6d6f0afSPavan Nikhilesh 	}
203a6d6f0afSPavan Nikhilesh 
204a6d6f0afSPavan Nikhilesh 	bar0 = pci_dev->mem_resource[0].addr;
205a6d6f0afSPavan Nikhilesh 	val = octeontx_read64(bar0);
206a6d6f0afSPavan Nikhilesh 	domain = val & 0xffff;
207a6d6f0afSPavan Nikhilesh 	vfid = (val >> 16) & 0xffff;
208a6d6f0afSPavan Nikhilesh 
209a6d6f0afSPavan Nikhilesh 	if (unlikely(vfid >= PKI_VF_MAX)) {
210a6d6f0afSPavan Nikhilesh 		octeontx_log_err("pki: Invalid vfid %d", vfid);
211a6d6f0afSPavan Nikhilesh 		return -EINVAL;
212a6d6f0afSPavan Nikhilesh 	}
213a6d6f0afSPavan Nikhilesh 
214a6d6f0afSPavan Nikhilesh 	res = &pki_vf_ctl.pki[vf_cnt++];
215a6d6f0afSPavan Nikhilesh 	res->vfid = vfid;
216a6d6f0afSPavan Nikhilesh 	res->domain = domain;
217a6d6f0afSPavan Nikhilesh 	res->bar0 = bar0;
218a6d6f0afSPavan Nikhilesh 
219a6d6f0afSPavan Nikhilesh 	octeontx_log_dbg("PKI Domain=%d vfid=%d", res->domain, res->vfid);
220445371e8SJerin Jacob 	return 0;
221445371e8SJerin Jacob }
222445371e8SJerin Jacob 
223445371e8SJerin Jacob static const struct rte_pci_id pci_pkivf_map[] = {
224445371e8SJerin Jacob 	{
225445371e8SJerin Jacob 		RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
226445371e8SJerin Jacob 				PCI_DEVICE_ID_OCTEONTX_PKI_VF)
227445371e8SJerin Jacob 	},
228445371e8SJerin Jacob 	{
229445371e8SJerin Jacob 		.vendor_id = 0,
230445371e8SJerin Jacob 	},
231445371e8SJerin Jacob };
232445371e8SJerin Jacob 
233445371e8SJerin Jacob static struct rte_pci_driver pci_pkivf = {
234445371e8SJerin Jacob 	.id_table = pci_pkivf_map,
235445371e8SJerin Jacob 	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
236445371e8SJerin Jacob 	.probe = pkivf_probe,
237445371e8SJerin Jacob };
238445371e8SJerin Jacob 
239445371e8SJerin Jacob RTE_PMD_REGISTER_PCI(octeontx_pkivf, pci_pkivf);
240