Raspberry Pi DT updates, Update AllWinner A64 timer errata workaround
This commit is contained in:
		
							parent
							
								
									89735063a0
								
							
						
					
					
						commit
						60a8ce36ab
					
				
							
								
								
									
										1130
									
								
								ARM-dts-bcm283x-Several-DTS-improvements.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1130
									
								
								ARM-dts-bcm283x-Several-DTS-improvements.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										527
									
								
								Allwinner-A64-timer-workaround.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										527
									
								
								Allwinner-A64-timer-workaround.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,527 @@ | ||||
| From patchwork Sun Jan 13 02:17:18 2019 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| X-Patchwork-Submitter: Samuel Holland <samuel@sholland.org> | ||||
| X-Patchwork-Id: 10761197 | ||||
| Return-Path:  | ||||
|  <linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org> | ||||
| Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org | ||||
|  [172.30.200.125]) | ||||
| 	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7438D14E5 | ||||
| 	for <patchwork-linux-arm@patchwork.kernel.org>; | ||||
|  Sun, 13 Jan 2019 02:18:08 +0000 (UTC) | ||||
| Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) | ||||
| 	by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6324429093 | ||||
| 	for <patchwork-linux-arm@patchwork.kernel.org>; | ||||
|  Sun, 13 Jan 2019 02:18:08 +0000 (UTC) | ||||
| Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) | ||||
| 	id 572B929097; Sun, 13 Jan 2019 02:18:08 +0000 (UTC) | ||||
| X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on | ||||
| 	pdx-wl-mail.web.codeaurora.org | ||||
| X-Spam-Level:  | ||||
| X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, | ||||
| 	DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 | ||||
| Received: from bombadil.infradead.org (bombadil.infradead.org | ||||
|  [198.137.202.133]) | ||||
| 	(using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) | ||||
| 	(No client certificate requested) | ||||
| 	by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5F83A29093 | ||||
| 	for <patchwork-linux-arm@patchwork.kernel.org>; | ||||
|  Sun, 13 Jan 2019 02:18:07 +0000 (UTC) | ||||
| 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:Cc:List-Subscribe:List-Help:List-Post: | ||||
| 	List-Archive:List-Unsubscribe:List-Id:MIME-Version: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=dQUQoZ0HK445Sd69SbjwJYcQyzVbBeZDboYvSLP8Vdw=; b=crafG7dY4EnzgC | ||||
| 	DsGSbEccC3W+IWHZ1IT48gptWAu7uAA+F8UlCxFhZjbnIWLSyJJ45p0OPLEpGqbXcAVG1b5PKktc2 | ||||
| 	fccU3caHf3SodUNh3vGg0xGPPIpak0a3bFcU3kJ2b2HU31TCK7d8u5PPsELEX1044dKRGgelnShpT | ||||
| 	bWP3zCyZ2BsTJyX72XpZ3xDZTHA6vx0Pk+n6vuRPylDfGX0CIZrDlGFh6szWORsn0emEN+IJOPiXc | ||||
| 	qhc3Ba3yzsS7ImYjmBkrPlaQpDO15afdFm+LuEx3i0RN9ErPfdG0edtJjd95n/PA7UashuXX2b/5Q | ||||
| 	TygDejejoCnuJQ1meYBg==; | ||||
| 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 1giVLf-0001hn-TG; Sun, 13 Jan 2019 02:18:03 +0000 | ||||
| Received: from out1-smtp.messagingengine.com ([66.111.4.25]) | ||||
|  by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) | ||||
|  id 1giVLA-0001BU-Qo | ||||
|  for linux-arm-kernel@lists.infradead.org; Sun, 13 Jan 2019 02:17:36 +0000 | ||||
| Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) | ||||
|  by mailout.nyi.internal (Postfix) with ESMTP id 663DB23174; | ||||
|  Sat, 12 Jan 2019 21:17:23 -0500 (EST) | ||||
| Received: from mailfrontend2 ([10.202.2.163]) | ||||
|  by compute5.internal (MEProxy); Sat, 12 Jan 2019 21:17:23 -0500 | ||||
| DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sholland.org; h= | ||||
|  from:to:cc:subject:date:message-id:in-reply-to:references | ||||
|  :mime-version:content-type:content-transfer-encoding; s=fm1; bh= | ||||
|  jKlMXS7XKvXn/szdGKBQgG32+kZpvO4uOo39QB1bolU=; b=mvmCKr9tLbEvZJbP | ||||
|  pDROAd6IVm3H+tyjyvewON4VHOYfu+/+ArBujiVhfDXn37l0VEuv9+CnihXwQJz6 | ||||
|  4joEh2OkDUy/Q32KvZzaH2GCqpcfAXUzqg4gMHL3z2eF+krzqNFd9EfXRZH4p3zO | ||||
|  HP0pa3tHrmZHsG9mnCbzz1JaRXVli6vxQKF/5KOoxpz++tQTllf25u0GpIbfKaOx | ||||
|  Z4eKMXxSZvDpYbsxPhgdBnlBZfvOfhsSvTgphvpKdchneqyKUYVjwO68c7ajBeK9 | ||||
|  PGEo6YPH30QIE71YUD80IG8ZMrQOWYdlNLKocWTel4ZaJpkw4CIA1H+gnDmSKutJ | ||||
|  VDRgYA== | ||||
| DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= | ||||
|  messagingengine.com; h=cc:content-transfer-encoding:content-type | ||||
|  :date:from:in-reply-to:message-id:mime-version:references | ||||
|  :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender | ||||
|  :x-sasl-enc; s=fm1; bh=jKlMXS7XKvXn/szdGKBQgG32+kZpvO4uOo39QB1bo | ||||
|  lU=; b=Upeefp0OZATDpZxWgrtHSzR2/FFiAwyRjS0PC/HWQehfO8m3OS4/AkyP1 | ||||
|  L96BnIrJ3Uk4WRUTblFAJvE+dJAiQeJ1WmOsJ+Dkgshp5OGZ0pUhxf/n45Ro4BuL | ||||
|  VTC4QqUzoYnFC/ut2gfaL91yRN5tZmU+2ik5O+8E1vvF/IwhZcLDw6tcR/JX6Ixa | ||||
|  X+EWoETX3GQC1Dbwzf9yMctarPw5mxJ8ERUyGHtDuFyzr0v0ReMlCfWqdBd0Ekca | ||||
|  /EA5D9Um8kl6S9wVk6XgFvZm2vyzRIhfmLQqoEzcCKywrMv2qiCquAYqWMUFIdM+ | ||||
|  3TkvJqkWkNjRz6J6Dbd2i15CpL/Sw== | ||||
| X-ME-Sender: <xms:sp86XLgZgR-OuGupvTKImnW3geoxWw9AmBdt1C0DGN-t7owcwWYflg> | ||||
| X-ME-Proxy-Cause:  | ||||
|  gggruggvucftvghtrhhoucdtuddrgedtledrfeekgdduvdcutefuodetggdotefrodftvf | ||||
|  curfhrohhfihhlvgemucfhrghsthforghilhdpqfhuthenuceurghilhhouhhtmecufedt | ||||
|  tdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojg | ||||
|  hfgggtgfesthekredtredtjeenucfhrhhomhepufgrmhhuvghlucfjohhllhgrnhguuceo | ||||
|  shgrmhhuvghlsehshhholhhlrghnugdrohhrgheqnecuffhomhgrihhnpegrrhhmsghirg | ||||
|  hnrdgtohhmpdhgihhthhhusgdrtghomhdpfihhihhtvghquhgrrhhkrdhorhhgnecukfhp | ||||
|  peejtddrudefhedrudegkedrudehudenucfrrghrrghmpehmrghilhhfrhhomhepshgrmh | ||||
|  huvghlsehshhholhhlrghnugdrohhrghenucevlhhushhtvghrufhiiigvpedt | ||||
| X-ME-Proxy: <xmx:sp86XClRnRqP6qey5otmmQUXhLScRlq2lYK8B3cn0kI6EqlMQuByFg> | ||||
|  <xmx:sp86XHpy0uQ1V3qD29APOD9ngWzb5KHgeV3vOBV4LioAvt-bR0k-rg> | ||||
|  <xmx:sp86XLGPLYL3h3AW4JPSnrVuevGIGc3rsQVzKchjHOk5g30XwDbN5g> | ||||
|  <xmx:s586XDRmlHkvg3iGQmu4ZPLH-3nA609xxZWSVf6vR2Xqp8dt6ACFxw> | ||||
| Received: from titanium.stl.sholland.net | ||||
|  (70-135-148-151.lightspeed.stlsmo.sbcglobal.net [70.135.148.151]) | ||||
|  by mail.messagingengine.com (Postfix) with ESMTPA id 6F2A31026D; | ||||
|  Sat, 12 Jan 2019 21:17:21 -0500 (EST) | ||||
| From: Samuel Holland <samuel@sholland.org> | ||||
| To: Catalin Marinas <catalin.marinas@arm.com>, | ||||
|  Will Deacon <will.deacon@arm.com>, | ||||
|  Maxime Ripard <maxime.ripard@bootlin.com>, Chen-Yu Tsai <wens@csie.org>, | ||||
|  Rob Herring <robh+dt@kernel.org>, Mark Rutland <Mark.Rutland@arm.com>, | ||||
|  Daniel Lezcano <daniel.lezcano@linaro.org>, | ||||
|  Thomas Gleixner <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com> | ||||
| Subject: [PATCH v3 1/2] arm64: arch_timer: Workaround for Allwinner A64 timer | ||||
|  instability | ||||
| Date: Sat, 12 Jan 2019 20:17:18 -0600 | ||||
| Message-Id: <20190113021719.46457-2-samuel@sholland.org> | ||||
| X-Mailer: git-send-email 2.19.2 | ||||
| In-Reply-To: <20190113021719.46457-1-samuel@sholland.org> | ||||
| References: <20190113021719.46457-1-samuel@sholland.org> | ||||
| MIME-Version: 1.0 | ||||
| X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3  | ||||
| X-CRM114-CacheID: sfid-20190112_181733_065120_A96E9A2B  | ||||
| X-CRM114-Status: GOOD (  19.89  ) | ||||
| X-BeenThere: linux-arm-kernel@lists.infradead.org | ||||
| X-Mailman-Version: 2.1.21 | ||||
| Precedence: list | ||||
| List-Id: <linux-arm-kernel.lists.infradead.org> | ||||
| List-Unsubscribe:  | ||||
|  <http://lists.infradead.org/mailman/options/linux-arm-kernel>, | ||||
|  <mailto:linux-arm-kernel-request@lists.infradead.org?subject=unsubscribe> | ||||
| List-Archive: <http://lists.infradead.org/pipermail/linux-arm-kernel/> | ||||
| List-Post: <mailto:linux-arm-kernel@lists.infradead.org> | ||||
| List-Help: <mailto:linux-arm-kernel-request@lists.infradead.org?subject=help> | ||||
| List-Subscribe:  | ||||
|  <http://lists.infradead.org/mailman/listinfo/linux-arm-kernel>, | ||||
|  <mailto:linux-arm-kernel-request@lists.infradead.org?subject=subscribe> | ||||
| Cc: devicetree@vger.kernel.org, linux-sunxi@googlegroups.com, | ||||
|  linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, | ||||
|  Samuel Holland <samuel@sholland.org> | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| Sender: "linux-arm-kernel" <linux-arm-kernel-bounces@lists.infradead.org> | ||||
| Errors-To:  | ||||
|  linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org | ||||
| X-Virus-Scanned: ClamAV using ClamSMTP | ||||
| 
 | ||||
