From patchwork Tue Jun 14 19:06:29 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerin Jacob X-Patchwork-Id: 13690 X-Patchwork-Delegate: bruce.richardson@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id B9E9D9AF6; Tue, 14 Jun 2016 21:08:06 +0200 (CEST) Received: from na01-by2-obe.outbound.protection.outlook.com (mail-by2on0095.outbound.protection.outlook.com [207.46.100.95]) by dpdk.org (Postfix) with ESMTP id 3E8E9AA39 for ; Tue, 14 Jun 2016 21:08:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=OAaxJOaQNI5cBnt51x/tx8lQkD8elwGsTY7DkheJMtw=; b=io7QDKyZez46WHrrPh7oRT/bZfDDc5GtoOiSuCnEuQAE7E27c76tDqHUOQZtYFcZbzmDOWIVGbVb09Ahziy7dNPZyWR3gNfAWfD8URd8gMS9Yh9dOxg1nxeoEE4FFv9w0kdTXyF3fNQk7mVEbHEUDMBosLqPsN7Sc8nOpPVafo4= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Jerin.Jacob@cavium.com; Received: from localhost.caveonetworks.com (111.93.218.67) by BY1PR0701MB1723.namprd07.prod.outlook.com (10.162.111.142) with Microsoft SMTP Server (TLS) id 15.1.511.8; Tue, 14 Jun 2016 19:08:00 +0000 From: Jerin Jacob To: CC: , , , Jerin Jacob , Maciej Czekaj , Kamil Rytarowski , Zyta Szpak , Slawomir Rosek , Radoslaw Biernacki Date: Wed, 15 Jun 2016 00:36:29 +0530 Message-ID: <1465931200-23912-15-git-send-email-jerin.jacob@caviumnetworks.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1465931200-23912-1-git-send-email-jerin.jacob@caviumnetworks.com> References: <1465826143-22159-1-git-send-email-jerin.jacob@caviumnetworks.com> <1465931200-23912-1-git-send-email-jerin.jacob@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: MA1PR01CA0040.INDPRD01.PROD.OUTLOOK.COM (10.164.116.140) To BY1PR0701MB1723.namprd07.prod.outlook.com (10.162.111.142) X-MS-Office365-Filtering-Correlation-Id: bed6954d-bbb4-4a87-1a98-08d39487357b X-Microsoft-Exchange-Diagnostics: 1; BY1PR0701MB1723; 2:W9chWCKf7WfFBINw7qqQnqYmTDsYD2HgAncszbUpppN6Eq2Ck+g7AZ5yM2Zt1K38ZjlK0iDGMLDjWczfnc3zdSFkgtD6UipBD0IeGRv/Rz3BKoF7GQpoYv69iZq8ZHexBxUPF3rGhuNa9pCAu6SHCJ/83BZB9kiV66Z8viDOnnXCu+m6OHv6GCF9H78Rrp07; 3:aJDD8Imt1uV0N4Bwu6SswLrSVeYx1p5Ci+1tKouOIhbgb4GU/Je2LBwk81mlGQgzVqIcb/DU0LfRtfilE3rLrLe/peyMm0YFJUUTqqpK577u6DLYkcn0Dta0WDxDVPre X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR0701MB1723; X-Microsoft-Exchange-Diagnostics: 1; BY1PR0701MB1723; 25:QWwcjtNAV/yq3VrBMyct8SNVAfokDzxGt6J46M4lOGZphHrwngDjIQ/RSOMvA7K6d7CjVY0P2c3+6Ng/Cpu/jfvl4xiWFq2qo+5zT/kr09eIB6uJLJyU9Wb2DqLzY25wWtlYjz4PxqaOlr37d9rLtA7iEDwzWzsNd+dfbVwo9BJywKNrQ0Zsnal1tEJ8Ye9Af5jP+uuZJNT9jAIMV+8Mj8/KWp9Kb5/W8Hd7FbzyzAC3BPiDdeUk4jP+TJiBC4OxzyruJYQXr0BnmY3O5ThonIPiy81cRAk0xJHmu0Kq0UNKT5VjTN530SlxR+6v/gZiyu/Q3NL15IL22BlzJKB/WgF6frGNJ3ak6CpS8p3RG0IqgjRKQ1/3bsc8V6UXn1zojfp4Qb3e57eu47u90HEaAb/kTg3s2nppY7nujySfwjCQ/i8mjCweGSiEoOjgNUdI/6fbMHRBP/xYqdo0eJY6hw0UoMwKrX1FSmKqWNmRpwIEdrryma7wfKTqYY8FtrxUNdFHlxcy+YIVsY2tozqU0SLI2VMkbIiCJRiQV7E40FmuMMVviXS8RH8KiRpxx7CYpHvOk3L8uGsLrrlmEGEwowNaROj7wbA3aI94VIyZ3PvCo7951z2hTxpd2ReweXid0p3aax1SQxDnzhxTFKZ9FUoAaADZd7utp3vy43h4XjrkYaOStZuC8P7a3PrbRK71OK6UdPV38c8UzhpBRzJu91k629ic+8xbfeuOlVJgCcJeM84T9m0BUHTCHjSaIpNgo8fnZYdKoFbiW2sOguMmcg== X-Microsoft-Exchange-Diagnostics: 1; BY1PR0701MB1723; 20:ZI6YTY+ATZhQnEUTzT0RvwxuujU8siJRrIQ9Blorv3gsPCV/Z9ireV1NSwVsjcm9e0Vr/LCWbnwxQGmvydv/wwozTTZEUawRuoMWSlN2iGs0AnEEBcYaFbsfTNtif3FIxdpR3YG6NyUl6vjiHYQzbq4vJW01ZRommysHlI9W2VSk2kR8jFOZ2Qk9Ej7I5AGR6nzVVIKvmrT25w+3GhQCsVK2pwrNGfjLDbItKATILotHk8lY/ClImikMN1QLradGEtTORcqMcYON+J3NHdSh4A6/GgiL3TWJ8K7Qnr9Q/W2bkeWwv/yth1gFUqQ0qn6sNJSA58CVpC2afeL32o5vHTvf3JwBcltgVm29jE4pwAaE+mfvLbGMiGr6YZDs+fEfy/0ZGHmMF0ntlaFhLKT3n58syu+uVdWGEA0zTvE5zfc7ErBYljFQ5kfmwU9b0uB6Lql1frzsaaAoiSgHm1kgg5/sQ6b8mEaRgs3ih3M2QICfsB1Bwj7wguIAWunIrAjJKaiLuINYCX5vXdGq3n9y7CVqSwM19RnwE0RLt88+3wSrpN4JbSvCMGC0bcadXQ0OIaYiyK63Jpkuqfa9CqWK+srktzcGcLRHojXMgPX248A= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046); SRVR:BY1PR0701MB1723; BCL:0; PCL:0; RULEID:; SRVR:BY1PR0701MB1723; X-Microsoft-Exchange-Diagnostics: 1; BY1PR0701MB1723; 4:tm+RcaA8eHU5LI4zzaT8FtKc4818DFbulDzNzrh2pBNNy03BV9Pmnwqzbeix/DxFgjJfQVGnETQmP7b1ybSktmDH77SG2sdi3/E4vyUcvQXHgyzexYgdfj+dsfpYHRzpfOqNnU0iOh9fgqWETmakn1wysFgp9v9u/ATTIEXTrWIlp3jveSqiVr9R7dgx0aGYgm5Yo/vD1Y3GUPDZld4Te/7MoQocUeVgJ7zICe0qDV2BkQMY24nW/FpMqlycVIJZvc2EdHXekmdGyb4CH0tg8FWh0BkZ0qCyQyr1AdfaE3gfJV4E4YfOQsrVYciqrxdA7mblVX5SY8uo0iuI9QDaRuToDt8uic+X723YD/RFmfvFJdq1gBz7DcfOaccZYowo X-Forefront-PRVS: 09730BD177 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(189002)(199003)(69596002)(189998001)(2950100001)(48376002)(77096005)(36756003)(19580405001)(5004730100002)(19580395003)(76176999)(5009440100003)(50986999)(97736004)(5003940100001)(68736007)(110136002)(92566002)(101416001)(5008740100001)(81166006)(8676002)(229853001)(81156014)(66066001)(4326007)(50466002)(2906002)(105586002)(106356001)(2351001)(47776003)(53416004)(76506005)(42186005)(33646002)(586003)(3846002)(6116002)(50226002)(7099028); DIR:OUT; SFP:1101; SCL:1; SRVR:BY1PR0701MB1723; H:localhost.caveonetworks.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY1PR0701MB1723; 23:v0uDv6qTFFD3WFmeIcZzXDxQUMyXsd9Fwf/5bGi?= =?us-ascii?Q?XUsFEV+zdf+f0SDA6Z0JdaP3l76z0PZ72jq8jRFgKGkZlZqP8v5DHdyT1sMu?= =?us-ascii?Q?1Sk/QaHZ5RKEreyMmorlMxFA70FX8K/iXWBjYItqh9iDvQ21IDej+bJH1WPc?= =?us-ascii?Q?btS+8pp6WpfAh9K7Jd4TW2fKNZUAqo3lJTw31Bo4SrFxFpXerk4Txx30nUuR?= =?us-ascii?Q?cG/GrLl8agI4dqbB0dQWrX/RJkw6K8GaxvcfvFhGfphs+iydeYWuIw3cT6ek?= =?us-ascii?Q?wv51Td1o2uB4pe7ULt1xKzRakSaTKAWc1YadGBxUGTIzgtBQXA+o5d1uucB4?= =?us-ascii?Q?XHz1diVMwn8aVCnna1/jm6Md+wbUjfpgV7AhlwlDIYIF1v22FYkYv7CK/yGS?= =?us-ascii?Q?ucviVFlKDV9TTLfaKWbAWQ39O5Deh8KjMnIF6ixV39+zvRDDnqJcZKs6NLUP?= =?us-ascii?Q?9TX1Tkg1xgrujVmx3mj6MkjDoeXgJETRXLRP/hfrzQgfbu4wafN/7tA8jtWL?= =?us-ascii?Q?9LxK72On5MIXXhdx7jFKUfejegQqBFYrsgZhc/fn2MB3TiUMfZmYqT7vL9Nv?= =?us-ascii?Q?BUj/hPx9/NJprlJ+jQwj52n/ZU0akl/6Us3q6Hd1YLhddRWWAz70TdyUJsnc?= =?us-ascii?Q?/q3RZAZUK26tyGBIgUkCXoqnnUN/DL593kYB6ek0agGcsISPSQDBDm+LKOq/?= =?us-ascii?Q?LZ3NIT7XvDWH24dBIDx1fXlp8fQGxygwejGt+yFhqVGb1THj6VME0MsdlpS6?= =?us-ascii?Q?XnQYwfNHOARL4UcJWvvogYEGCLVDn/mY/INhyOkps5saSm2JY6rG96iyNSGg?= =?us-ascii?Q?aRxnH9EfsY+MphTUk4/yWEgFaWh1EgEvkrmllIM/Lu74eN2EufKf7hWLRPGk?= =?us-ascii?Q?YnFV/PFo3QZjvz4RHrO09VFedOyo0CNrXy2QAxmF1cvpP2XB4y8E/lltPc+Y?= =?us-ascii?Q?8aoXqRaa2URxj8miTsCbv+ALoE5vgbRaAVtTeaCVhO8hjClat0rMztdh6Q9Z?= =?us-ascii?Q?Htb47Q4yRZckVDqfcqqkVwMNU7HUvCBCZaHVa3rk47q38702gSRwDFI+VMjE?= =?us-ascii?Q?4BcRh0LPqjGW2PtItBZtUUGEBoaIvftUGPiJuL69c2TU0HsjAI4+9NMBmj17?= =?us-ascii?Q?OOZXC7RXfhRRLlQHN00/te2XgvE33RIhoCte0bcZUr7LuOAnhnFePxizOsds?= =?us-ascii?Q?8vlut7ba8HqAu1m4=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY1PR0701MB1723; 5:5r69RJJ3IWSzqGw4HqysIWw97rHaTYt/ciAb1tBZB9LI6n5e8UcqvJHd7PGfUqmrys1HBx92q0DuFeXIYsPDgu2bANe87IJEaRxe7TG2Vu/sN4qL4b7yCTA492M6G9lkNTG8WayRhTYybVdmQffE+w==; 24:mmR83txtgrT+wcI0DdAM3M8Pp5e8u+lP+oqJr0mbaN94nZuBizj1RfhMMcEXrzpGdHl5VwQ70ppOS15sN8e5NMk6PqxXRAMUqsDGouDJwLA=; 7:R2LSUch6MMCIsxsD8gaSDdpnv+njwXblKHMdgzqNap/YdfmPPANEr/6KzMkr9E5B1yakFtevuiDRnT/+jsbYCNGj7IuwDsr2PKMduZ+CRV3yriHcw5uiQxhuPJndYYeaLqdLLCjJZfNKS9ntJ+zmEO4FhJ2rrvOcown22iGWb7uHSmFd2bX1cxp1aZr4R1RUepdtMLKxQQlq0UntQWYNrA== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Jun 2016 19:08:00.2033 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR0701MB1723 Subject: [dpdk-dev] [PATCH v5 14/25] net/thunderx: add Tx queue setup and release support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Signed-off-by: Jerin Jacob Signed-off-by: Maciej Czekaj Signed-off-by: Kamil Rytarowski Signed-off-by: Zyta Szpak Signed-off-by: Slawomir Rosek Signed-off-by: Radoslaw Biernacki --- drivers/net/thunderx/nicvf_ethdev.c | 175 ++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c index 4652438..167149e 100644 --- a/drivers/net/thunderx/nicvf_ethdev.c +++ b/drivers/net/thunderx/nicvf_ethdev.c @@ -191,6 +191,179 @@ nicvf_qset_cq_alloc(struct nicvf *nic, struct nicvf_rxq *rxq, uint16_t qidx, return 0; } +static int +nicvf_qset_sq_alloc(struct nicvf *nic, struct nicvf_txq *sq, uint16_t qidx, + uint32_t desc_cnt) +{ + const struct rte_memzone *rz; + uint32_t ring_size = desc_cnt * sizeof(union sq_entry_t); + + rz = rte_eth_dma_zone_reserve(nic->eth_dev, "sq", qidx, ring_size, + NICVF_SQ_BASE_ALIGN_BYTES, nic->node); + if (rz == NULL) { + PMD_INIT_LOG(ERR, "Failed allocate mem for sq hw ring"); + return -ENOMEM; + } + + memset(rz->addr, 0, ring_size); + + sq->phys = rz->phys_addr; + sq->desc = rz->addr; + sq->qlen_mask = desc_cnt - 1; + + return 0; +} + +static inline void +nicvf_tx_queue_release_mbufs(struct nicvf_txq *txq) +{ + uint32_t head; + + head = txq->head; + while (head != txq->tail) { + if (txq->txbuffs[head]) { + rte_pktmbuf_free_seg(txq->txbuffs[head]); + txq->txbuffs[head] = NULL; + } + head++; + head = head & txq->qlen_mask; + } +} + +static void +nicvf_tx_queue_reset(struct nicvf_txq *txq) +{ + uint32_t txq_desc_cnt = txq->qlen_mask + 1; + + memset(txq->desc, 0, sizeof(union sq_entry_t) * txq_desc_cnt); + memset(txq->txbuffs, 0, sizeof(struct rte_mbuf *) * txq_desc_cnt); + txq->tail = 0; + txq->head = 0; + txq->xmit_bufs = 0; +} + +static void +nicvf_dev_tx_queue_release(void *sq) +{ + struct nicvf_txq *txq; + + PMD_INIT_FUNC_TRACE(); + + txq = (struct nicvf_txq *)sq; + if (txq) { + if (txq->txbuffs != NULL) { + nicvf_tx_queue_release_mbufs(txq); + rte_free(txq->txbuffs); + txq->txbuffs = NULL; + } + rte_free(txq); + } +} + +static int +nicvf_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, + uint16_t nb_desc, unsigned int socket_id, + const struct rte_eth_txconf *tx_conf) +{ + uint16_t tx_free_thresh; + uint8_t is_single_pool; + struct nicvf_txq *txq; + struct nicvf *nic = nicvf_pmd_priv(dev); + + PMD_INIT_FUNC_TRACE(); + + /* Socket id check */ + if (socket_id != (unsigned int)SOCKET_ID_ANY && socket_id != nic->node) + PMD_DRV_LOG(WARNING, "socket_id expected %d, configured %d", + socket_id, nic->node); + + /* Tx deferred start is not supported */ + if (tx_conf->tx_deferred_start) { + PMD_INIT_LOG(ERR, "Tx deferred start not supported"); + return -EINVAL; + } + + /* Roundup nb_desc to available qsize and validate max number of desc */ + nb_desc = nicvf_qsize_sq_roundup(nb_desc); + if (nb_desc == 0) { + PMD_INIT_LOG(ERR, "Value of nb_desc beyond available sq qsize"); + return -EINVAL; + } + + /* Validate tx_free_thresh */ + tx_free_thresh = (uint16_t)((tx_conf->tx_free_thresh) ? + tx_conf->tx_free_thresh : + NICVF_DEFAULT_TX_FREE_THRESH); + + if (tx_free_thresh > (nb_desc) || + tx_free_thresh > NICVF_MAX_TX_FREE_THRESH) { + PMD_INIT_LOG(ERR, + "tx_free_thresh must be less than the number of TX " + "descriptors. (tx_free_thresh=%u port=%d " + "queue=%d)", (unsigned int)tx_free_thresh, + (int)dev->data->port_id, (int)qidx); + return -EINVAL; + } + + /* Free memory prior to re-allocation if needed. */ + if (dev->data->tx_queues[qidx] != NULL) { + PMD_TX_LOG(DEBUG, "Freeing memory prior to re-allocation %d", + qidx); + nicvf_dev_tx_queue_release(dev->data->tx_queues[qidx]); + dev->data->tx_queues[qidx] = NULL; + } + + /* Allocating tx queue data structure */ + txq = rte_zmalloc_socket("ethdev TX queue", sizeof(struct nicvf_txq), + RTE_CACHE_LINE_SIZE, nic->node); + if (txq == NULL) { + PMD_INIT_LOG(ERR, "Failed to allocate txq=%d", qidx); + return -ENOMEM; + } + + txq->nic = nic; + txq->queue_id = qidx; + txq->tx_free_thresh = tx_free_thresh; + txq->txq_flags = tx_conf->txq_flags; + txq->sq_head = nicvf_qset_base(nic, qidx) + NIC_QSET_SQ_0_7_HEAD; + txq->sq_door = nicvf_qset_base(nic, qidx) + NIC_QSET_SQ_0_7_DOOR; + is_single_pool = (txq->txq_flags & ETH_TXQ_FLAGS_NOREFCOUNT && + txq->txq_flags & ETH_TXQ_FLAGS_NOMULTMEMP); + + /* Choose optimum free threshold value for multipool case */ + if (!is_single_pool) { + txq->tx_free_thresh = (uint16_t) + (tx_conf->tx_free_thresh == NICVF_DEFAULT_TX_FREE_THRESH ? + NICVF_TX_FREE_MPOOL_THRESH : + tx_conf->tx_free_thresh); + } + + /* Allocate software ring */ + txq->txbuffs = rte_zmalloc_socket("txq->txbuffs", + nb_desc * sizeof(struct rte_mbuf *), + RTE_CACHE_LINE_SIZE, nic->node); + + if (txq->txbuffs == NULL) { + nicvf_dev_tx_queue_release(txq); + return -ENOMEM; + } + + if (nicvf_qset_sq_alloc(nic, txq, qidx, nb_desc)) { + PMD_INIT_LOG(ERR, "Failed to allocate mem for sq %d", qidx); + nicvf_dev_tx_queue_release(txq); + return -ENOMEM; + } + + nicvf_tx_queue_reset(txq); + + PMD_TX_LOG(DEBUG, "[%d] txq=%p nb_desc=%d desc=%p phys=0x%" PRIx64, + qidx, txq, nb_desc, txq->desc, txq->phys); + + dev->data->tx_queues[qidx] = txq; + dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED; + return 0; +} + static void nicvf_rx_queue_reset(struct nicvf_rxq *rxq) { @@ -430,6 +603,8 @@ static const struct eth_dev_ops nicvf_eth_dev_ops = { .dev_infos_get = nicvf_dev_info_get, .rx_queue_setup = nicvf_dev_rx_queue_setup, .rx_queue_release = nicvf_dev_rx_queue_release, + .tx_queue_setup = nicvf_dev_tx_queue_setup, + .tx_queue_release = nicvf_dev_tx_queue_release, .get_reg_length = nicvf_dev_get_reg_length, .get_reg = nicvf_dev_get_regs, };