Pablo Greco f2aff3
From patchwork Mon May 13 14:24:10 2019
Pablo Greco f2aff3
Content-Type: text/plain; charset="utf-8"
Pablo Greco f2aff3
MIME-Version: 1.0
Pablo Greco f2aff3
Content-Transfer-Encoding: 7bit
Pablo Greco f2aff3
X-Patchwork-Submitter: Uenal Mutlu <um@mutluit.com>
Pablo Greco f2aff3
X-Patchwork-Id: 10941009
Pablo Greco f2aff3
Return-Path: 
Pablo Greco f2aff3
 <linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org>
Pablo Greco f2aff3
Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org
Pablo Greco f2aff3
 [172.30.200.125])
Pablo Greco f2aff3
	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 64DB1933
Pablo Greco f2aff3
	for <patchwork-linux-arm@patchwork.kernel.org>;
Pablo Greco f2aff3
 Mon, 13 May 2019 14:25:04 +0000 (UTC)
Pablo Greco f2aff3
Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1])
Pablo Greco f2aff3
	by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 53A7E28173
Pablo Greco f2aff3
	for <patchwork-linux-arm@patchwork.kernel.org>;
Pablo Greco f2aff3
 Mon, 13 May 2019 14:25:04 +0000 (UTC)
Pablo Greco f2aff3
Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486)
Pablo Greco f2aff3
	id 44C8E2817F; Mon, 13 May 2019 14:25:04 +0000 (UTC)
Pablo Greco f2aff3
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
Pablo Greco f2aff3
	pdx-wl-mail.web.codeaurora.org
Pablo Greco f2aff3
X-Spam-Level: 
Pablo Greco f2aff3
X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED,
Pablo Greco f2aff3
	DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,TVD_RCVD_SPACE_BRACKET
Pablo Greco f2aff3
	autolearn=ham version=3.3.1
Pablo Greco f2aff3
Received: from bombadil.infradead.org (bombadil.infradead.org
Pablo Greco f2aff3
 [198.137.202.133])
Pablo Greco f2aff3
	(using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits))
Pablo Greco f2aff3
	(No client certificate requested)
Pablo Greco f2aff3
	by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1965627B13
Pablo Greco f2aff3
	for <patchwork-linux-arm@patchwork.kernel.org>;
Pablo Greco f2aff3
 Mon, 13 May 2019 14:25:03 +0000 (UTC)
Pablo Greco f2aff3
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
Pablo Greco f2aff3
	d=lists.infradead.org; s=bombadil.20170209; h=Sender:
Pablo Greco f2aff3
	Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe:
Pablo Greco f2aff3
	List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date:
Pablo Greco f2aff3
	Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date:
Pablo Greco f2aff3
	Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:
Pablo Greco f2aff3
	References:List-Owner; bh=VkMtdWYKvqBKk3e5nsb2oSCQ7/i6ILGNJ9G30WzfwwM=; b=dhR
Pablo Greco f2aff3
	lLF1HS0z1Iw8ATlWJrNkYsB5lzCXeRq6NWJoiKGDnyFP0DzEsmK8hk/hM5gfqKJVzfbS20UAKtrWR
Pablo Greco f2aff3
	KFChW9BQjSSUmMlejAZlogUQCUraRP0z9dmMb2vrsMxdFfoUTB+Kpcabq0VPGrjaNwIU72gjW9tG7
Pablo Greco f2aff3
	M69LjSV96H16B4wLhIQYo/CgMH1OHxHf4o4xaqVBr9UpqOcFNzwGKuaIISjuIriyhfWAbrrPMoRpL
Pablo Greco f2aff3
	sg+5X4JcQE17YkDdpau1e8zp6RQpsDbiai9Qv/vnFqJTXU8xo9ERq/qCyehQ1+EH+JWRWZ4ArzP5v
Pablo Greco f2aff3
	brG6fmI4tEB1dTuBRGj+WXa3B/Ccm2A==;
Pablo Greco f2aff3
Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org)
Pablo Greco f2aff3
	by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux))
Pablo Greco f2aff3
	id 1hQBsu-0006y7-6y; Mon, 13 May 2019 14:24:56 +0000
Pablo Greco f2aff3
Received: from mutluit.com ([82.211.8.197])
Pablo Greco f2aff3
 by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux))
Pablo Greco f2aff3
 id 1hQBsm-0006sz-Hf
Pablo Greco f2aff3
 for linux-arm-kernel@lists.infradead.org; Mon, 13 May 2019 14:24:51 +0000
