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