]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/dpdk/drivers/net/octeontx/base/octeontx_pkivf.c
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / dpdk / drivers / net / octeontx / base / octeontx_pkivf.c
index 1babea0e8c3296df17a6b61140a622fa9bea7109..0ddff548860664a9b83a23337c12a60a8e677488 100644 (file)
@@ -7,19 +7,49 @@
 #include <rte_eal.h>
 #include <rte_bus_pci.h>
 
+#include "../octeontx_logs.h"
+#include "octeontx_io.h"
 #include "octeontx_pkivf.h"
 
+
+struct octeontx_pkivf {
+       uint8_t         *bar0;
+       uint8_t         status;
+       uint16_t        domain;
+       uint16_t        vfid;
+};
+
+struct octeontx_pki_vf_ctl_s {
+       struct octeontx_pkivf pki[PKI_VF_MAX];
+};
+
+static struct octeontx_pki_vf_ctl_s pki_vf_ctl;
+
 int
 octeontx_pki_port_open(int port)
 {
+       uint16_t global_domain = octeontx_get_global_domain();
        struct octeontx_mbox_hdr hdr;
-       int res;
+       pki_port_type_t port_type;
+       int i, res;
+
+       /* Check if atleast one PKI vf is in application domain. */
+       for (i = 0; i < PKI_VF_MAX; i++) {
+               if (pki_vf_ctl.pki[i].domain != global_domain)
+                       continue;
+               break;
+       }
+
+       if (i == PKI_VF_MAX)
+               return -ENODEV;
 
+       port_type.port_type = OCTTX_PORT_TYPE_NET;
        hdr.coproc = OCTEONTX_PKI_COPROC;
        hdr.msg = MBOX_PKI_PORT_OPEN;
        hdr.vfid = port;
 
-       res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0);
+       res = octeontx_mbox_send(&hdr, &port_type, sizeof(pki_port_type_t),
+                                NULL, 0);
        if (res < 0)
                return -EACCES;
        return res;
@@ -31,8 +61,8 @@ octeontx_pki_port_hash_config(int port, pki_hash_cfg_t *hash_cfg)
        struct octeontx_mbox_hdr hdr;
        int res;
 
-       mbox_pki_hash_cfg_t h_cfg = *(mbox_pki_hash_cfg_t *)hash_cfg;
-       int len = sizeof(mbox_pki_hash_cfg_t);
+       pki_hash_cfg_t h_cfg = *(pki_hash_cfg_t *)hash_cfg;
+       int len = sizeof(pki_hash_cfg_t);
 
        hdr.coproc = OCTEONTX_PKI_COPROC;
        hdr.msg = MBOX_PKI_PORT_HASH_CONFIG;
@@ -51,8 +81,8 @@ octeontx_pki_port_pktbuf_config(int port, pki_pktbuf_cfg_t *buf_cfg)
        struct octeontx_mbox_hdr hdr;
        int res;
 
-       mbox_pki_pktbuf_cfg_t b_cfg = *(mbox_pki_pktbuf_cfg_t *)buf_cfg;
-       int len = sizeof(mbox_pki_pktbuf_cfg_t);
+       pki_pktbuf_cfg_t b_cfg = *(pki_pktbuf_cfg_t *)buf_cfg;
+       int len = sizeof(pki_pktbuf_cfg_t);
 
        hdr.coproc = OCTEONTX_PKI_COPROC;
        hdr.msg = MBOX_PKI_PORT_PKTBUF_CONFIG;
@@ -70,8 +100,8 @@ octeontx_pki_port_create_qos(int port, pki_qos_cfg_t *qos_cfg)
        struct octeontx_mbox_hdr hdr;
        int res;
 
-       mbox_pki_qos_cfg_t q_cfg = *(mbox_pki_qos_cfg_t *)qos_cfg;
-       int len = sizeof(mbox_pki_qos_cfg_t);
+       pki_qos_cfg_t q_cfg = *(pki_qos_cfg_t *)qos_cfg;
+       int len = sizeof(pki_qos_cfg_t);
 
        hdr.coproc = OCTEONTX_PKI_COPROC;
        hdr.msg = MBOX_PKI_PORT_CREATE_QOS;
