60a8ce3
From patchwork Sun Jan 13 02:17:18 2019
60a8ce3
Content-Type: text/plain; charset="utf-8"
60a8ce3
MIME-Version: 1.0
60a8ce3
Content-Transfer-Encoding: 8bit
60a8ce3
X-Patchwork-Submitter: Samuel Holland <samuel@sholland.org>
60a8ce3
X-Patchwork-Id: 10761197
60a8ce3
Return-Path: 
60a8ce3
 <linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org>
60a8ce3
Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org
60a8ce3
 [172.30.200.125])
60a8ce3
	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7438D14E5
60a8ce3
	for <patchwork-linux-arm@patchwork.kernel.org>;
60a8ce3
 Sun, 13 Jan 2019 02:18:08 +0000 (UTC)
60a8ce3
Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1])
60a8ce3
	by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6324429093
60a8ce3
	for <patchwork-linux-arm@patchwork.kernel.org>;
60a8ce3
 Sun, 13 Jan 2019 02:18:08 +0000 (UTC)
60a8ce3
Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486)
60a8ce3
	id 572B929097; Sun, 13 Jan 2019 02:18:08 +0000 (UTC)
60a8ce3
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
60a8ce3
	pdx-wl-mail.web.codeaurora.org
60a8ce3
X-Spam-Level: 
60a8ce3
X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED,
60a8ce3
	DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1
60a8ce3
Received: from bombadil.infradead.org (bombadil.infradead.org
60a8ce3
 [198.137.202.133])
60a8ce3
	(using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits))
60a8ce3
	(No client certificate requested)
60a8ce3
	by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5F83A29093
60a8ce3
	for <patchwork-linux-arm@patchwork.kernel.org>;
60a8ce3
 Sun, 13 Jan 2019 02:18:07 +0000 (UTC)
60a8ce3
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
60a8ce3
	d=lists.infradead.org; s=bombadil.20170209; h=Sender:
60a8ce3
	Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post:
60a8ce3
	List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:
60a8ce3
	Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description:
60a8ce3
	Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:
60a8ce3
	List-Owner; bh=dQUQoZ0HK445Sd69SbjwJYcQyzVbBeZDboYvSLP8Vdw=; b=crafG7dY4EnzgC
60a8ce3
	DsGSbEccC3W+IWHZ1IT48gptWAu7uAA+F8UlCxFhZjbnIWLSyJJ45p0OPLEpGqbXcAVG1b5PKktc2
60a8ce3
	fccU3caHf3SodUNh3vGg0xGPPIpak0a3bFcU3kJ2b2HU31TCK7d8u5PPsELEX1044dKRGgelnShpT
60a8ce3
	bWP3zCyZ2BsTJyX72XpZ3xDZTHA6vx0Pk+n6vuRPylDfGX0CIZrDlGFh6szWORsn0emEN+IJOPiXc
60a8ce3
	qhc3Ba3yzsS7ImYjmBkrPlaQpDO15afdFm+LuEx3i0RN9ErPfdG0edtJjd95n/PA7UashuXX2b/5Q
60a8ce3
	TygDejejoCnuJQ1meYBg==;
60a8ce3
Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org)
60a8ce3
	by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux))
60a8ce3
	id 1giVLf-0001hn-TG; Sun, 13 Jan 2019 02:18:03 +0000
60a8ce3
Received: from out1-smtp.messagingengine.com ([66.111.4.25])
60a8ce3
 by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux))
60a8ce3
 id 1giVLA-0001BU-Qo
60a8ce3
 for linux-arm-kernel@lists.infradead.org; Sun, 13 Jan 2019 02:17:36 +0000
60a8ce3
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
60a8ce3
 by mailout.nyi.internal (Postfix) with ESMTP id 663DB23174;
60a8ce3
 Sat, 12 Jan 2019 21:17:23 -0500 (EST)
60a8ce3
Received: from mailfrontend2 ([10.202.2.163])
60a8ce3
 by compute5.internal (MEProxy); Sat, 12 Jan 2019 21:17:23 -0500
60a8ce3
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sholland.org; h=
60a8ce3
 from:to:cc:subject:date:message-id:in-reply-to:references
60a8ce3
 :mime-version:content-type:content-transfer-encoding; s=fm1; bh=
60a8ce3
 jKlMXS7XKvXn/szdGKBQgG32+kZpvO4uOo39QB1bolU=; b=mvmCKr9tLbEvZJbP
60a8ce3
 pDROAd6IVm3H+tyjyvewON4VHOYfu+/+ArBujiVhfDXn37l0VEuv9+CnihXwQJz6
60a8ce3
 4joEh2OkDUy/Q32KvZzaH2GCqpcfAXUzqg4gMHL3z2eF+krzqNFd9EfXRZH4p3zO
60a8ce3
 HP0pa3tHrmZHsG9mnCbzz1JaRXVli6vxQKF/5KOoxpz++tQTllf25u0GpIbfKaOx
60a8ce3
 Z4eKMXxSZvDpYbsxPhgdBnlBZfvOfhsSvTgphvpKdchneqyKUYVjwO68c7ajBeK9