| The Allwinner A64 SoC is known[1] to have an unstable architectural | ||||
| timer, which manifests itself most obviously in the time jumping forward | ||||
| a multiple of 95 years[2][3]. This coincides with 2^56 cycles at a | ||||
| timer frequency of 24 MHz, implying that the time went slightly backward | ||||
| (and this was interpreted by the kernel as it jumping forward and | ||||
| wrapping around past the epoch). | ||||
| 
 | ||||
| Investigation revealed instability in the low bits of CNTVCT at the | ||||
| point a high bit rolls over. This leads to power-of-two cycle forward | ||||
| and backward jumps. (Testing shows that forward jumps are about twice as | ||||
| likely as backward jumps.) Since the counter value returns to normal | ||||
| after an indeterminate read, each "jump" really consists of both a | ||||
| forward and backward jump from the software perspective. | ||||
| 
 | ||||
| Unless the kernel is trapping CNTVCT reads, a userspace program is able | ||||
| to read the register in a loop faster than it changes. A test program | ||||
| running on all 4 CPU cores that reported jumps larger than 100 ms was | ||||
| run for 13.6 hours and reported the following: | ||||
| 
 | ||||
|  Count | Event | ||||
| -------+---------------------------
 | ||||
|   9940 | jumped backward      699ms | ||||
|    268 | jumped backward     1398ms | ||||
|      1 | jumped backward     2097ms | ||||
|  16020 | jumped forward       175ms | ||||
|   6443 | jumped forward       699ms | ||||
|   2976 | jumped forward      1398ms | ||||
|      9 | jumped forward    356516ms | ||||
|      9 | jumped forward    357215ms | ||||
|      4 | jumped forward    714430ms | ||||
|      1 | jumped forward   3578440ms | ||||
| 
 | ||||
| This works out to a jump larger than 100 ms about every 5.5 seconds on | ||||
| each CPU core. | ||||
| 
 | ||||
| The largest jump (almost an hour!) was the following sequence of reads: | ||||
|     0x0000007fffffffff → 0x00000093feffffff → 0x0000008000000000 | ||||
| 
 | ||||
| Note that the middle bits don't necessarily all read as all zeroes or | ||||
| all ones during the anomalous behavior; however the low 10 bits checked | ||||
| by the function in this patch have never been observed with any other | ||||
| value. | ||||
| 
 | ||||
| Also note that smaller jumps are much more common, with backward jumps | ||||
| of 2048 (2^11) cycles observed over 400 times per second on each core. | ||||
| (Of course, this is partially explained by lower bits rolling over more | ||||
| frequently.) Any one of these could have caused the 95 year time skip. | ||||
| 
 | ||||
| Similar anomalies were observed while reading CNTPCT (after patching the | ||||
| kernel to allow reads from userspace). However, the CNTPCT jumps are | ||||
| much less frequent, and only small jumps were observed. The same program | ||||
| as before (except now reading CNTPCT) observed after 72 hours: | ||||
| 
 | ||||
|  Count | Event | ||||
| -------+---------------------------
 | ||||
|     17 | jumped backward      699ms | ||||
|     52 | jumped forward       175ms | ||||
|   2831 | jumped forward       699ms | ||||
|      5 | jumped forward      1398ms | ||||
| 
 | ||||
| Further investigation showed that the instability in CNTPCT/CNTVCT also | ||||
| affected the respective timer's TVAL register. The following values were | ||||
| observed immediately after writing CNVT_TVAL to 0x10000000: | ||||
| 
 | ||||
|  CNTVCT             | CNTV_TVAL  | CNTV_CVAL          | CNTV_TVAL Error | ||||
| --------------------+------------+--------------------+-----------------
 | ||||
|  0x000000d4a2d8bfff | 0x10003fff | 0x000000d4b2d8bfff | +0x00004000 | ||||
|  0x000000d4a2d94000 | 0x0fffffff | 0x000000d4b2d97fff | -0x00004000 | ||||
|  0x000000d4a2d97fff | 0x10003fff | 0x000000d4b2d97fff | +0x00004000 | ||||
|  0x000000d4a2d9c000 | 0x0fffffff | 0x000000d4b2d9ffff | -0x00004000 | ||||
| 
 | ||||
| The pattern of errors in CNTV_TVAL seemed to depend on exactly which | ||||
| value was written to it. For example, after writing 0x10101010: | ||||
| 
 | ||||
|  CNTVCT             | CNTV_TVAL  | CNTV_CVAL          | CNTV_TVAL Error | ||||
| --------------------+------------+--------------------+-----------------
 | ||||
|  0x000001ac3effffff | 0x1110100f | 0x000001ac4f10100f | +0x1000000 | ||||
|  0x000001ac40000000 | 0x1010100f | 0x000001ac5110100f | -0x1000000 | ||||
|  0x000001ac58ffffff | 0x1110100f | 0x000001ac6910100f | +0x1000000 | ||||
|  0x000001ac66000000 | 0x1010100f | 0x000001ac7710100f | -0x1000000 | ||||
|  0x000001ac6affffff | 0x1110100f | 0x000001ac7b10100f | +0x1000000 | ||||
|  0x000001ac6e000000 | 0x1010100f | 0x000001ac7f10100f | -0x1000000 | ||||
| 
 | ||||
