From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C152C43334 for ; Sun, 10 Jul 2022 22:55:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229547AbiGJWzv convert rfc822-to-8bit (ORCPT ); Sun, 10 Jul 2022 18:55:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56744 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229463AbiGJWzv (ORCPT ); Sun, 10 Jul 2022 18:55:51 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 7D66255B2; Sun, 10 Jul 2022 15:55:49 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7D81023A; Sun, 10 Jul 2022 15:55:49 -0700 (PDT) Received: from slackpad.lan (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3C7E73F73D; Sun, 10 Jul 2022 15:55:47 -0700 (PDT) Date: Sun, 10 Jul 2022 23:54:40 +0100 From: Andre Przywara To: Jernej =?UTF-8?B?xaBrcmFiZWM=?= Cc: samuel@sholland.org, Roman Stratiienko , mturquette@baylibre.com, sboyd@kernel.org, mripard@kernel.org, wens@csie.org, linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [RFC] ccu-sun50i-h6: Bump-up DDR0 PLL to 1800MHz Message-ID: <20220710235440.0b34d8cb@slackpad.lan> In-Reply-To: <1917526.jZfb76A358@kista> References: <20220710175214.544748-1-r.stratiienko@gmail.com> <1917526.jZfb76A358@kista> Organization: Arm Ltd. X-Mailer: Claws Mail 4.1.0 (GTK 3.24.31; x86_64-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org On Sun, 10 Jul 2022 20:47:55 +0200 Jernej Škrabec wrote: Hi Roman, > Dne nedelja, 10. julij 2022 ob 19:52:14 CEST je Roman Stratiienko napisal(a): > > While debugging complex animated composition cases I noticed a glitch > > which as it turned-out eventually was caused by lack of memory bandwidth. > > > > I can't find a DRAMC manual to check what input frequency must be > > supplied to avoid exceeding the 800MHz LPDDR3 which is installed on > > my orangepi3 board. But the system is running stable so far. Well, most recent Allwinner boards indeed have capable LPDDR3 (800 MHz) or DDR3-1600 (or even higher) chips, but we never got them running at the full clock speed, and lowering the DRAM frequency is a common kludge to improve system stability (as in: actually reaching the login prompt). And we figured that those "more aggressive" timings are quite board specific, so while 800 MHz might work on your particular board, your friend's OPi3 might not be as lucky. > this is hard topic. Generally, max. supported DRAM frequency is board specific > and is set by SPL (part of U-Boot), so we can't assume every board supports > max. frequency for its memory type. Yes, while we run most H6 boards at 744 MHz, the Tanix TX6 requires no more than 648 MHz, for instance, partly because it has DDR3 (not LPDDR3) DRAM. Another H6 TV box I have needs an even lower frequency (at least with the current timing settings). > In fact, this assumption was proven wrong. > Some boards were unstable until DRAM frequency was lowered. So in short, Linux > clock driver certainly shouldn't set DRAM frequency. Yes, and on top of that, also keep in mind that many DRAM controller registers take timing parameters in terms of clock cycles, but the actual DDR chips are specified in terms of pico- or nanoseconds. This means the register values must be calculated and programmed based on the clock frequency, see [1] for examples in all those ns_to_t() calls. And just increasing the PLL frequency might now lead to exceeded specifications, and thus subtle instabilities. [1] https://source.denx.de/u-boot/u-boot/-/blob/master/arch/arm/mach-sunxi/dram_timings/h6_ddr3_1333.c > There is, however, Linux > MBUS driver for H5 and A64, which can throttle DRAM frequency when system is > idle, but max. frequency is still that one which was programmed by SPL. > > There is no definitive DRAM documentation, because Allwinner usually tries to > hide all details. DRAM drivers are, except in rare cases, all reverse > engineered by community. Register values (mostly) match those produced by > vendor driver. Fortunately, at least H6 DRAM controller matches pretty good > with one other memory controller (one in Zynq UltraScale+ MPSoC), which is > fully documented (see comments in U-Boot driver). MBUS is also pretty standard > and it's not a mystery. > > Note that it's hard to convince maintainers to either lower or increase DRAM > frequency as it was common issue in the past. You have to do a lot of memory > intensive tests, both CPU and GPU, running at the same time for extended > period of time. Initial board bring ups usually just use same frequency as in > BSP based images. Yes, this DDR3 controller logic is mostly undocumented rocket science, see [2] in our wiki for just *some* (old!) pieces of information and the complexity it involved in the past to come to a set of timing parameters (including the clock frequency) that works stably across all boards. [2] https://linux-sunxi.org/A10_DRAM_Controller_Calibration > If I understand procedure correctly, boards are sent to > Allwinner, so their engineers determine max. DRAM frequency and timings, so > these values are pretty trustwothy. > There is other possibility. Along with DRAM controller and PHY, there is MBUS > core, which is memory arbiter and responsible for bandwidth allocation. You > can change DE priority and bandwith there (again, in U-Boot DRAM driver). That's indeed an interesting topic to explore, though the DE seems to be already in the top tier in our settings: https://source.denx.de/u-boot/u-boot/-/blob/master/arch/arm/mach-sunxi/dram_sun50i_h6.c#L135-151 Cheers, Andre > I hope this explains why things are the way they are. > > Best regards, > Jernej > > > > > Signed-off-by: Roman Stratiienko > > --- > > drivers/clk/sunxi-ng/ccu-sun50i-h6.c | 11 +++++++++++ > > 1 file changed, 11 insertions(+) > > > > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c > > b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c index 750368a86b8b6..abdde80307993 > > 100644 > > --- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c > > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c > > @@ -1203,6 +1203,17 @@ static int sun50i_h6_ccu_probe(struct platform_device > > *pdev) val &= ~GENMASK(3, 0); > > writel(val, reg + gpu_clk.common.reg); > > > > + /* > > + * Increase DDR0 PLL from 1488(default) to 1800MHz. > > + * (DE3.0 require higher memory bandwidth while displaying > > + * complex composition at 1920x1080@60FPS) > > + */ > > + > > + val = readl(reg + SUN50I_H6_PLL_DDR0_REG); > > + val &= ~GENMASK(15, 0); > > + val |= 74 << 8; > > + writel(val, reg + SUN50I_H6_PLL_DDR0_REG); > > + > > /* Enable the lock bits on all PLLs */ > > for (i = 0; i < ARRAY_SIZE(pll_regs); i++) { > > val = readl(reg + pll_regs[i]); > > -- > > 2.34.1 > > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F3434C433EF for ; Sun, 10 Jul 2022 22:57:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=f7f//QTRz65QfT2r6heOsO0+YbyskvcBRyFISq/8cwM=; b=Dc+M7Xm1QGP5j+ RcT3nPezc7ILNCiOODj2FX7uKsBQCuP+GZolBYSsGyMjSeynsa/TCjqRLQvWdb46txPaDaE7Dtlkg tdPAQayL5xpNNTQisjrXhd+BAOrMx17L8zSYOD+QxBW9Xz1ro7vOzByFEBR1DY5bPVl/KkYvUHIuu REe1r8isg7wg45bXugbSw6ZjZ44sQg+QyOZG1JUoVzcsVKyHaogh8FobrecXJSjbhZHPyly8zPgsp CxSBg6/h2yAKqgGm+nhgnr/UlkfMln66Df1XJX65ZWXGPkRGB1D0SRYw5VscD5tvTb2kvNSjZZJCF JQVlr6ZVarnISkL3hKiQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oAfqK-00E4lN-HZ; Sun, 10 Jul 2022 22:56:00 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oAfqE-00E4if-HI for linux-arm-kernel@lists.infradead.org; Sun, 10 Jul 2022 22:55:56 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7D81023A; Sun, 10 Jul 2022 15:55:49 -0700 (PDT) Received: from slackpad.lan (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3C7E73F73D; Sun, 10 Jul 2022 15:55:47 -0700 (PDT) Date: Sun, 10 Jul 2022 23:54:40 +0100 From: Andre Przywara To: Jernej =?UTF-8?B?xaBrcmFiZWM=?= Cc: samuel@sholland.org, Roman Stratiienko , mturquette@baylibre.com, sboyd@kernel.org, mripard@kernel.org, wens@csie.org, linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [RFC] ccu-sun50i-h6: Bump-up DDR0 PLL to 1800MHz Message-ID: <20220710235440.0b34d8cb@slackpad.lan> In-Reply-To: <1917526.jZfb76A358@kista> References: <20220710175214.544748-1-r.stratiienko@gmail.com> <1917526.jZfb76A358@kista> Organization: Arm Ltd. X-Mailer: Claws Mail 4.1.0 (GTK 3.24.31; x86_64-slackware-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220710_155554_700950_A4A30C5A X-CRM114-Status: GOOD ( 32.84 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gU3VuLCAxMCBKdWwgMjAyMiAyMDo0Nzo1NSArMDIwMApKZXJuZWogxaBrcmFiZWMgPGplcm5l ai5za3JhYmVjQGdtYWlsLmNvbT4gd3JvdGU6CgpIaSBSb21hbiwKCj4gRG5lIG5lZGVsamEsIDEw LiBqdWxpaiAyMDIyIG9iIDE5OjUyOjE0IENFU1QgamUgUm9tYW4gU3RyYXRpaWVua28gbmFwaXNh bChhKToKPiA+IFdoaWxlIGRlYnVnZ2luZyBjb21wbGV4IGFuaW1hdGVkIGNvbXBvc2l0aW9uIGNh c2VzICBJIG5vdGljZWQgYSBnbGl0Y2gKPiA+IHdoaWNoIGFzIGl0IHR1cm5lZC1vdXQgZXZlbnR1 YWxseSB3YXMgY2F1c2VkIGJ5IGxhY2sgb2YgbWVtb3J5IGJhbmR3aWR0aC4KPiA+IAo+ID4gSSBj YW4ndCBmaW5kIGEgRFJBTUMgbWFudWFsIHRvIGNoZWNrIHdoYXQgaW5wdXQgZnJlcXVlbmN5IG11 c3QgYmUKPiA+IHN1cHBsaWVkIHRvIGF2b2lkIGV4Y2VlZGluZyB0aGUgODAwTUh6IExQRERSMyB3 aGljaCBpcyBpbnN0YWxsZWQgb24KPiA+IG15IG9yYW5nZXBpMyBib2FyZC4gQnV0IHRoZSBzeXN0 ZW0gaXMgcnVubmluZyBzdGFibGUgc28gZmFyLiAgCgpXZWxsLCBtb3N0IHJlY2VudCBBbGx3aW5u ZXIgYm9hcmRzIGluZGVlZCBoYXZlIGNhcGFibGUgTFBERFIzICg4MDAgTUh6KQpvciBERFIzLTE2 MDAgKG9yIGV2ZW4gaGlnaGVyKSBjaGlwcywgYnV0IHdlIG5ldmVyIGdvdCB0aGVtIHJ1bm5pbmcg YXQgdGhlCmZ1bGwgY2xvY2sgc3BlZWQsIGFuZCBsb3dlcmluZyB0aGUgRFJBTSBmcmVxdWVuY3kg aXMgYSBjb21tb24ga2x1ZGdlIHRvCmltcHJvdmUgc3lzdGVtIHN0YWJpbGl0eSAoYXMgaW46IGFj dHVhbGx5IHJlYWNoaW5nIHRoZSBsb2dpbiBwcm9tcHQpLgpBbmQgd2UgZmlndXJlZCB0aGF0IHRo b3NlICJtb3JlIGFnZ3Jlc3NpdmUiIHRpbWluZ3MgYXJlIHF1aXRlIGJvYXJkCnNwZWNpZmljLCBz byB3aGlsZSA4MDAgTUh6IG1pZ2h0IHdvcmsgb24geW91ciBwYXJ0aWN1bGFyIGJvYXJkLCB5b3Vy CmZyaWVuZCdzIE9QaTMgbWlnaHQgbm90IGJlIGFzIGx1Y2t5LgoKPiB0aGlzIGlzIGhhcmQgdG9w aWMuIEdlbmVyYWxseSwgbWF4LiBzdXBwb3J0ZWQgRFJBTSBmcmVxdWVuY3kgaXMgYm9hcmQgc3Bl Y2lmaWMgCj4gYW5kIGlzIHNldCBieSBTUEwgKHBhcnQgb2YgVS1Cb290KSwgc28gd2UgY2FuJ3Qg YXNzdW1lIGV2ZXJ5IGJvYXJkIHN1cHBvcnRzIAo+IG1heC4gZnJlcXVlbmN5IGZvciBpdHMgbWVt b3J5IHR5cGUuCgpZZXMsIHdoaWxlIHdlIHJ1biBtb3N0IEg2IGJvYXJkcyBhdCA3NDQgTUh6LCB0 aGUgVGFuaXggVFg2IHJlcXVpcmVzIG5vCm1vcmUgdGhhbiA2NDggTUh6LCBmb3IgaW5zdGFuY2Us IHBhcnRseSBiZWNhdXNlIGl0IGhhcyBERFIzIChub3QgTFBERFIzKQpEUkFNLiBBbm90aGVyIEg2 IFRWIGJveCBJIGhhdmUgbmVlZHMgYW4gZXZlbiBsb3dlciBmcmVxdWVuY3kgKGF0IGxlYXN0Cndp dGggdGhlIGN1cnJlbnQgdGltaW5nIHNldHRpbmdzKS4KCj4gSW4gZmFjdCwgdGhpcyBhc3N1bXB0 aW9uIHdhcyBwcm92ZW4gd3JvbmcuIAo+IFNvbWUgYm9hcmRzIHdlcmUgdW5zdGFibGUgdW50aWwg RFJBTSBmcmVxdWVuY3kgd2FzIGxvd2VyZWQuIFNvIGluIHNob3J0LCBMaW51eCAKPiBjbG9jayBk cml2ZXIgY2VydGFpbmx5IHNob3VsZG4ndCBzZXQgRFJBTSBmcmVxdWVuY3kuCgpZZXMsIGFuZCBv biB0b3Agb2YgdGhhdCwgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCBtYW55IERSQU0gY29udHJvbGxl cgpyZWdpc3RlcnMgdGFrZSB0aW1pbmcgcGFyYW1ldGVycyBpbiB0ZXJtcyBvZiBjbG9jayBjeWNs ZXMsIGJ1dCB0aGUKYWN0dWFsIEREUiBjaGlwcyBhcmUgc3BlY2lmaWVkIGluIHRlcm1zIG9mIHBp Y28tIG9yIG5hbm9zZWNvbmRzLiBUaGlzCm1lYW5zIHRoZSByZWdpc3RlciB2YWx1ZXMgbXVzdCBi ZSBjYWxjdWxhdGVkIGFuZCBwcm9ncmFtbWVkIGJhc2VkIG9uCnRoZSBjbG9jayBmcmVxdWVuY3ks IHNlZSBbMV0gZm9yIGV4YW1wbGVzIGluIGFsbCB0aG9zZSBuc190b190KCkKY2FsbHMuIEFuZCBq dXN0IGluY3JlYXNpbmcgdGhlIFBMTCBmcmVxdWVuY3kgbWlnaHQgbm93IGxlYWQgdG8gZXhjZWVk ZWQKc3BlY2lmaWNhdGlvbnMsIGFuZCB0aHVzIHN1YnRsZSBpbnN0YWJpbGl0aWVzLgoKWzFdIGh0 dHBzOi8vc291cmNlLmRlbnguZGUvdS1ib290L3UtYm9vdC8tL2Jsb2IvbWFzdGVyL2FyY2gvYXJt L21hY2gtc3VueGkvZHJhbV90aW1pbmdzL2g2X2RkcjNfMTMzMy5jCgo+IFRoZXJlIGlzLCBob3dl dmVyLCBMaW51eCAKPiBNQlVTIGRyaXZlciBmb3IgSDUgYW5kIEE2NCwgd2hpY2ggY2FuIHRocm90 dGxlIERSQU0gZnJlcXVlbmN5IHdoZW4gc3lzdGVtIGlzIAo+IGlkbGUsIGJ1dCBtYXguIGZyZXF1 ZW5jeSBpcyBzdGlsbCB0aGF0IG9uZSB3aGljaCB3YXMgcHJvZ3JhbW1lZCBieSBTUEwuCj4gCj4g VGhlcmUgaXMgbm8gZGVmaW5pdGl2ZSBEUkFNIGRvY3VtZW50YXRpb24sIGJlY2F1c2UgQWxsd2lu bmVyIHVzdWFsbHkgdHJpZXMgdG8gCj4gaGlkZSBhbGwgZGV0YWlscy4gRFJBTSBkcml2ZXJzIGFy ZSwgZXhjZXB0IGluIHJhcmUgY2FzZXMsIGFsbCByZXZlcnNlIAo+IGVuZ2luZWVyZWQgYnkgY29t bXVuaXR5LiBSZWdpc3RlciB2YWx1ZXMgKG1vc3RseSkgbWF0Y2ggdGhvc2UgcHJvZHVjZWQgYnkg Cj4gdmVuZG9yIGRyaXZlci4gRm9ydHVuYXRlbHksIGF0IGxlYXN0IEg2IERSQU0gY29udHJvbGxl ciBtYXRjaGVzIHByZXR0eSBnb29kIAo+IHdpdGggb25lIG90aGVyIG1lbW9yeSBjb250cm9sbGVy IChvbmUgaW4gWnlucSBVbHRyYVNjYWxlKyBNUFNvQyksIHdoaWNoIGlzIAo+IGZ1bGx5IGRvY3Vt ZW50ZWQgKHNlZSBjb21tZW50cyBpbiBVLUJvb3QgZHJpdmVyKS4gTUJVUyBpcyBhbHNvIHByZXR0 eSBzdGFuZGFyZCAKPiBhbmQgaXQncyBub3QgYSBteXN0ZXJ5Lgo+IAo+IE5vdGUgdGhhdCBpdCdz IGhhcmQgdG8gY29udmluY2UgbWFpbnRhaW5lcnMgdG8gZWl0aGVyIGxvd2VyIG9yIGluY3JlYXNl IERSQU0gCj4gZnJlcXVlbmN5IGFzIGl0IHdhcyBjb21tb24gaXNzdWUgaW4gdGhlIHBhc3QuIFlv dSBoYXZlIHRvIGRvIGEgbG90IG9mIG1lbW9yeSAKPiBpbnRlbnNpdmUgdGVzdHMsIGJvdGggQ1BV IGFuZCBHUFUsIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZSBmb3IgZXh0ZW5kZWQgCj4gcGVyaW9k IG9mIHRpbWUuIEluaXRpYWwgYm9hcmQgYnJpbmcgdXBzIHVzdWFsbHkganVzdCB1c2Ugc2FtZSBm cmVxdWVuY3kgYXMgaW4gCj4gQlNQIGJhc2VkIGltYWdlcy4KClllcywgdGhpcyBERFIzIGNvbnRy b2xsZXIgbG9naWMgaXMgbW9zdGx5IHVuZG9jdW1lbnRlZCByb2NrZXQgc2NpZW5jZSwKc2VlIFsy XSBpbiBvdXIgd2lraSBmb3IganVzdCAqc29tZSogKG9sZCEpIHBpZWNlcyBvZiBpbmZvcm1hdGlv biBhbmQKdGhlIGNvbXBsZXhpdHkgaXQgaW52b2x2ZWQgaW4gdGhlIHBhc3QgdG8gY29tZSB0byBh IHNldCBvZiB0aW1pbmcKcGFyYW1ldGVycyAoaW5jbHVkaW5nIHRoZSBjbG9jayBmcmVxdWVuY3kp IHRoYXQgd29ya3Mgc3RhYmx5IGFjcm9zcwphbGwgYm9hcmRzLgoKWzJdIGh0dHBzOi8vbGludXgt c3VueGkub3JnL0ExMF9EUkFNX0NvbnRyb2xsZXJfQ2FsaWJyYXRpb24KCj4gSWYgSSB1bmRlcnN0 YW5kIHByb2NlZHVyZSBjb3JyZWN0bHksIGJvYXJkcyBhcmUgc2VudCB0byAKPiBBbGx3aW5uZXIs IHNvIHRoZWlyIGVuZ2luZWVycyBkZXRlcm1pbmUgbWF4LiBEUkFNIGZyZXF1ZW5jeSBhbmQgdGlt aW5ncywgc28gCj4gdGhlc2UgdmFsdWVzIGFyZSBwcmV0dHkgdHJ1c3R3b3RoeS4KPiBUaGVyZSBp cyBvdGhlciBwb3NzaWJpbGl0eS4gQWxvbmcgd2l0aCBEUkFNIGNvbnRyb2xsZXIgYW5kIFBIWSwg dGhlcmUgaXMgTUJVUyAKPiBjb3JlLCB3aGljaCBpcyBtZW1vcnkgYXJiaXRlciBhbmQgcmVzcG9u c2libGUgZm9yIGJhbmR3aWR0aCBhbGxvY2F0aW9uLiBZb3UgCj4gY2FuIGNoYW5nZSBERSBwcmlv cml0eSBhbmQgYmFuZHdpdGggdGhlcmUgKGFnYWluLCBpbiBVLUJvb3QgRFJBTSBkcml2ZXIpLgoK VGhhdCdzIGluZGVlZCBhbiBpbnRlcmVzdGluZyB0b3BpYyB0byBleHBsb3JlLCB0aG91Z2ggdGhl IERFIHNlZW1zIHRvCmJlIGFscmVhZHkgaW4gdGhlIHRvcCB0aWVyIGluIG91ciBzZXR0aW5nczoK aHR0cHM6Ly9zb3VyY2UuZGVueC5kZS91LWJvb3QvdS1ib290Ly0vYmxvYi9tYXN0ZXIvYXJjaC9h cm0vbWFjaC1zdW54aS9kcmFtX3N1bjUwaV9oNi5jI0wxMzUtMTUxCgpDaGVlcnMsCkFuZHJlCgo+ IEkgaG9wZSB0aGlzIGV4cGxhaW5zIHdoeSB0aGluZ3MgYXJlIHRoZSB3YXkgdGhleSBhcmUuCj4g Cj4gQmVzdCByZWdhcmRzLAo+IEplcm5lago+IAo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBSb21h biBTdHJhdGlpZW5rbyA8ci5zdHJhdGlpZW5rb0BnbWFpbC5jb20+Cj4gPiAtLS0KPiA+ICBkcml2 ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLWg2LmMgfCAxMSArKysrKysrKysrKwo+ID4gIDEg ZmlsZSBjaGFuZ2VkLCAxMSBpbnNlcnRpb25zKCspCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLWg2LmMKPiA+IGIvZHJpdmVycy9jbGsvc3VueGkt bmcvY2N1LXN1bjUwaS1oNi5jIGluZGV4IDc1MDM2OGE4NmI4YjYuLmFiZGRlODAzMDc5OTMKPiA+ IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjUwaS1oNi5jCj4g PiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLWg2LmMKPiA+IEBAIC0xMjAz LDYgKzEyMDMsMTcgQEAgc3RhdGljIGludCBzdW41MGlfaDZfY2N1X3Byb2JlKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UKPiA+ICpwZGV2KSB2YWwgJj0gfkdFTk1BU0soMywgMCk7Cj4gPiAgCXdyaXRl bCh2YWwsIHJlZyArIGdwdV9jbGsuY29tbW9uLnJlZyk7Cj4gPiAKPiA+ICsJLyoKPiA+ICsJICog SW5jcmVhc2UgRERSMCBQTEwgZnJvbSAxNDg4KGRlZmF1bHQpIHRvIDE4MDBNSHouCj4gPiArCSAq IChERTMuMCByZXF1aXJlIGhpZ2hlciBtZW1vcnkgYmFuZHdpZHRoIHdoaWxlIGRpc3BsYXlpbmcK PiA+ICsJICogY29tcGxleCBjb21wb3NpdGlvbiBhdCAxOTIweDEwODBANjBGUFMpCj4gPiArCSAq Lwo+ID4gKwo+ID4gKwl2YWwgPSByZWFkbChyZWcgKyBTVU41MElfSDZfUExMX0REUjBfUkVHKTsK PiA+ICsJdmFsICY9IH5HRU5NQVNLKDE1LCAwKTsKPiA+ICsJdmFsIHw9IDc0IDw8IDg7Cj4gPiAr CXdyaXRlbCh2YWwsIHJlZyArIFNVTjUwSV9INl9QTExfRERSMF9SRUcpOwo+ID4gKwo+ID4gIAkv KiBFbmFibGUgdGhlIGxvY2sgYml0cyBvbiBhbGwgUExMcyAqLwo+ID4gIAlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShwbGxfcmVncyk7IGkrKykgewo+ID4gIAkJdmFsID0gcmVhZGwocmVnICsg cGxsX3JlZ3NbaV0pOwo+ID4gLS0KPiA+IDIuMzQuMSAgCj4gCj4gCj4gCgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=