60a8ce3
 PGEo6YPH30QIE71YUD80IG8ZMrQOWYdlNLKocWTel4ZaJpkw4CIA1H+gnDmSKutJ
60a8ce3
 VDRgYA==
60a8ce3
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
60a8ce3
 messagingengine.com; h=cc:content-transfer-encoding:content-type
60a8ce3
 :date:from:in-reply-to:message-id:mime-version:references
60a8ce3
 :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender
60a8ce3
 :x-sasl-enc; s=fm1; bh=jKlMXS7XKvXn/szdGKBQgG32+kZpvO4uOo39QB1bo
60a8ce3
 lU=; b=Upeefp0OZATDpZxWgrtHSzR2/FFiAwyRjS0PC/HWQehfO8m3OS4/AkyP1
60a8ce3
 L96BnIrJ3Uk4WRUTblFAJvE+dJAiQeJ1WmOsJ+Dkgshp5OGZ0pUhxf/n45Ro4BuL
60a8ce3
 VTC4QqUzoYnFC/ut2gfaL91yRN5tZmU+2ik5O+8E1vvF/IwhZcLDw6tcR/JX6Ixa
60a8ce3
 X+EWoETX3GQC1Dbwzf9yMctarPw5mxJ8ERUyGHtDuFyzr0v0ReMlCfWqdBd0Ekca
60a8ce3
 /EA5D9Um8kl6S9wVk6XgFvZm2vyzRIhfmLQqoEzcCKywrMv2qiCquAYqWMUFIdM+
60a8ce3
 3TkvJqkWkNjRz6J6Dbd2i15CpL/Sw==
60a8ce3
X-ME-Sender: <xms:sp86XLgZgR-OuGupvTKImnW3geoxWw9AmBdt1C0DGN-t7owcwWYflg>
60a8ce3
X-ME-Proxy-Cause: 
60a8ce3
 gggruggvucftvghtrhhoucdtuddrgedtledrfeekgdduvdcutefuodetggdotefrodftvf
60a8ce3
 curfhrohhfihhlvgemucfhrghsthforghilhdpqfhuthenuceurghilhhouhhtmecufedt
60a8ce3
 tdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojg
60a8ce3
 hfgggtgfesthekredtredtjeenucfhrhhomhepufgrmhhuvghlucfjohhllhgrnhguuceo
60a8ce3
 shgrmhhuvghlsehshhholhhlrghnugdrohhrgheqnecuffhomhgrihhnpegrrhhmsghirg
60a8ce3
 hnrdgtohhmpdhgihhthhhusgdrtghomhdpfihhihhtvghquhgrrhhkrdhorhhgnecukfhp
60a8ce3
 peejtddrudefhedrudegkedrudehudenucfrrghrrghmpehmrghilhhfrhhomhepshgrmh
60a8ce3
 huvghlsehshhholhhlrghnugdrohhrghenucevlhhushhtvghrufhiiigvpedt
60a8ce3
X-ME-Proxy: <xmx:sp86XClRnRqP6qey5otmmQUXhLScRlq2lYK8B3cn0kI6EqlMQuByFg>
60a8ce3
 <xmx:sp86XHpy0uQ1V3qD29APOD9ngWzb5KHgeV3vOBV4LioAvt-bR0k-rg>
60a8ce3
 <xmx:sp86XLGPLYL3h3AW4JPSnrVuevGIGc3rsQVzKchjHOk5g30XwDbN5g>
60a8ce3
 <xmx:s586XDRmlHkvg3iGQmu4ZPLH-3nA609xxZWSVf6vR2Xqp8dt6ACFxw>
60a8ce3
Received: from titanium.stl.sholland.net
60a8ce3
 (70-135-148-151.lightspeed.stlsmo.sbcglobal.net [70.135.148.151])
60a8ce3
 by mail.messagingengine.com (Postfix) with ESMTPA id 6F2A31026D;
60a8ce3
 Sat, 12 Jan 2019 21:17:21 -0500 (EST)
60a8ce3
From: Samuel Holland <samuel@sholland.org>
60a8ce3
To: Catalin Marinas <catalin.marinas@arm.com>,
60a8ce3
 Will Deacon <will.deacon@arm.com>,
60a8ce3
 Maxime Ripard <maxime.ripard@bootlin.com>, Chen-Yu Tsai <wens@csie.org>,
60a8ce3
 Rob Herring <robh+dt@kernel.org>, Mark Rutland <Mark.Rutland@arm.com>,
60a8ce3
 Daniel Lezcano <daniel.lezcano@linaro.org>,
60a8ce3
 Thomas Gleixner <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com>
60a8ce3
Subject: [PATCH v3 1/2] arm64: arch_timer: Workaround for Allwinner A64 timer
60a8ce3
 instability
