From patchwork Thu Dec 8 07:52:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 120559 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 1C14DA00C2; Thu, 8 Dec 2022 08:53:53 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2FD8E42D34; Thu, 8 Dec 2022 08:53:33 +0100 (CET) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mails.dpdk.org (Postfix) with ESMTP id A3ECE42D34 for ; Thu, 8 Dec 2022 08:53:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1670486011; x=1702022011; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=/pxyZ1ndI3ky1A4tHUabUoICi6j7TqWliD7T/LM1Zsk=; b=Hz+a69AiCHmE4CHj4711D5NpzWBs5lv5UDEt6mDgnC2iUbXOjEOkFo/w c9AdaGFZyIXP3O03MfgNGaGhVjz6EmZsdZpEbsneJwLEMqUbuTQsfZ8pE /npEhXhCWFSM8LHk+dUuFlexe1d60mi1JL9cuAEB1dtMN3ic276QZ+R9d 05ngEhKlHFHBJa4YBprE4LoLcciuZmZsL6eYbRA9W7z9YMc0J2ObBOTJE M2jn/AFz6iOkuOlJs78f3rylZetuqsQF/kov6dyXa1QOSYSMUhZSsUxal PMkqKS+IK5R42lINWcC3S7xj3OseGWlr7fSDV7oB8RGQI0hlINd63yjXv Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10554"; a="318244163" X-IronPort-AV: E=Sophos;i="5.96,227,1665471600"; d="scan'208";a="318244163" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Dec 2022 23:53:31 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10554"; a="715499296" X-IronPort-AV: E=Sophos;i="5.96,227,1665471600"; d="scan'208";a="715499296" Received: from dpdk-beileix-3.sh.intel.com ([10.67.110.253]) by fmsmga004.fm.intel.com with ESMTP; 07 Dec 2022 23:53:29 -0800 From: beilei.xing@intel.com To: jingjing.wu@intel.com, qi.z.zhang@intel.com Cc: dev@dpdk.org, Beilei Xing , Wenjun Wu Subject: [PATCH 04/15] common/idpf: introduce adapter init and deinit Date: Thu, 8 Dec 2022 07:52:58 +0000 Message-Id: <20221208075309.37852-5-beilei.xing@intel.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20221208075309.37852-1-beilei.xing@intel.com> References: <20221208075309.37852-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 Introduce base init and deinit in common module. Signed-off-by: Wenjun Wu Signed-off-by: Beilei Xing --- drivers/common/idpf/idpf_common_device.c | 153 ++++++++++++++++++++ drivers/common/idpf/idpf_common_device.h | 6 + drivers/common/idpf/idpf_common_virtchnl.h | 2 - drivers/common/idpf/version.map | 4 +- drivers/net/idpf/idpf_ethdev.c | 158 +++------------------ drivers/net/idpf/idpf_ethdev.h | 2 - 6 files changed, 178 insertions(+), 147 deletions(-) diff --git a/drivers/common/idpf/idpf_common_device.c b/drivers/common/idpf/idpf_common_device.c index 5062780362..b2b42443e4 100644 --- a/drivers/common/idpf/idpf_common_device.c +++ b/drivers/common/idpf/idpf_common_device.c @@ -4,5 +4,158 @@ #include #include +#include + +static void +idpf_reset_pf(struct idpf_hw *hw) +{ + uint32_t reg; + + reg = IDPF_READ_REG(hw, PFGEN_CTRL); + IDPF_WRITE_REG(hw, PFGEN_CTRL, (reg | PFGEN_CTRL_PFSWR)); +} + +#define IDPF_RESET_WAIT_CNT 100 +static int +idpf_check_pf_reset_done(struct idpf_hw *hw) +{ + uint32_t reg; + int i; + + for (i = 0; i < IDPF_RESET_WAIT_CNT; i++) { + reg = IDPF_READ_REG(hw, PFGEN_RSTAT); + if (reg != 0xFFFFFFFF && (reg & PFGEN_RSTAT_PFR_STATE_M)) + return 0; + rte_delay_ms(1000); + } + + DRV_LOG(ERR, "IDPF reset timeout"); + return -EBUSY; +} + +#define CTLQ_NUM 2 +static int +idpf_init_mbx(struct idpf_hw *hw) +{ + struct idpf_ctlq_create_info ctlq_info[CTLQ_NUM] = { + { + .type = IDPF_CTLQ_TYPE_MAILBOX_TX, + .id = IDPF_CTLQ_ID, + .len = IDPF_CTLQ_LEN, + .buf_size = IDPF_DFLT_MBX_BUF_SIZE, + .reg = { + .head = PF_FW_ATQH, + .tail = PF_FW_ATQT, + .len = PF_FW_ATQLEN, + .bah = PF_FW_ATQBAH, + .bal = PF_FW_ATQBAL, + .len_mask = PF_FW_ATQLEN_ATQLEN_M, + .len_ena_mask = PF_FW_ATQLEN_ATQENABLE_M, + .head_mask = PF_FW_ATQH_ATQH_M, + } + }, + { + .type = IDPF_CTLQ_TYPE_MAILBOX_RX, + .id = IDPF_CTLQ_ID, + .len = IDPF_CTLQ_LEN, + .buf_size = IDPF_DFLT_MBX_BUF_SIZE, + .reg = { + .head = PF_FW_ARQH, + .tail = PF_FW_ARQT, + .len = PF_FW_ARQLEN, + .bah = PF_FW_ARQBAH, + .bal = PF_FW_ARQBAL, + .len_mask = PF_FW_ARQLEN_ARQLEN_M, + .len_ena_mask = PF_FW_ARQLEN_ARQENABLE_M, + .head_mask = PF_FW_ARQH_ARQH_M, + } + } + }; + struct idpf_ctlq_info *ctlq; + int ret; + + ret = idpf_ctlq_init(hw, CTLQ_NUM, ctlq_info); + if (ret != 0) + return ret; + + LIST_FOR_EACH_ENTRY_SAFE(ctlq, NULL, &hw->cq_list_head, + struct idpf_ctlq_info, cq_list) { + if (ctlq->q_id == IDPF_CTLQ_ID && + ctlq->cq_type == IDPF_CTLQ_TYPE_MAILBOX_TX) + hw->asq = ctlq; + if (ctlq->q_id == IDPF_CTLQ_ID && + ctlq->cq_type == IDPF_CTLQ_TYPE_MAILBOX_RX) + hw->arq = ctlq; + } + + if (hw->asq == NULL || hw->arq == NULL) { + idpf_ctlq_deinit(hw); + ret = -ENOENT; + } + + return ret; +} + +int +idpf_adapter_init(struct idpf_adapter *adapter) +{ + struct idpf_hw *hw = &adapter->hw; + int ret; + + idpf_reset_pf(hw); + ret = idpf_check_pf_reset_done(hw); + if (ret != 0) { + DRV_LOG(ERR, "IDPF is still resetting"); + goto err_check_reset; + } + + ret = idpf_init_mbx(hw); + if (ret != 0) { + DRV_LOG(ERR, "Failed to init mailbox"); + goto err_check_reset; + } + + adapter->mbx_resp = rte_zmalloc("idpf_adapter_mbx_resp", + IDPF_DFLT_MBX_BUF_SIZE, 0); + if (adapter->mbx_resp == NULL) { + DRV_LOG(ERR, "Failed to allocate idpf_adapter_mbx_resp memory"); + ret = -ENOMEM; + goto err_mbx_resp; + } + + ret = idpf_vc_check_api_version(adapter); + if (ret != 0) { + DRV_LOG(ERR, "Failed to check api version"); + goto err_check_api; + } + + ret = idpf_vc_get_caps(adapter); + if (ret != 0) { + DRV_LOG(ERR, "Failed to get capabilities"); + goto err_check_api; + } + + return 0; + +err_check_api: + rte_free(adapter->mbx_resp); + adapter->mbx_resp = NULL; +err_mbx_resp: + idpf_ctlq_deinit(hw); +err_check_reset: + return ret; +} + +int +idpf_adapter_deinit(struct idpf_adapter *adapter) +{ + struct idpf_hw *hw = &adapter->hw; + + idpf_ctlq_deinit(hw); + rte_free(adapter->mbx_resp); + adapter->mbx_resp = NULL; + + return 0; +} RTE_LOG_REGISTER_SUFFIX(idpf_common_logtype, common, NOTICE); diff --git a/drivers/common/idpf/idpf_common_device.h b/drivers/common/idpf/idpf_common_device.h index a7537281d1..e4344ea392 100644 --- a/drivers/common/idpf/idpf_common_device.h +++ b/drivers/common/idpf/idpf_common_device.h @@ -9,6 +9,7 @@ #include #include +#define IDPF_CTLQ_ID -1 #define IDPF_CTLQ_LEN 64 #define IDPF_DFLT_MBX_BUF_SIZE 4096 @@ -137,4 +138,9 @@ atomic_set_cmd(struct idpf_adapter *adapter, uint32_t ops) return !ret; } +__rte_internal +int idpf_adapter_init(struct idpf_adapter *adapter); +__rte_internal +int idpf_adapter_deinit(struct idpf_adapter *adapter); + #endif /* _IDPF_COMMON_DEVICE_H_ */ diff --git a/drivers/common/idpf/idpf_common_virtchnl.h b/drivers/common/idpf/idpf_common_virtchnl.h index bbc66d63c4..a1bae81372 100644 --- a/drivers/common/idpf/idpf_common_virtchnl.h +++ b/drivers/common/idpf/idpf_common_virtchnl.h @@ -7,9 +7,7 @@ #include -__rte_internal int idpf_vc_check_api_version(struct idpf_adapter *adapter); -__rte_internal int idpf_vc_get_caps(struct idpf_adapter *adapter); __rte_internal int idpf_vc_create_vport(struct idpf_vport *vport, diff --git a/drivers/common/idpf/version.map b/drivers/common/idpf/version.map index 3fa367aea4..535fa1fc24 100644 --- a/drivers/common/idpf/version.map +++ b/drivers/common/idpf/version.map @@ -7,8 +7,6 @@ INTERNAL { idpf_ctlq_recv; idpf_ctlq_send; idpf_ctlq_post_rx_buffs; - idpf_vc_check_api_version; - idpf_vc_get_caps; idpf_vc_create_vport; idpf_vc_destroy_vport; idpf_vc_set_rss_key; @@ -23,6 +21,8 @@ INTERNAL { idpf_vc_query_ptype_info; idpf_read_one_msg; idpf_execute_vc_cmd; + idpf_adapter_init; + idpf_adapter_deinit; local: *; }; diff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c index bd74fb57b4..46529cebf9 100644 --- a/drivers/net/idpf/idpf_ethdev.c +++ b/drivers/net/idpf/idpf_ethdev.c @@ -781,148 +781,32 @@ idpf_parse_devargs(struct rte_pci_device *pci_dev, struct idpf_adapter_ext *adap return ret; } -static void -idpf_reset_pf(struct idpf_hw *hw) -{ - uint32_t reg; - - reg = IDPF_READ_REG(hw, PFGEN_CTRL); - IDPF_WRITE_REG(hw, PFGEN_CTRL, (reg | PFGEN_CTRL_PFSWR)); -} - -#define IDPF_RESET_WAIT_CNT 100 static int -idpf_check_pf_reset_done(struct idpf_hw *hw) +idpf_adapter_ext_init(struct rte_pci_device *pci_dev, struct idpf_adapter_ext *adapter) { - uint32_t reg; - int i; - - for (i = 0; i < IDPF_RESET_WAIT_CNT; i++) { - reg = IDPF_READ_REG(hw, PFGEN_RSTAT); - if (reg != 0xFFFFFFFF && (reg & PFGEN_RSTAT_PFR_STATE_M)) - return 0; - rte_delay_ms(1000); - } - - PMD_INIT_LOG(ERR, "IDPF reset timeout"); - return -EBUSY; -} - -#define CTLQ_NUM 2 -static int -idpf_init_mbx(struct idpf_hw *hw) -{ - struct idpf_ctlq_create_info ctlq_info[CTLQ_NUM] = { - { - .type = IDPF_CTLQ_TYPE_MAILBOX_TX, - .id = IDPF_CTLQ_ID, - .len = IDPF_CTLQ_LEN, - .buf_size = IDPF_DFLT_MBX_BUF_SIZE, - .reg = { - .head = PF_FW_ATQH, - .tail = PF_FW_ATQT, - .len = PF_FW_ATQLEN, - .bah = PF_FW_ATQBAH, - .bal = PF_FW_ATQBAL, - .len_mask = PF_FW_ATQLEN_ATQLEN_M, - .len_ena_mask = PF_FW_ATQLEN_ATQENABLE_M, - .head_mask = PF_FW_ATQH_ATQH_M, - } - }, - { - .type = IDPF_CTLQ_TYPE_MAILBOX_RX, - .id = IDPF_CTLQ_ID, - .len = IDPF_CTLQ_LEN, - .buf_size = IDPF_DFLT_MBX_BUF_SIZE, - .reg = { - .head = PF_FW_ARQH, - .tail = PF_FW_ARQT, - .len = PF_FW_ARQLEN, - .bah = PF_FW_ARQBAH, - .bal = PF_FW_ARQBAL, - .len_mask = PF_FW_ARQLEN_ARQLEN_M, - .len_ena_mask = PF_FW_ARQLEN_ARQENABLE_M, - .head_mask = PF_FW_ARQH_ARQH_M, - } - } - }; - struct idpf_ctlq_info *ctlq; - int ret; - - ret = idpf_ctlq_init(hw, CTLQ_NUM, ctlq_info); - if (ret != 0) - return ret; - - LIST_FOR_EACH_ENTRY_SAFE(ctlq, NULL, &hw->cq_list_head, - struct idpf_ctlq_info, cq_list) { - if (ctlq->q_id == IDPF_CTLQ_ID && - ctlq->cq_type == IDPF_CTLQ_TYPE_MAILBOX_TX) - hw->asq = ctlq; - if (ctlq->q_id == IDPF_CTLQ_ID && - ctlq->cq_type == IDPF_CTLQ_TYPE_MAILBOX_RX) - hw->arq = ctlq; - } - - if (hw->asq == NULL || hw->arq == NULL) { - idpf_ctlq_deinit(hw); - ret = -ENOENT; - } - - return ret; -} - -static int -idpf_adapter_init(struct rte_pci_device *pci_dev, struct idpf_adapter_ext *adapter) -{ - struct idpf_hw *hw = &adapter->base.hw; + struct idpf_adapter *base = &adapter->base; + struct idpf_hw *hw = &base->hw; int ret = 0; hw->hw_addr = (void *)pci_dev->mem_resource[0].addr; hw->hw_addr_len = pci_dev->mem_resource[0].len; - hw->back = &adapter->base; + hw->back = base; hw->vendor_id = pci_dev->id.vendor_id; hw->device_id = pci_dev->id.device_id; hw->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id; strncpy(adapter->name, pci_dev->device.name, PCI_PRI_STR_SIZE); - idpf_reset_pf(hw); - ret = idpf_check_pf_reset_done(hw); - if (ret != 0) { - PMD_INIT_LOG(ERR, "IDPF is still resetting"); - goto err; - } - - ret = idpf_init_mbx(hw); - if (ret != 0) { - PMD_INIT_LOG(ERR, "Failed to init mailbox"); - goto err; - } - - adapter->base.mbx_resp = rte_zmalloc("idpf_adapter_mbx_resp", - IDPF_DFLT_MBX_BUF_SIZE, 0); - if (adapter->base.mbx_resp == NULL) { - PMD_INIT_LOG(ERR, "Failed to allocate idpf_adapter_mbx_resp memory"); - ret = -ENOMEM; - goto err_mbx; - } - - ret = idpf_vc_check_api_version(&adapter->base); + ret = idpf_adapter_init(base); if (ret != 0) { - PMD_INIT_LOG(ERR, "Failed to check api version"); - goto err_api; + PMD_INIT_LOG(ERR, "Failed to init adapter"); + goto err_adapter_init; } ret = idpf_get_pkt_type(adapter); if (ret != 0) { PMD_INIT_LOG(ERR, "Failed to set ptype table"); - goto err_api; - } - - ret = idpf_vc_get_caps(&adapter->base); - if (ret != 0) { - PMD_INIT_LOG(ERR, "Failed to get capabilities"); - goto err_api; + goto err_get_ptype; } adapter->max_vport_nb = adapter->base.caps.max_vports; @@ -934,7 +818,7 @@ idpf_adapter_init(struct rte_pci_device *pci_dev, struct idpf_adapter_ext *adapt if (adapter->vports == NULL) { PMD_INIT_LOG(ERR, "Failed to allocate vports memory"); ret = -ENOMEM; - goto err_api; + goto err_get_ptype; } adapter->cur_vports = 0; @@ -944,12 +828,9 @@ idpf_adapter_init(struct rte_pci_device *pci_dev, struct idpf_adapter_ext *adapt return ret; -err_api: - rte_free(adapter->base.mbx_resp); - adapter->base.mbx_resp = NULL; -err_mbx: - idpf_ctlq_deinit(hw); -err: +err_get_ptype: + idpf_adapter_deinit(base); +err_adapter_init: return ret; } @@ -1088,14 +969,9 @@ idpf_find_adapter_ext(struct rte_pci_device *pci_dev) } static void -idpf_adapter_rel(struct idpf_adapter_ext *adapter) +idpf_adapter_ext_deinit(struct idpf_adapter_ext *adapter) { - struct idpf_hw *hw = &adapter->base.hw; - - idpf_ctlq_deinit(hw); - - rte_free(adapter->base.mbx_resp); - adapter->base.mbx_resp = NULL; + idpf_adapter_deinit(&adapter->base); rte_free(adapter->vports); adapter->vports = NULL; @@ -1128,7 +1004,7 @@ idpf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, return -ENOMEM; } - retval = idpf_adapter_init(pci_dev, adapter); + retval = idpf_adapter_ext_init(pci_dev, adapter); if (retval != 0) { PMD_INIT_LOG(ERR, "Failed to init adapter."); return retval; @@ -1191,7 +1067,7 @@ idpf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, rte_spinlock_lock(&idpf_adapter_lock); TAILQ_REMOVE(&idpf_adapter_list, adapter, next); rte_spinlock_unlock(&idpf_adapter_lock); - idpf_adapter_rel(adapter); + idpf_adapter_ext_deinit(adapter); rte_free(adapter); } return retval; @@ -1211,7 +1087,7 @@ idpf_pci_remove(struct rte_pci_device *pci_dev) rte_spinlock_lock(&idpf_adapter_lock); TAILQ_REMOVE(&idpf_adapter_list, adapter, next); rte_spinlock_unlock(&idpf_adapter_lock); - idpf_adapter_rel(adapter); + idpf_adapter_ext_deinit(adapter); rte_free(adapter); return 0; diff --git a/drivers/net/idpf/idpf_ethdev.h b/drivers/net/idpf/idpf_ethdev.h index 10b1542ba4..bfede6f4e3 100644 --- a/drivers/net/idpf/idpf_ethdev.h +++ b/drivers/net/idpf/idpf_ethdev.h @@ -31,8 +31,6 @@ #define IDPF_RXQ_PER_GRP 1 #define IDPF_RX_BUFQ_PER_GRP 2 -#define IDPF_CTLQ_ID -1 - #define IDPF_DFLT_Q_VEC_NUM 1 #define IDPF_DFLT_INTERVAL 16