@@ -91,9 +121,9 @@ octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg)
        struct octeontx_mbox_hdr hdr;
        int res;
 
-       mbox_pki_errcheck_cfg_t e_cfg;
-       e_cfg = *((mbox_pki_errcheck_cfg_t *)(cfg));
-       int len = sizeof(mbox_pki_errcheck_cfg_t);
+       pki_errchk_cfg_t e_cfg;
+       e_cfg = *((pki_errchk_cfg_t *)(cfg));
+       int len = sizeof(pki_errchk_cfg_t);
 
        hdr.coproc = OCTEONTX_PKI_COPROC;
        hdr.msg = MBOX_PKI_PORT_ERRCHK_CONFIG;
@@ -106,6 +136,46 @@ octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg)
        return res;
 }
 
+int
+octeontx_pki_port_vlan_fltr_config(int port,
+                                  pki_port_vlan_filter_config_t *fltr_cfg)
+{
+       struct octeontx_mbox_hdr hdr;
+       int res;
+
+       pki_port_vlan_filter_config_t cfg = *fltr_cfg;
+       int len = sizeof(pki_port_vlan_filter_config_t);
+
+       hdr.coproc = OCTEONTX_PKI_COPROC;
+       hdr.msg = MBOX_PKI_PORT_VLAN_FILTER_CONFIG;
+       hdr.vfid = port;
+
+       res = octeontx_mbox_send(&hdr, &cfg, len, NULL, 0);
+       if (res < 0)
+               return -EACCES;
+       return res;
+}
+
+int
+octeontx_pki_port_vlan_fltr_entry_config(int port,
+                                  pki_port_vlan_filter_entry_config_t *e_cfg)
+{
+       struct octeontx_mbox_hdr hdr;
+       int res;
+
+       pki_port_vlan_filter_entry_config_t cfg = *e_cfg;
+       int len = sizeof(pki_port_vlan_filter_entry_config_t);
+
+       hdr.coproc = OCTEONTX_PKI_COPROC;
+       hdr.msg = MBOX_PKI_PORT_VLAN_FILTER_ENTRY_CONFIG;
+       hdr.vfid = port;
+
+       res = octeontx_mbox_send(&hdr, &cfg, len, NULL, 0);
+       if (res < 0)
+               return -EACCES;
+       return res;
+}
+
 #define PCI_VENDOR_ID_CAVIUM               0x177D
 #define PCI_DEVICE_ID_OCTEONTX_PKI_VF      0xA0DD
 
@@ -113,13 +183,40 @@ octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg)
 static int
 pkivf_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
 {
-       RTE_SET_USED(pci_drv);
-       RTE_SET_USED(pci_dev);
+       struct octeontx_pkivf *res;
+       static uint8_t vf_cnt;
+       uint16_t domain;
+       uint16_t vfid;
+       uint8_t *bar0;
+       uint64_t val;
 
+       RTE_SET_USED(pci_drv);
        /* For secondary processes, the primary has done all the work */
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
                return 0;
 
+       if (pci_dev->mem_resource[0].addr == NULL) {
+               octeontx_log_err("PKI Empty bar[0] %p",
+                                pci_dev->mem_resource[0].addr);
+               return -ENODEV;
+       }
+
+       bar0 = pci_dev->mem_resource[0].addr;
+       val = octeontx_read64(bar0);
+       domain = val & 0xffff;
+       vfid = (val >> 16) & 0xffff;
+
+       if (unlikely(vfid >= PKI_VF_MAX)) {
+               octeontx_log_err("pki: Invalid vfid %d", vfid);
+               return -EINVAL;
+       }
+
+       res = &pki_vf_ctl.pki[vf_cnt++];
+       res->vfid = vfid;
+       res->domain = domain;
+       res->bar0 = bar0;
+
+       octeontx_log_dbg("PKI Domain=%d vfid=%d", res->domain, res->vfid);
        return 0;
 }