60a8ce3
Date: Sat, 12 Jan 2019 20:17:18 -0600
60a8ce3
Message-Id: <20190113021719.46457-2-samuel@sholland.org>
60a8ce3
X-Mailer: git-send-email 2.19.2
60a8ce3
In-Reply-To: <20190113021719.46457-1-samuel@sholland.org>
60a8ce3
References: <20190113021719.46457-1-samuel@sholland.org>
60a8ce3
MIME-Version: 1.0
60a8ce3
X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 
60a8ce3
X-CRM114-CacheID: sfid-20190112_181733_065120_A96E9A2B 
60a8ce3
X-CRM114-Status: GOOD (  19.89  )
60a8ce3
X-BeenThere: linux-arm-kernel@lists.infradead.org
60a8ce3
X-Mailman-Version: 2.1.21
60a8ce3
Precedence: list
60a8ce3
List-Id: <linux-arm-kernel.lists.infradead.org>
60a8ce3
List-Unsubscribe: 
60a8ce3
 <http://lists.infradead.org/mailman/options/linux-arm-kernel>,
60a8ce3
 <mailto:linux-arm-kernel-request@lists.infradead.org?subject=unsubscribe>
60a8ce3
List-Archive: <http://lists.infradead.org/pipermail/linux-arm-kernel/>
60a8ce3
List-Post: <mailto:linux-arm-kernel@lists.infradead.org>
60a8ce3
List-Help: <mailto:linux-arm-kernel-request@lists.infradead.org?subject=help>
60a8ce3
List-Subscribe: 
60a8ce3
 <http://lists.infradead.org/mailman/listinfo/linux-arm-kernel>,
60a8ce3
 <mailto:linux-arm-kernel-request@lists.infradead.org?subject=subscribe>
60a8ce3
Cc: devicetree@vger.kernel.org, linux-sunxi@googlegroups.com,
60a8ce3
 linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
60a8ce3
 Samuel Holland <samuel@sholland.org>
60a8ce3
Content-Type: text/plain; charset="utf-8"
60a8ce3
Sender: "linux-arm-kernel" <linux-arm-kernel-bounces@lists.infradead.org>
60a8ce3
Errors-To: 
60a8ce3
 linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org
60a8ce3
X-Virus-Scanned: ClamAV using ClamSMTP
60a8ce3
60a8ce3
The Allwinner A64 SoC is known[1] to have an unstable architectural
60a8ce3
timer, which manifests itself most obviously in the time jumping forward
60a8ce3
a multiple of 95 years[2][3]. This coincides with 2^56 cycles at a
60a8ce3
timer frequency of 24 MHz, implying that the time went slightly backward
60a8ce3
(and this was interpreted by the kernel as it jumping forward and
60a8ce3
wrapping around past the epoch).
60a8ce3
60a8ce3
Investigation revealed instability in the low bits of CNTVCT at the
60a8ce3
point a high bit rolls over. This leads to power-of-two cycle forward
60a8ce3
and backward jumps. (Testing shows that forward jumps are about twice as
60a8ce3
likely as backward jumps.) Since the counter value returns to normal
60a8ce3
after an indeterminate read, each "jump" really consists of both a
60a8ce3
forward and backward jump from the software perspective.
60a8ce3
60a8ce3
Unless the kernel is trapping CNTVCT reads, a userspace program is able
60a8ce3
to read the register in a loop faster than it changes. A test program
60a8ce3
running on all 4 CPU cores that reported jumps larger than 100 ms was
60a8ce3
run for 13.6 hours and reported the following:
60a8ce3
60a8ce3
 Count | Event
60a8ce3
-------+---------------------------
60a8ce3
  9940 | jumped backward      699ms
60a8ce3
   268 | jumped backward     1398ms
60a8ce3
     1 | jumped backward     2097ms
60a8ce3
 16020 | jumped forward       175ms
60a8ce3
  6443 | jumped forward       699ms
60a8ce3
  2976 | jumped forward      1398ms
60a8ce3
     9 | jumped forward    356516ms
60a8ce3
     9 | jumped forward    357215ms
60a8ce3
     4 | jumped forward    714430ms
60a8ce3
     1 | jumped forward   3578440ms
60a8ce3
60a8ce3
This works out to a jump larger than 100 ms about every 5.5 seconds on
60a8ce3
each CPU core.
60a8ce3
60a8ce3
The largest jump (almost an hour!) was the following sequence of reads:
60a8ce3
    0x0000007fffffffff → 0x00000093feffffff → 0x0000008000000000
60a8ce3
60a8ce3
Note that the middle bits don't necessarily all read as all zeroes or
60a8ce3
all ones during the anomalous behavior; however the low 10 bits checked
60a8ce3
by the function in this patch have never been observed with any other
60a8ce3
value.
60a8ce3
60a8ce3
Also note that smaller jumps are much more common, with backward jumps
60a8ce3
of 2048 (2^11) cycles observed over 400 times per second on each core.
60a8ce3
(Of course, this is partially explained by lower bits rolling over more
60a8ce3
frequently.) Any one of these could have caused the 95 year time skip.
60a8ce3
60a8ce3
Similar anomalies were observed while reading CNTPCT (after patching the
60a8ce3
kernel to allow reads from userspace). However, the CNTPCT jumps are
60a8ce3
much less frequent, and only small jumps were observed. The same program
60a8ce3
as before (except now reading CNTPCT) observed after 72 hours:
60a8ce3
60a8ce3
 Count | Event