| I was also twice able to reproduce the issue covered by Allwinner's | ||||
| workaround[4], that writing to TVAL sometimes fails, and both CVAL and | ||||
| TVAL are left with entirely bogus values. One was the following values: | ||||
| 
 | ||||
|  CNTVCT             | CNTV_TVAL  | CNTV_CVAL | ||||
| --------------------+------------+--------------------------------------
 | ||||
|  0x000000d4a2d6014c | 0x8fbd5721 | 0x000000d132935fff (615s in the past) | ||||
| 
 | ||||
| ========================================================================
 | ||||
| 
 | ||||
| Because the CPU can read the CNTPCT/CNTVCT registers faster than they | ||||
| change, performing two reads of the register and comparing the high bits | ||||
| (like other workarounds) is not a workable solution. And because the | ||||
| timer can jump both forward and backward, no pair of reads can | ||||
| distinguish a good value from a bad one. The only way to guarantee a | ||||
| good value from consecutive reads would be to read _three_ times, and | ||||
| take the middle value only if the three values are 1) each unique and | ||||
| 2) increasing. This takes at minimum 3 counter cycles (125 ns), or more | ||||
| if an anomaly is detected. | ||||
| 
 | ||||
| However, since there is a distinct pattern to the bad values, we can | ||||
| optimize the common case (1022/1024 of the time) to a single read by | ||||
| simply ignoring values that match the error pattern. This still takes no | ||||
| more than 3 cycles in the worst case, and requires much less code. As an | ||||
| additional safety check, we still limit the loop iteration to the number | ||||
| of max-frequency (1.2 GHz) CPU cycles in three 24 MHz counter periods. | ||||
| 
 | ||||
| For the TVAL registers, the simple solution is to not use them. Instead, | ||||
| read or write the CVAL and calculate the TVAL value in software. | ||||
| 
 | ||||
| Although the manufacturer is aware of at least part of the erratum[4], | ||||
| there is no official name for it. For now, use the kernel-internal name | ||||
| "UNKNOWN1". | ||||
| 
 | ||||
| [1]: https://github.com/armbian/build/commit/a08cd6fe7ae9 | ||||
| [2]: https://forum.armbian.com/topic/3458-a64-datetime-clock-issue/ | ||||
| [3]: https://irclog.whitequark.org/linux-sunxi/2018-01-26 | ||||
| [4]: https://github.com/Allwinner-Homlet/H6-BSP4.9-linux/blob/master/drivers/clocksource/arm_arch_timer.c#L272 | ||||
| 
 | ||||
| Acked-by: Maxime Ripard <maxime.ripard@bootlin.com> | ||||
| Tested-by: Andre Przywara <andre.przywara@arm.com> | ||||
| Signed-off-by: Samuel Holland <samuel@sholland.org> | ||||
| ---
 | ||||
|  Documentation/arm64/silicon-errata.txt |  2 + | ||||
|  drivers/clocksource/Kconfig            | 10 +++++ | ||||
|  drivers/clocksource/arm_arch_timer.c   | 55 ++++++++++++++++++++++++++ | ||||
|  3 files changed, 67 insertions(+) | ||||
| 
 | ||||
| diff --git a/Documentation/arm64/silicon-errata.txt b/Documentation/arm64/silicon-errata.txt
 | ||||
| index 8f9577621144..4a269732d2a0 100644
 | ||||
| --- a/Documentation/arm64/silicon-errata.txt
 | ||||
| +++ b/Documentation/arm64/silicon-errata.txt
 | ||||
| @@ -44,6 +44,8 @@ stable kernels.
 | ||||
|   | ||||
|  | Implementor    | Component       | Erratum ID      | Kconfig                     | | ||||
|  +----------------+-----------------+-----------------+-----------------------------+ | ||||
| +| Allwinner      | A64/R18         | UNKNOWN1        | SUN50I_ERRATUM_UNKNOWN1     |
 | ||||
| +|                |                 |                 |                             |
 | ||||
|  | ARM            | Cortex-A53      | #826319         | ARM64_ERRATUM_826319        | | ||||
|  | ARM            | Cortex-A53      | #827319         | ARM64_ERRATUM_827319        | | ||||
|  | ARM            | Cortex-A53      | #824069         | ARM64_ERRATUM_824069        | | ||||
| diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
 | ||||
| index 55c77e44bb2d..d20ff4da07c3 100644
 | ||||
| --- a/drivers/clocksource/Kconfig
 | ||||
| +++ b/drivers/clocksource/Kconfig
 | ||||
| @@ -364,6 +364,16 @@ config ARM64_ERRATUM_858921
 | ||||
|  	  The workaround will be dynamically enabled when an affected | ||||
|  	  core is detected. | ||||
|   | ||||
| +config SUN50I_ERRATUM_UNKNOWN1
 | ||||
| +	bool "Workaround for Allwinner A64 erratum UNKNOWN1"
 | ||||
| +	default y
 | ||||
| +	depends on ARM_ARCH_TIMER && ARM64 && ARCH_SUNXI
 | ||||
| +	select ARM_ARCH_TIMER_OOL_WORKAROUND
 | ||||
| +	help
 | ||||
| +	  This option enables a workaround for instability in the timer on
 | ||||
| +	  the Allwinner A64 SoC. The workaround will only be active if the
 | ||||
| +	  allwinner,erratum-unknown1 property is found in the timer node.
 | ||||
| +
 | ||||
|  config ARM_GLOBAL_TIMER | ||||
|  	bool "Support for the ARM global timer" if COMPILE_TEST | ||||
|  	select TIMER_OF if OF | ||||
| diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
 | ||||
| index 9a7d4dc00b6e..a8b20b65bd4b 100644
 | ||||
| --- a/drivers/clocksource/arm_arch_timer.c
 | ||||
| +++ b/drivers/clocksource/arm_arch_timer.c
 | ||||
| @@ -326,6 +326,48 @@ static u64 notrace arm64_1188873_read_cntvct_el0(void)
 | ||||
|  } | ||||
|  #endif | ||||
|   | ||||
| +#ifdef CONFIG_SUN50I_ERRATUM_UNKNOWN1
 | ||||
| +/*
 | ||||
| + * The low bits of the counter registers are indeterminate while bit 10 or
 | ||||
| + * greater is rolling over. Since the counter value can jump both backward
 | ||||
| + * (7ff -> 000 -> 800) and forward (7ff -> fff -> 800), ignore register values
 | ||||
| + * with all ones or all zeros in the low bits. Bound the loop by the maximum
 | ||||
| + * number of CPU cycles in 3 consecutive 24 MHz counter periods.
 | ||||
| + */
 | ||||
| +#define __sun50i_a64_read_reg(reg) ({					\
 | ||||
| +	u64 _val;							\
 | ||||
| +	int _retries = 150;						\
 | ||||
| +									\
 | ||||
| +	do {								\
 | ||||
| +		_val = read_sysreg(reg);				\
 | ||||
| +		_retries--;						\
 | ||||
| +	} while (((_val + 1) & GENMASK(9, 0)) <= 1 && _retries);	\
 | ||||
| +									\
 | ||||
| +	WARN_ON_ONCE(!_retries);					\
 | ||||
| +	_val;								\
 | ||||
| +})
 | ||||
| +
 | ||||
| +static u64 notrace sun50i_a64_read_cntpct_el0(void)
 | ||||