Pablo Greco f2aff3
Received: from c22-local.mutluit.com (ip4d155212.dynamic.kabel-deutschland.de
Pablo Greco f2aff3
 [77.21.82.18]:58476)
Pablo Greco f2aff3
 by mutluit.com (s2.mutluit.com [82.211.8.197]:25) with ESMTP ([XMail 1.27
Pablo Greco f2aff3
 ESMTP Server])
Pablo Greco f2aff3
 id <S16FAD6A> for <linux-arm-kernel@lists.infradead.org> from
Pablo Greco f2aff3
 <um@mutluit.com>;
Pablo Greco f2aff3
 Mon, 13 May 2019 10:24:41 -0400
Pablo Greco f2aff3
From: Uenal Mutlu <um@mutluit.com>
Pablo Greco f2aff3
To: Jens Axboe <axboe@kernel.dk>, Maxime Ripard <maxime.ripard@bootlin.com>,
Pablo Greco f2aff3
 Chen-Yu Tsai <wens@csie.org>, linux-ide@vger.kernel.org,
Pablo Greco f2aff3
 linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org
Pablo Greco f2aff3
Subject: [PATCH v3] drivers: ata: ahci_sunxi: Increased SATA/AHCI DMA TX/RX
Pablo Greco f2aff3
 FIFOs
Pablo Greco f2aff3
Date: Mon, 13 May 2019 16:24:10 +0200
Pablo Greco f2aff3
Message-Id: <20190513142410.9299-1-um@mutluit.com>
Pablo Greco f2aff3
X-Mailer: git-send-email 2.11.0
Pablo Greco f2aff3
X-Patchwork-Bot: notify
Pablo Greco f2aff3
X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 
Pablo Greco f2aff3
X-CRM114-CacheID: sfid-20190513_072449_032044_164B56F7 
Pablo Greco f2aff3
X-CRM114-Status: GOOD (  12.14  )
Pablo Greco f2aff3
X-BeenThere: linux-arm-kernel@lists.infradead.org
Pablo Greco f2aff3
X-Mailman-Version: 2.1.21
Pablo Greco f2aff3
Precedence: list
Pablo Greco f2aff3
List-Id: <linux-arm-kernel.lists.infradead.org>
Pablo Greco f2aff3
List-Unsubscribe: 
Pablo Greco f2aff3
 <http://lists.infradead.org/mailman/options/linux-arm-kernel>,
Pablo Greco f2aff3
 <mailto:linux-arm-kernel-request@lists.infradead.org?subject=unsubscribe>
Pablo Greco f2aff3
List-Archive: <http://lists.infradead.org/pipermail/linux-arm-kernel/>
Pablo Greco f2aff3
List-Post: <mailto:linux-arm-kernel@lists.infradead.org>
Pablo Greco f2aff3
List-Help: <mailto:linux-arm-kernel-request@lists.infradead.org?subject=help>
Pablo Greco f2aff3
List-Subscribe: 
Pablo Greco f2aff3
 <http://lists.infradead.org/mailman/listinfo/linux-arm-kernel>,
Pablo Greco f2aff3
 <mailto:linux-arm-kernel-request@lists.infradead.org?subject=subscribe>
Pablo Greco f2aff3
Cc: Mark Rutland <mark.rutland@arm.com>, Uenal Mutlu <um@mutluit.com>,
Pablo Greco f2aff3
 Oliver Schinagl <oliver@schinagl.nl>,
Pablo Greco f2aff3
 Andre Przywara <andre.przywara@arm.com>,
Pablo Greco f2aff3
 Linus Walleij <linus.walleij@linaro.org>,
Pablo Greco f2aff3
 Pablo Greco <pgreco@centosproject.org>, FUKAUMI Naoki <naobsd@gmail.com>,
Pablo Greco f2aff3
 Hans de Goede <hdegoede@redhat.com>, linux-sunxi@googlegroups.com,
Pablo Greco f2aff3
 Jagan Teki <jagan@amarulasolutions.com>, linux-amarula@amarulasolutions.com,
Pablo Greco f2aff3
 Stefan Monnier <monnier@iro.umontreal.ca>
Pablo Greco f2aff3
MIME-Version: 1.0
Pablo Greco f2aff3
Content-Type: text/plain; charset="us-ascii"
Pablo Greco f2aff3
Sender: "linux-arm-kernel" <linux-arm-kernel-bounces@lists.infradead.org>
Pablo Greco f2aff3
Errors-To: 
Pablo Greco f2aff3
 linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org