60a8ce3
-------+---------------------------
60a8ce3
    17 | jumped backward      699ms
60a8ce3
    52 | jumped forward       175ms
60a8ce3
  2831 | jumped forward       699ms
60a8ce3
     5 | jumped forward      1398ms
60a8ce3
60a8ce3
Further investigation showed that the instability in CNTPCT/CNTVCT also
60a8ce3
affected the respective timer's TVAL register. The following values were
60a8ce3
observed immediately after writing CNVT_TVAL to 0x10000000:
60a8ce3
60a8ce3
 CNTVCT             | CNTV_TVAL  | CNTV_CVAL          | CNTV_TVAL Error
60a8ce3
--------------------+------------+--------------------+-----------------
60a8ce3
 0x000000d4a2d8bfff | 0x10003fff | 0x000000d4b2d8bfff | +0x00004000
60a8ce3
 0x000000d4a2d94000 | 0x0fffffff | 0x000000d4b2d97fff | -0x00004000
60a8ce3
 0x000000d4a2d97fff | 0x10003fff | 0x000000d4b2d97fff | +0x00004000
60a8ce3
 0x000000d4a2d9c000 | 0x0fffffff | 0x000000d4b2d9ffff | -0x00004000
60a8ce3
60a8ce3
The pattern of errors in CNTV_TVAL seemed to depend on exactly which
60a8ce3
value was written to it. For example, after writing 0x10101010:
60a8ce3
60a8ce3
 CNTVCT             | CNTV_TVAL  | CNTV_CVAL          | CNTV_TVAL Error
60a8ce3
--------------------+------------+--------------------+-----------------
60a8ce3
 0x000001ac3effffff | 0x1110100f | 0x000001ac4f10100f | +0x1000000
60a8ce3
 0x000001ac40000000 | 0x1010100f | 0x000001ac5110100f | -0x1000000
60a8ce3
 0x000001ac58ffffff | 0x1110100f | 0x000001ac6910100f | +0x1000000
60a8ce3
 0x000001ac66000000 | 0x1010100f | 0x000001ac7710100f | -0x1000000
60a8ce3
 0x000001ac6affffff | 0x1110100f | 0x000001ac7b10100f | +0x1000000
60a8ce3
 0x000001ac6e000000 | 0x1010100f | 0x000001ac7f10100f | -0x1000000
60a8ce3
60a8ce3
I was also twice able to reproduce the issue covered by Allwinner's
60a8ce3
workaround[4], that writing to TVAL sometimes fails, and both CVAL and
60a8ce3
TVAL are left with entirely bogus values. One was the following values:
60a8ce3
60a8ce3
 CNTVCT             | CNTV_TVAL  | CNTV_CVAL
60a8ce3
--------------------+------------+--------------------------------------
60a8ce3
 0x000000d4a2d6014c | 0x8fbd5721 | 0x000000d132935fff (615s in the past)
60a8ce3
60a8ce3
========================================================================
60a8ce3
60a8ce3
Because the CPU can read the CNTPCT/CNTVCT registers faster than they
60a8ce3
change, performing two reads of the register and comparing the high bits
60a8ce3
(like other workarounds) is not a workable solution. And because the
60a8ce3
timer can jump both forward and backward, no pair of reads can
60a8ce3
distinguish a good value from a bad one. The only way to guarantee a
60a8ce3
good value from consecutive reads would be to read _three_ times, and
60a8ce3
take the middle value only if the three values are 1) each unique and
60a8ce3
2) increasing. This takes at minimum 3 counter cycles (125 ns), or more
60a8ce3
if an anomaly is detected.
60a8ce3
60a8ce3
However, since there is a distinct pattern to the bad values, we can
60a8ce3
optimize the common case (1022/1024 of the time) to a single read by
60a8ce3
simply ignoring values that match the error pattern. This still takes no
60a8ce3
more than 3 cycles in the worst case, and requires much less code. As an
60a8ce3
additional safety check, we still limit the loop iteration to the number
60a8ce3
of max-frequency (1.2 GHz) CPU cycles in three 24 MHz counter periods.
60a8ce3
60a8ce3
For the TVAL registers, the simple solution is to not use them. Instead,
60a8ce3
read or write the CVAL and calculate the TVAL value in software.
60a8ce3
60a8ce3
Although the manufacturer is aware of at least part of the erratum[4],
60a8ce3
there is no official name for it. For now, use the kernel-internal name
60a8ce3
"UNKNOWN1".
60a8ce3
60a8ce3
[1]: https://github.com/armbian/build/commit/a08cd6fe7ae9
60a8ce3
[2]: https://forum.armbian.com/topic/3458-a64-datetime-clock-issue/
60a8ce3
[3]: https://irclog.whitequark.org/linux-sunxi/2018-01-26
60a8ce3
[4]: https://github.com/Allwinner-Homlet/H6-BSP4.9-linux/blob/master/drivers/clocksource/arm_arch_timer.c#L272
60a8ce3
60a8ce3
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
60a8ce3
Tested-by: Andre Przywara <andre.przywara@arm.com>
60a8ce3
Signed-off-by: Samuel Holland <samuel@sholland.org>
60a8ce3
---
60a8ce3
 Documentation/arm64/silicon-errata.txt |  2 +
