Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp2655105ybi; Thu, 4 Jul 2019 16:16:48 -0700 (PDT) X-Google-Smtp-Source: APXvYqx/4gqBXf6EQ3J8qkYL8RhOqpxDv92EvpTjp/Q6FkrwMWlqOkrxgHD7sufiu1jO2ju4xvea X-Received: by 2002:a63:f13:: with SMTP id e19mr950238pgl.132.1562282208516; Thu, 04 Jul 2019 16:16:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562282208; cv=none; d=google.com; s=arc-20160816; b=lOjPE398p01CBAhlSjI0SW5Lb48lO4/YDjClaQMnJeUkKks+c4pRi7am+fSPOoyP2P ICzg10vUHRUfQ4TfTIeXIlpwv77Tnm7E8KwHqS7bK8epbFCiSb3f525H14819mAmClId MEieHsjh+i2lN6qo61VZMz3ST/d8Mlq9AfGqQUcGpnWmgWWc6Q6m4N2Fwr8V1HG0gQvf DgsNbkUUv5fua6yIrVTarkTxT6U0Y/oUaZu/IUdN5ySv/V7usCDZjSB/XDZKaXEF//sx fGMwOQPv/KV7gVIQsRfbrVncHkTONhn+fATNh0URAH9EmFA/PlymKahvBhHgPizn9JKW DpwQ== 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=r0WD0RuxlV4vRsxNVFHsnkCMOWJYf6ED0FtNiTh3I01UiGA157Xk3IwO/nu5Z7uc9w fmXdTjUKFC0tigqhBtY989S0I+248jlxH91T9BtbfMPOfhSh+OtdiXT3gud9FGv49eSp CdgMm2bWSA9oHuCgFYb6/YVaqJOugQPyHtMUYR0ALCQtGZXd6YAOEFd2Hvd5Xgay8ty+ hJX84S+h35i00NKEEq5RFva88ec6hZ34bKsgCaLCsFoFNASsaIUpi9BuLV+p3RRPKcFC HfDLHpMytha+RjppYyMlHACi6VcCzbiIUkKJInsZKxrzPyquE62NxyAr5KNBnvepO1lU 8+Ag== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=toHSJXK1; 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 i36si6045688plb.365.2019.07.04.16.16.33; Thu, 04 Jul 2019 16:16:48 -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=toHSJXK1; 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 S1727628AbfGDXOg (ORCPT + 99 others); Thu, 4 Jul 2019 19:14:36 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:43943 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727623AbfGDXOe (ORCPT ); Thu, 4 Jul 2019 19:14:34 -0400 Received: by mail-lf1-f68.google.com with SMTP id j29so5089804lfk.10 for ; Thu, 04 Jul 2019 16:14:33 -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=toHSJXK191KYd0zFlIS07meMLjzURi5WWQGdBwse2gP009kpssUfzHZedxI/sklTKr ARFERW2ecMDdWxWLdcPNGgjqUOiuE3c1p1+3M36j1usjfm56ERt1NRoSa+JkT0iz8pG4 cd7lP+szicgmGkoOe6IzQeWDFiDaZf8j4u4ojDTRssA9RkbXo3J7R9CB6UUGIIXLIAGD FDEJKsonRdpNz6FX8lMW7tuxcbkhfbrpu1cd/8veHMykoeVvTE/5qlicL/QSQLaxGt9B FhV6aHMkigwdRZFv4JuRXJr9Ith05qJ7Fptd5IpqdOLuqGXOo1SPFwRnXxvylOQIVCpb 9PQw== 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=bLJDoSognOKQTlMw1VMR8/SKIoLcAYb1KDmOL48ZMGctoWLA3MrHqZ4/62KEFDlgAW J8MkDttkCoXc8dd0d0gYx0ix/jhCobGwxokenyw6UUq2uZBfETyxuGHTXDsyTfWbOZnl UBqhMj6lRSpqdmlBCp5lLSNpNEfslK4zhm38AIx4cc7gNJk76Q58alHSzVUGkhxWKdk/ XBnEzY4yZnmb9MvFn4JF0KnZl1MQ+fgaBQFfNLZFZX3KISf9tXIFN4Jw77RjiYy5rtdv gIX69NcO3r105238y7jqau3g98xmCIC+T+LVnHjb7mIymmKdoHoo+SilCfSXmKoBZCHJ 5qSg== X-Gm-Message-State: APjAAAUhPE/svWYtFvS0cvwN1Ldr9JDv8g3TtohFZ5flTNhCqRL1Szjc s0iAMd960aJhQmx7eVYMkIsnQw== X-Received: by 2002:ac2:5a01:: with SMTP id q1mr429316lfn.46.1562282072613; Thu, 04 Jul 2019 16:14:32 -0700 (PDT) Received: from localhost.localdomain ([46.211.39.135]) by smtp.gmail.com with ESMTPSA id q6sm1407269lji.70.2019.07.04.16.14.26 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 04 Jul 2019 16:14:31 -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 v7 net-next 2/5] net: ethernet: ti: davinci_cpdma: add dma mapped submit Date: Fri, 5 Jul 2019 02:14:03 +0300 Message-Id: <20190704231406.27083-3-ivan.khoronzhuk@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190704231406.27083-1-ivan.khoronzhuk@linaro.org> References: <20190704231406.27083-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