| +{
 | ||||
| +	return __sun50i_a64_read_reg(cntpct_el0);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static u64 notrace sun50i_a64_read_cntvct_el0(void)
 | ||||
| +{
 | ||||
| +	return __sun50i_a64_read_reg(cntvct_el0);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static u32 notrace sun50i_a64_read_cntp_tval_el0(void)
 | ||||
| +{
 | ||||
| +	return read_sysreg(cntp_cval_el0) - sun50i_a64_read_cntpct_el0();
 | ||||
| +}
 | ||||
| +
 | ||||
| +static u32 notrace sun50i_a64_read_cntv_tval_el0(void)
 | ||||
| +{
 | ||||
| +	return read_sysreg(cntv_cval_el0) - sun50i_a64_read_cntvct_el0();
 | ||||
| +}
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #ifdef CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND | ||||
|  DEFINE_PER_CPU(const struct arch_timer_erratum_workaround *, timer_unstable_counter_workaround); | ||||
|  EXPORT_SYMBOL_GPL(timer_unstable_counter_workaround); | ||||
| @@ -423,6 +465,19 @@ static const struct arch_timer_erratum_workaround ool_workarounds[] = {
 | ||||
|  		.read_cntvct_el0 = arm64_1188873_read_cntvct_el0, | ||||
|  	}, | ||||
|  #endif | ||||
| +#ifdef CONFIG_SUN50I_ERRATUM_UNKNOWN1
 | ||||
| +	{
 | ||||
| +		.match_type = ate_match_dt,
 | ||||
| +		.id = "allwinner,erratum-unknown1",
 | ||||
| +		.desc = "Allwinner erratum UNKNOWN1",
 | ||||
| +		.read_cntp_tval_el0 = sun50i_a64_read_cntp_tval_el0,
 | ||||
| +		.read_cntv_tval_el0 = sun50i_a64_read_cntv_tval_el0,
 | ||||
| +		.read_cntpct_el0 = sun50i_a64_read_cntpct_el0,
 | ||||
| +		.read_cntvct_el0 = sun50i_a64_read_cntvct_el0,
 | ||||
| +		.set_next_event_phys = erratum_set_next_event_tval_phys,
 | ||||
| +		.set_next_event_virt = erratum_set_next_event_tval_virt,
 | ||||
| +	},
 | ||||
| +#endif
 | ||||
|  }; | ||||
|   | ||||
|  typedef bool (*ate_match_fn_t)(const struct arch_timer_erratum_workaround *, | ||||
| 
 | ||||
| From patchwork Sun Jan 13 02:17:19 2019 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 7bit | ||||
| X-Patchwork-Submitter: Samuel Holland <samuel@sholland.org> | ||||
| X-Patchwork-Id: 10761195 | ||||
| Return-Path:  | ||||
|  <linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org> | ||||
| Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org | ||||
|  [172.30.200.125]) | ||||
| 	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5600213B5 | ||||
| 	for <patchwork-linux-arm@patchwork.kernel.org>; | ||||
|  Sun, 13 Jan 2019 02:17:49 +0000 (UTC) | ||||
| Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) | ||||
| 	by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 455A02908A | ||||
| 	for <patchwork-linux-arm@patchwork.kernel.org>; | ||||
|  Sun, 13 Jan 2019 02:17:49 +0000 (UTC) | ||||
| Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) | ||||
| 	id 397D52908F; Sun, 13 Jan 2019 02:17:49 +0000 (UTC) | ||||
| X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on | ||||
| 	pdx-wl-mail.web.codeaurora.org | ||||
| X-Spam-Level:  | ||||
| X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, | ||||
| 	DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 | ||||
| Received: from bombadil.infradead.org (bombadil.infradead.org | ||||
|  [198.137.202.133]) | ||||
| 	(using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) | ||||
| 	(No client certificate requested) | ||||
| 	by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 99BED2908A | ||||
| 	for <patchwork-linux-arm@patchwork.kernel.org>; | ||||
|  Sun, 13 Jan 2019 02:17:48 +0000 (UTC) | ||||
| 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:Cc:List-Subscribe:List-Help:List-Post: | ||||
| 	List-Archive:List-Unsubscribe:List-Id:MIME-Version: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=81rywXc0nLAQXkKBaUF3JbVJE1w8kNqPZiSw/rJIxQU=; b=bzFR1Zl3PUkKOj | ||||
| 	GDlGg1LEgye6Wvu5OpjIF/BFr5WR3u6PByyyLk5b2v/IaPz/Jl+GwULiFoqCtOClaOf4eXTPUAVk4 | ||||
| 	/zv54RuzWhCLNK5E+bMFJDcOmNqXlmoJnnQrXI4NsfWPgT0l8y8eqSW0vMplCCojSsdOw24wVv8y7 | ||||
| 	UxMyWC8WKVaW6KzMEBAS5EgV1tredQlpRUBOsmnFMY2N6EkRCfFX4DxehywPBiv2Af35czHO0roiy | ||||
| 	WNESOXNXRxjJivnshxW4+XPfcLlSfQhovZKeue+ztLUkJdeQoeg56oBv9+Vh2SXNbUnew+Nw7v/Gm | ||||
| 	17TZYrFktGxOAOhb+cOw==; | ||||
| 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 1giVLL-0001Ip-VF; Sun, 13 Jan 2019 02:17:44 +0000 | ||||
| Received: from out1-smtp.messagingengine.com ([66.111.4.25]) | ||||
|  by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) | ||||
|  id 1giVLA-0001BV-QY | ||||
|  for linux-arm-kernel@lists.infradead.org; Sun, 13 Jan 2019 02:17:34 +0000 | ||||
| Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) | ||||
|  by mailout.nyi.internal (Postfix) with ESMTP id 58C172217A; | ||||
|  Sat, 12 Jan 2019 21:17:23 -0500 (EST) | ||||
| Received: from mailfrontend2 ([10.202.2.163]) | ||||
|  by compute5.internal (MEProxy); Sat, 12 Jan 2019 21:17:23 -0500 | ||||
| DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sholland.org; h= | ||||
|  from:to:cc:subject:date:message-id:in-reply-to:references | ||||
|  :mime-version:content-transfer-encoding; s=fm1; bh=BcKEOqrm2Nddz | ||||
|  dFcJfheN0gw9UIuZWkg3rxvmQZRiIs=; b=VQCFZC/fuHByg4cpT6HXrPggPO7Ya | ||||
|  7v5IEDVxQpSkqH702Nr1s4JAYbcdkol3j0AwYlfh4DXsKWVJu6aeu6WdntZViEGr | ||||
|  cKYGOmRx9g/A9t4Pv74giorkqeDx4qsmjrOPGTxNkvYAVWOWYtyXllZDm2U+s30g | ||||
|  wCw2Y40NPYrJKqcGXFrKmiLQeelJA7aBNcv464toHdGKqKssaj9Ga06vS9UnG7Pj | ||||
|  JT90zC11j2dqM/SI+lblqWz3IQQqfx87qiKn/qhhOkiSv74fMFDfmBpgzQcfwJFZ | ||||
|  hStK5QZihYCLG94SuhTGgfJzRTSXks0Kt3EL5AcLDqaVH9qujyMg6JKXQ== | ||||
| DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= | ||||
|  messagingengine.com; h=cc:content-transfer-encoding:date:from | ||||
|  :in-reply-to:message-id:mime-version:references:subject:to | ||||
|  :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= | ||||
|  fm1; bh=BcKEOqrm2NddzdFcJfheN0gw9UIuZWkg3rxvmQZRiIs=; b=iJBq9L23 | ||||
|  6lDXPuxV7FsoVVaFnY3c+Sc/+wsLVJCsIzowctPQ4Kt89W15UIaACbxm72T4LzGw | ||||
|  RSg47CGMKVmqWdoFlCF3AqsADizdNHw8bZgSsug8OxThLWnm8bwDCMDgQNnoY9kN | ||||
|  nlkmNI3g26PQJSTzYw+nPfgk//LCBlPWsacufHcT6dfbaoPLOVyRMXZTqwFArUQv | ||||
|  oWx34MVGM+BYBvo78zpG4EkdLXx2nuvwiO3nz/D9aaFvLt//mXBHhpR2qFNCQoQh | ||||
|  ExIIq/6GJSLRF29mHXwtmXSGGE2plK85c7lc599Hr6AwEFCMBbyYftksKF8gRCDT | ||||
|  X5KWIrsMAHwNmw== | ||||
| X-ME-Sender: <xms:sp86XK7GnQHA9uHaHGZsyRJJRdVPHqaqXrcZSZDhFHK9mw52sOD8Mw> | ||||
| X-ME-Proxy-Cause:  | ||||
|  gggruggvucftvghtrhhoucdtuddrgedtledrfeekgdduvdcutefuodetggdotefrodftvf | ||||
|  curfhrohhfihhlvgemucfhrghsthforghilhdpqfhuthenuceurghilhhouhhtmecufedt | ||||
|  tdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvufffkffojg | ||||
|  hfggfgsedtkeertdertddtnecuhfhrohhmpefurghmuhgvlhcujfholhhlrghnugcuoehs | ||||
|  rghmuhgvlhesshhhohhllhgrnhgurdhorhhgqeenucfkphepjedtrddufeehrddugeekrd | ||||
|  duhedunecurfgrrhgrmhepmhgrihhlfhhrohhmpehsrghmuhgvlhesshhhohhllhgrnhgu | ||||
|  rdhorhhgnecuvehluhhsthgvrhfuihiivgeptd | ||||
| X-ME-Proxy: <xmx:sp86XB018KTtDKatCu7gB4vrEktSU_R5Kofe4r5HX1Vgcfgs3AWTxQ> | ||||
|  <xmx:sp86XBApgRBLm_CLOjfcZdkoeYXTHGiaw5bTKV1ZWrD68QOFmKvX8A> | ||||
|  <xmx:sp86XD3HOmrRMd6Re7jXqrUdDh9oicR3Mx3OuyUSPBmc0uhZzn-Dlw> | ||||
|  <xmx:s586XOboucBXUXW8COEbY-dWquI3bdp6K1N7Piyn8RdSWcTQSPUVew> | ||||
| Received: from titanium.stl.sholland.net | ||||
|  (70-135-148-151.lightspeed.stlsmo.sbcglobal.net [70.135.148.151]) | ||||
|  by mail.messagingengine.com (Postfix) with ESMTPA id 07E8010085; | ||||
|  Sat, 12 Jan 2019 21:17:22 -0500 (EST) | ||||
| From: Samuel Holland <samuel@sholland.org> | ||||
| To: Catalin Marinas <catalin.marinas@arm.com>, | ||||
|  Will Deacon <will.deacon@arm.com>, | ||||
|  Maxime Ripard <maxime.ripard@bootlin.com>, Chen-Yu Tsai <wens@csie.org>, | ||||
|  Rob Herring <robh+dt@kernel.org>, Mark Rutland <Mark.Rutland@arm.com>, | ||||
|  Daniel Lezcano <daniel.lezcano@linaro.org>, | ||||
|  Thomas Gleixner <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com> | ||||
| Subject: [PATCH v3 2/2] arm64: dts: allwinner: a64: Enable A64 timer | ||||
|  workaround | ||||
| Date: Sat, 12 Jan 2019 20:17:19 -0600 | ||||
| Message-Id: <20190113021719.46457-3-samuel@sholland.org> | ||||
| X-Mailer: git-send-email 2.19.2 | ||||
| In-Reply-To: <20190113021719.46457-1-samuel@sholland.org> | ||||
| References: <20190113021719.46457-1-samuel@sholland.org> | ||||
| MIME-Version: 1.0 | ||||
| X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3  | ||||
| X-CRM114-CacheID: sfid-20190112_181733_014958_D1734ED1  | ||||
| X-CRM114-Status: GOOD (  10.90  ) | ||||
| X-BeenThere: linux-arm-kernel@lists.infradead.org | ||||
| X-Mailman-Version: 2.1.21 | ||||
| Precedence: list | ||||
| List-Id: <linux-arm-kernel.lists.infradead.org> | ||||
| List-Unsubscribe:  | ||||
|  <http://lists.infradead.org/mailman/options/linux-arm-kernel>, | ||||
|  <mailto:linux-arm-kernel-request@lists.infradead.org?subject=unsubscribe> | ||||
| List-Archive: <http://lists.infradead.org/pipermail/linux-arm-kernel/> | ||||
| List-Post: <mailto:linux-arm-kernel@lists.infradead.org> | ||||
| List-Help: <mailto:linux-arm-kernel-request@lists.infradead.org?subject=help> | ||||
| List-Subscribe:  | ||||
|  <http://lists.infradead.org/mailman/listinfo/linux-arm-kernel>, | ||||
|  <mailto:linux-arm-kernel-request@lists.infradead.org?subject=subscribe> | ||||
| Cc: devicetree@vger.kernel.org, linux-sunxi@googlegroups.com, | ||||
|  linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, | ||||
|  Samuel Holland <samuel@sholland.org> | ||||
| Content-Type: text/plain; charset="us-ascii" | ||||
| Sender: "linux-arm-kernel" <linux-arm-kernel-bounces@lists.infradead.org> | ||||
| Errors-To:  | ||||
|  linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org | ||||
| X-Virus-Scanned: ClamAV using ClamSMTP | ||||
| 
 | ||||
