From patchwork Wed Sep 26 22:07:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 975460 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="SbIEpN23"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42LByJ27P6z9s2P for ; Thu, 27 Sep 2018 08:12:40 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=M2qzJinlK0ItkYl9a1L3gsMLGqQ3DTWXMVAei3nsZEg=; b=SbIEpN23zkfmbXUHsia6JkfESN PAotaZgPn27bL2hiFrhd1piwo3punmThTF+ZwU+k1oS5jyCjBfGLf5wMEePpIC11nw5Uj+A0nuPOG RIJWpEjfaksLYeLTuxLdKSgUKzJr8BlJFr0xCmdO9NfMxczYemliAuJddOhnKCqswNBtuH4/rl/bV 4jiNNfwZTU8xtmVDNO8ez5eq1k/OPAxyPkNmkMHUcSgpajSWRf3w7mqndsbFqkTnAHRt9XdMDyPiB 2NFDewn6t/A2LD8UrVJGwUxB7FlGb+FSkdGozEGrjvS/i+ReRkuNafAWVAeJtHxqr+KKjn0UKOGLq nQACXUdQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1g5I2g-0007Z5-Te; Wed, 26 Sep 2018 22:12:22 +0000 Received: from mail-out.m-online.net ([212.18.0.9]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1g5Hz0-0005du-9z for linux-mtd@lists.infradead.org; Wed, 26 Sep 2018 22:08:38 +0000 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 42LBrz5qnVz1qxxf; Thu, 27 Sep 2018 00:08:03 +0200 (CEST) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 42LBrz4R4zz1qqkx; Thu, 27 Sep 2018 00:08:03 +0200 (CEST) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id kr8_Z9pKI__g; Thu, 27 Sep 2018 00:08:01 +0200 (CEST) X-Auth-Info: hku7XZxTv9S2//bjEAyT7brOvOxhLiMUKQbqqMV7gZ4= Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Thu, 27 Sep 2018 00:08:01 +0200 (CEST) From: Lukasz Majewski To: Frieder Schrempf , boris.brezillon@bootlin.com, Mark Rutland Subject: [RFC/RFT PATCH v1 2/9] mtd: qspi: Provide quirk to read only half of RX buffer (NXP's vybrid) Date: Thu, 27 Sep 2018 00:07:32 +0200 Message-Id: <20180926220739.620-3-lukma@denx.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180926220739.620-1-lukma@denx.de> References: <20180926220739.620-1-lukma@denx.de> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180926_150834_710395_88CBC3A7 X-CRM114-Status: GOOD ( 13.19 ) X-Spam-Score: -0.7 (/) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-0.7 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [212.18.0.9 listed in list.dnswl.org] X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: yogeshnarayan.gaur@nxp.com, richard@nod.at, broonie@kernel.org, linux-kernel@vger.kernel.org, Stefan Agner , linux-spi@vger.kernel.org, albert.aribaud@3adev.fr, prabhakar.kushwaha@nxp.com, linux-mtd@lists.infradead.org, david.wolfe@nxp.com, Fabio Estevam , han.xu@nxp.com, computersforpeace@gmail.com, Fabio Estevam , dwmw2@infradead.org, Lukasz Majewski MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org This commit introduces new quirk for the NXP's quadspi driver for vybrid SoC. It turns out that when reading for example 256B as single bytes: dd if=/dev/mtd7 of=aaa.img bs=1 count=256 root@nix:~# hexdump aaa.img 0000000 464c eec0 baa5 c5ff 7b99 4dfb e0b6 8a2e 0000010 e98e 5265 683c a635 c069 e402 303f d936 0000020 c243 01a7 7064 fce8 e3a9 200a 7e85 28bc 0000030 4296 a30e 1bb4 88d4 b456 b4a6 f3aa 8cff 0000040 01c9 462d 0a43 f893 0e42 67f1 57f0 787c 0000050 49c0 fb2a e514 e954 1d21 affa bac4 38f1 0000060 1ca5 ec46 77eb a854 285b 8e21 12d7 f377 0000070 ffff ffff ffff ffff ffff ffff ffff ffff * 0000100 Data got corrupted. Signed-off-by: Lukasz Majewski --- drivers/mtd/spi-nor/fsl-quadspi.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c index f67f3fa5b9c9..2ef5bfc41d32 100644 --- a/drivers/mtd/spi-nor/fsl-quadspi.c +++ b/drivers/mtd/spi-nor/fsl-quadspi.c @@ -41,6 +41,8 @@ #define QUADSPI_QUIRK_TKT253890 (1 << 2) /* Controller cannot wake up from wait mode, TKT245618 */ #define QUADSPI_QUIRK_TKT245618 (1 << 3) +/* Controller can only read half a rx fifo through AHB */ +#define QUADSPI_QUIRK_AHB_READ_HALF_FIFO (1 << 4) /* The registers */ #define QUADSPI_MCR 0x00 @@ -230,7 +232,8 @@ static const struct fsl_qspi_devtype_data vybrid_data = { .rxfifo = 128, .txfifo = 64, .ahb_buf_size = 1024, - .driver_data = QUADSPI_QUIRK_SWAP_ENDIAN, + .driver_data = QUADSPI_QUIRK_SWAP_ENDIAN + | QUADSPI_QUIRK_AHB_READ_HALF_FIFO, }; static const struct fsl_qspi_devtype_data imx6sx_data = { @@ -341,6 +344,11 @@ static u32 qspi_readl(struct fsl_qspi *q, void __iomem *addr) return ioread32(addr); } +static inline int needs_half_fifo(struct fsl_qspi *q) +{ + return q->devtype_data->driver_data & QUADSPI_QUIRK_AHB_READ_HALF_FIFO; +} + /* * An IC bug makes us to re-arrange the 32-bit data. * The following chips, such as IMX6SLX, have fixed this bug. @@ -390,6 +398,10 @@ static void fsl_qspi_init_lut(struct fsl_qspi *q) u8 read_op = nor->read_opcode; u8 read_dm = nor->read_dummy; + /* use only half fifo if controller needs that */ + if (needs_half_fifo(q)) + rxfifo /= 2; + fsl_qspi_unlock_lut(q); /* Clear all the LUT table */ @@ -675,6 +687,7 @@ static void fsl_qspi_init_ahb_read(struct fsl_qspi *q) { void __iomem *base = q->iobase; int seqid; + u32 buf3cr; /* AHB configuration for access buffer 0/1/2 .*/ qspi_writel(q, QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF0CR); @@ -682,12 +695,14 @@ static void fsl_qspi_init_ahb_read(struct fsl_qspi *q) qspi_writel(q, QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF2CR); /* * Set ADATSZ with the maximum AHB buffer size to improve the - * read performance. + * read performance, except when the controller should not use + * more than half its RX fifo in AHB reads, in which case read + * size is given in the LUT FSL_READ instructions. */ - qspi_writel(q, QUADSPI_BUF3CR_ALLMST_MASK | - ((q->devtype_data->ahb_buf_size / 8) - << QUADSPI_BUF3CR_ADATSZ_SHIFT), - base + QUADSPI_BUF3CR); + buf3cr = QUADSPI_BUF3CR_ALLMST_MASK + | ( (needs_half_fifo(q)? 0 : q->devtype_data->ahb_buf_size / 8) + << QUADSPI_BUF3CR_ADATSZ_SHIFT); + writel(buf3cr, base + QUADSPI_BUF3CR); /* We only use the buffer3 */ qspi_writel(q, 0, base + QUADSPI_BUF0IND);