From patchwork Wed Apr 15 14:49:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Venkat Duvvuru X-Patchwork-Id: 68568 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id BDD6EA0563; Wed, 15 Apr 2020 16:52:42 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 223E41D94D; Wed, 15 Apr 2020 16:50:57 +0200 (CEST) Received: from mail-pf1-f193.google.com (mail-pf1-f193.google.com [209.85.210.193]) by dpdk.org (Postfix) with ESMTP id 748F91D94A for ; Wed, 15 Apr 2020 16:50:55 +0200 (CEST) Received: by mail-pf1-f193.google.com with SMTP id 201so67969pfv.2 for ; Wed, 15 Apr 2020 07:50:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=1TlqkJlBZs3mVEGBnHq6Tco3LzIIaAvz+h2ZV3TrQZ0=; b=di7AYVK7gVLKl/oz7XepiLUsMU783Hd6yEn9NgJt3aGiM9gV5cKyoZ1eMjcbq63B08 HF5qszQrwiD0lAPPml8LwMlkMu5CddjGwhF0E64glvKwNwYch0Tg9XCn8hKUIW1N8r7t QiDMe28mfNzu5f7ZWCQWfRIX5sOy9rZqCNcfM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=1TlqkJlBZs3mVEGBnHq6Tco3LzIIaAvz+h2ZV3TrQZ0=; b=eExVJpmyDEKOkM6GJ9OzqgSRsOEqnpz+Hyb8glX5uZsKWDr7P5QPQoNZXgyhRj9I0q CgfBDRpZqidpxWJ16AblIZOyV676r9dSNfHtI1jhqRsZsd9rmDb0rl34Tv9AfKibGZr+ He3uky6bJ2Na++VeA4rFqQ0o/Ffoxt/5pI76wcJbjrClQcJMV5iVyjMEe6sh1c82W2b/ yXeJYhr9hVbKjN+0/6uqqL1UpIKR6T7uFcTQ7oBofrCxsxANutKNyIfvukt8ShynBYey tyhUMbKutwamFNisBA7znaLSFXzLJW/Bv4Od3vD9lxIcMuqlSUSmWKsWV0aQcB1v+6u9 GILw== X-Gm-Message-State: AGi0PuY/bT3/nmPuo7BqH02RfG1VSY5n+Rka9qGyhV6QtIll0F0wsH+1 K0c2tmRH3OPZvj1oNFtPJJW3SEcjWpvghIoSHx5j//ErQs8eo3BR8SB5dV0MT0aAk9gtG/Zd2/b A6NvKzicPGDhi+sujVvzhI2qzHQjDRr5YJ51LRSdaV8S+PIT2Ekba5bXE17n2ngcr6TH4 X-Google-Smtp-Source: APiQypK/DTMFgI4onlkwt3FP/iTLeaBM06i9Get9w6RGa/oqxwvFmd2FMm5lAgoHmWaSAOXggmyIoA== X-Received: by 2002:a62:3843:: with SMTP id f64mr28588040pfa.81.1586962252325; Wed, 15 Apr 2020 07:50:52 -0700 (PDT) Received: from S60.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id 11sm13767969pfz.91.2020.04.15.07.50.50 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 15 Apr 2020 07:50:51 -0700 (PDT) From: Venkat Duvvuru To: dev@dpdk.org Cc: Kishore Padmanabha , Venkat Duvvuru Date: Wed, 15 Apr 2020 20:19:16 +0530 Message-Id: <1586962156-11179-12-git-send-email-venkatkumar.duvvuru@broadcom.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586962156-11179-1-git-send-email-venkatkumar.duvvuru@broadcom.com> References: <1586962156-11179-1-git-send-email-venkatkumar.duvvuru@broadcom.com> Subject: [dpdk-dev] [PATCH 11/11] net/bnxt: addition of the port database X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Kishore Padmanabha The port database is a repository of the port details it is used by the ulp code to query any port related details. Reviewed-by: Mike Baucom Signed-off-by: Kishore Padmanabha Signed-off-by: Venkat Duvvuru --- drivers/net/bnxt/Makefile | 1 + drivers/net/bnxt/meson.build | 1 + drivers/net/bnxt/tf_ulp/bnxt_ulp.c | 48 +++++ drivers/net/bnxt/tf_ulp/bnxt_ulp.h | 10 + drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c | 13 +- drivers/net/bnxt/tf_ulp/ulp_port_db.c | 264 ++++++++++++++++++++++++++ drivers/net/bnxt/tf_ulp/ulp_port_db.h | 134 +++++++++++++ drivers/net/bnxt/tf_ulp/ulp_rte_parser.c | 16 +- drivers/net/bnxt/tf_ulp/ulp_template_struct.h | 1 + 9 files changed, 482 insertions(+), 6 deletions(-) create mode 100644 drivers/net/bnxt/tf_ulp/ulp_port_db.c create mode 100644 drivers/net/bnxt/tf_ulp/ulp_port_db.h diff --git a/drivers/net/bnxt/Makefile b/drivers/net/bnxt/Makefile index 5ed33cc..2a39ed1 100644 --- a/drivers/net/bnxt/Makefile +++ b/drivers/net/bnxt/Makefile @@ -66,6 +66,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_ulp/ulp_mapper.c SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_ulp/ulp_matcher.c SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_ulp/ulp_rte_parser.c SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_ulp/bnxt_ulp_flow.c +SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_ulp/ulp_port_db.c # # Export include files diff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build index d75f887..59dda69 100644 --- a/drivers/net/bnxt/meson.build +++ b/drivers/net/bnxt/meson.build @@ -41,6 +41,7 @@ sources = files('bnxt_cpr.c', 'tf_ulp/ulp_matcher.c', 'tf_ulp/ulp_rte_parser.c', 'tf_ulp/bnxt_ulp_flow.c', + 'tf_ulp/ulp_port_db.c', 'rte_pmd_bnxt.c') diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c index 202b4a5..1823b73 100644 --- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c +++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c @@ -20,6 +20,7 @@ #include "ulp_mark_mgr.h" #include "ulp_flow_db.h" #include "ulp_mapper.h" +#include "ulp_port_db.h" /* Linked list of all TF sessions. */ STAILQ_HEAD(, bnxt_ulp_session_state) bnxt_ulp_session_list = @@ -454,6 +455,13 @@ bnxt_ulp_init(struct bnxt *bp) if (rc) { BNXT_TF_DBG(ERR, "Failed to attach the ulp context\n"); + return rc; + } + /* update the port database */ + rc = ulp_port_db_dev_port_intf_update(&bp->ulp_ctx, bp); + if (rc) { + BNXT_TF_DBG(ERR, + "Failed to update port database\n"); } return rc; } @@ -465,6 +473,20 @@ bnxt_ulp_init(struct bnxt *bp) goto jump_to_error; } + /* create the port database */ + rc = ulp_port_db_init(&bp->ulp_ctx); + if (rc) { + BNXT_TF_DBG(ERR, "Failed to create the port database\n"); + goto jump_to_error; + } + + /* update the port database */ + rc = ulp_port_db_dev_port_intf_update(&bp->ulp_ctx, bp); + if (rc) { + BNXT_TF_DBG(ERR, "Failed to update port database\n"); + goto jump_to_error; + } + /* Create the Mark database. */ rc = ulp_mark_db_init(&bp->ulp_ctx); if (rc) { @@ -539,6 +561,9 @@ bnxt_ulp_deinit(struct bnxt *bp) /* cleanup the ulp mapper */ ulp_mapper_deinit(&bp->ulp_ctx); + /* Delete the Port database */ + ulp_port_db_deinit(&bp->ulp_ctx); + /* Delete the ulp context and tf session */ ulp_ctx_detach(bp, session); @@ -723,3 +748,26 @@ bnxt_ulp_cntxt_ptr2_mapper_data_get(struct bnxt_ulp_context *ulp_ctx) return ulp_ctx->cfg_data->mapper_data; } + +/* Function to set the port database to the ulp context. */ +int32_t +bnxt_ulp_cntxt_ptr2_port_db_set(struct bnxt_ulp_context *ulp_ctx, + struct bnxt_ulp_port_db *port_db) +{ + if (!ulp_ctx || !ulp_ctx->cfg_data) + return -EINVAL; + + ulp_ctx->cfg_data->port_db = port_db; + return 0; +} + +/* Function to get the port database from the ulp context. */ +struct bnxt_ulp_port_db * +bnxt_ulp_cntxt_ptr2_port_db_get(struct bnxt_ulp_context *ulp_ctx) +{ + if (!ulp_ctx || !ulp_ctx->cfg_data) + return NULL; + + return ulp_ctx->cfg_data->port_db; +} + diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h index d2ca178..eecc09c 100644 --- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h +++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h @@ -19,6 +19,7 @@ struct bnxt_ulp_data { uint32_t ref_cnt; struct bnxt_ulp_flow_db *flow_db; void *mapper_data; + struct bnxt_ulp_port_db *port_db; }; struct bnxt_ulp_context { @@ -117,4 +118,13 @@ bnxt_ulp_cntxt_ptr2_mapper_data_set(struct bnxt_ulp_context *ulp_ctx, void * bnxt_ulp_cntxt_ptr2_mapper_data_get(struct bnxt_ulp_context *ulp_ctx); +/* Function to set the port database to the ulp context. */ +int32_t +bnxt_ulp_cntxt_ptr2_port_db_set(struct bnxt_ulp_context *ulp_ctx, + struct bnxt_ulp_port_db *port_db); + +/* Function to get the port database from the ulp context. */ +struct bnxt_ulp_port_db * +bnxt_ulp_cntxt_ptr2_port_db_get(struct bnxt_ulp_context *ulp_ctx); + #endif /* _BNXT_ULP_H_ */ diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c index 7783f85..dbec8ce 100644 --- a/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c +++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c @@ -69,7 +69,7 @@ bnxt_ulp_flow_create(struct rte_eth_dev *dev, { struct bnxt_ulp_mapper_create_parms mapper_cparms = { 0 }; struct ulp_rte_parser_params params; - struct bnxt_ulp_context *ulp_ctx = NULL; + struct bnxt_ulp_context *ulp_ctx; uint32_t class_id, act_tmpl; struct rte_flow *flow_id; uint32_t fid; @@ -90,6 +90,7 @@ bnxt_ulp_flow_create(struct rte_eth_dev *dev, /* Initialize the parser params */ memset(¶ms, 0, sizeof(struct ulp_rte_parser_params)); + params.ulp_ctx = ulp_ctx; if (attr->egress) params.dir = ULP_DIR_EGRESS; @@ -142,7 +143,7 @@ bnxt_ulp_flow_create(struct rte_eth_dev *dev, /* Function to validate the rte flow. */ static int -bnxt_ulp_flow_validate(struct rte_eth_dev *dev __rte_unused, +bnxt_ulp_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], @@ -151,6 +152,7 @@ bnxt_ulp_flow_validate(struct rte_eth_dev *dev __rte_unused, struct ulp_rte_parser_params params; uint32_t class_id, act_tmpl; int ret; + struct bnxt_ulp_context *ulp_ctx; if (bnxt_ulp_flow_validate_args(attr, pattern, actions, @@ -159,8 +161,15 @@ bnxt_ulp_flow_validate(struct rte_eth_dev *dev __rte_unused, return -EINVAL; } + ulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(dev); + if (!ulp_ctx) { + BNXT_TF_DBG(ERR, "ULP context is not initialized\n"); + return -EINVAL; + } + /* Initialize the parser params */ memset(¶ms, 0, sizeof(struct ulp_rte_parser_params)); + params.ulp_ctx = ulp_ctx; if (attr->egress) params.dir = ULP_DIR_EGRESS; diff --git a/drivers/net/bnxt/tf_ulp/ulp_port_db.c b/drivers/net/bnxt/tf_ulp/ulp_port_db.c new file mode 100644 index 0000000..762f90e --- /dev/null +++ b/drivers/net/bnxt/tf_ulp/ulp_port_db.c @@ -0,0 +1,264 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2014-2020 Broadcom + * All rights reserved. + */ + +#include +#include "bnxt.h" +#include "bnxt_vnic.h" +#include "bnxt_tf_common.h" +#include "ulp_port_db.h" + +static uint32_t +ulp_port_db_allocate_ifindex(struct bnxt_ulp_port_db *port_db) +{ + uint32_t idx = 1; + + while (idx < port_db->ulp_intf_list_size && + port_db->ulp_intf_list[idx].type != BNXT_ULP_INTF_TYPE_INVALID) + idx++; + + if (idx >= port_db->ulp_intf_list_size) { + BNXT_TF_DBG(ERR, "Port DB interface list is full\n"); + return 0; + } + return idx; +} + +/* + * Initialize the port database. Memory is allocated in this + * call and assigned to the port database. + * + * ulp_ctxt [in] Ptr to ulp context + * + * Returns 0 on success or negative number on failure. + */ +int32_t ulp_port_db_init(struct bnxt_ulp_context *ulp_ctxt) +{ + struct bnxt_ulp_port_db *port_db; + + port_db = rte_zmalloc("bnxt_ulp_port_db", + sizeof(struct bnxt_ulp_port_db), 0); + if (!port_db) { + BNXT_TF_DBG(ERR, + "Failed to allocate memory for port db\n"); + return -ENOMEM; + } + + /* Attach the port database to the ulp context. */ + bnxt_ulp_cntxt_ptr2_port_db_set(ulp_ctxt, port_db); + + /* index 0 is not being used hence add 1 to size */ + port_db->ulp_intf_list_size = BNXT_PORT_DB_MAX_INTF_LIST + 1; + /* Allocate the port tables */ + port_db->ulp_intf_list = rte_zmalloc("bnxt_ulp_port_db_intf_list", + port_db->ulp_intf_list_size * + sizeof(struct ulp_interface_info), + 0); + if (!port_db->ulp_intf_list) { + BNXT_TF_DBG(ERR, + "Failed to allocate mem for port interface list\n"); + goto error_free; + } + return 0; + +error_free: + ulp_port_db_deinit(ulp_ctxt); + return -ENOMEM; +} + +/* + * Deinitialize the port database. Memory is deallocated in + * this call. + * + * ulp_ctxt [in] Ptr to ulp context + * + * Returns 0 on success. + */ +int32_t ulp_port_db_deinit(struct bnxt_ulp_context *ulp_ctxt) +{ + struct bnxt_ulp_port_db *port_db; + + port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); + if (!port_db) { + BNXT_TF_DBG(ERR, "Invalid Arguments\n"); + return -EINVAL; + } + + /* Detach the flow database from the ulp context. */ + bnxt_ulp_cntxt_ptr2_port_db_set(ulp_ctxt, NULL); + + /* Free up all the memory. */ + rte_free(port_db->ulp_intf_list); + rte_free(port_db); + return 0; +} + +/* + * Update the port database.This api is called when the port + * details are available during the startup. + * + * ulp_ctxt [in] Ptr to ulp context + * bp [in]. ptr to the device function. + * + * Returns 0 on success or negative number on failure. + */ +int32_t ulp_port_db_dev_port_intf_update(struct bnxt_ulp_context *ulp_ctxt, + struct bnxt *bp) +{ + struct bnxt_ulp_port_db *port_db; + uint32_t port_id = bp->eth_dev->data->port_id; + uint32_t ifindex; + struct ulp_interface_info *intf; + int32_t rc; + struct bnxt_vnic_info *vnic; + + port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); + if (!port_db) { + BNXT_TF_DBG(ERR, "Invalid Arguments\n"); + return -EINVAL; + } + + rc = ulp_port_db_dev_port_to_ulp_index(ulp_ctxt, port_id, &ifindex); + if (rc == -ENOENT) { + /* port not found, allocate one */ + ifindex = ulp_port_db_allocate_ifindex(port_db); + if (!ifindex) + return -ENOMEM; + port_db->dev_port_list[port_id] = ifindex; + } else if (rc == -EINVAL) { + return -EINVAL; + } + + /* update the interface details */ + intf = &port_db->ulp_intf_list[ifindex]; + if (BNXT_PF(bp) || BNXT_VF(bp)) { + if (BNXT_PF(bp)) { + intf->type = BNXT_ULP_INTF_TYPE_PF; + intf->port_svif = bp->port_svif; + } else { + intf->type = BNXT_ULP_INTF_TYPE_VF; + } + intf->func_id = bp->fw_fid; + intf->func_svif = bp->func_svif; + vnic = BNXT_GET_DEFAULT_VNIC(bp); + if (vnic) + intf->default_vnic = vnic->fw_vnic_id; + intf->bp = bp; + memcpy(intf->mac_addr, bp->mac_addr, sizeof(intf->mac_addr)); + } else { + BNXT_TF_DBG(ERR, "Invalid interface type\n"); + } + + return 0; +} + +/* + * Api to get the ulp ifindex for a given device port. + * + * ulp_ctxt [in] Ptr to ulp context + * port_id [in].device port id + * ifindex [out] ulp ifindex + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_dev_port_to_ulp_index(struct bnxt_ulp_context *ulp_ctxt, + uint32_t port_id, + uint32_t *ifindex) +{ + struct bnxt_ulp_port_db *port_db; + + *ifindex = 0; + port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); + if (!port_db || port_id >= RTE_MAX_ETHPORTS) { + BNXT_TF_DBG(ERR, "Invalid Arguments\n"); + return -EINVAL; + } + if (!port_db->dev_port_list[port_id]) + return -ENOENT; + + *ifindex = port_db->dev_port_list[port_id]; + return 0; +} + +/* + * Api to get the function id for a given ulp ifindex. + * + * ulp_ctxt [in] Ptr to ulp context + * ifindex [in] ulp ifindex + * func_id [out] the function id of the given ifindex. + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_function_id_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t ifindex, + uint16_t *func_id) +{ + struct bnxt_ulp_port_db *port_db; + + port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); + if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { + BNXT_TF_DBG(ERR, "Invalid Arguments\n"); + return -EINVAL; + } + *func_id = port_db->ulp_intf_list[ifindex].func_id; + return 0; +} + +/* + * Api to get the svid for a given ulp ifindex. + * + * ulp_ctxt [in] Ptr to ulp context + * ifindex [in] ulp ifindex + * dir [in] the direction for the flow. + * svif [out] the svif of the given ifindex. + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_svif_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t ifindex, + uint32_t dir, + uint16_t *svif) +{ + struct bnxt_ulp_port_db *port_db; + + port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); + if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { + BNXT_TF_DBG(ERR, "Invalid Arguments\n"); + return -EINVAL; + } + if (dir == ULP_DIR_EGRESS) + *svif = port_db->ulp_intf_list[ifindex].func_svif; + else + *svif = port_db->ulp_intf_list[ifindex].port_svif; + return 0; +} + +/* + * Api to get the vnic id for a given ulp ifindex. + * + * ulp_ctxt [in] Ptr to ulp context + * ifindex [in] ulp ifindex + * vnic [out] the vnic of the given ifindex. + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_default_vnic_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t ifindex, + uint16_t *vnic) +{ + struct bnxt_ulp_port_db *port_db; + + port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); + if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { + BNXT_TF_DBG(ERR, "Invalid Arguments\n"); + return -EINVAL; + } + *vnic = port_db->ulp_intf_list[ifindex].default_vnic; + return 0; +} + diff --git a/drivers/net/bnxt/tf_ulp/ulp_port_db.h b/drivers/net/bnxt/tf_ulp/ulp_port_db.h new file mode 100644 index 0000000..271c29a --- /dev/null +++ b/drivers/net/bnxt/tf_ulp/ulp_port_db.h @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2014-2019 Broadcom + * All rights reserved. + */ + +#ifndef _ULP_PORT_DB_H_ +#define _ULP_PORT_DB_H_ + +#include "bnxt_ulp.h" + +#define BNXT_PORT_DB_MAX_INTF_LIST 256 + +/* enumeration of the interface types */ +enum bnxt_ulp_intf_type { + BNXT_ULP_INTF_TYPE_INVALID = 0, + BNXT_ULP_INTF_TYPE_PF = 1, + BNXT_ULP_INTF_TYPE_VF, + BNXT_ULP_INTF_TYPE_PF_REP, + BNXT_ULP_INTF_TYPE_VF_REP, + BNXT_ULP_INTF_TYPE_LAST +}; + +/* Structure for the Port database resource information. */ +struct ulp_interface_info { + enum bnxt_ulp_intf_type type; + uint16_t func_id; + uint16_t func_svif; + uint16_t port_svif; + uint16_t default_vnic; + uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; + /* back pointer to the bnxt driver, it is null for rep ports */ + struct bnxt *bp; +}; + +/* Structure for the Port database */ +struct bnxt_ulp_port_db { + struct ulp_interface_info *ulp_intf_list; + uint32_t ulp_intf_list_size; + + /* dpdk device external port list */ + uint16_t dev_port_list[RTE_MAX_ETHPORTS]; +}; + +/* + * Initialize the port database. Memory is allocated in this + * call and assigned to the port database. + * + * ulp_ctxt [in] Ptr to ulp context + * + * Returns 0 on success or negative number on failure. + */ +int32_t ulp_port_db_init(struct bnxt_ulp_context *ulp_ctxt); + +/* + * Deinitialize the port database. Memory is deallocated in + * this call. + * + * ulp_ctxt [in] Ptr to ulp context + * + * Returns 0 on success. + */ +int32_t ulp_port_db_deinit(struct bnxt_ulp_context *ulp_ctxt); + +/* + * Update the port database.This api is called when the port + * details are available during the startup. + * + * ulp_ctxt [in] Ptr to ulp context + * bp [in]. ptr to the device function. + * + * Returns 0 on success or negative number on failure. + */ +int32_t ulp_port_db_dev_port_intf_update(struct bnxt_ulp_context *ulp_ctxt, + struct bnxt *bp); + +/* + * Api to get the ulp ifindex for a given device port. + * + * ulp_ctxt [in] Ptr to ulp context + * port_id [in].device port id + * ifindex [out] ulp ifindex + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_dev_port_to_ulp_index(struct bnxt_ulp_context *ulp_ctxt, + uint32_t port_id, + uint32_t *ifindex); + +/* + * Api to get the function id for a given ulp ifindex. + * + * ulp_ctxt [in] Ptr to ulp context + * ifindex [in] ulp ifindex + * func_id [out] the function id of the given ifindex. + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_function_id_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t ifindex, + uint16_t *func_id); + +/* + * Api to get the svid for a given ulp ifindex. + * + * ulp_ctxt [in] Ptr to ulp context + * ifindex [in] ulp ifindex + * dir [in] the direction for the flow. + * svif [out] the svif of the given ifindex. + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_svif_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t ifindex, + uint32_t dir, + uint16_t *svif); + +/* + * Api to get the vnic id for a given ulp ifindex. + * + * ulp_ctxt [in] Ptr to ulp context + * ifindex [in] ulp ifindex + * vnic [out] the vnic of the given ifindex. + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_default_vnic_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t ifindex, + uint16_t *vnic); + +#endif /* _ULP_PORT_DB_H_ */ diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c index 873f864..ace5fad 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c +++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c @@ -10,6 +10,7 @@ #include "ulp_rte_parser.h" #include "ulp_utils.h" #include "tfp.h" +#include "ulp_port_db.h" /* Utility function to skip the void items. */ static inline int32_t @@ -161,6 +162,8 @@ ulp_rte_parser_svif_set(struct ulp_rte_parser_params *params, uint16_t port_id = svif; uint32_t dir = 0; struct ulp_rte_hdr_field *hdr_field; + uint32_t ifindex; + int32_t rc; if (ULP_BITMAP_ISSET(params->hdr_bitmap.bits, BNXT_ULP_HDR_BIT_SVIF)) { BNXT_TF_DBG(ERR, @@ -175,10 +178,15 @@ ulp_rte_parser_svif_set(struct ulp_rte_parser_params *params, dir = ULP_UTIL_CHF_IDX_RD(params, BNXT_ULP_CHF_IDX_DIRECTION); /* perform the conversion from dpdk port to bnxt svif */ - if (dir == ULP_DIR_EGRESS) - svif = bnxt_get_svif(port_id, true); - else - svif = bnxt_get_svif(port_id, false); + rc = ulp_port_db_dev_port_to_ulp_index(params->ulp_ctx, port_id, + &ifindex); + if (rc) { + BNXT_TF_DBG(ERR, + "Invalid port id\n"); + return BNXT_TF_RC_ERROR; + } + ulp_port_db_svif_get(params->ulp_ctx, ifindex, dir, &svif); + svif = rte_cpu_to_be_16(svif); } hdr_field = ¶ms->hdr_field[BNXT_ULP_PROTO_HDR_FIELD_SVIF_IDX]; memcpy(hdr_field->spec, &svif, sizeof(svif)); diff --git a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h index 1bef5ab..0e0d02f 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h +++ b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h @@ -66,6 +66,7 @@ struct ulp_rte_parser_params { struct ulp_rte_act_bitmap act_bitmap; struct ulp_rte_act_prop act_prop; uint32_t dir; + struct bnxt_ulp_context *ulp_ctx; }; /* Flow Parser Header Information Structure */