From patchwork Tue Sep 12 17:30:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 131369 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9813D4257B; Tue, 12 Sep 2023 11:13:14 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2754A40DFD; Tue, 12 Sep 2023 11:12:22 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.93]) by mails.dpdk.org (Postfix) with ESMTP id F102840A7F for ; Tue, 12 Sep 2023 11:12:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1694509940; x=1726045940; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=5PGir8RBOi2aGxQjfVmOGQWDWEe8YDzvZbMflOjWVuA=; b=M8g9oGwYXTzOFrjp2viiBLAqI5DmDF+hZzpVqfJOZsyPzH4CWqiTV/7X jV7pKAfBfOoM4KbMSWBwEtVt+SICReQUKI2ec2scAmQoEDRCfVeZVGl42 0lAZSL9DquYQPkJducpxVWZd7WGI84qtkZ1PbhLEjK2n4uOSUe1OxXs4g lZo2F1j+TORZBm8iB6xjGfppKIkV3AHwn5jRf669QQNMPigmOB0UZLLxi hD/lzI33h/gI6h4V2q9rC3lFB7N/Bs2aTIIBLdZ5OP2pxQvPBf4NRA0Z8 K5l4stjfjr8FX0ij2hRzBbQIkO4jQTTz4uRReh4fZcp8bGV/YNcN/mnAr A==; X-IronPort-AV: E=McAfee;i="6600,9927,10830"; a="375652093" X-IronPort-AV: E=Sophos;i="6.02,245,1688454000"; d="scan'208";a="375652093" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Sep 2023 02:12:19 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10830"; a="809164466" X-IronPort-AV: E=Sophos;i="6.02,245,1688454000"; d="scan'208";a="809164466" Received: from dpdk-beileix-icelake.sh.intel.com ([10.67.116.248]) by fmsmga008.fm.intel.com with ESMTP; 12 Sep 2023 02:12:18 -0700 From: beilei.xing@intel.com To: jingjing.wu@intel.com Cc: dev@dpdk.org, mingxia.liu@intel.com, Beilei Xing Subject: [PATCH v6 10/10] net/cpfl: support link update for representor Date: Tue, 12 Sep 2023 17:30:39 +0000 Message-Id: <20230912173039.1612287-11-beilei.xing@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230912173039.1612287-1-beilei.xing@intel.com> References: <20230912162640.1439383-1-beilei.xing@intel.com> <20230912173039.1612287-1-beilei.xing@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Beilei Xing Add link update ops for representor. Signed-off-by: Jingjing Wu Signed-off-by: Beilei Xing --- drivers/net/cpfl/cpfl_ethdev.h | 1 + drivers/net/cpfl/cpfl_representor.c | 89 +++++++++++++++++++++++------ 2 files changed, 71 insertions(+), 19 deletions(-) diff --git a/drivers/net/cpfl/cpfl_ethdev.h b/drivers/net/cpfl/cpfl_ethdev.h index a4ffd51fb3..d0dcc0cc05 100644 --- a/drivers/net/cpfl/cpfl_ethdev.h +++ b/drivers/net/cpfl/cpfl_ethdev.h @@ -162,6 +162,7 @@ struct cpfl_repr { struct cpfl_repr_id repr_id; struct rte_ether_addr mac_addr; struct cpfl_vport_info *vport_info; + bool func_up; /* If the represented function is up */ }; struct cpfl_adapter_ext { diff --git a/drivers/net/cpfl/cpfl_representor.c b/drivers/net/cpfl/cpfl_representor.c index d2558c39a8..4d15a26c80 100644 --- a/drivers/net/cpfl/cpfl_representor.c +++ b/drivers/net/cpfl/cpfl_representor.c @@ -308,6 +308,72 @@ cpfl_repr_tx_queue_setup(__rte_unused struct rte_eth_dev *dev, return 0; } +static int +cpfl_func_id_get(uint8_t host_id, uint8_t pf_id) +{ + if ((host_id != CPFL_HOST_ID_HOST && + host_id != CPFL_HOST_ID_ACC) || + (pf_id != CPFL_PF_TYPE_APF && + pf_id != CPFL_PF_TYPE_CPF)) + return -EINVAL; + + static const uint32_t func_id_map[CPFL_HOST_ID_NUM][CPFL_PF_TYPE_NUM] = { + [CPFL_HOST_ID_HOST][CPFL_PF_TYPE_APF] = CPFL_HOST0_APF, + [CPFL_HOST_ID_HOST][CPFL_PF_TYPE_CPF] = CPFL_HOST0_CPF_ID, + [CPFL_HOST_ID_ACC][CPFL_PF_TYPE_APF] = CPFL_ACC_APF_ID, + [CPFL_HOST_ID_ACC][CPFL_PF_TYPE_CPF] = CPFL_ACC_CPF_ID, + }; + + return func_id_map[host_id][pf_id]; +} + +static int +cpfl_repr_link_update(struct rte_eth_dev *ethdev, + int wait_to_complete) +{ + struct cpfl_repr *repr = CPFL_DEV_TO_REPR(ethdev); + struct rte_eth_link *dev_link = ðdev->data->dev_link; + struct cpfl_adapter_ext *adapter = repr->itf.adapter; + struct cpchnl2_get_vport_info_response response; + struct cpfl_vport_id vi; + int ret; + + if (!(ethdev->data->dev_flags & RTE_ETH_DEV_REPRESENTOR)) { + PMD_INIT_LOG(ERR, "This ethdev is not representor."); + return -EINVAL; + } + + if (wait_to_complete) { + if (repr->repr_id.type == RTE_ETH_REPRESENTOR_PF) { + /* PF */ + vi.func_type = CPCHNL2_FUNC_TYPE_PF; + vi.pf_id = cpfl_func_id_get(repr->repr_id.host_id, repr->repr_id.pf_id); + vi.vf_id = 0; + } else { + /* VF */ + vi.func_type = CPCHNL2_FUNC_TYPE_SRIOV; + vi.pf_id = CPFL_HOST0_APF; + vi.vf_id = repr->repr_id.vf_id; + } + ret = cpfl_cc_vport_info_get(adapter, &repr->vport_info->vport.vport, + &vi, &response); + if (ret < 0) { + PMD_INIT_LOG(ERR, "Fail to get vport info."); + return ret; + } + + if (response.info.vport_status == CPCHNL2_VPORT_STATUS_ENABLED) + repr->func_up = true; + else + repr->func_up = false; + } + + dev_link->link_status = repr->func_up ? + RTE_ETH_LINK_UP : RTE_ETH_LINK_DOWN; + + return 0; +} + static const struct eth_dev_ops cpfl_repr_dev_ops = { .dev_start = cpfl_repr_dev_start, .dev_stop = cpfl_repr_dev_stop, @@ -317,6 +383,8 @@ static const struct eth_dev_ops cpfl_repr_dev_ops = { .rx_queue_setup = cpfl_repr_rx_queue_setup, .tx_queue_setup = cpfl_repr_tx_queue_setup, + + .link_update = cpfl_repr_link_update, }; static int @@ -331,6 +399,8 @@ cpfl_repr_init(struct rte_eth_dev *eth_dev, void *init_param) repr->itf.type = CPFL_ITF_TYPE_REPRESENTOR; repr->itf.adapter = adapter; repr->itf.data = eth_dev->data; + if (repr->vport_info->vport.info.vport_status == CPCHNL2_VPORT_STATUS_ENABLED) + repr->func_up = true; eth_dev->dev_ops = &cpfl_repr_dev_ops; @@ -349,25 +419,6 @@ cpfl_repr_init(struct rte_eth_dev *eth_dev, void *init_param) return cpfl_repr_allowlist_update(adapter, &repr->repr_id, eth_dev); } -static int -cpfl_func_id_get(uint8_t host_id, uint8_t pf_id) -{ - if ((host_id != CPFL_HOST_ID_HOST && - host_id != CPFL_HOST_ID_ACC) || - (pf_id != CPFL_PF_TYPE_APF && - pf_id != CPFL_PF_TYPE_CPF)) - return -EINVAL; - - static const uint32_t func_id_map[CPFL_HOST_ID_NUM][CPFL_PF_TYPE_NUM] = { - [CPFL_HOST_ID_HOST][CPFL_PF_TYPE_APF] = CPFL_HOST0_APF, - [CPFL_HOST_ID_HOST][CPFL_PF_TYPE_CPF] = CPFL_HOST0_CPF_ID, - [CPFL_HOST_ID_ACC][CPFL_PF_TYPE_APF] = CPFL_ACC_APF_ID, - [CPFL_HOST_ID_ACC][CPFL_PF_TYPE_CPF] = CPFL_ACC_CPF_ID, - }; - - return func_id_map[host_id][pf_id]; -} - static bool cpfl_match_repr_with_vport(const struct cpfl_repr_id *repr_id, struct cpchnl2_vport_info *info)