| As instability in the architectural timer has been observed on multiple | ||||
| devices using this SoC, inluding the Pine64 and the Orange Pi Win, | ||||
| enable the workaround in the SoC's device tree. | ||||
| 
 | ||||
| Acked-by: Maxime Ripard <maxime.ripard@bootlin.com> | ||||
| Signed-off-by: Samuel Holland <samuel@sholland.org> | ||||
| ---
 | ||||
|  arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
 | ||||
| index f3a66f888205..13eac92a8c55 100644
 | ||||
| --- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
 | ||||
| +++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
 | ||||
| @@ -175,6 +175,7 @@
 | ||||
|   | ||||
|  	timer { | ||||
|  		compatible = "arm,armv8-timer"; | ||||
| +		allwinner,erratum-unknown1;
 | ||||
|  		interrupts = <GIC_PPI 13 | ||||
|  			(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>, | ||||
|  			     <GIC_PPI 14 | ||||
| @ -1,184 +0,0 @@ | ||||
| From patchwork Fri May 11 02:27:50 2018 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| Subject: [1/2] arm64: arch_timer: Workaround for Allwinner A64 timer | ||||
|  instability | ||||
| From: Samuel Holland <samuel@sholland.org> | ||||
| X-Patchwork-Id: 10392891 | ||||
| Message-Id: <20180511022751.9096-2-samuel@sholland.org> | ||||
| To: Maxime Ripard <maxime.ripard@bootlin.com>, Chen-Yu Tsai <wens@csie.org>,  | ||||
|  Catalin Marinas <catalin.marinas@arm.com>, | ||||
|  Will Deacon <will.deacon@arm.com>, | ||||
|  Daniel Lezcano <daniel.lezcano@linaro.org>, | ||||
|  Thomas Gleixner <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com> | ||||
| Cc: linux-sunxi@googlegroups.com, linux-kernel@vger.kernel.org, | ||||
|  linux-arm-kernel@lists.infradead.org, Samuel Holland <samuel@sholland.org> | ||||
| Date: Thu, 10 May 2018 21:27:50 -0500 | ||||
| 
 | ||||
| The Allwinner A64 SoC is known [1] to have an unstable architectural | ||||
| timer, which manifests itself most obviously in the time jumping forward | ||||
| a multiple of 95 years [2][3]. This coincides with 2^56 cycles at a | ||||
| timer frequency of 24 MHz, implying that the time went slightly backward | ||||
| (and this was interpreted by the kernel as it jumping forward and | ||||
| wrapping around past the epoch). | ||||
| 
 | ||||
| Further investigation revealed instability in the low bits of CNTVCT at | ||||
| the point a high bit rolls over. This leads to power-of-two cycle | ||||
| forward and backward jumps. (Testing shows that forward jumps are about | ||||
| twice as likely as backward jumps.) | ||||
| 
 | ||||
| Without trapping reads to CNTVCT, a userspace program is able to read it | ||||
| in a loop faster than it changes. A test program running on all 4 CPU | ||||
| cores that reported jumps larger than 100 ms was run for 13.6 hours and | ||||
| reported the following: | ||||
| 
 | ||||
|  Count | Event | ||||
| -------+---------------------------
 | ||||
|   9940 | jumped backward      699ms | ||||
|    268 | jumped backward     1398ms | ||||
|      1 | jumped backward     2097ms | ||||
|  16020 | jumped forward       175ms | ||||
|   6443 | jumped forward       699ms | ||||
|   2976 | jumped forward      1398ms | ||||
|      9 | jumped forward    356516ms | ||||
|      9 | jumped forward    357215ms | ||||
|      4 | jumped forward    714430ms | ||||
|      1 | jumped forward   3578440ms | ||||
| 
 | ||||
| This works out to a jump larger than 100 ms about every 5.5 seconds on | ||||
| each CPU core. | ||||
| 
 | ||||
| The largest jump (almost an hour!) was the following sequence of reads: | ||||
|       0x0000007fffffffff → 0x00000093feffffff → 0x0000008000000000 | ||||
| 
 | ||||
| Note that the middle bits don't necessarily all read as all zeroes or | ||||
| all ones during the anomalous behavior; however the low 11 bits checked | ||||
| by the function in this patch have never been observed with any other | ||||
| value. | ||||
| 
 | ||||
| Also note that smaller jumps are much more common, with the smallest | ||||
| backward jumps of 2048 cycles observed over 400 times per second on each | ||||
| core. (Of course, this is partially due to lower bits rolling over more | ||||
| frequently.) Any one of these could have caused the 95 year time skip. | ||||
| 
 | ||||
| Similar anomalies were observed while reading CNTPCT (after patching the | ||||
| kernel to allow reads from userspace). However, the jumps are much less | ||||
| frequent, and only small jumps were observed. The same program as before | ||||
| (except now reading CNTPCT) observed after 72 hours: | ||||
| 
 | ||||
|  Count | Event | ||||
| -------+---------------------------
 | ||||
|     17 | jumped backward      699ms | ||||
|     52 | jumped forward       175ms | ||||
|   2831 | jumped forward       699ms | ||||
|      5 | jumped forward      1398ms | ||||
| Acked-by: Maxime Ripard <maxime.ripard@bootlin.com> | ||||
| Tested-by: Andre Przywara <andre.przywara@arm.com> | ||||
| 
 | ||||
| ========================================================================
 | ||||
| 
 | ||||
| Because the CPU can read the CNTPCT/CNTVCT registers faster than they | ||||
| change, performing two reads of the register and comparing the high bits | ||||
| (like other workarounds) is not a workable solution. And because the | ||||
| timer can jump both forward and backward, no pair of reads can | ||||
| distinguish a good value from a bad one. The only way to guarantee a | ||||
| good value from consecutive reads would be to read _three_ times, and | ||||
| take the middle value iff the three values are 1) individually unique | ||||
| and 2) increasing. This takes at minimum 3 cycles (125 ns), or more if | ||||
| an anomaly is detected. | ||||
| 
 | ||||