Pablo Greco f2aff3
X-Virus-Scanned: ClamAV using ClamSMTP
Pablo Greco f2aff3
Pablo Greco f2aff3
Increasing the SATA/AHCI DMA TX/RX FIFOs (P0DMACR.TXTS and .RXTS, ie.
Pablo Greco f2aff3
TX_TRANSACTION_SIZE and RX_TRANSACTION_SIZE) from default 0x0 each
Pablo Greco f2aff3
to 0x3 each, gives a write performance boost of 120 MiB/s to 132 MiB/s
Pablo Greco f2aff3
from lame 36 MiB/s to 45 MiB/s previously.
Pablo Greco f2aff3
Read performance is above 200 MiB/s.
Pablo Greco f2aff3
[tested on SSD using dd bs=4K/8K/12K/16K/20K/24K/32K: peak-perf at 12K]
Pablo Greco f2aff3
Pablo Greco f2aff3
Tested on the SBCs Banana Pi R1 (aka Lamobo R1) and Banana Pi M1 which
Pablo Greco f2aff3
are based on the Allwinner A20 32bit-SoC (ARMv7-a / arm-linux-gnueabihf).
Pablo Greco f2aff3
These devices are RaspberryPi-like small devices.
Pablo Greco f2aff3
Pablo Greco f2aff3
This problem of slow SATA write-speed with these small devices lasts
Pablo Greco f2aff3
for about 7 years now (beginning with the A10 SoC). Many commentators
Pablo Greco f2aff3
throughout the years wrongly assumed the slow write speed was a
Pablo Greco f2aff3
hardware limitation. This patch finally solves the problem, which
Pablo Greco f2aff3
in fact was just a hard-to-find software problem due to lack of
Pablo Greco f2aff3
SATA/AHCI documentation by the SoC-maker Allwinner Technology.
Pablo Greco f2aff3
Pablo Greco f2aff3
Lists of the affected sunxi and other boards and SoCs with SATA using
Pablo Greco f2aff3
the ahci_sunxi driver:
Pablo Greco f2aff3
  $ grep -i -e "^&ahci" arch/arm/boot/dts/sun*dts
Pablo Greco f2aff3
  and http://linux-sunxi.org/SATA#Devices_with_SATA_ports
Pablo Greco f2aff3
  See also http://linux-sunxi.org/Category:Devices_with_SATA_port
Pablo Greco f2aff3
Pablo Greco f2aff3
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
Pablo Greco f2aff3
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Pablo Greco f2aff3
Signed-off-by: Uenal Mutlu <um@mutluit.com>
Pablo Greco f2aff3
---
Pablo Greco f2aff3
Pablo Greco f2aff3
v3:
Pablo Greco f2aff3
  * Removed RFC from Subject line, and also the explicit call for RFC
Pablo Greco f2aff3
    in the text, thereby submitting the patch for official merging.
Pablo Greco f2aff3
Pablo Greco f2aff3
v2:
Pablo Greco f2aff3
  * Commented the patch in-place in ahci_sunxi.c
Pablo Greco f2aff3
  * With bs=12K and no conv=... passed to dd, the write performance
Pablo Greco f2aff3
    rises further to 132 MiB/s
Pablo Greco f2aff3
  * Changed MB/s to MiB/s
Pablo Greco f2aff3
  * Posted the story behind the patch:
Pablo Greco f2aff3
    http://lkml.iu.edu/hypermail/linux/kernel/1905.1/03506.html
Pablo Greco f2aff3
  * Posted a dd test script to find optimal bs, and some results:
Pablo Greco f2aff3
    https://bit.ly/2YoOzEM
Pablo Greco f2aff3
Pablo Greco f2aff3
v1:
Pablo Greco f2aff3
  * States bs=4K for dd and a write performance of 120 MiB/s
Pablo Greco f2aff3
---
Pablo Greco f2aff3
 drivers/ata/ahci_sunxi.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
Pablo Greco f2aff3
 1 file changed, 45 insertions(+), 2 deletions(-)
Pablo Greco f2aff3
Pablo Greco f2aff3
diff --git a/drivers/ata/ahci_sunxi.c b/drivers/ata/ahci_sunxi.c
Pablo Greco f2aff3
index 911710643305..018186a39a69 100644
Pablo Greco f2aff3
--- a/drivers/ata/ahci_sunxi.c
Pablo Greco f2aff3
+++ b/drivers/ata/ahci_sunxi.c
Pablo Greco f2aff3
@@ -157,8 +157,51 @@ static void ahci_sunxi_start_engine(struct ata_port *ap)
Pablo Greco f2aff3
 	void __iomem *port_mmio = ahci_port_base(ap);
