1 /* 2 * BSD LICENSE 3 * 4 * Copyright (C) Cavium Inc. 2017. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * * Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the 15 * distribution. 16 * * Neither the name of Cavium networks nor the names of its 17 * contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 #include <string.h> 33 34 #include <rte_eal.h> 35 #include <rte_pci.h> 36 37 #include "octeontx_pkivf.h" 38 39 int 40 octeontx_pki_port_open(int port) 41 { 42 struct octeontx_mbox_hdr hdr; 43 int res; 44 45 hdr.coproc = OCTEONTX_PKI_COPROC; 46 hdr.msg = MBOX_PKI_PORT_OPEN; 47 hdr.vfid = port; 48 49 res = octeontx_ssovf_mbox_send(&hdr, NULL, 0, NULL, 0); 50 if (res < 0) 51 return -EACCES; 52 return res; 53 } 54 55 int 56 octeontx_pki_port_hash_config(int port, pki_hash_cfg_t *hash_cfg) 57 { 58 struct octeontx_mbox_hdr hdr; 59 int res; 60 61 mbox_pki_hash_cfg_t h_cfg = *(mbox_pki_hash_cfg_t *)hash_cfg; 62 int len = sizeof(mbox_pki_hash_cfg_t); 63 64 hdr.coproc = OCTEONTX_PKI_COPROC; 65 hdr.msg = MBOX_PKI_PORT_HASH_CONFIG; 66 hdr.vfid = port; 67 68 res = octeontx_ssovf_mbox_send(&hdr, &h_cfg, len, NULL, 0); 69 if (res < 0) 70 return -EACCES; 71 72 return res; 73 } 74 75 int 76 octeontx_pki_port_pktbuf_config(int port, pki_pktbuf_cfg_t *buf_cfg) 77 { 78 struct octeontx_mbox_hdr hdr; 79 int res; 80 81 mbox_pki_pktbuf_cfg_t b_cfg = *(mbox_pki_pktbuf_cfg_t *)buf_cfg; 82 int len = sizeof(mbox_pki_pktbuf_cfg_t); 83 84 hdr.coproc = OCTEONTX_PKI_COPROC; 85 hdr.msg = MBOX_PKI_PORT_PKTBUF_CONFIG; 86 hdr.vfid = port; 87 88 res = octeontx_ssovf_mbox_send(&hdr, &b_cfg, len, NULL, 0); 89 if (res < 0) 90 return -EACCES; 91 return res; 92 } 93 94 int 95 octeontx_pki_port_create_qos(int port, pki_qos_cfg_t *qos_cfg) 96 { 97 struct octeontx_mbox_hdr hdr; 98 int res; 99 100 mbox_pki_qos_cfg_t q_cfg = *(mbox_pki_qos_cfg_t *)qos_cfg; 101 int len = sizeof(mbox_pki_qos_cfg_t); 102 103 hdr.coproc = OCTEONTX_PKI_COPROC; 104 hdr.msg = MBOX_PKI_PORT_CREATE_QOS; 105 hdr.vfid = port; 106 107 res = octeontx_ssovf_mbox_send(&hdr, &q_cfg, len, NULL, 0); 108 if (res < 0) 109 return -EACCES; 110 111 return res; 112 } 113 114 115 int 116 octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg) 117 { 118 struct octeontx_mbox_hdr hdr; 119 int res; 120 121 mbox_pki_errcheck_cfg_t e_cfg; 122 e_cfg = *((mbox_pki_errcheck_cfg_t *)(cfg)); 123 int len = sizeof(mbox_pki_errcheck_cfg_t); 124 125 hdr.coproc = OCTEONTX_PKI_COPROC; 126 hdr.msg = MBOX_PKI_PORT_ERRCHK_CONFIG; 127 hdr.vfid = port; 128 129 res = octeontx_ssovf_mbox_send(&hdr, &e_cfg, len, NULL, 0); 130 if (res < 0) 131 return -EACCES; 132 133 return res; 134 } 135 136 #define PCI_VENDOR_ID_CAVIUM 0x177D 137 #define PCI_DEVICE_ID_OCTEONTX_PKI_VF 0xA0DD 138 139 /* PKIVF pcie device */ 140 static int 141 pkivf_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) 142 { 143 RTE_SET_USED(pci_drv); 144 RTE_SET_USED(pci_dev); 145 146 /* For secondary processes, the primary has done all the work */ 147 if (rte_eal_process_type() != RTE_PROC_PRIMARY) 148 return 0; 149 150 return 0; 151 } 152 153 static const struct rte_pci_id pci_pkivf_map[] = { 154 { 155 RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, 156 PCI_DEVICE_ID_OCTEONTX_PKI_VF) 157 }, 158 { 159 .vendor_id = 0, 160 }, 161 }; 162 163 static struct rte_pci_driver pci_pkivf = { 164 .id_table = pci_pkivf_map, 165 .drv_flags = RTE_PCI_DRV_NEED_MAPPING, 166 .probe = pkivf_probe, 167 }; 168 169 RTE_PMD_REGISTER_PCI(octeontx_pkivf, pci_pkivf); 170