| However, since there is a distinct pattern to the bad values, we can | ||||
| optimize the common case (2046/2048 of the time) to a single read by | ||||
| simply ignoring values that match the pattern. This still takes no more | ||||
| than 3 cycles in the worst case, and requires much less code. | ||||
| 
 | ||||
| [1]: https://github.com/armbian/build/commit/a08cd6fe7ae9 | ||||
| [2]: https://forum.armbian.com/topic/3458-a64-datetime-clock-issue/ | ||||
| [3]: https://irclog.whitequark.org/linux-sunxi/2018-01-26 | ||||
| 
 | ||||
| Signed-off-by: Samuel Holland <samuel@sholland.org> | ||||
| ---
 | ||||
|  drivers/clocksource/Kconfig          | 11 ++++++++++ | ||||
|  drivers/clocksource/arm_arch_timer.c | 39 ++++++++++++++++++++++++++++++++++++ | ||||
|  2 files changed, 50 insertions(+) | ||||
| 
 | ||||
| diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
 | ||||
| index 8e8a09755d10..7a5d434dd30b 100644
 | ||||
| --- a/drivers/clocksource/Kconfig
 | ||||
| +++ b/drivers/clocksource/Kconfig
 | ||||
| @@ -364,6 +364,17 @@ config ARM64_ERRATUM_858921
 | ||||
|  	  The workaround will be dynamically enabled when an affected | ||||
|  	  core is detected. | ||||
|   | ||||
| +config SUN50I_A64_UNSTABLE_TIMER
 | ||||
| +	bool "Workaround for Allwinner A64 timer instability"
 | ||||
| +	default y
 | ||||
| +	depends on ARM_ARCH_TIMER && ARM64 && ARCH_SUNXI
 | ||||
| +	select ARM_ARCH_TIMER_OOL_WORKAROUND
 | ||||
| +	help
 | ||||
| +	  This option enables a workaround for instability in the timer on
 | ||||
| +	  the Allwinner A64 SoC. The workaround will only be active if the
 | ||||
| +	  allwinner,sun50i-a64-unstable-timer property is found in the
 | ||||
| +	  timer node.
 | ||||
| +
 | ||||
|  config ARM_GLOBAL_TIMER | ||||
|  	bool "Support for the ARM global timer" if COMPILE_TEST | ||||
|  	select TIMER_OF if OF | ||||
| diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
 | ||||
| index 57cb2f00fc07..66ce13578c52 100644
 | ||||
| --- a/drivers/clocksource/arm_arch_timer.c
 | ||||
| +++ b/drivers/clocksource/arm_arch_timer.c
 | ||||
| @@ -319,6 +319,36 @@ static u64 notrace arm64_858921_read_cntvct_el0(void)
 | ||||
|  } | ||||
|  #endif | ||||
|   | ||||
| +#ifdef CONFIG_SUN50I_A64_UNSTABLE_TIMER
 | ||||
| +/*
 | ||||
| + * The low bits of each register can transiently read as all ones or all zeroes
 | ||||
| + * when bit 11 or greater rolls over. Since the value can jump both backward
 | ||||
| + * (7ff -> 000 -> 800) and forward (7ff -> fff -> 800), it is simplest to just
 | ||||
| + * ignore register values with all ones or zeros in the low bits.
 | ||||
| + */
 | ||||
| +static u64 notrace sun50i_a64_read_cntpct_el0(void)
 | ||||
