From patchwork Thu Mar 11 11:55:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Hunt, David" X-Patchwork-Id: 88941 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 75513A0564; Thu, 11 Mar 2021 12:55:40 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 544DF40689; Thu, 11 Mar 2021 12:55:40 +0100 (CET) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mails.dpdk.org (Postfix) with ESMTP id 33E4240141 for ; Thu, 11 Mar 2021 12:55:38 +0100 (CET) IronPort-SDR: w9gIn7d6xPzRegyrYA8WbO26O+IW2djkcUELunOmdFoPKW1HA16XuekHClZ/6Jv1SLDukx0plb WcxZZ8xQuYOg== X-IronPort-AV: E=McAfee;i="6000,8403,9919"; a="273694485" X-IronPort-AV: E=Sophos;i="5.81,240,1610438400"; d="scan'208";a="273694485" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Mar 2021 03:55:37 -0800 IronPort-SDR: QPN1+nI1kUJtklbFODVLKD6kaDRJbXD+ak6Pz8hTf2oC02xCY+GA2mT2uJRUoqAXjLO3EjKhSk ZZ3Z1vdq34Yw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.81,240,1610438400"; d="scan'208";a="386990776" Received: from silpixa00399952.ir.intel.com (HELO silpixa00399952.ger.corp.intel.com) ([10.237.222.38]) by orsmga002.jf.intel.com with ESMTP; 11 Mar 2021 03:55:35 -0800 From: David Hunt To: dev@dpdk.org Cc: jingjing.wu@intel.com, beilei.xing@intel.com, David Hunt Date: Thu, 11 Mar 2021 11:55:10 +0000 Message-Id: <20210311115510.21066-1-david.hunt@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [dpdk-dev] [PATCH v1] net/iavf: implement power management API 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 Sender: "dev" Implement support for the power management API by implementing a `get_monitor_addr` function that will return an address of an RX ring's status bit. This patch is basically a cut-and-paste of the changes already committed in ixgbe, i40e and ice drivers in 21.02. This extends the availability of the power-saving mechanism to the iavf driver, which is needed for those use-cases using virtual functions. Patch set where PMD Power Manamgement added in 21.02: http://patchwork.dpdk.org/project/dpdk/list/?series=14756 Signed-off-by: David Hunt Acked-by: Anatoly Burakov --- drivers/net/iavf/iavf_ethdev.c | 1 + drivers/net/iavf/iavf_rxtx.c | 25 +++++++++++++++++++++++++ drivers/net/iavf/iavf_rxtx.h | 1 + 3 files changed, 27 insertions(+) diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 4d3772202..760aa41c1 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -197,6 +197,7 @@ static const struct eth_dev_ops iavf_eth_dev_ops = { .rx_queue_intr_disable = iavf_dev_rx_queue_intr_disable, .filter_ctrl = iavf_dev_filter_ctrl, .tx_done_cleanup = iavf_dev_tx_done_cleanup, + .get_monitor_addr = iavf_get_monitor_addr, }; static int diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c index 8fafe4579..caf14a232 100644 --- a/drivers/net/iavf/iavf_rxtx.c +++ b/drivers/net/iavf/iavf_rxtx.c @@ -57,6 +57,31 @@ iavf_proto_xtr_type_to_rxdid(uint8_t flex_type) rxdid_map[flex_type] : IAVF_RXDID_COMMS_OVS_1; } +int +iavf_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc) +{ + struct iavf_rx_queue *rxq = rx_queue; + volatile union iavf_rx_desc *rxdp; + uint16_t desc; + + desc = rxq->rx_tail; + rxdp = &rxq->rx_ring[desc]; + /* watch for changes in status bit */ + pmc->addr = &rxdp->wb.qword1.status_error_len; + + /* + * we expect the DD bit to be set to 1 if this descriptor was already + * written to. + */ + pmc->val = rte_cpu_to_le_64(1 << IAVF_RX_DESC_STATUS_DD_SHIFT); + pmc->mask = rte_cpu_to_le_64(1 << IAVF_RX_DESC_STATUS_DD_SHIFT); + + /* registers are 64-bit */ + pmc->size = sizeof(uint64_t); + + return 0; +} + static inline int check_rx_thresh(uint16_t nb_desc, uint16_t thresh) { diff --git a/drivers/net/iavf/iavf_rxtx.h b/drivers/net/iavf/iavf_rxtx.h index 922ddadad..5377459ea 100644 --- a/drivers/net/iavf/iavf_rxtx.h +++ b/drivers/net/iavf/iavf_rxtx.h @@ -469,6 +469,7 @@ uint16_t iavf_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts); uint16_t iavf_xmit_pkts_vec_avx2(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts); +int iavf_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc); int iavf_rx_vec_dev_check(struct rte_eth_dev *dev); int iavf_tx_vec_dev_check(struct rte_eth_dev *dev); int iavf_rxq_vec_setup(struct iavf_rx_queue *rxq);