From patchwork Thu Jul 23 20:52:31 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frank Li X-Patchwork-Id: 499553 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2001:1868:205::9]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4C1A31402ED for ; Fri, 24 Jul 2015 08:03:59 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZIOZh-0005YZ-BI; Thu, 23 Jul 2015 22:02:45 +0000 Received: from mail-bn1on0144.outbound.protection.outlook.com ([157.56.110.144] helo=na01-bn1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZIOZe-0005W0-Q5 for linux-mtd@lists.infradead.org; Thu, 23 Jul 2015 22:02:43 +0000 Received: from CH1PR03CA002.namprd03.prod.outlook.com (10.255.156.147) by BLUPR0301MB1633.namprd03.prod.outlook.com (10.162.214.139) with Microsoft SMTP Server (TLS) id 15.1.219.17; Thu, 23 Jul 2015 22:02:20 +0000 Received: from BY2FFO11FD012.protection.gbl (10.255.156.132) by CH1PR03CA002.outlook.office365.com (10.255.156.147) with Microsoft SMTP Server (TLS) id 15.1.213.14 via Frontend Transport; Thu, 23 Jul 2015 22:02:20 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BY2FFO11FD012.mail.protection.outlook.com (10.1.14.130) with Microsoft SMTP Server (TLS) id 15.1.231.11 via Frontend Transport; Thu, 23 Jul 2015 22:02:20 +0000 Received: from shlinux2.ap.freescale.net (shlinux2.ap.freescale.net [10.192.224.44]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t6NM2F8U031254; Thu, 23 Jul 2015 15:02:17 -0700 From: To: , , , Subject: [PATCH v2 1/1] mtd: spi-nor: fsl-qspi: dynamically map memory space for AHB read Date: Fri, 24 Jul 2015 04:52:31 +0800 Message-ID: <1437684751-1845-1-git-send-email-Frank.Li@freescale.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD012; 1:hPPKfejiWrAMvbI4bG54sbXwwjeQOEuBWnWRUwX+q5nZRiUb+qQZlXVImeVbvW/dFKZ/KPZoeKWWA9Q+4bHsmNKxlc01O58f9wUXe9Yy+Ba1FFGCn7P2KLcVpFo43QlyWRT+NjO1YIT5qJwdnTvg+F33RTeVUvToVizbNu+3wuKZNkNHRGahHZyduSDiJwZ0pmp9fY40BWOu7+0BcXFhKL8N/oB++AiDhlQiyir+iIqCZrbCBLrgV45DNRuNB6fq5G3rL8OvsLo7p58A1pkCPQH4DUlsULpaAc6ghKU3vKObRp7U8UlopaCfIy9WBBN+g3q74B78D3qEQOH5toCgSw== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(979002)(6009001)(2980300002)(339900001)(189002)(199003)(92566002)(105606002)(5001960100002)(85426001)(6806004)(107886002)(50226001)(86362001)(5003940100001)(104016003)(77096005)(50986999)(19580395003)(5001920100001)(46102003)(189998001)(229853001)(19580405001)(50466002)(2201001)(86152002)(77156002)(106466001)(47776003)(62966003)(36756003)(87936001)(48376002)(5001770100001)(4001430100001)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1102; SCL:1; SRVR:BLUPR0301MB1633; H:az84smr01.freescale.net; FPR:; SPF:Fail; MLV:ovrnspm; MX:1; A:1; PTR:InfoDomainNonexistent; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; BLUPR0301MB1633; 2:E/mDUS4CXcfCqoI2naAoXvc2Jzq1QXHurjBrV6T76kkNvFQQWco1uopoJzM4SzMj; 3:LU1yPjRKOfkGzJBp3hLM+6DbOxKEQd4Tr4VNubSabOaVLxll9dySrAidcMJJmVcnbhKTN4xQP9BLhsXaGYwvGvqKmpvV9XtSSU+O7zRkJIUaEryxq9S/oP9oqVc9D6fyr2iMAEgJxsqG4iIxBC39VLJJB9hrLfmYAqyfF0s3jQ7c2u6eneDs9xvAprnUHLccFkobezr6kOaS2CHNMjcmquEu8mTctR1ak4AOLMAjAT0=; 25:uS+PWnzZYfQBJ3pgKhdFhjc4AEssjNPmDtHD1os2uS27jMSJx15ao46WAW32qt6zAYNdMNmGjtZRodB3BjV2DAVUttHHE12k/bYnmZKacUTbksSqtQhGZ9qyHki3JEleppi2750h2mQjvo/QCMsMJVPw66ZdAMbjo4wX2GVU18Y2pMBzGRssjSqW2GkSre/Hl22wfRGtfvoFjypEuxuskQNZHRSkGNy/PAJ5fhEFIR0nd0DOvByHBBJLOz6OzH3Dpf74Dwxh6mtZg6gHbncJuw==; 20:aTlCX8jiIO7hWwRwDe8I5yHVq0uNlFPEhfF/LqIF6vRpR987s0RGRX7Af3LYv9N6P2zt18FpeGu4ZECagFL3h9j3rNcQn64kFkSfw+BhaNREstn3QeWjRskHnv0dzzCZ5E5jI+rXLvYbkebwzMTIljbgRAqyQ2VWdokNuaksB60bqkZlDqf0pzBvdOYc9hOPLWRQubqwTDbQu2PhXlzQ1Q9QeGw7Oflc1xsMHwftdxILvjW6VC1zRTD3V4iqYny/hKc3bp+eGtq3ecCUPsCE/DH9wJgQfoYAuziF+e/KjhESdmaibXnU2LcvSNmG+CnAxV5pMRSFqwGgYgubJuGZn91DWHQVOCaVoGaBeMABEII= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR0301MB1633; BLUPR0301MB1633: X-MS-Exchange-Organization-RulesExecuted X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(3002001); SRVR:BLUPR0301MB1633; BCL:0; PCL:0; RULEID:; SRVR:BLUPR0301MB1633; X-Microsoft-Exchange-Diagnostics: 1; BLUPR0301MB1633; 4:tajB2LuYlUZm03j6F74Xnxsa4/jQWvnl+lqvV4EeM9UH9hlO0AOKR1gdtKYaidr3sM8Tgut3ZAzyS2F6Vy7d9QOkjwCEBm5skTT9rV2te1Je2ac1ghaY3Q58BXFDgGKqZcrm/RLySPtYBcUfgq2RkoMzgH3rtwmvCchzxF996716SGkY85TSrjroZ/42stecWnSztiucNmPAQIJK/5bZkTyDCHZKxZhE71znC4c3lsSJDCvrVtr8AQOr/tvRpNuxIDOTmZFbDnJH2VlivIYes7oW9HDpZxEOQq1m6r7IErc= X-Forefront-PRVS: 06469BCC91 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR0301MB1633; 23:hyXp3cYcKG9KPjHnL182eLkPSCbx24L4bH2OMA3?= =?us-ascii?Q?QqDOSgSSJ7HvrDtJPr5HutJpHg9FuGi7GPpkcP5bcKktX5CxsXR1YRhvKjeo?= =?us-ascii?Q?SGqeLheMeaFaKdfpcBQ26m8Nk1eff09boTjCtav4EwTQf7WthGD6AhK0pBLh?= =?us-ascii?Q?ppRvfMpScD3Z/+lziNnQRcDKguvd45NigoZpyjTcNIEjaNKiDpVYRzTbNgyi?= =?us-ascii?Q?OWyfbFYc5p1FrFDJynYUBSP+j+4TINQ2Em5ny3bw0n6NxlBELtilY033to8v?= =?us-ascii?Q?zMbCXhVSe9Y5r1r7aA5+MVcqrVnARV9HBVXhmNcgRTIC9YB9+S3KAAoQQpLG?= =?us-ascii?Q?87GUT9P/NNMdaWVpFwgSSOOjZiSKU3PXWqgJv+GMI/94pxjRlFTsnbcqjQvC?= =?us-ascii?Q?vyO9NVX/C/7OZdE5oNy406XBqkgYV4ZX5TF90LQWXdAWcDzbm+mY7iFA7u6Z?= =?us-ascii?Q?kAGBL8mDSP+Nrh442y2YKdAt4/Zxg1gFbzldbWBNbLagvRvFyCqb75Rq4CrN?= =?us-ascii?Q?ynELFmgJ0UnKI4e/tr2432qOsd+L3hI5mululZCODUe3+SXO8ExvRNcrNvZe?= =?us-ascii?Q?wLQcaHJhB72S+lNM+qspZUUxMh8BdxNfDHLU+agegfWV6mUfcNA83+/kIc6E?= =?us-ascii?Q?suoitFZxV6aNba1/8lICK4e+L4ReX5Lu/OSz6jc5w9kA1kVfKPLzLdadS0/B?= =?us-ascii?Q?ADJGeOYWcg400DijDLBeygNFA1jEGuW2VeJfy8M36YfPrF9tuJ30VWzwrlyo?= =?us-ascii?Q?szDPIG+RlucMpwuoQK3terROvN8Vvn0OtS0UW5QocQeYTa0Zfk7j9g+SdsxV?= =?us-ascii?Q?DGE3THIy7JhTvqCAELsArTrx4hBxaBR5nVu/9XvVVnf+lgxyMBo30JG+38FE?= =?us-ascii?Q?0OuRmq5VbSIOElsflScZafxnExcE+XPNS3aOl6LKXVVMQTzN3JI4cn4Z6qWj?= =?us-ascii?Q?14RJjdGs6cVBRTSoT4/Xp+ka4vV3RDzcjM6FFHnPKLOwwXypiVpToerATtMR?= =?us-ascii?Q?R8cHZj7+Ab1YTEcCkoxz5niwEOY4DVkq7FR2uKvjRmVx8JvzLgkRcBNntKUV?= =?us-ascii?Q?IRIdrRXU=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR0301MB1633; 5:PjSa8iCyPWhO5uYwViUkzVY6QidaVTyYhqrNxUHgH5q4GgzRl472ILjoy9GVrv9mLQWJDQnhXkZ7ASRhfjMCR8kIASf4dvQe50GiooFh9MOSHXvNe8LYpX9vWd1GzryuKsW/YvlOev4hRIuKURDSpQ==; 24:JCyepfoN9YII4zT/MshYP+qSIcb495xBYXs4vX3yihv6ayljehPKHjbqEha+QcNkJBR7MPm8VZAxEzTuOOs4YX4Yjn1WAdMokgsVTPp3BHY=; 20:pn9xG5eDbWDo+R1zs5letQ4muFOt+aM2We7RWkKfpCnqANn0PQZJ3CnxBoksRULkGpJw+2WSn+JUpraV2t1Epw== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2015 22:02:20.1184 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR0301MB1633 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150723_150243_071210_EB224BBD X-CRM114-Status: GOOD ( 16.20 ) X-Spam-Score: -1.9 (-) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-1.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [157.56.110.144 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [157.56.110.144 listed in wl.mailspike.net] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Frank Li Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Allen Xu QSPI may failed to map enough memory (256MB) for AHB read in previous implementation, especially in 3G/1G memory layout kernel. Dynamically map memory to avoid such issue. This implementation generally map 4MB memory for AHB read, it should be enough for common scenarios, and the side effect (0.6% performance drop) is minor. Previous implementation root@imx6qdlsolo:~# dd if=/dev/mtd0 of=/dev/null bs=1K count=32K 32768+0 records in 32768+0 records out 33554432 bytes (34 MB) copied, 2.16006 s, 15.5 MB/s root@imx6qdlsolo:~# dd if=/dev/mtd0 of=/dev/null bs=32M count=1 1+0 records in 1+0 records out 33554432 bytes (34 MB) copied, 1.43149 s, 23.4 MB/s After applied the patch root@imx6qdlsolo:~# dd if=/dev/mtd0 of=/dev/null bs=1K count=32K 32768+0 records in 32768+0 records out 33554432 bytes (34 MB) copied, 2.1743 s, 15.4 MB/s root@imx6qdlsolo:~# dd if=/dev/mtd0 of=/dev/null bs=32M count=1 1+0 records in 1+0 records out 33554432 bytes (34 MB) copied, 1.43158 s, 23.4 MB/s Signed-off-by: Allen Xu Signed-off-by: Frank Li Acked-by: Han Xu --- Change from v1 to v2: rebase to last l2-mtd drivers/mtd/spi-nor/fsl-quadspi.c | 48 ++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c index 1946c6d..e854004 100644 --- a/drivers/mtd/spi-nor/fsl-quadspi.c +++ b/drivers/mtd/spi-nor/fsl-quadspi.c @@ -223,8 +223,10 @@ struct fsl_qspi { struct mtd_info mtd[FSL_QSPI_MAX_CHIP]; struct spi_nor nor[FSL_QSPI_MAX_CHIP]; void __iomem *iobase; - void __iomem *ahb_base; /* Used when read from AHB bus */ + void __iomem *ahb_addr; u32 memmap_phy; + u32 memmap_offs; + u32 memmap_len; struct clk *clk, *clk_en; struct device *dev; struct completion c; @@ -732,11 +734,41 @@ static int fsl_qspi_read(struct spi_nor *nor, loff_t from, struct fsl_qspi *q = nor->priv; u8 cmd = nor->read_opcode; - dev_dbg(q->dev, "cmd [%x],read from (0x%p, 0x%.8x, 0x%.8x),len:%d\n", - cmd, q->ahb_base, q->chip_base_addr, (unsigned int)from, len); + /* if necessary,ioremap buffer before AHB read, */ + /* generally 4MB should be large enough */ + if (!q->ahb_addr) { + q->ahb_addr = ioremap_nocache( + q->memmap_phy + q->chip_base_addr + from, + len > SZ_4M ? len : SZ_4M); + if (!q->ahb_addr) { + dev_err(q->dev, "ioremap failed\n"); + return -ENOMEM; + } + q->memmap_offs = q->chip_base_addr + from; + q->memmap_len = len > SZ_4M ? len : SZ_4M; + /* ioremap if the data requested is out of range */ + } else if (q->chip_base_addr + from < q->memmap_offs + || q->chip_base_addr + from + len > + q->memmap_offs + q->memmap_len) { + iounmap(q->ahb_addr); + q->ahb_addr = ioremap_nocache( + q->memmap_phy + q->chip_base_addr + from, + len > SZ_4M ? len : SZ_4M); + if (!q->ahb_addr) { + dev_err(q->dev, "ioremap failed\n"); + return -ENOMEM; + } + q->memmap_offs = q->chip_base_addr + from; + q->memmap_len = len > SZ_4M ? len : SZ_4M; + } + + dev_dbg(q->dev, "cmd [%x],read from 0x%p, len:%d\n", + cmd, q->ahb_addr + q->chip_base_addr + from - q->memmap_offs, + len); /* Read out the data directly from the AHB buffer.*/ - memcpy(buf, q->ahb_base + q->chip_base_addr + from, len); + memcpy(buf, q->ahb_addr + q->chip_base_addr + from - q->memmap_offs, + len); *retlen += len; return 0; @@ -821,10 +853,6 @@ static int fsl_qspi_probe(struct platform_device *pdev) res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "QuadSPI-memory"); - q->ahb_base = devm_ioremap_resource(dev, res); - if (IS_ERR(q->ahb_base)) - return PTR_ERR(q->ahb_base); - q->memmap_phy = res->start; /* find the clocks */ @@ -989,6 +1017,10 @@ static int fsl_qspi_remove(struct platform_device *pdev) mutex_destroy(&q->lock); clk_unprepare(q->clk); clk_unprepare(q->clk_en); + + if (q->ahb_addr) + iounmap(q->ahb_addr); + return 0; }