| +{
 | ||||
| +	u64 val;
 | ||||
| +
 | ||||
| +	do {
 | ||||
| +		val = read_sysreg(cntpct_el0);
 | ||||
| +	} while (((val + 1) & GENMASK(10, 0)) <= 1);
 | ||||
| +
 | ||||
| +	return val;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static u64 notrace sun50i_a64_read_cntvct_el0(void)
 | ||||
| +{
 | ||||
| +	u64 val;
 | ||||
| +
 | ||||
| +	do {
 | ||||
| +		val = read_sysreg(cntvct_el0);
 | ||||
| +	} while (((val + 1) & GENMASK(10, 0)) <= 1);
 | ||||
| +
 | ||||
| +	return val;
 | ||||
| +}
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #ifdef CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND | ||||
|  DEFINE_PER_CPU(const struct arch_timer_erratum_workaround *, timer_unstable_counter_workaround); | ||||
|  EXPORT_SYMBOL_GPL(timer_unstable_counter_workaround); | ||||
| @@ -408,6 +438,15 @@ static const struct arch_timer_erratum_workaround ool_workarounds[] = {
 | ||||
|  		.read_cntvct_el0 = arm64_1188873_read_cntvct_el0, | ||||
|  	}, | ||||
|  #endif | ||||
| +#ifdef CONFIG_SUN50I_A64_UNSTABLE_TIMER
 | ||||
| +	{
 | ||||
| +		.match_type = ate_match_dt,
 | ||||
| +		.id = "allwinner,sun50i-a64-unstable-timer",
 | ||||
| +		.desc = "Allwinner A64 timer instability",
 | ||||
| +		.read_cntpct_el0 = sun50i_a64_read_cntpct_el0,
 | ||||
| +		.read_cntvct_el0 = sun50i_a64_read_cntvct_el0,
 | ||||
| +	},
 | ||||
| +#endif
 | ||||
|  }; | ||||
|   | ||||
|  typedef bool (*ate_match_fn_t)(const struct arch_timer_erratum_workaround *, | ||||
| @ -1,38 +0,0 @@ | ||||
| From patchwork Fri May 11 02:27:51 2018 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 7bit | ||||
| Subject: [2/2] arm64: dts: allwinner: a64: Enable A64 timer workaround | ||||
| From: Samuel Holland <samuel@sholland.org> | ||||
| X-Patchwork-Id: 10392889 | ||||
| Message-Id: <20180511022751.9096-3-samuel@sholland.org> | ||||
| To: Maxime Ripard <maxime.ripard@bootlin.com>, Chen-Yu Tsai <wens@csie.org>,  | ||||
|  Catalin Marinas <catalin.marinas@arm.com>, | ||||
|  Will Deacon <will.deacon@arm.com>, | ||||
|  Daniel Lezcano <daniel.lezcano@linaro.org>, | ||||
|  Thomas Gleixner <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com> | ||||
| Cc: linux-sunxi@googlegroups.com, linux-kernel@vger.kernel.org, | ||||
|  linux-arm-kernel@lists.infradead.org, Samuel Holland <samuel@sholland.org> | ||||
| Date: Thu, 10 May 2018 21:27:51 -0500 | ||||
| 
 | ||||
| As instability in the architectural timer has been observed on multiple | ||||
| devices using this SoC, inluding the Pine64 and the Orange Pi Win, | ||||
| enable the workaround in the SoC's device tree. | ||||
| 
 | ||||
| Signed-off-by: Samuel Holland <samuel@sholland.org> | ||||
| ---
 | ||||
|  arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
 | ||||
| index 1b2ef28c42bd..5202b76e9684 100644
 | ||||
| --- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
 | ||||
| +++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
 | ||||
| @@ -152,6 +152,7 @@
 | ||||
|   | ||||
|  	timer { | ||||
|  		compatible = "arm,armv8-timer"; | ||||
| +		allwinner,sun50i-a64-unstable-timer;
 | ||||
|  		interrupts = <GIC_PPI 13 | ||||
|  			(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>, | ||||
|  			     <GIC_PPI 14 | ||||
| @ -1,255 +0,0 @@ | ||||
| From 99909530ec9b6e9b1b3b756a05a83fa1c7d6d4bc Mon Sep 17 00:00:00 2001 | ||||
| From: Stefan Wahren <stefan.wahren@i2se.com> | ||||
| Date: Tue, 1 Jan 2019 18:29:08 +0100 | ||||
| Subject: [PATCH] ARM: dts: bcm283x: Add missing GPIO line names | ||||
| 
 | ||||
| The GPIO sysfs is deprecated and disabled in the defconfig files. | ||||
| So in order to motivate the usage of the new GPIO character device API | ||||
| add the missing GPIO line names for Raspberry Pi 2 and 3. | ||||
| 
 | ||||
| Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com> | ||||
| ---
 | ||||
|  arch/arm/boot/dts/bcm2836-rpi-2-b.dts      | 66 ++++++++++++++++++++ | ||||
|  arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts | 70 ++++++++++++++++++++++ | ||||
|  arch/arm/boot/dts/bcm2837-rpi-3-b.dts      | 70 ++++++++++++++++++++++ | ||||
|  3 files changed, 206 insertions(+) | ||||
| 
 | ||||
| diff --git a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
 | ||||
| index 871fc4a558cf..7b4e651bafdd 100644
 | ||||
| --- a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
 | ||||
| +++ b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
 | ||||
| @@ -28,6 +28,72 @@
 | ||||
|  }; | ||||
|   | ||||
|  &gpio { | ||||
| +	/*
 | ||||
| +	 * Taken from rpi_SCH_2b_1p2_reduced.pdf and
 | ||||
| +	 * the official GPU firmware DT blob.
 | ||||
| +	 *
 | ||||
| +	 * Legend:
 | ||||
| +	 * "NC" = not connected (no rail from the SoC)
 | ||||
| +	 * "FOO" = GPIO line named "FOO" on the schematic
 | ||||
| +	 * "FOO_N" = GPIO line named "FOO" on schematic, active low
 | ||||
| +	 */
 | ||||
| +	gpio-line-names = "ID_SDA",
 | ||||
| +			  "ID_SCL",
 | ||||
| +			  "SDA1",
 | ||||
| +			  "SCL1",
 | ||||
| +			  "GPIO_GCLK",
 | ||||
| +			  "GPIO5",
 | ||||
| +			  "GPIO6",
 | ||||
| +			  "SPI_CE1_N",
 | ||||
| +			  "SPI_CE0_N",
 | ||||
| +			  "SPI_MISO",
 | ||||
| +			  "SPI_MOSI",
 | ||||
| +			  "SPI_SCLK",
 | ||||
| +			  "GPIO12",
 | ||||
| +			  "GPIO13",
 | ||||
| +			  /* Serial port */
 | ||||
| +			  "TXD0",
 | ||||
| +			  "RXD0",
 | ||||
| +			  "GPIO16",
 | ||||
| +			  "GPIO17",
 | ||||
| +			  "GPIO18",
 | ||||
| +			  "GPIO19",
 | ||||
| +			  "GPIO20",
 | ||||
| +			  "GPIO21",
 | ||||
| +			  "GPIO22",
 | ||||
| +			  "GPIO23",
 | ||||
| +			  "GPIO24",
 | ||||
| +			  "GPIO25",
 | ||||
| +			  "GPIO26",
 | ||||
| +			  "GPIO27",
 | ||||
| +			  "SDA0",
 | ||||
| +			  "SCL0",
 | ||||
| +			  "", /* GPIO30 */
 | ||||
| +			  "LAN_RUN",
 | ||||
| +			  "CAM_GPIO1",
 | ||||
| +			  "", /* GPIO33 */
 | ||||
| +			  "", /* GPIO34 */
 | ||||
| +			  "PWR_LOW_N",
 | ||||
| +			  "", /* GPIO36 */
 | ||||
| +			  "", /* GPIO37 */
 | ||||
| +			  "USB_LIMIT",
 | ||||
| +			  "", /* GPIO39 */
 | ||||
| +			  "PWM0_OUT",
 | ||||
| +			  "CAM_GPIO0",
 | ||||
| +			  "SMPS_SCL",
 | ||||
| +			  "SMPS_SDA",
 | ||||
| +			  "ETHCLK",
 | ||||
| +			  "PWM1_OUT",
 | ||||
| +			  "HDMI_HPD_N",
 | ||||
| +			  "STATUS_LED",
 | ||||
| +			  /* Used by SD Card */
 | ||||
| +			  "SD_CLK_R",
 | ||||
| +			  "SD_CMD_R",
 | ||||
| +			  "SD_DATA0_R",
 | ||||
| +			  "SD_DATA1_R",
 | ||||
| +			  "SD_DATA2_R",
 | ||||
| +			  "SD_DATA3_R";
 | ||||
| +
 | ||||
|  	pinctrl-0 = <&gpioout &alt0 &i2s_alt0>; | ||||
|   | ||||
|  	/* I2S interface */ | ||||
| diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
 | ||||
| index 94886fcaf0b9..9358f8481f36 100644
 | ||||
| --- a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
 | ||||
| +++ b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
 | ||||
| @@ -52,6 +52,76 @@
 | ||||
|  	}; | ||||
|  }; | ||||
|   | ||||
| +&gpio {
 | ||||
| +	/*
 | ||||
| +	 * Taken from rpi_SCH_3bplus_1p0_reduced.pdf and
 | ||||
| +	 * the official GPU firmware DT blob.
 | ||||
| +	 *
 | ||||
| +	 * Legend:
 | ||||
| +	 * "NC" = not connected (no rail from the SoC)
 | ||||
| +	 * "FOO" = GPIO line named "FOO" on the schematic
 | ||||
| +	 * "FOO_N" = GPIO line named "FOO" on schematic, active low
 | ||||
| +	 */
 | ||||
| +	gpio-line-names = "ID_SDA",
 | ||||
| +			  "ID_SCL",
 | ||||
| +			  "SDA1",
 | ||||
| +			  "SCL1",
 | ||||
| +			  "GPIO_GCLK",
 | ||||
| +			  "GPIO5",
 | ||||
| +			  "GPIO6",
 | ||||
| +			  "SPI_CE1_N",
 | ||||
| +			  "SPI_CE0_N",
 | ||||
| +			  "SPI_MISO",
 | ||||
| +			  "SPI_MOSI",
 | ||||
| +			  "SPI_SCLK",
 | ||||
| +			  "GPIO12",
 | ||||
| +			  "GPIO13",
 | ||||
| +			  /* Serial port */
 | ||||
| +			  "TXD1",
 | ||||
| +			  "RXD1",
 | ||||
| +			  "GPIO16",
 | ||||
| +			  "GPIO17",
 | ||||
| +			  "GPIO18",
 | ||||
| +			  "GPIO19",
 | ||||
| +			  "GPIO20",
 | ||||
| +			  "GPIO21",
 | ||||
| +			  "GPIO22",
 | ||||
| +			  "GPIO23",
 | ||||
| +			  "GPIO24",
 | ||||
| +			  "GPIO25",
 | ||||
| +			  "GPIO26",
 | ||||
| +			  "GPIO27",
 | ||||
| +			  "HDMI_HPD_N",
 | ||||
| +			  "STATUS_LED_G",
 | ||||
| +			  /* Used by BT module */
 | ||||
| +			  "CTS0",
 | ||||
| +			  "RTS0",
 | ||||
| +			  "TXD0",
 | ||||
| +			  "RXD0",
 | ||||
| +			  /* Used by Wifi */
 | ||||
| +			  "SD1_CLK",
 | ||||
| +			  "SD1_CMD",
 | ||||
| +			  "SD1_DATA0",
 | ||||
| +			  "SD1_DATA1",
 | ||||
| +			  "SD1_DATA2",
 | ||||
| +			  "SD1_DATA3",
 | ||||
| +			  "PWM0_OUT",
 | ||||
| +			  "PWM1_OUT",
 | ||||
| +			  "ETHCLK",
 | ||||
| +			  "WIFI_CLK",
 | ||||
| +			  "SDA0",
 | ||||
| +			  "SCL0",
 | ||||
| +			  "SMPS_SCL",
 | ||||
| +			  "SMPS_SDA",
 | ||||
| +			  /* Used by SD Card */
 | ||||
| +			  "SD_CLK_R",
 | ||||
| +			  "SD_CMD_R",
 | ||||
| +			  "SD_DATA0_R",
 | ||||
| +			  "SD_DATA1_R",
 | ||||
| +			  "SD_DATA2_R",
 | ||||
| +			  "SD_DATA3_R";
 | ||||
| +};
 | ||||
| +
 | ||||
|  &hdmi { | ||||
|  	hpd-gpios = <&gpio 28 GPIO_ACTIVE_LOW>; | ||||
|  }; | ||||
| diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
 | ||||
| index 31b1c03e0ff7..ce71f578c51a 100644
 | ||||
| --- a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
 | ||||
| +++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
 | ||||
| @@ -47,6 +47,76 @@
 | ||||
|  	}; | ||||
|  }; | ||||
|   | ||||
| +&gpio {
 | ||||
| +	/*
 | ||||
| +	 * Taken from rpi_SCH_3b_1p2_reduced.pdf and
 | ||||
| +	 * the official GPU firmware DT blob.
 | ||||
| +	 *
 | ||||
| +	 * Legend:
 | ||||
| +	 * "NC" = not connected (no rail from the SoC)
 | ||||
| +	 * "FOO" = GPIO line named "FOO" on the schematic
 | ||||
| +	 * "FOO_N" = GPIO line named "FOO" on schematic, active low
 | ||||
| +	 */
 | ||||
| +	gpio-line-names = "ID_SDA",
 | ||||
| +			  "ID_SCL",
 | ||||
| +			  "SDA1",
 | ||||
| +			  "SCL1",
 | ||||
| +			  "GPIO_GCLK",
 | ||||
| +			  "GPIO5",
 | ||||
| +			  "GPIO6",
 | ||||
| +			  "SPI_CE1_N",
 | ||||
| +			  "SPI_CE0_N",
 | ||||
| +			  "SPI_MISO",
 | ||||
| +			  "SPI_MOSI",
 | ||||
| +			  "SPI_SCLK",
 | ||||
| +			  "GPIO12",
 | ||||
| +			  "GPIO13",
 | ||||
| +			  /* Serial port */
 | ||||
| +			  "TXD1",
 | ||||
| +			  "RXD1",
 | ||||
| +			  "GPIO16",
 | ||||
| +			  "GPIO17",
 | ||||
| +			  "GPIO18",
 | ||||
| +			  "GPIO19",
 | ||||
| +			  "GPIO20",
 | ||||
| +			  "GPIO21",
 | ||||
| +			  "GPIO22",
 | ||||
| +			  "GPIO23",
 | ||||
| +			  "GPIO24",
 | ||||
| +			  "GPIO25",
 | ||||
| +			  "GPIO26",
 | ||||
| +			  "GPIO27",
 | ||||
| +			  "", /* GPIO 28 */
 | ||||
| +			  "LAN_RUN_BOOT",
 | ||||
| +			  /* Used by BT module */
 | ||||
| +			  "CTS0",
 | ||||
| +			  "RTS0",
 | ||||
| +			  "TXD0",
 | ||||
| +			  "RXD0",
 | ||||
| +			  /* Used by Wifi */
 | ||||
| +			  "SD1_CLK",
 | ||||
| +			  "SD1_CMD",
 | ||||
| +			  "SD1_DATA0",
 | ||||
| +			  "SD1_DATA1",
 | ||||
| +			  "SD1_DATA2",
 | ||||
| +			  "SD1_DATA3",
 | ||||
| +			  "PWM0_OUT",
 | ||||
| +			  "PWM1_OUT",
 | ||||
| +			  "ETHCLK",
 | ||||
| +			  "WIFI_CLK",
 | ||||
| +			  "SDA0",
 | ||||
| +			  "SCL0",
 | ||||
| +			  "SMPS_SCL",
 | ||||
| +			  "SMPS_SDA",
 | ||||
| +			  /* Used by SD Card */
 | ||||
| +			  "SD_CLK_R",
 | ||||
| +			  "SD_CMD_R",
 | ||||
| +			  "SD_DATA0_R",
 | ||||
| +			  "SD_DATA1_R",
 | ||||
| +			  "SD_DATA2_R",
 | ||||
| +			  "SD_DATA3_R";
 | ||||
| +};
 | ||||
| +
 | ||||
|  &pwm { | ||||
|  	pinctrl-names = "default"; | ||||
|  	pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio41>; | ||||
| @ -0,0 +1 @@ | ||||
| CONFIG_SUN50I_ERRATUM_UNKNOWN1=y | ||||
| @ -6034,6 +6034,7 @@ CONFIG_ST_UVIS25_SPI=m | ||||
| CONFIG_SUN50I_A64_CCU=y | ||||
| CONFIG_SUN50I_A64_UNSTABLE_TIMER=y | ||||
| CONFIG_SUN50I_DE2_BUS=y | ||||
| CONFIG_SUN50I_ERRATUM_UNKNOWN1=y | ||||
| CONFIG_SUN50I_H6_CCU=y | ||||
| CONFIG_SUN50I_H6_R_CCU=y | ||||
| # CONFIG_SUN8I_A83T_CCU is not set | ||||
|  | ||||
| @ -6011,6 +6011,7 @@ CONFIG_ST_UVIS25_SPI=m | ||||
| CONFIG_SUN50I_A64_CCU=y | ||||
| CONFIG_SUN50I_A64_UNSTABLE_TIMER=y | ||||
| CONFIG_SUN50I_DE2_BUS=y | ||||
| CONFIG_SUN50I_ERRATUM_UNKNOWN1=y | ||||
| CONFIG_SUN50I_H6_CCU=y | ||||
| CONFIG_SUN50I_H6_R_CCU=y | ||||
| # CONFIG_SUN8I_A83T_CCU is not set | ||||
|  | ||||
							
								
								
									
										12
									
								
								kernel.spec
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								kernel.spec
									
									
									
									
									
								
							| @ -580,14 +580,14 @@ Patch330: bcm2837-dts-add-Raspberry-Pi-3-A.patch | ||||
| # https://patchwork.kernel.org/patch/10741809/ | ||||
| Patch331: bcm2835-mmc-sdhci-iproc-handle-mmc_of_parse-errors-during-probe.patch | ||||
| 
 | ||||
| Patch332: bcm283x-Add-missing-GPIO-line-names.patch | ||||
| # https://www.spinics.net/lists/arm-kernel/msg699583.html | ||||
| Patch332: ARM-dts-bcm283x-Several-DTS-improvements.patch | ||||
| 
 | ||||
| Patch339: bcm2835-cpufreq-add-CPU-frequency-control-driver.patch | ||||
| 
 | ||||
| # Fix for AllWinner A64 Timer Errata, still not final | ||||
| # https://patchwork.kernel.org/patch/10392891/ | ||||
| Patch350: arm64-arch_timer-Workaround-for-Allwinner-A64-timer-instability.patch | ||||
| Patch351: arm64-dts-allwinner-a64-Enable-A64-timer-workaround.patch | ||||
| # https://www.spinics.net/lists/arm-kernel/msg699622.html | ||||
| Patch350: Allwinner-A64-timer-workaround.patch | ||||
| 
 | ||||
| # 400 - IBM (ppc/s390x) patches | ||||
| 
 | ||||
| @ -1876,6 +1876,10 @@ fi | ||||
| # | ||||
| # | ||||
| %changelog | ||||
| * Sun Jan 13 2019 Peter Robinson <pbrobinson@fedoraproject.org> | ||||
| - Raspberry Pi updates | ||||
| - Update AllWinner A64 timer errata workaround | ||||
| 
 | ||||
| * Fri Jan 11 2019 Laura Abbott <labbott@redhat.com> - 5.0.0-0.rc1.git4.1 | ||||
| - Linux v5.0-rc1-43-g1bdbe2274920 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user