net/octeontx: add application domain validation
[dpdk.git] / drivers / net / octeontx / base / octeontx_pkivf.c
index f9e4053..783b2a2 100644 (file)
@@ -1,52 +1,56 @@
-/*
- *   BSD LICENSE
- *
- *   Copyright (C) Cavium Inc. 2017. All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Cavium networks nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2017 Cavium, Inc
  */
+
 #include <string.h>
 
 #include <rte_eal.h>
-#include <rte_pci.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;
+       mbox_pki_port_t port_type = {
+               .port_type = OCTTX_PORT_TYPE_NET,
+       };
+       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;
 
        hdr.coproc = OCTEONTX_PKI_COPROC;
        hdr.msg = MBOX_PKI_PORT_OPEN;
        hdr.vfid = port;
 
-       res = octeontx_ssovf_mbox_send(&hdr, NULL, 0, NULL, 0);
+       res = octeontx_mbox_send(&hdr, &port_type, sizeof(mbox_pki_port_t),
+                                NULL, 0);
        if (res < 0)
                return -EACCES;
        return res;
@@ -65,7 +69,7 @@ octeontx_pki_port_hash_config(int port, pki_hash_cfg_t *hash_cfg)
        hdr.msg = MBOX_PKI_PORT_HASH_CONFIG;
        hdr.vfid = port;
 
-       res = octeontx_ssovf_mbox_send(&hdr, &h_cfg, len, NULL, 0);
+       res = octeontx_mbox_send(&hdr, &h_cfg, len, NULL, 0);
        if (res < 0)
                return -EACCES;
 
@@ -85,7 +89,7 @@ octeontx_pki_port_pktbuf_config(int port, pki_pktbuf_cfg_t *buf_cfg)
        hdr.msg = MBOX_PKI_PORT_PKTBUF_CONFIG;
        hdr.vfid = port;
 
-       res = octeontx_ssovf_mbox_send(&hdr, &b_cfg, len, NULL, 0);
+       res = octeontx_mbox_send(&hdr, &b_cfg, len, NULL, 0);
        if (res < 0)
                return -EACCES;
        return res;
@@ -104,7 +108,7 @@ octeontx_pki_port_create_qos(int port, pki_qos_cfg_t *qos_cfg)
        hdr.msg = MBOX_PKI_PORT_CREATE_QOS;
        hdr.vfid = port;
 
-       res = octeontx_ssovf_mbox_send(&hdr, &q_cfg, len, NULL, 0);
+       res = octeontx_mbox_send(&hdr, &q_cfg, len, NULL, 0);
        if (res < 0)
                return -EACCES;
 
@@ -126,7 +130,7 @@ octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg)
        hdr.msg = MBOX_PKI_PORT_ERRCHK_CONFIG;
        hdr.vfid = port;
 
-       res = octeontx_ssovf_mbox_send(&hdr, &e_cfg, len, NULL, 0);
+       res = octeontx_mbox_send(&hdr, &e_cfg, len, NULL, 0);
        if (res < 0)
                return -EACCES;
 
@@ -140,13 +144,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;
 }