Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp1298108ybc; Tue, 19 Nov 2019 18:13:46 -0800 (PST) X-Google-Smtp-Source: APXvYqzJefGAtQKtSIzMeyYyK7fJQpVsO62AofZ3GAx6pFNIyMtHlFVvMUcIFx01iaPK0fssHNJI X-Received: by 2002:a17:906:1d19:: with SMTP id n25mr1449243ejh.151.1574216026684; Tue, 19 Nov 2019 18:13:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574216026; cv=none; d=google.com; s=arc-20160816; b=uw2n4+ltzff/rAC2+7BfIm0YWvmbQS+c5FrFaY12bqCsTXh5cMOgTCei+LumT6npPf Y+etiwlRdi1GH5bI94EW3N89Hw6uFwYhu+QP1ChipnxiCmVG5rWDY4i7mX8ku/IM5qbs XUe8/JwKy6Sm9Re8gTCqf0gUzmInDiQKURL5MxbuRn4h6XKrRgHODoACMa+QW7+QClWP CDBANDreOEbh754uv8mSDhDNoHdn+DQQHsv0pJe953QcQsVhD1FO/M0OOoxLenM5HwAX eTQ+4JZfgyI2cu+UQilDn8zISEbDe2wEuZ2WLFcL4Z5zKdzSQ3SgKiTypeKBPtw2eZbz h6wA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date; bh=2Xgr8leDUcleBv+6AWJ1syZWRDZTbk5V1CxCgiO1yWY=; b=uv0cf/TL2CST+C4m09N7HQCVgPqNVrv6IUy5t84Am4nIyi8xxNU2p2C6GFct1llYZf QiCuDphpUVfP6bWVvKBeUavpQCQObGlI8+EyryXwOpkgjIfphMsfAyJDjJSTOwEiCj3w W9QAsPAxgsPU3TA2j2PR8CTpIFr+rOqda1slHjO7n8pmfVpVDiUjuh1qI76ywL/CG5yZ sVy6EX73Lt5yemk0SMWhmVJnvfXMT8D3nNII1CK6NLZ6U/XgWzOiz+Dos8BuFq3w/4uq uD+nE3kgX2kAZ12+nmL9/fOiqORnMa6hPn7XeyNTqyOmEH66p5Y5KWpRbixDNx/jA2a0 w1lw== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=toshiba.co.jp Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a25si14589108ejt.323.2019.11.19.18.13.22; Tue, 19 Nov 2019 18:13:46 -0800 (PST) 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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=toshiba.co.jp Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727399AbfKTCMQ (ORCPT + 99 others); Tue, 19 Nov 2019 21:12:16 -0500 Received: from mo-csw-fb1516.securemx.jp ([210.130.202.172]:43838 "EHLO mo-csw-fb.securemx.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727262AbfKTCMQ (ORCPT ); Tue, 19 Nov 2019 21:12:16 -0500 X-Greylist: delayed 1667 seconds by postgrey-1.27 at vger.kernel.org; Tue, 19 Nov 2019 21:12:15 EST Received: by mo-csw-fb.securemx.jp (mx-mo-csw-fb1516) id xAK1iRDR021224; Wed, 20 Nov 2019 10:44:29 +0900 Received: by mo-csw.securemx.jp (mx-mo-csw1516) id xAK1iDqJ031733; Wed, 20 Nov 2019 10:44:13 +0900 X-Iguazu-Qid: 34trXMv6oTDFsoBoOZ X-Iguazu-QSIG: v=2; s=0; t=1574214253; q=34trXMv6oTDFsoBoOZ; m=zSb2Ql+p4RWbL6ryM4ftbL9TR6ynY+a/LXW4c1SkabI= Received: from imx2.toshiba.co.jp (imx2.toshiba.co.jp [106.186.93.51]) by relay.securemx.jp (mx-mr1512) id xAK1iCXi035032; Wed, 20 Nov 2019 10:44:12 +0900 Received: from enc01.localdomain ([106.186.93.100]) by imx2.toshiba.co.jp with ESMTP id xAK1iBXU006614; Wed, 20 Nov 2019 10:44:11 +0900 (JST) Received: from hop001.toshiba.co.jp ([133.199.164.63]) by enc01.localdomain with ESMTP id xAK1iBxv026879; Wed, 20 Nov 2019 10:44:11 +0900 Date: Wed, 20 Nov 2019 10:44:06 +0900 From: Nobuhiro Iwamatsu To: Greg Kroah-Hartman Cc: linux-kernel@vger.kernel.org, stable@vger.kernel.org, Jun Gao , Wolfram Sang , Sasha Levin Subject: Re: [PATCH 4.19 127/422] i2c: mediatek: Use DMA safe buffers for i2c transactions X-TSB-HOP: ON Message-ID: <20191120014406.nfmrfe5ic5vm6b2l@toshiba.co.jp> References: <20191119051400.261610025@linuxfoundation.org> <20191119051407.175902069@linuxfoundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20191119051407.175902069@linuxfoundation.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On Tue, Nov 19, 2019 at 06:15:24AM +0100, Greg Kroah-Hartman wrote: > From: Jun Gao > > [ Upstream commit fc66b39fe36acfd06f716e338de7cd8f9550fad2 ] > > DMA mode will always be used in i2c transactions, try to allocate > a DMA safe buffer if the buf of struct i2c_msg used is not DMA safe. > > Signed-off-by: Jun Gao > Signed-off-by: Wolfram Sang > Signed-off-by: Sasha Levin This patch requires the following additional commit: commit bc1a7f75c85e226e82f183d30d75c357f92b6029 Author: Hsin-Yi Wang Date: Fri Feb 15 17:02:02 2019 +0800 i2c: mediatek: modify threshold passed to i2c_get_dma_safe_msg_buf() DMA with zero-length transfers doesn't make sense and this HW doesn't support them at all, so increase the threshold. Fixes: fc66b39fe36a ("i2c: mediatek: Use DMA safe buffers for i2c transactions") Signed-off-by: Hsin-Yi Wang [wsa: reworded commit message] Signed-off-by: Wolfram Sang Please apply this commit. Best regards, Nobuhiro > --- > drivers/i2c/busses/i2c-mt65xx.c | 62 +++++++++++++++++++++++++++++---- > 1 file changed, 55 insertions(+), 7 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c > index 1e57f58fcb001..a74ef76705e0c 100644 > --- a/drivers/i2c/busses/i2c-mt65xx.c > +++ b/drivers/i2c/busses/i2c-mt65xx.c > @@ -441,6 +441,8 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, > u16 control_reg; > u16 restart_flag = 0; > u32 reg_4g_mode; > + u8 *dma_rd_buf = NULL; > + u8 *dma_wr_buf = NULL; > dma_addr_t rpaddr = 0; > dma_addr_t wpaddr = 0; > int ret; > @@ -500,10 +502,18 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, > if (i2c->op == I2C_MASTER_RD) { > writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); > writel(I2C_DMA_CON_RX, i2c->pdmabase + OFFSET_CON); > - rpaddr = dma_map_single(i2c->dev, msgs->buf, > + > + dma_rd_buf = i2c_get_dma_safe_msg_buf(msgs, 0); > + if (!dma_rd_buf) > + return -ENOMEM; > + > + rpaddr = dma_map_single(i2c->dev, dma_rd_buf, > msgs->len, DMA_FROM_DEVICE); > - if (dma_mapping_error(i2c->dev, rpaddr)) > + if (dma_mapping_error(i2c->dev, rpaddr)) { > + i2c_put_dma_safe_msg_buf(dma_rd_buf, msgs, false); > + > return -ENOMEM; > + } > > if (i2c->dev_comp->support_33bits) { > reg_4g_mode = mtk_i2c_set_4g_mode(rpaddr); > @@ -515,10 +525,18 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, > } else if (i2c->op == I2C_MASTER_WR) { > writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); > writel(I2C_DMA_CON_TX, i2c->pdmabase + OFFSET_CON); > - wpaddr = dma_map_single(i2c->dev, msgs->buf, > + > + dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 0); > + if (!dma_wr_buf) > + return -ENOMEM; > + > + wpaddr = dma_map_single(i2c->dev, dma_wr_buf, > msgs->len, DMA_TO_DEVICE); > - if (dma_mapping_error(i2c->dev, wpaddr)) > + if (dma_mapping_error(i2c->dev, wpaddr)) { > + i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); > + > return -ENOMEM; > + } > > if (i2c->dev_comp->support_33bits) { > reg_4g_mode = mtk_i2c_set_4g_mode(wpaddr); > @@ -530,16 +548,39 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, > } else { > writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_INT_FLAG); > writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_CON); > - wpaddr = dma_map_single(i2c->dev, msgs->buf, > + > + dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 0); > + if (!dma_wr_buf) > + return -ENOMEM; > + > + wpaddr = dma_map_single(i2c->dev, dma_wr_buf, > msgs->len, DMA_TO_DEVICE); > - if (dma_mapping_error(i2c->dev, wpaddr)) > + if (dma_mapping_error(i2c->dev, wpaddr)) { > + i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); > + > return -ENOMEM; > - rpaddr = dma_map_single(i2c->dev, (msgs + 1)->buf, > + } > + > + dma_rd_buf = i2c_get_dma_safe_msg_buf((msgs + 1), 0); > + if (!dma_rd_buf) { > + dma_unmap_single(i2c->dev, wpaddr, > + msgs->len, DMA_TO_DEVICE); > + > + i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); > + > + return -ENOMEM; > + } > + > + rpaddr = dma_map_single(i2c->dev, dma_rd_buf, > (msgs + 1)->len, > DMA_FROM_DEVICE); > if (dma_mapping_error(i2c->dev, rpaddr)) { > dma_unmap_single(i2c->dev, wpaddr, > msgs->len, DMA_TO_DEVICE); > + > + i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, false); > + i2c_put_dma_safe_msg_buf(dma_rd_buf, (msgs + 1), false); > + > return -ENOMEM; > } > > @@ -578,14 +619,21 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, > if (i2c->op == I2C_MASTER_WR) { > dma_unmap_single(i2c->dev, wpaddr, > msgs->len, DMA_TO_DEVICE); > + > + i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, true); > } else if (i2c->op == I2C_MASTER_RD) { > dma_unmap_single(i2c->dev, rpaddr, > msgs->len, DMA_FROM_DEVICE); > + > + i2c_put_dma_safe_msg_buf(dma_rd_buf, msgs, true); > } else { > dma_unmap_single(i2c->dev, wpaddr, msgs->len, > DMA_TO_DEVICE); > dma_unmap_single(i2c->dev, rpaddr, (msgs + 1)->len, > DMA_FROM_DEVICE); > + > + i2c_put_dma_safe_msg_buf(dma_wr_buf, msgs, true); > + i2c_put_dma_safe_msg_buf(dma_rd_buf, (msgs + 1), true); > } > > if (ret == 0) { > -- > 2.20.1 > > > >