Pablo Greco f2aff3
 	struct ahci_host_priv *hpriv = ap->host->private_data;
Pablo Greco f2aff3
 
Pablo Greco f2aff3
-	/* Setup DMA before DMA start */
Pablo Greco f2aff3
-	sunxi_clrsetbits(hpriv->mmio + AHCI_P0DMACR, 0x0000ff00, 0x00004400);
Pablo Greco f2aff3
+	/* Setup DMA before DMA start
Pablo Greco f2aff3
+	 *
Pablo Greco f2aff3
+	 * NOTE: A similar SoC with SATA/AHCI by Texas Instruments documents
Pablo Greco f2aff3
+	 *   this Vendor Specific Port (P0DMACR, aka PxDMACR) in its
Pablo Greco f2aff3
+	 *   User's Guide document (TMS320C674x/OMAP-L1x Processor
Pablo Greco f2aff3
+	 *   Serial ATA (SATA) Controller, Literature Number: SPRUGJ8C,
Pablo Greco f2aff3
+	 *   March 2011, Chapter 4.33 Port DMA Control Register (P0DMACR),
Pablo Greco f2aff3
+	 *   p.68, https://www.ti.com/lit/ug/sprugj8c/sprugj8c.pdf)
Pablo Greco f2aff3
+	 *   as equivalent to the following struct:
Pablo Greco f2aff3
+	 *
Pablo Greco f2aff3
+	 *   struct AHCI_P0DMACR_t
Pablo Greco f2aff3
+	 *   {
Pablo Greco f2aff3
+	 *     unsigned TXTS     : 4;
Pablo Greco f2aff3
+	 *     unsigned RXTS     : 4;
Pablo Greco f2aff3
+	 *     unsigned TXABL    : 4;
Pablo Greco f2aff3
+	 *     unsigned RXABL    : 4;
Pablo Greco f2aff3
+	 *     unsigned Reserved : 16;
Pablo Greco f2aff3
+	 *   };
Pablo Greco f2aff3
+	 *
Pablo Greco f2aff3
+	 *   TXTS: Transmit Transaction Size (TX_TRANSACTION_SIZE).
Pablo Greco f2aff3
+	 *     This field defines the DMA transaction size in DWORDs for
Pablo Greco f2aff3
+	 *     transmit (system bus read, device write) operation. [...]
Pablo Greco f2aff3
+	 *
Pablo Greco f2aff3
+	 *   RXTS: Receive Transaction Size (RX_TRANSACTION_SIZE).
Pablo Greco f2aff3
+	 *     This field defines the Port DMA transaction size in DWORDs
Pablo Greco f2aff3
+	 *     for receive (system bus write, device read) operation. [...]
Pablo Greco f2aff3
+	 *
Pablo Greco f2aff3
+	 *   TXABL: Transmit Burst Limit.
Pablo Greco f2aff3
+	 *     This field allows software to limit the VBUSP master read
Pablo Greco f2aff3
+	 *     burst size. [...]
Pablo Greco f2aff3
+	 *
Pablo Greco f2aff3
+	 *   RXABL: Receive Burst Limit.
Pablo Greco f2aff3
+	 *     Allows software to limit the VBUSP master write burst
Pablo Greco f2aff3
+	 *     size. [...]
Pablo Greco f2aff3
+	 *
Pablo Greco f2aff3
+	 *   Reserved: Reserved.
Pablo Greco f2aff3
+	 *
Pablo Greco f2aff3
+	 *
Pablo Greco f2aff3
+	 * NOTE: According to the above document, the following alternative
Pablo Greco f2aff3
+	 *   to the code below could perhaps be a better option
Pablo Greco f2aff3
+	 *   (or preparation) for possible further improvements later:
Pablo Greco f2aff3
+	 *     sunxi_clrsetbits(hpriv->mmio + AHCI_P0DMACR, 0x0000ffff,
Pablo Greco f2aff3
+	 *		0x00000033);
Pablo Greco f2aff3
+	 */
Pablo Greco f2aff3
+	sunxi_clrsetbits(hpriv->mmio + AHCI_P0DMACR, 0x0000ffff, 0x00004433);
Pablo Greco f2aff3
 
Pablo Greco f2aff3
 	/* Start DMA */
Pablo Greco f2aff3
 	sunxi_setbits(port_mmio + PORT_CMD, PORT_CMD_START);