Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp704084ybi; Wed, 3 Jul 2019 03:21:31 -0700 (PDT) X-Google-Smtp-Source: APXvYqyZBnWCu/r4cKkHAx0lURH2QMclgbjW71hdQVSecHDTHwHdCHjK4veMaKBM/NxMM1qHUTJn X-Received: by 2002:a63:1356:: with SMTP id 22mr8484661pgt.160.1562149290825; Wed, 03 Jul 2019 03:21:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562149290; cv=none; d=google.com; s=arc-20160816; b=sULSNAiLe3dkFgFCyFH4OolatEeBOWKlZM+iim8py/Q3Kb6r2JWx89qfPoA2AaPjbc GcUtpTLfXK2xktZ5az89vXbNP0GEf1NMnUQSYGx3ooBB/qJAzWA26tziKySfaK72z3/4 UR4RQaQhAcbDLXBRJU0wm3jVSKOdRrf9XTocFMrN2kXe+IvA8ZFmLM41FXDxhNd66Xbq bCLn1jL0aeHC032n6gYMFZj2r135N+X+UuAVGILSIh/puhR0ZK9RlTkJaamvN0ZfOAQ+ yjn6g7/hTnrnA/k1+pfs0JDu2xPuWGbkvlur8axGRgI5ImYlaAIZHgjeyQ726oLlF2nC imAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=F7JFqzRXqxTzUkcqfAtcONZlOP60PRysVxN4UPvDiWY=; b=a9IP95g0wkZtYGzAqFHof3rkM+IvV9yDfmzLpfvmv/yQ0CJwOxxq+l00sujMHIHJdB xaASl+MEjfqNUVE6Mp5yyJSRAbwoV7NcDocfLTB3wmzm15+HCBS2SIpXsjB1bd4DaUXJ R0HlnbL+DicrlBixpaKGiMBwtqEvRZ5EHhDoj+KKHbFkl+nPs6ODogYwtTSpXf5lP/zD 2gDtRjFPPWXhHtr1JoW/CzHW2iV6VRQ66HYXNKLqPfhIIClHT8Yem2h72y3KeDMmcN5V Eq+z3qA4mbslqyhtdz2gXsS9o0WFD9eqs7iJ3IhlgoZDefEkPxAGIcIFdi0adm4a8p9n An5w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=TXAox2sd; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id az7si412745pjb.51.2019.07.03.03.21.15; Wed, 03 Jul 2019 03:21:30 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=TXAox2sd; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727275AbfGCKTl (ORCPT + 99 others); Wed, 3 Jul 2019 06:19:41 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:37224 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727092AbfGCKTM (ORCPT ); Wed, 3 Jul 2019 06:19:12 -0400 Received: by mail-lf1-f67.google.com with SMTP id d11so1382246lfb.4 for ; Wed, 03 Jul 2019 03:19:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=F7JFqzRXqxTzUkcqfAtcONZlOP60PRysVxN4UPvDiWY=; b=TXAox2sdWXBNBf+PRssojPI1C03UgoSeeRHKksHkDwWknje+kVCYI4gFwiCbZCxfEY IkgI+mvbjSXUUB6DVZ5qMJ7mz1RVdPm+ypWOjvbis+zWk4d+AihqA88rbKHidV14PiWR J8yJAfhdWtjTPK5Z2v3TiM8zork4wBqowDNGMSUVhiUMESHKEwOevdnHTiqLv97ldpif SoRPCvwrJb0POJBqOSvXIBcFJr1Ti2uZmbHkbFTyPyKisAtav9ThkI6MNIQR4DREmk8a ykPZHSrZYB4zt4dFwXwUr5VzE2AeqmubgnYNxQYwvfm+NLCO8HuyyY1LMKIpDwtXbVPI LK9w== 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=F7JFqzRXqxTzUkcqfAtcONZlOP60PRysVxN4UPvDiWY=; b=XjuQ/hQJRR+yEYWhecajsR2oCVmQIwFzBALr25B0FSi4FE8cFzYNf7Go/EcWJLUxsM VBa8zwbyEXMa4X0V+Q2iXEVgyPWCyXaP2lps/98WLwlapiG8NLEjLCf/KqOy+foAqW/h OMCf6DkjjiOwcpJaywPxzu5so8SZaUJP19mnjoffuSe6rXCo0lnraI7QbvDbVJH3qRBq 9rHOcvM8rChmvSoZ33U2awNEmOdF6PuBywOEshXFFlRRITJzjdUc/DujdhY4brGPk0sW KrFLKQcVRWqfLD8mgtcNic3rgsKRxmgLsy++jnN3VWz4FpgFPpMMAm5XWs2IED+e7Yu7 NJQg== X-Gm-Message-State: APjAAAXxRqqPgPGO4hz7Vbcdute7Od79pDTNkyUEgUeYLskWLw3PGpec vQNmwvSkjKydzMhZwlUBmpxyYA== X-Received: by 2002:ac2:46d5:: with SMTP id p21mr17199495lfo.133.1562149149849; Wed, 03 Jul 2019 03:19:09 -0700 (PDT) Received: from localhost.localdomain (59-201-94-178.pool.ukrtel.net. [178.94.201.59]) by smtp.gmail.com with ESMTPSA id i9sm67267lfl.10.2019.07.03.03.19.08 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Wed, 03 Jul 2019 03:19:09 -0700 (PDT) From: Ivan Khoronzhuk To: grygorii.strashko@ti.com, hawk@kernel.org, davem@davemloft.net Cc: ast@kernel.org, linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, xdp-newbies@vger.kernel.org, ilias.apalodimas@linaro.org, netdev@vger.kernel.org, daniel@iogearbox.net, jakub.kicinski@netronome.com, john.fastabend@gmail.com, Ivan Khoronzhuk Subject: [PATCH v6 net-next 2/5] net: ethernet: ti: davinci_cpdma: add dma mapped submit Date: Wed, 3 Jul 2019 13:19:00 +0300 Message-Id: <20190703101903.8411-3-ivan.khoronzhuk@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190703101903.8411-1-ivan.khoronzhuk@linaro.org> References: <20190703101903.8411-1-ivan.khoronzhuk@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In case if dma mapped packet needs to be sent, like with XDP page pool, the "mapped" submit can be used. This patch adds dma mapped submit based on regular one. Signed-off-by: Ivan Khoronzhuk --- drivers/net/ethernet/ti/davinci_cpdma.c | 89 ++++++++++++++++++++++--- drivers/net/ethernet/ti/davinci_cpdma.h | 4 ++ 2 files changed, 83 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c index 5cf1758d425b..8da46394c0e7 100644 --- a/drivers/net/ethernet/ti/davinci_cpdma.c +++ b/drivers/net/ethernet/ti/davinci_cpdma.c @@ -139,6 +139,7 @@ struct submit_info { int directed; void *token; void *data; + int flags; int len; }; @@ -184,6 +185,8 @@ static struct cpdma_control_info controls[] = { (directed << CPDMA_TO_PORT_SHIFT)); \ } while (0) +#define CPDMA_DMA_EXT_MAP BIT(16) + static void cpdma_desc_pool_destroy(struct cpdma_ctlr *ctlr) { struct cpdma_desc_pool *pool = ctlr->pool; @@ -1015,6 +1018,7 @@ static int cpdma_chan_submit_si(struct submit_info *si) struct cpdma_chan *chan = si->chan; struct cpdma_ctlr *ctlr = chan->ctlr; int len = si->len; + int swlen = len; struct cpdma_desc __iomem *desc; dma_addr_t buffer; u32 mode; @@ -1036,16 +1040,22 @@ static int cpdma_chan_submit_si(struct submit_info *si) chan->stats.runt_transmit_buff++; } - buffer = dma_map_single(ctlr->dev, si->data, len, chan->dir); - ret = dma_mapping_error(ctlr->dev, buffer); - if (ret) { - cpdma_desc_free(ctlr->pool, desc, 1); - return -EINVAL; - } - mode = CPDMA_DESC_OWNER | CPDMA_DESC_SOP | CPDMA_DESC_EOP; cpdma_desc_to_port(chan, mode, si->directed); + if (si->flags & CPDMA_DMA_EXT_MAP) { + buffer = (u32)si->data; + dma_sync_single_for_device(ctlr->dev, buffer, len, chan->dir); + swlen |= CPDMA_DMA_EXT_MAP; + } else { + buffer = dma_map_single(ctlr->dev, si->data, len, chan->dir); + ret = dma_mapping_error(ctlr->dev, buffer); + if (ret) { + cpdma_desc_free(ctlr->pool, desc, 1); + return -EINVAL; + } + } + /* Relaxed IO accessors can be used here as there is read barrier * at the end of write sequence. */ @@ -1055,7 +1065,7 @@ static int cpdma_chan_submit_si(struct submit_info *si) writel_relaxed(mode | len, &desc->hw_mode); writel_relaxed((uintptr_t)si->token, &desc->sw_token); writel_relaxed(buffer, &desc->sw_buffer); - writel_relaxed(len, &desc->sw_len); + writel_relaxed(swlen, &desc->sw_len); desc_read(desc, sw_len); __cpdma_chan_submit(chan, desc); @@ -1079,6 +1089,32 @@ int cpdma_chan_idle_submit(struct cpdma_chan *chan, void *token, void *data, si.data = data; si.len = len; si.directed = directed; + si.flags = 0; + + spin_lock_irqsave(&chan->lock, flags); + if (chan->state == CPDMA_STATE_TEARDOWN) { + spin_unlock_irqrestore(&chan->lock, flags); + return -EINVAL; + } + + ret = cpdma_chan_submit_si(&si); + spin_unlock_irqrestore(&chan->lock, flags); + return ret; +} + +int cpdma_chan_idle_submit_mapped(struct cpdma_chan *chan, void *token, + dma_addr_t data, int len, int directed) +{ + struct submit_info si; + unsigned long flags; + int ret; + + si.chan = chan; + si.token = token; + si.data = (void *)(u32)data; + si.len = len; + si.directed = directed; + si.flags = CPDMA_DMA_EXT_MAP; spin_lock_irqsave(&chan->lock, flags); if (chan->state == CPDMA_STATE_TEARDOWN) { @@ -1103,6 +1139,32 @@ int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data, si.data = data; si.len = len; si.directed = directed; + si.flags = 0; + + spin_lock_irqsave(&chan->lock, flags); + if (chan->state != CPDMA_STATE_ACTIVE) { + spin_unlock_irqrestore(&chan->lock, flags); + return -EINVAL; + } + + ret = cpdma_chan_submit_si(&si); + spin_unlock_irqrestore(&chan->lock, flags); + return ret; +} + +int cpdma_chan_submit_mapped(struct cpdma_chan *chan, void *token, + dma_addr_t data, int len, int directed) +{ + struct submit_info si; + unsigned long flags; + int ret; + + si.chan = chan; + si.token = token; + si.data = (void *)(u32)data; + si.len = len; + si.directed = directed; + si.flags = CPDMA_DMA_EXT_MAP; spin_lock_irqsave(&chan->lock, flags); if (chan->state != CPDMA_STATE_ACTIVE) { @@ -1140,10 +1202,17 @@ static void __cpdma_chan_free(struct cpdma_chan *chan, uintptr_t token; token = desc_read(desc, sw_token); - buff_dma = desc_read(desc, sw_buffer); origlen = desc_read(desc, sw_len); - dma_unmap_single(ctlr->dev, buff_dma, origlen, chan->dir); + buff_dma = desc_read(desc, sw_buffer); + if (origlen & CPDMA_DMA_EXT_MAP) { + origlen &= ~CPDMA_DMA_EXT_MAP; + dma_sync_single_for_cpu(ctlr->dev, buff_dma, origlen, + chan->dir); + } else { + dma_unmap_single(ctlr->dev, buff_dma, origlen, chan->dir); + } + cpdma_desc_free(pool, desc, 1); (*chan->handler)((void *)token, outlen, status); } diff --git a/drivers/net/ethernet/ti/davinci_cpdma.h b/drivers/net/ethernet/ti/davinci_cpdma.h index 9343c8c73c1b..0271a20c2e09 100644 --- a/drivers/net/ethernet/ti/davinci_cpdma.h +++ b/drivers/net/ethernet/ti/davinci_cpdma.h @@ -77,8 +77,12 @@ int cpdma_chan_stop(struct cpdma_chan *chan); int cpdma_chan_get_stats(struct cpdma_chan *chan, struct cpdma_chan_stats *stats); +int cpdma_chan_submit_mapped(struct cpdma_chan *chan, void *token, + dma_addr_t data, int len, int directed); int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data, int len, int directed); +int cpdma_chan_idle_submit_mapped(struct cpdma_chan *chan, void *token, + dma_addr_t data, int len, int directed); int cpdma_chan_idle_submit(struct cpdma_chan *chan, void *token, void *data, int len, int directed); int cpdma_chan_process(struct cpdma_chan *chan, int quota); -- 2.17.1