60a8ce3
 drivers/clocksource/Kconfig            | 10 +++++
60a8ce3
 drivers/clocksource/arm_arch_timer.c   | 55 ++++++++++++++++++++++++++
60a8ce3
 3 files changed, 67 insertions(+)
60a8ce3
60a8ce3
diff --git a/Documentation/arm64/silicon-errata.txt b/Documentation/arm64/silicon-errata.txt
60a8ce3
index 8f9577621144..4a269732d2a0 100644
60a8ce3
--- a/Documentation/arm64/silicon-errata.txt
60a8ce3
+++ b/Documentation/arm64/silicon-errata.txt
60a8ce3
@@ -44,6 +44,8 @@ stable kernels.
60a8ce3
 
60a8ce3
 | Implementor    | Component       | Erratum ID      | Kconfig                     |
60a8ce3
 +----------------+-----------------+-----------------+-----------------------------+
60a8ce3
+| Allwinner      | A64/R18         | UNKNOWN1        | SUN50I_ERRATUM_UNKNOWN1     |
60a8ce3
+|                |                 |                 |                             |
60a8ce3
 | ARM            | Cortex-A53      | #826319         | ARM64_ERRATUM_826319        |
60a8ce3
 | ARM            | Cortex-A53      | #827319         | ARM64_ERRATUM_827319        |
60a8ce3
 | ARM            | Cortex-A53      | #824069         | ARM64_ERRATUM_824069        |
60a8ce3
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
60a8ce3
index 55c77e44bb2d..d20ff4da07c3 100644
60a8ce3
--- a/drivers/clocksource/Kconfig
60a8ce3
+++ b/drivers/clocksource/Kconfig
60a8ce3
@@ -364,6 +364,16 @@ config ARM64_ERRATUM_858921
60a8ce3
 	  The workaround will be dynamically enabled when an affected
60a8ce3
 	  core is detected.
60a8ce3
 
60a8ce3
+config SUN50I_ERRATUM_UNKNOWN1
60a8ce3
+	bool "Workaround for Allwinner A64 erratum UNKNOWN1"
60a8ce3
+	default y
60a8ce3
+	depends on ARM_ARCH_TIMER && ARM64 && ARCH_SUNXI
60a8ce3
+	select ARM_ARCH_TIMER_OOL_WORKAROUND
60a8ce3
+	help
60a8ce3
+	  This option enables a workaround for instability in the timer on
60a8ce3
+	  the Allwinner A64 SoC. The workaround will only be active if the
60a8ce3
+	  allwinner,erratum-unknown1 property is found in the timer node.
60a8ce3
+
60a8ce3
 config ARM_GLOBAL_TIMER
60a8ce3
 	bool "Support for the ARM global timer" if COMPILE_TEST
60a8ce3
 	select TIMER_OF if OF
60a8ce3
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
60a8ce3
index 9a7d4dc00b6e..a8b20b65bd4b 100644
60a8ce3
--- a/drivers/clocksource/arm_arch_timer.c
60a8ce3
+++ b/drivers/clocksource/arm_arch_timer.c
60a8ce3
@@ -326,6 +326,48 @@ static u64 notrace arm64_1188873_read_cntvct_el0(void)
60a8ce3
 }
60a8ce3
 #endif
60a8ce3
 
60a8ce3
+#ifdef CONFIG_SUN50I_ERRATUM_UNKNOWN1
60a8ce3
+/*
60a8ce3
+ * The low bits of the counter registers are indeterminate while bit 10 or
60a8ce3
+ * greater is rolling over. Since the counter value can jump both backward
60a8ce3
+ * (7ff -> 000 -> 800) and forward (7ff -> fff -> 800), ignore register values
60a8ce3
+ * with all ones or all zeros in the low bits. Bound the loop by the maximum
60a8ce3
+ * number of CPU cycles in 3 consecutive 24 MHz counter periods.
60a8ce3
+ */
60a8ce3
+#define __sun50i_a64_read_reg(reg) ({					\
60a8ce3
+	u64 _val;							\
60a8ce3
+	int _retries = 150;						\
60a8ce3
+									\
60a8ce3
+	do {								\
60a8ce3
+		_val = read_sysreg(reg);				\
60a8ce3
+		_retries--;						\
60a8ce3
+	} while (((_val + 1) & GENMASK(9, 0)) <= 1 && _retries);	\
60a8ce3
+									\
60a8ce3
+	WARN_ON_ONCE(!_retries);					\
60a8ce3
+	_val;								\
60a8ce3
+})
60a8ce3
+
60a8ce3
+static u64 notrace sun50i_a64_read_cntpct_el0(void)
60a8ce3
+{
60a8ce3
+	return __sun50i_a64_read_reg(cntpct_el0);
60a8ce3
+}
60a8ce3
+
60a8ce3
+static u64 notrace sun50i_a64_read_cntvct_el0(void)
60a8ce3
+{
60a8ce3
+	return __sun50i_a64_read_reg(cntvct_el0);
60a8ce3
+}
60a8ce3
+
60a8ce3
+static u32 notrace sun50i_a64_read_cntp_tval_el0(void)
60a8ce3
+{
60a8ce3
+	return read_sysreg(cntp_cval_el0) - sun50i_a64_read_cntpct_el0();
60a8ce3
+}
60a8ce3
+
60a8ce3
+static u32 notrace sun50i_a64_read_cntv_tval_el0(void)
60a8ce3
+{
60a8ce3
+	return read_sysreg(cntv_cval_el0) - sun50i_a64_read_cntvct_el0();
60a8ce3
+}
60a8ce3
+#endif
60a8ce3
+
60a8ce3
 #ifdef CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND
60a8ce3
 DEFINE_PER_CPU(const struct arch_timer_erratum_workaround *, timer_unstable_counter_workaround);
60a8ce3
 EXPORT_SYMBOL_GPL(timer_unstable_counter_workaround);
60a8ce3
@@ -423,6 +465,19 @@ static const struct arch_timer_erratum_workaround ool_workarounds[] = {
60a8ce3
 		.read_cntvct_el0 = arm64_1188873_read_cntvct_el0,
60a8ce3
 	},
60a8ce3
 #endif
60a8ce3
+#ifdef CONFIG_SUN50I_ERRATUM_UNKNOWN1
60a8ce3
+	{
60a8ce3
+		.match_type = ate_match_dt,
60a8ce3
+		.id = "allwinner,erratum-unknown1",
60a8ce3
+		.desc = "Allwinner erratum UNKNOWN1",
60a8ce3
+		.read_cntp_tval_el0 = sun50i_a64_read_cntp_tval_el0,
60a8ce3
+		.read_cntv_tval_el0 = sun50i_a64_read_cntv_tval_el0,
60a8ce3
+		.read_cntpct_el0 = sun50i_a64_read_cntpct_el0,
60a8ce3
+		.read_cntvct_el0 = sun50i_a64_read_cntvct_el0,
60a8ce3
+		.set_next_event_phys = erratum_set_next_event_tval_phys,
60a8ce3
+		.set_next_event_virt = erratum_set_next_event_tval_virt,
60a8ce3
+	},
60a8ce3
+#endif
60a8ce3
 };
60a8ce3
 
60a8ce3
 typedef bool (*ate_match_fn_t)(const struct arch_timer_erratum_workaround *,
60a8ce3
60a8ce3
From patchwork Sun Jan 13 02:17:19 2019
60a8ce3
Content-Type: text/plain; charset="utf-8"
60a8ce3
MIME-Version: 1.0
60a8ce3
Content-Transfer-Encoding: 7bit
60a8ce3
X-Patchwork-Submitter: Samuel Holland <samuel@sholland.org>
60a8ce3
X-Patchwork-Id: 10761195
60a8ce3
Return-Path: 
60a8ce3
 <linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org>
60a8ce3
Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org
60a8ce3
 [172.30.200.125])
60a8ce3
	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5600213B5
60a8ce3
	for <patchwork-linux-arm@patchwork.kernel.org>;
60a8ce3
 Sun, 13 Jan 2019 02:17:49 +0000 (UTC)
60a8ce3
Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1])
60a8ce3
	by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 455A02908A
60a8ce3
	for <patchwork-linux-arm@patchwork.kernel.org>;
60a8ce3
 Sun, 13 Jan 2019 02:17:49 +0000 (UTC)
60a8ce3
Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486)
60a8ce3
	id 397D52908F; Sun, 13 Jan 2019 02:17:49 +0000 (UTC)
60a8ce3
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
60a8ce3
	pdx-wl-mail.web.codeaurora.org
60a8ce3
X-Spam-Level: 
60a8ce3
X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED,
60a8ce3
	DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1
60a8ce3
Received: from bombadil.infradead.org (bombadil.infradead.org
60a8ce3
 [198.137.202.133])
60a8ce3
	(using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits))
60a8ce3
	(No client certificate requested)
60a8ce3
	by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 99BED2908A
60a8ce3
	for <patchwork-linux-arm@patchwork.kernel.org>;
60a8ce3
 Sun, 13 Jan 2019 02:17:48 +0000 (UTC)
60a8ce3
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
60a8ce3
	d=lists.infradead.org; s=bombadil.20170209; h=Sender:
60a8ce3
	Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post:
60a8ce3
	List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:
60a8ce3
	Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description:
60a8ce3
	Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:
60a8ce3
	List-Owner; bh=81rywXc0nLAQXkKBaUF3JbVJE1w8kNqPZiSw/rJIxQU=; b=bzFR1Zl3PUkKOj
60a8ce3
	GDlGg1LEgye6Wvu5OpjIF/BFr5WR3u6PByyyLk5b2v/IaPz/Jl+GwULiFoqCtOClaOf4eXTPUAVk4
60a8ce3
	/zv54RuzWhCLNK5E+bMFJDcOmNqXlmoJnnQrXI4NsfWPgT0l8y8eqSW0vMplCCojSsdOw24wVv8y7
60a8ce3
	UxMyWC8WKVaW6KzMEBAS5EgV1tredQlpRUBOsmnFMY2N6EkRCfFX4DxehywPBiv2Af35czHO0roiy
60a8ce3
	WNESOXNXRxjJivnshxW4+XPfcLlSfQhovZKeue+ztLUkJdeQoeg56oBv9+Vh2SXNbUnew+Nw7v/Gm
60a8ce3
	17TZYrFktGxOAOhb+cOw==;
60a8ce3
Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org)
60a8ce3
	by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux))
60a8ce3
	id 1giVLL-0001Ip-VF; Sun, 13 Jan 2019 02:17:44 +0000
60a8ce3
Received: from out1-smtp.messagingengine.com ([66.111.4.25])
60a8ce3
 by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux))
60a8ce3
 id 1giVLA-0001BV-QY
60a8ce3
 for linux-arm-kernel@lists.infradead.org; Sun, 13 Jan 2019 02:17:34 +0000
60a8ce3
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
60a8ce3
 by mailout.nyi.internal (Postfix) with ESMTP id 58C172217A;
60a8ce3
 Sat, 12 Jan 2019 21:17:23 -0500 (EST)
60a8ce3
Received: from mailfrontend2 ([10.202.2.163])
60a8ce3
 by compute5.internal (MEProxy); Sat, 12 Jan 2019 21:17:23 -0500
60a8ce3
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sholland.org; h=
60a8ce3
 from:to:cc:subject:date:message-id:in-reply-to:references
60a8ce3
 :mime-version:content-transfer-encoding; s=fm1; bh=BcKEOqrm2Nddz
60a8ce3
 dFcJfheN0gw9UIuZWkg3rxvmQZRiIs=; b=VQCFZC/fuHByg4cpT6HXrPggPO7Ya
60a8ce3
 7v5IEDVxQpSkqH702Nr1s4JAYbcdkol3j0AwYlfh4DXsKWVJu6aeu6WdntZViEGr
60a8ce3
 cKYGOmRx9g/A9t4Pv74giorkqeDx4qsmjrOPGTxNkvYAVWOWYtyXllZDm2U+s30g
60a8ce3
 wCw2Y40NPYrJKqcGXFrKmiLQeelJA7aBNcv464toHdGKqKssaj9Ga06vS9UnG7Pj
60a8ce3
 JT90zC11j2dqM/SI+lblqWz3IQQqfx87qiKn/qhhOkiSv74fMFDfmBpgzQcfwJFZ
60a8ce3
 hStK5QZihYCLG94SuhTGgfJzRTSXks0Kt3EL5AcLDqaVH9qujyMg6JKXQ==
60a8ce3
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
60a8ce3
 messagingengine.com; h=cc:content-transfer-encoding:date:from
60a8ce3
 :in-reply-to:message-id:mime-version:references:subject:to
60a8ce3
 :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=
60a8ce3
 fm1; bh=BcKEOqrm2NddzdFcJfheN0gw9UIuZWkg3rxvmQZRiIs=; b=iJBq9L23
60a8ce3
 6lDXPuxV7FsoVVaFnY3c+Sc/+wsLVJCsIzowctPQ4Kt89W15UIaACbxm72T4LzGw
60a8ce3
 RSg47CGMKVmqWdoFlCF3AqsADizdNHw8bZgSsug8OxThLWnm8bwDCMDgQNnoY9kN
60a8ce3
 nlkmNI3g26PQJSTzYw+nPfgk//LCBlPWsacufHcT6dfbaoPLOVyRMXZTqwFArUQv
60a8ce3
 oWx34MVGM+BYBvo78zpG4EkdLXx2nuvwiO3nz/D9aaFvLt//mXBHhpR2qFNCQoQh
60a8ce3
 ExIIq/6GJSLRF29mHXwtmXSGGE2plK85c7lc599Hr6AwEFCMBbyYftksKF8gRCDT
60a8ce3
 X5KWIrsMAHwNmw==
60a8ce3
X-ME-Sender: <xms:sp86XK7GnQHA9uHaHGZsyRJJRdVPHqaqXrcZSZDhFHK9mw52sOD8Mw>
60a8ce3
X-ME-Proxy-Cause: 
60a8ce3
 gggruggvucftvghtrhhoucdtuddrgedtledrfeekgdduvdcutefuodetggdotefrodftvf
60a8ce3
 curfhrohhfihhlvgemucfhrghsthforghilhdpqfhuthenuceurghilhhouhhtmecufedt
60a8ce3
 tdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojg
60a8ce3
 hfggfgsedtkeertdertddtnecuhfhrohhmpefurghmuhgvlhcujfholhhlrghnugcuoehs
60a8ce3
 rghmuhgvlhesshhhohhllhgrnhgurdhorhhgqeenucfkphepjedtrddufeehrddugeekrd
60a8ce3
 duhedunecurfgrrhgrmhepmhgrihhlfhhrohhmpehsrghmuhgvlhesshhhohhllhgrnhgu
60a8ce3
 rdhorhhgnecuvehluhhsthgvrhfuihiivgeptd
60a8ce3
X-ME-Proxy: <xmx:sp86XB018KTtDKatCu7gB4vrEktSU_R5Kofe4r5HX1Vgcfgs3AWTxQ>
60a8ce3
 <xmx:sp86XBApgRBLm_CLOjfcZdkoeYXTHGiaw5bTKV1ZWrD68QOFmKvX8A>
60a8ce3
 <xmx:sp86XD3HOmrRMd6Re7jXqrUdDh9oicR3Mx3OuyUSPBmc0uhZzn-Dlw>
60a8ce3
 <xmx:s586XOboucBXUXW8COEbY-dWquI3bdp6K1N7Piyn8RdSWcTQSPUVew>
60a8ce3
Received: from titanium.stl.sholland.net
60a8ce3
 (70-135-148-151.lightspeed.stlsmo.sbcglobal.net [70.135.148.151])
60a8ce3
 by mail.messagingengine.com (Postfix) with ESMTPA id 07E8010085;
60a8ce3
 Sat, 12 Jan 2019 21:17:22 -0500 (EST)
60a8ce3
From: Samuel Holland <samuel@sholland.org>
60a8ce3
To: Catalin Marinas <catalin.marinas@arm.com>,
60a8ce3
 Will Deacon <will.deacon@arm.com>,
60a8ce3
 Maxime Ripard <maxime.ripard@bootlin.com>, Chen-Yu Tsai <wens@csie.org>,
60a8ce3
 Rob Herring <robh+dt@kernel.org>, Mark Rutland <Mark.Rutland@arm.com>,
60a8ce3
 Daniel Lezcano <daniel.lezcano@linaro.org>,
60a8ce3
 Thomas Gleixner <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com>
60a8ce3
Subject: [PATCH v3 2/2] arm64: dts: allwinner: a64: Enable A64 timer
60a8ce3
 workaround
60a8ce3
Date: Sat, 12 Jan 2019 20:17:19 -0600
60a8ce3
Message-Id: <20190113021719.46457-3-samuel@sholland.org>
60a8ce3
X-Mailer: git-send-email 2.19.2
60a8ce3
In-Reply-To: <20190113021719.46457-1-samuel@sholland.org>
60a8ce3
References: <20190113021719.46457-1-samuel@sholland.org>
60a8ce3
MIME-Version: 1.0
60a8ce3
X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 
60a8ce3
X-CRM114-CacheID: sfid-20190112_181733_014958_D1734ED1 
60a8ce3
X-CRM114-Status: GOOD (  10.90  )
60a8ce3
X-BeenThere: linux-arm-kernel@lists.infradead.org
60a8ce3
X-Mailman-Version: 2.1.21
60a8ce3
Precedence: list
60a8ce3
List-Id: <linux-arm-kernel.lists.infradead.org>
60a8ce3
List-Unsubscribe: 
60a8ce3
 <http://lists.infradead.org/mailman/options/linux-arm-kernel>,
60a8ce3
 <mailto:linux-arm-kernel-request@lists.infradead.org?subject=unsubscribe>
60a8ce3
List-Archive: <http://lists.infradead.org/pipermail/linux-arm-kernel/>
60a8ce3
List-Post: <mailto:linux-arm-kernel@lists.infradead.org>
60a8ce3
List-Help: <mailto:linux-arm-kernel-request@lists.infradead.org?subject=help>
60a8ce3
List-Subscribe: 
60a8ce3
 <http://lists.infradead.org/mailman/listinfo/linux-arm-kernel>,
60a8ce3
 <mailto:linux-arm-kernel-request@lists.infradead.org?subject=subscribe>
60a8ce3
Cc: devicetree@vger.kernel.org, linux-sunxi@googlegroups.com,
60a8ce3
 linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
60a8ce3
 Samuel Holland <samuel@sholland.org>
60a8ce3
Content-Type: text/plain; charset="us-ascii"
60a8ce3
Sender: "linux-arm-kernel" <linux-arm-kernel-bounces@lists.infradead.org>
60a8ce3
Errors-To: 
60a8ce3
 linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org
60a8ce3
X-Virus-Scanned: ClamAV using ClamSMTP
60a8ce3
60a8ce3
As instability in the architectural timer has been observed on multiple
60a8ce3
devices using this SoC, inluding the Pine64 and the Orange Pi Win,
60a8ce3
enable the workaround in the SoC's device tree.
60a8ce3
60a8ce3
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
60a8ce3
Signed-off-by: Samuel Holland <samuel@sholland.org>
60a8ce3
---
60a8ce3
 arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 1 +
60a8ce3
 1 file changed, 1 insertion(+)
60a8ce3
60a8ce3
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
60a8ce3
index f3a66f888205..13eac92a8c55 100644
60a8ce3
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
60a8ce3
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
60a8ce3
@@ -175,6 +175,7 @@
60a8ce3
 
60a8ce3
 	timer {
60a8ce3
 		compatible = "arm,armv8-timer";
60a8ce3
+		allwinner,erratum-unknown1;
60a8ce3
 		interrupts = 
60a8ce3
 			(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
60a8ce3