Received: by 10.192.165.148 with SMTP id m20csp480095imm; Wed, 2 May 2018 03:48:41 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrHxM9LK4fIIrkj6IKrIGhd5xNegbxiDpfAmZIAPYhcttoaZy9YFEu8QD/ojPRMgF+f2UMR X-Received: by 2002:a17:902:274a:: with SMTP id j10-v6mr20139317plg.393.1525258121047; Wed, 02 May 2018 03:48:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525258121; cv=none; d=google.com; s=arc-20160816; b=YOWOtRzW71o9BONQgxRtThJE4yO6NJkwykkhKcdxSnqcCQuA2mbbS8Z9JpCv3W9g1s eJZkixn95thxlnC9X84FebhoLPj0d9shiM5bHf5WCoHUcr/LcnD3qKdbw4m3Rm2ebiCZ YL7L1B1cmNUvyY7EKkO2pXKsqvCLJCeToPZeW7Xn999lpMYanHUKnR6jInM1NijQPiOG QEKxpqP036d7BaiLFi0h+YqL2Ieu/7gtx2s7RzAuRivQSkEVh2Fm1QF5N8g2ytlwMhm3 sMaw77DP3DvqoO86toNpdqqs81z1iQNJr4e93eHMwAScWOYFJ3OamQ73AtF3hB6b1aee YSIQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :arc-authentication-results; bh=BAYT01fFE191KG1LJ1ar70Nc6yW9b2JCcIVoccp8j7s=; b=IFAsYLPqaEX9EqXk49/6B74CRrRPpC+19hEH0grtonNyHVm/MuNh1Qit5YmHWOxckw ahR1Z6oYTGhIQSg6peSEav1ePnePmwXyLRyxE8cIJBGvvACDL2YcX4y5WJpYalr1CuJQ ii+AjTdShLp0t97V8NcQ1hg8XbrsKo8amELtN5SGyzZw52YvQc2X31V2Uw0VSKF/A/9z zZ6e+i4hQ45cYhYDUCCDoWgizkHGDZ0SI24yEA4YgPx04OxbPosbGHbpFsSKOyqLsgjZ /cQ3KsLwA/oJxanpEy2DdIrcGqSAfDtN/x/EUsKFjekjW5fVt+9TJoeFRQAEmHsCNpo0 pztg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=Q/3wpgSU; 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=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x17si11052651pfm.330.2018.05.02.03.48.26; Wed, 02 May 2018 03:48:41 -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=@ti.com header.s=ti-com-17Q1 header.b=Q/3wpgSU; 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=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751138AbeEBKrI (ORCPT + 99 others); Wed, 2 May 2018 06:47:08 -0400 Received: from lelnx194.ext.ti.com ([198.47.27.80]:55624 "EHLO lelnx194.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750883AbeEBKrH (ORCPT ); Wed, 2 May 2018 06:47:07 -0400 Received: from dlelxv90.itg.ti.com ([172.17.2.17]) by lelnx194.ext.ti.com (8.15.1/8.15.1) with ESMTP id w42Ak44t005288; Wed, 2 May 2018 05:46:04 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ti.com; s=ti-com-17Q1; t=1525257964; bh=/bsnF/mPa0xJJh63v9pRhe7FaqRq93V304GMFkqvZXQ=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=Q/3wpgSU9WtU0xbz2O9jPGXPq6pGUxrdRUqd5zjHr6BhpsqYLv9Y7yp8UbLakm6uJ 3CHbbqjS1Zl6Z4CoT289XE6LTdAfFX9dfUxSIamCJqZ5oOn1btK4HxrSFNB8cojmjh Vpt5Kju3edV9t5QvZ8DHMC/lf+8e5RNbemSJ8ArE= Received: from DFLE115.ent.ti.com (dfle115.ent.ti.com [10.64.6.36]) by dlelxv90.itg.ti.com (8.14.3/8.13.8) with ESMTP id w42Ak4cx016143; Wed, 2 May 2018 05:46:04 -0500 Received: from DFLE110.ent.ti.com (10.64.6.31) by DFLE115.ent.ti.com (10.64.6.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1466.3; Wed, 2 May 2018 05:46:04 -0500 Received: from dlep32.itg.ti.com (157.170.170.100) by DFLE110.ent.ti.com (10.64.6.31) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1466.3 via Frontend Transport; Wed, 2 May 2018 05:46:04 -0500 Received: from [192.168.2.6] (ileax41-snat.itg.ti.com [10.172.224.153]) by dlep32.itg.ti.com (8.14.3/8.13.8) with ESMTP id w42Ak1BZ028511; Wed, 2 May 2018 05:46:02 -0500 Subject: Re: [PATCH v3] mtd: onenand: omap2: Disable DMA for HIGHMEM buffers To: Ladislav Michl , Boris Brezillon CC: , , Roger Quadros , Aaro Koskinen , Tony Lindgren , "H. Nikolaus Schaller" , Andreas Kemnade References: <20180502104132.GA12979@lenoch> From: Peter Ujfalusi Message-ID: Date: Wed, 2 May 2018 13:46:39 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <20180502104132.GA12979@lenoch> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 8bit X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2018-05-02 13:41, Ladislav Michl wrote: > dma_map_single does not work for vmalloc-ed buffers, > so disable DMA in this case. Reviewed-by: Peter Ujfalusi > Signed-off-by: Ladislav Michl > Reported-by: "H. Nikolaus Schaller" > Tested-by: "H. Nikolaus Schaller" > --- > Changes: > -v2: Added Tested-by tag, based on v4.17-rc1 (no change in patch itself) > -v3: Reworded commit log > > drivers/mtd/nand/onenand/omap2.c | 105 +++++++++++-------------------- > 1 file changed, 38 insertions(+), 67 deletions(-) > > diff --git a/drivers/mtd/nand/onenand/omap2.c b/drivers/mtd/nand/onenand/omap2.c > index 9c159f0dd9a6..321137158ff3 100644 > --- a/drivers/mtd/nand/onenand/omap2.c > +++ b/drivers/mtd/nand/onenand/omap2.c > @@ -375,56 +375,42 @@ static int omap2_onenand_read_bufferram(struct mtd_info *mtd, int area, > { > struct omap2_onenand *c = container_of(mtd, struct omap2_onenand, mtd); > struct onenand_chip *this = mtd->priv; > - dma_addr_t dma_src, dma_dst; > - int bram_offset; > + struct device *dev = &c->pdev->dev; > void *buf = (void *)buffer; > + dma_addr_t dma_src, dma_dst; > + int bram_offset, err; > size_t xtra; > - int ret; > > bram_offset = omap2_onenand_bufferram_offset(mtd, area) + area + offset; > - if (bram_offset & 3 || (size_t)buf & 3 || count < 384) > - goto out_copy; > - > - /* panic_write() may be in an interrupt context */ > - if (in_interrupt() || oops_in_progress) > + /* > + * If the buffer address is not DMA-able, len is not long enough to make > + * DMA transfers profitable or panic_write() may be in an interrupt > + * context fallback to PIO mode. > + */ > + if (!virt_addr_valid(buf) || bram_offset & 3 || (size_t)buf & 3 || > + count < 384 || in_interrupt() || oops_in_progress ) > goto out_copy; > > - if (buf >= high_memory) { > - struct page *p1; > - > - if (((size_t)buf & PAGE_MASK) != > - ((size_t)(buf + count - 1) & PAGE_MASK)) > - goto out_copy; > - p1 = vmalloc_to_page(buf); > - if (!p1) > - goto out_copy; > - buf = page_address(p1) + ((size_t)buf & ~PAGE_MASK); > - } > - > xtra = count & 3; > if (xtra) { > count -= xtra; > memcpy(buf + count, this->base + bram_offset + count, xtra); > } > > + dma_dst = dma_map_single(dev, buf, count, DMA_FROM_DEVICE); > dma_src = c->phys_base + bram_offset; > - dma_dst = dma_map_single(&c->pdev->dev, buf, count, DMA_FROM_DEVICE); > - if (dma_mapping_error(&c->pdev->dev, dma_dst)) { > - dev_err(&c->pdev->dev, > - "Couldn't DMA map a %d byte buffer\n", > - count); > - goto out_copy; > - } > > - ret = omap2_onenand_dma_transfer(c, dma_src, dma_dst, count); > - dma_unmap_single(&c->pdev->dev, dma_dst, count, DMA_FROM_DEVICE); > - > - if (ret) { > - dev_err(&c->pdev->dev, "timeout waiting for DMA\n"); > + if (dma_mapping_error(dev, dma_dst)) { > + dev_err(dev, "Couldn't DMA map a %d byte buffer\n", count); > goto out_copy; > } > > - return 0; > + err = omap2_onenand_dma_transfer(c, dma_src, dma_dst, count); > + dma_unmap_single(dev, dma_dst, count, DMA_FROM_DEVICE); > + if (!err) > + return 0; > + > + dev_err(dev, "timeout waiting for DMA\n"); > > out_copy: > memcpy(buf, this->base + bram_offset, count); > @@ -437,49 +423,34 @@ static int omap2_onenand_write_bufferram(struct mtd_info *mtd, int area, > { > struct omap2_onenand *c = container_of(mtd, struct omap2_onenand, mtd); > struct onenand_chip *this = mtd->priv; > - dma_addr_t dma_src, dma_dst; > - int bram_offset; > + struct device *dev = &c->pdev->dev; > void *buf = (void *)buffer; > - int ret; > + dma_addr_t dma_src, dma_dst; > + int bram_offset, err; > > bram_offset = omap2_onenand_bufferram_offset(mtd, area) + area + offset; > - if (bram_offset & 3 || (size_t)buf & 3 || count < 384) > - goto out_copy; > - > - /* panic_write() may be in an interrupt context */ > - if (in_interrupt() || oops_in_progress) > + /* > + * If the buffer address is not DMA-able, len is not long enough to make > + * DMA transfers profitable or panic_write() may be in an interrupt > + * context fallback to PIO mode. > + */ > + if (!virt_addr_valid(buf) || bram_offset & 3 || (size_t)buf & 3 || > + count < 384 || in_interrupt() || oops_in_progress ) > goto out_copy; > > - if (buf >= high_memory) { > - struct page *p1; > - > - if (((size_t)buf & PAGE_MASK) != > - ((size_t)(buf + count - 1) & PAGE_MASK)) > - goto out_copy; > - p1 = vmalloc_to_page(buf); > - if (!p1) > - goto out_copy; > - buf = page_address(p1) + ((size_t)buf & ~PAGE_MASK); > - } > - > - dma_src = dma_map_single(&c->pdev->dev, buf, count, DMA_TO_DEVICE); > + dma_src = dma_map_single(dev, buf, count, DMA_TO_DEVICE); > dma_dst = c->phys_base + bram_offset; > - if (dma_mapping_error(&c->pdev->dev, dma_src)) { > - dev_err(&c->pdev->dev, > - "Couldn't DMA map a %d byte buffer\n", > - count); > - return -1; > - } > - > - ret = omap2_onenand_dma_transfer(c, dma_src, dma_dst, count); > - dma_unmap_single(&c->pdev->dev, dma_src, count, DMA_TO_DEVICE); > - > - if (ret) { > - dev_err(&c->pdev->dev, "timeout waiting for DMA\n"); > + if (dma_mapping_error(dev, dma_src)) { > + dev_err(dev, "Couldn't DMA map a %d byte buffer\n", count); > goto out_copy; > } > > - return 0; > + err = omap2_onenand_dma_transfer(c, dma_src, dma_dst, count); > + dma_unmap_page(dev, dma_src, count, DMA_TO_DEVICE); > + if (!err) > + return 0; > + > + dev_err(dev, "timeout waiting for DMA\n"); > > out_copy: > memcpy(this->base + bram_offset, buf, count); > - Péter Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki